Release v1.01 Enhanced: Vi Control, TUI Gen5, Core Stability
This commit is contained in:
117
bin/ui/components/ServerInspector.mjs
Normal file
117
bin/ui/components/ServerInspector.mjs
Normal file
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* Server Inspector - Ops Console
|
||||
*
|
||||
* Shows: host, cwd, env, command queue, log tail
|
||||
*
|
||||
* Credit: Based on ops console patterns
|
||||
*/
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* Server Inspector Component
|
||||
*/
|
||||
const ServerInspector = ({
|
||||
host = null,
|
||||
user = null,
|
||||
cwd = null,
|
||||
env = {},
|
||||
commandQueue = [],
|
||||
logTail = [],
|
||||
lastExitCode = null,
|
||||
healthStatus = null,
|
||||
isExpanded = false,
|
||||
width = 40
|
||||
}) => {
|
||||
const caps = getCapabilities();
|
||||
const [expanded, setExpanded] = useState(isExpanded);
|
||||
|
||||
const checkmark = caps.unicodeOK ? '✓' : '+';
|
||||
const crossmark = caps.unicodeOK ? '✗' : 'X';
|
||||
|
||||
// Collapsed view
|
||||
if (!expanded) {
|
||||
const statusIcon = healthStatus === 'healthy' ? checkmark :
|
||||
healthStatus === 'unhealthy' ? crossmark : '?';
|
||||
const statusColor = healthStatus === 'healthy' ? colors.success :
|
||||
healthStatus === 'unhealthy' ? colors.error : colors.muted;
|
||||
|
||||
return h(Box, { flexDirection: 'row' },
|
||||
h(Text, { color: colors.muted, bold: true }, '🖥️ Server: '),
|
||||
h(Text, { color: colors.fg }, `${user || 'user'}@${host || 'localhost'}`),
|
||||
h(Text, { color: statusColor }, ` ${statusIcon}`)
|
||||
);
|
||||
}
|
||||
|
||||
// Expanded view
|
||||
return h(Box, { flexDirection: 'column', width },
|
||||
// Header
|
||||
h(Text, { color: colors.accent, bold: true }, '🖥️ Server Inspector'),
|
||||
|
||||
// Connection
|
||||
h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Host: '),
|
||||
h(Text, { color: colors.fg }, `${user || 'user'}@${host || 'localhost'}`)
|
||||
),
|
||||
|
||||
// CWD
|
||||
cwd ? h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'CWD: '),
|
||||
h(Text, { color: colors.muted, dimColor: true }, cwd)
|
||||
) : null,
|
||||
|
||||
// Environment (if any interesting vars)
|
||||
Object.keys(env).length > 0 ? h(Box, { flexDirection: 'column', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Env:'),
|
||||
...Object.entries(env).slice(0, 3).map(([k, v], i) =>
|
||||
h(Text, { key: i, color: colors.muted, dimColor: true },
|
||||
` ${k}=${String(v).slice(0, 20)}`
|
||||
)
|
||||
)
|
||||
) : null,
|
||||
|
||||
// Command queue
|
||||
commandQueue.length > 0 ? h(Box, { flexDirection: 'column', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, `Queue (${commandQueue.length}):`),
|
||||
...commandQueue.slice(0, 3).map((cmd, i) =>
|
||||
h(Text, { key: i, color: colors.muted, dimColor: true },
|
||||
` ${i + 1}. ${cmd.slice(0, width - 8)}`
|
||||
)
|
||||
)
|
||||
) : null,
|
||||
|
||||
// Log tail (last 5 lines)
|
||||
logTail.length > 0 ? h(Box, { flexDirection: 'column', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Logs:'),
|
||||
...logTail.slice(-5).map((line, i) =>
|
||||
h(Text, { key: i, color: colors.muted, dimColor: true },
|
||||
` ${line.slice(0, width - 4)}`
|
||||
)
|
||||
)
|
||||
) : null,
|
||||
|
||||
// Last exit code
|
||||
lastExitCode !== null ? h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: lastExitCode === 0 ? colors.success : colors.error },
|
||||
lastExitCode === 0 ? checkmark : crossmark
|
||||
),
|
||||
h(Text, { color: colors.muted }, ` Exit: ${lastExitCode}`)
|
||||
) : null,
|
||||
|
||||
// Health status
|
||||
healthStatus ? h(Box, { flexDirection: 'row', paddingLeft: 1 },
|
||||
h(Text, { color: colors.muted }, 'Health: '),
|
||||
h(Text, { color: healthStatus === 'healthy' ? colors.success : colors.error },
|
||||
healthStatus
|
||||
)
|
||||
) : null
|
||||
);
|
||||
};
|
||||
|
||||
export default ServerInspector;
|
||||
export { ServerInspector };
|
||||
Reference in New Issue
Block a user