Release v1.01 Enhanced: Vi Control, TUI Gen5, Core Stability
This commit is contained in:
105
bin/ui/components/DesktopInspector.mjs
Normal file
105
bin/ui/components/DesktopInspector.mjs
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* Desktop Inspector - Windows-Use inspired
|
||||
*
|
||||
* Shows: foreground app, cursor, apps list, interactive elements
|
||||
*
|
||||
* Credit: https://github.com/CursorTouch/Windows-Use
|
||||
*/
|
||||
|
||||
import React, { useState } from 'react';
|
||||
import { Box, Text } from 'ink';
|
||||
import { colors } from '../../tui-theme.mjs';
|
||||
import { getCapabilities } from '../../terminal-profile.mjs';
|
||||
|
||||
const h = React.createElement;
|
||||
|
||||
/**
|
||||
* Desktop Inspector Component
|
||||
*/
|
||||
const DesktopInspector = ({
|
||||
foregroundApp = null,
|
||||
cursorPosition = null,
|
||||
runningApps = [],
|
||||
interactiveElements = [],
|
||||
lastScreenshot = null,
|
||||
lastVerification = null,
|
||||
isExpanded = false,
|
||||
width = 40
|
||||
}) => {
|
||||
const caps = getCapabilities();
|
||||
const [expanded, setExpanded] = useState(isExpanded);
|
||||
|
||||
const railV = caps.unicodeOK ? '│' : '|';
|
||||
const checkmark = caps.unicodeOK ? '✓' : '+';
|
||||
const crossmark = caps.unicodeOK ? '✗' : 'X';
|
||||
|
||||
// Collapsed view
|
||||
if (!expanded) {
|
||||
return h(Box, { flexDirection: 'row' },
|
||||
h(Text, { color: colors.muted, bold: true }, '🖥️ Desktop: '),
|
||||
h(Text, { color: colors.fg }, foregroundApp || 'Unknown'),
|
||||
interactiveElements.length > 0
|
||||
? h(Text, { color: colors.muted }, ` (${interactiveElements.length} elements)`)
|
||||
: null
|
||||
);
|
||||
}
|
||||
|
||||
// Expanded view
|
||||
return h(Box, { flexDirection: 'column', width },
|
||||
// Header
|
||||
h(Text, { color: colors.accent, bold: true }, '🖥️ Desktop Inspector'),
|
||||
|
||||
// Foreground app
|
||||
h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'App: '),
|
||||
h(Text, { color: colors.fg }, foregroundApp || 'Unknown')
|
||||
),
|
||||
|
||||
// Cursor position
|
||||
cursorPosition ? h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Cursor: '),
|
||||
h(Text, { color: colors.muted }, `(${cursorPosition.x}, ${cursorPosition.y})`)
|
||||
) : null,
|
||||
|
||||
// Running apps (first 5)
|
||||
runningApps.length > 0 ? h(Box, { flexDirection: 'column', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Apps:'),
|
||||
...runningApps.slice(0, 5).map((app, i) =>
|
||||
h(Text, { key: i, color: colors.muted, dimColor: true }, ` ${i + 1}. ${app}`)
|
||||
),
|
||||
runningApps.length > 5
|
||||
? h(Text, { color: colors.muted, dimColor: true }, ` +${runningApps.length - 5} more`)
|
||||
: null
|
||||
) : null,
|
||||
|
||||
// Last screenshot path
|
||||
lastScreenshot ? h(Box, { flexDirection: 'column', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Screenshot:'),
|
||||
h(Text, { color: colors.muted, dimColor: true, wrap: 'truncate' }, lastScreenshot)
|
||||
) : null,
|
||||
|
||||
// Interactive elements (first 5)
|
||||
interactiveElements.length > 0 ? h(Box, { flexDirection: 'column', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Elements:'),
|
||||
...interactiveElements.slice(0, 5).map((el, i) =>
|
||||
h(Text, { key: i, color: colors.muted, dimColor: true },
|
||||
` [${el.id || i}] ${el.type}: ${(el.text || '').slice(0, 20)}`
|
||||
)
|
||||
),
|
||||
interactiveElements.length > 5
|
||||
? h(Text, { color: colors.muted, dimColor: true }, ` +${interactiveElements.length - 5} more`)
|
||||
: null
|
||||
) : null,
|
||||
|
||||
// Last verification
|
||||
lastVerification ? h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: lastVerification.passed ? colors.success : colors.error },
|
||||
lastVerification.passed ? checkmark : crossmark
|
||||
),
|
||||
h(Text, { color: colors.muted }, ` Verify: ${lastVerification.message || ''}`)
|
||||
) : null
|
||||
);
|
||||
};
|
||||
|
||||
export default DesktopInspector;
|
||||
export { DesktopInspector };
|
||||
Reference in New Issue
Block a user