UNPKG

@nanocollective/nanocoder

Version:

A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter

105 lines 6.08 kB
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import { Box, Text, useInput } from 'ink'; import SelectInput from 'ink-select-input'; import { getColors } from '../../config/index.js'; import { useResponsiveTerminal } from '../../hooks/useTerminalWidth.js'; // Helper function to get transport icon function getTransportIcon(transport) { switch (transport) { case 'stdio': return '[STDIO]'; // Full name for stdio transport case 'http': return '[HTTP]'; // Full name for http transport case 'websocket': return '[WEBSOCKET]'; // Full name for websocket transport default: return '[UNKNOWN]'; // Unknown transport } } // Helper function to get connection details based on transport type function getConnectionDetails(server) { const details = []; // Always show transport type details.push({ label: 'Transport', value: server.transport || 'unknown', }); // Show connection details based on transport type if (server.transport === 'stdio') { const command = server.command || ''; const args = server.args?.join(' ') || ''; details.push({ label: 'Cmd', value: `${command} ${args}`.trim(), }); } else if (server.transport === 'http' || server.transport === 'websocket') { if (server.url) { details.push({ label: server.transport === 'http' ? 'URL' : 'WS URL', value: server.url, }); } // Show timeout for remote servers if specified if (server.timeout) { details.push({ label: 'Timeout', value: `${server.timeout / 1000}s`, }); } } // Show environment variables if present if (server.env && Object.keys(server.env).length > 0) { details.push({ label: 'Env', value: Object.keys(server.env).join(', '), }); } return details; } export function SummaryStep({ providerConfigPath, mcpConfigPath, providers, mcpServers, onSave, onAddProviders, onAddMcpServers, onCancel, onBack, }) { const colors = getColors(); const { isNarrow, truncatePath } = useResponsiveTerminal(); const options = [ { label: 'Save configuration', value: 'save' }, { label: 'Add more providers', value: 'add-providers' }, { label: 'Add more MCP servers', value: 'add-mcp' }, { label: 'Cancel (discard changes)', value: 'cancel' }, ]; const handleSelect = (item) => { switch (item.value) { case 'save': { onSave(); break; } case 'add-providers': { onAddProviders(); break; } case 'add-mcp': { onAddMcpServers(); break; } case 'cancel': { onCancel(); break; } } }; // Handle Shift+Tab to go back useInput((_input, key) => { if (key.shift && key.tab) { if (onBack) { onBack(); } } }); const serverNames = Object.keys(mcpServers); return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: colors.primary, children: "Configuration Summary" }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.secondary, children: '─'.repeat(isNarrow ? 30 : 60) }) }), _jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: colors.primary, children: "Configuration files:" }), _jsx(Text, { color: colors.success, children: isNarrow ? truncatePath(providerConfigPath, 40) : providerConfigPath }), _jsx(Text, { color: colors.success, children: isNarrow ? truncatePath(mcpConfigPath, 40) : mcpConfigPath })] }), _jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsxs(Text, { bold: true, color: colors.primary, children: ["Providers (", providers.length, "):"] }), providers.length === 0 ? (_jsx(Text, { color: colors.warning, children: " None" })) : (providers.map((provider, index) => (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsxs(Text, { children: ["\u2022 ", _jsx(Text, { color: colors.success, children: provider.name })] }), !isNarrow && provider.baseUrl && (_jsxs(Text, { dimColor: true, children: [" URL: ", provider.baseUrl] })), !isNarrow && (_jsxs(Text, { dimColor: true, children: ["Models: ", provider.models?.join(', ') || 'none'] }))] }, index))))] }), _jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsxs(Text, { bold: true, color: colors.primary, children: ["MCP Servers (", serverNames.length, "):"] }), serverNames.length === 0 ? (_jsx(Text, { color: colors.warning, children: " None" })) : (serverNames.map(name => { const server = mcpServers[name]; const transportIcon = getTransportIcon(server.transport || 'unknown'); const connectionDetails = getConnectionDetails(server); return (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsxs(Text, { children: ["\u2022 ", _jsx(Text, { color: colors.success, children: server.name }), ' ', transportIcon] }), !isNarrow && (_jsx(_Fragment, { children: connectionDetails.map((detail, index) => (_jsxs(Text, { dimColor: true, children: [detail.label, ": ", detail.value] }, index))) }))] }, name)); }))] }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.secondary, children: '─'.repeat(isNarrow ? 30 : 60) }) }), providers.length === 0 && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: colors.warning, children: ["! ", isNarrow ? 'No providers!' : 'Warning: No providers configured.'] }) })), _jsx(SelectInput, { items: options, onSelect: handleSelect })] })); } //# sourceMappingURL=summary-step.js.map