dexto 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -7
- package/dist/agents/agent-template.yml +2 -2
- package/dist/agents/coding-agent/coding-agent.yml +22 -16
- package/dist/agents/database-agent/database-agent.yml +2 -2
- package/dist/agents/default-agent.yml +7 -5
- package/dist/agents/github-agent/github-agent.yml +2 -2
- package/dist/agents/product-name-researcher/product-name-researcher.yml +2 -2
- package/dist/agents/talk2pdf-agent/talk2pdf-agent.yml +2 -2
- package/dist/analytics/events.d.ts +13 -6
- package/dist/analytics/events.d.ts.map +1 -1
- package/dist/analytics/index.d.ts +1 -1
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +6 -2
- package/dist/api/server-hono.d.ts.map +1 -1
- package/dist/api/server-hono.js +27 -5
- package/dist/cli/cli-subscriber.d.ts +4 -0
- package/dist/cli/cli-subscriber.d.ts.map +1 -1
- package/dist/cli/cli-subscriber.js +40 -2
- package/dist/cli/commands/create-app.d.ts +16 -14
- package/dist/cli/commands/create-app.d.ts.map +1 -1
- package/dist/cli/commands/create-app.js +626 -102
- package/dist/cli/commands/create-image.d.ts +7 -0
- package/dist/cli/commands/create-image.d.ts.map +1 -0
- package/dist/cli/commands/create-image.js +201 -0
- package/dist/cli/commands/helpers/formatters.js +7 -7
- package/dist/cli/commands/index.d.ts +2 -1
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -1
- package/dist/cli/commands/init-app.js +7 -7
- package/dist/cli/commands/install.d.ts +0 -3
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +10 -35
- package/dist/cli/commands/interactive-commands/command-parser.js +7 -7
- package/dist/cli/commands/interactive-commands/general-commands.js +1 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +11 -11
- package/dist/cli/commands/interactive-commands/system/system-commands.js +3 -3
- package/dist/cli/commands/list-agents.js +2 -2
- package/dist/cli/commands/session-commands.js +16 -16
- package/dist/cli/commands/setup.d.ts +13 -5
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +860 -65
- package/dist/cli/commands/which.js +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +2 -0
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.js +29 -7
- package/dist/cli/ink-cli/components/CustomInput.js +1 -1
- package/dist/cli/ink-cli/components/EditableMultiLineInput.js +4 -4
- package/dist/cli/ink-cli/components/ElicitationForm.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ElicitationForm.js +6 -6
- package/dist/cli/ink-cli/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ErrorBoundary.js +1 -1
- package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/Footer.js +1 -1
- package/dist/cli/ink-cli/components/HistorySearchBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/HistorySearchBar.js +1 -1
- package/dist/cli/ink-cli/components/MultiLineInput.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/MultiLineInput.js +3 -3
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ResourceAutocomplete.js +4 -4
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +3 -3
- package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/StatusBar.js +7 -5
- package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/TextBufferInput.js +6 -6
- package/dist/cli/ink-cli/components/base/BaseAutocomplete.js +4 -4
- package/dist/cli/ink-cli/components/base/BaseSelector.js +2 -2
- package/dist/cli/ink-cli/components/chat/Footer.js +1 -1
- package/dist/cli/ink-cli/components/chat/Header.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/Header.js +2 -4
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.js +5 -5
- package/dist/cli/ink-cli/components/chat/MessageList.js +1 -1
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.js +1 -1
- package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts +1 -1
- package/dist/cli/ink-cli/components/chat/ToolIcon.js +4 -4
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.js +2 -2
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.js +5 -5
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.js +2 -2
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.js +2 -2
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +1 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.js +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts +10 -2
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +198 -89
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +2 -2
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.js +2 -2
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.js +2 -2
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerList.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +5 -5
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +222 -68
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.js +2 -2
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.js +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.js +2 -2
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptList.js +2 -2
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.js +4 -4
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/StreamSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +12 -12
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts +25 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.js +609 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts +15 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.js +14 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +33 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +419 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts +25 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.js +29 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts +17 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.js +11 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts +20 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.js +10 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts +30 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.js +13 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts +8 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.js +7 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts +79 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.js +38 -0
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.js +2 -2
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +1 -1
- package/dist/cli/ink-cli/components/renderers/FileRenderer.js +4 -4
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +2 -2
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +1 -1
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.js +3 -3
- package/dist/cli/ink-cli/components/renderers/diff-shared.js +1 -1
- package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/shared/MarkdownText.js +8 -6
- package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/InputContainer.js +23 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.js +80 -24
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts +1 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.js +5 -1
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts +1 -1
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useCLIState.js +4 -2
- package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/processStream.js +77 -9
- package/dist/cli/ink-cli/state/types.d.ts +3 -2
- package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts +5 -0
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.js +59 -1
- package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/toolUtils.js +2 -0
- package/dist/cli/utils/api-key-setup.d.ts +54 -4
- package/dist/cli/utils/api-key-setup.d.ts.map +1 -1
- package/dist/cli/utils/api-key-setup.js +433 -107
- package/dist/cli/utils/api-key-verification.d.ts +17 -0
- package/dist/cli/utils/api-key-verification.d.ts.map +1 -0
- package/dist/cli/utils/api-key-verification.js +211 -0
- package/dist/cli/utils/config-validation.d.ts +22 -2
- package/dist/cli/utils/config-validation.d.ts.map +1 -1
- package/dist/cli/utils/config-validation.js +354 -25
- package/dist/cli/utils/local-model-setup.d.ts +46 -0
- package/dist/cli/utils/local-model-setup.d.ts.map +1 -0
- package/dist/cli/utils/local-model-setup.js +662 -0
- package/dist/cli/utils/options.js +1 -1
- package/dist/cli/utils/prompt-helpers.d.ts +47 -0
- package/dist/cli/utils/prompt-helpers.d.ts.map +1 -0
- package/dist/cli/utils/prompt-helpers.js +66 -0
- package/dist/cli/utils/provider-setup.d.ts +66 -8
- package/dist/cli/utils/provider-setup.d.ts.map +1 -1
- package/dist/cli/utils/provider-setup.js +324 -84
- package/dist/cli/utils/scaffolding-utils.d.ts +76 -0
- package/dist/cli/utils/scaffolding-utils.d.ts.map +1 -0
- package/dist/cli/utils/scaffolding-utils.js +246 -0
- package/dist/cli/utils/setup-utils.d.ts +16 -0
- package/dist/cli/utils/setup-utils.d.ts.map +1 -1
- package/dist/cli/utils/setup-utils.js +72 -21
- package/dist/cli/utils/template-engine.d.ts +65 -0
- package/dist/cli/utils/template-engine.d.ts.map +1 -0
- package/dist/cli/utils/template-engine.js +1089 -0
- package/dist/config/cli-overrides.d.ts +44 -1
- package/dist/config/cli-overrides.d.ts.map +1 -1
- package/dist/config/cli-overrides.js +102 -0
- package/dist/index.js +315 -53
- package/dist/webui/assets/index-8j-KMkX1.js +2054 -0
- package/dist/webui/assets/index-c_AX24V4.css +1 -0
- package/dist/webui/index.html +3 -9
- package/dist/webui/logos/aws-color.svg +1 -0
- package/dist/webui/logos/dexto/dexto_logo.svg +1 -1
- package/dist/webui/logos/dexto/dexto_logo_light.svg +6 -6
- package/dist/webui/logos/glama.svg +7 -0
- package/dist/webui/logos/litellm.svg +7 -0
- package/dist/webui/logos/openrouter.svg +1 -0
- package/package.json +8 -7
- package/dist/webui/assets/index-BkwPkZpd.css +0 -1
- package/dist/webui/assets/index-D9u1XfyH.js +0 -2025
|
@@ -56,7 +56,7 @@ export const MessageItem = memo(({ message }) => {
|
|
|
56
56
|
const data = message.styledData;
|
|
57
57
|
const durationStr = formatDuration(data.durationMs);
|
|
58
58
|
const tokensStr = data.outputTokens > 0 ? `, Used ${data.outputTokens} tokens` : '';
|
|
59
|
-
return (_jsx(Box, { marginTop: 1, marginBottom: 1, width: "100%", children: _jsxs(Text, { color: "gray",
|
|
59
|
+
return (_jsx(Box, { marginTop: 1, marginBottom: 1, width: "100%", children: _jsxs(Text, { color: "gray", children: ["\u2500 Worked for ", durationStr, tokensStr, " \u2500"] }) }));
|
|
60
60
|
}
|
|
61
61
|
case 'shortcuts':
|
|
62
62
|
return _jsx(ShortcutsBox, { data: message.styledData });
|
|
@@ -66,7 +66,7 @@ export const MessageItem = memo(({ message }) => {
|
|
|
66
66
|
}
|
|
67
67
|
// User message: '>' prefix with gray background
|
|
68
68
|
if (message.role === 'user') {
|
|
69
|
-
return (_jsx(Box, { flexDirection: "column", marginTop: 2, marginBottom: 1, width: "100%", children: _jsxs(Box, { flexDirection: "row", paddingX: 1, backgroundColor: "gray", children: [_jsx(Text, { color: "green",
|
|
69
|
+
return (_jsx(Box, { flexDirection: "column", marginTop: 2, marginBottom: 1, width: "100%", children: _jsxs(Box, { flexDirection: "row", paddingX: 1, backgroundColor: "gray", children: [_jsx(Text, { color: "green", children: '> ' }), _jsx(Text, { color: "white", wrap: "wrap", children: message.content })] }) }));
|
|
70
70
|
}
|
|
71
71
|
// Assistant message: Gray circle indicator (unless continuation)
|
|
72
72
|
// IMPORTANT: width="100%" is required to prevent Ink layout failures on large content.
|
|
@@ -83,7 +83,7 @@ export const MessageItem = memo(({ message }) => {
|
|
|
83
83
|
return (_jsx(Box, { flexDirection: "column", marginTop: 1, width: "100%", children: _jsx(MarkdownText, { bulletPrefix: "\u23FA ", children: message.content || '' }) }));
|
|
84
84
|
}
|
|
85
85
|
// Tool message: Animated icon based on status
|
|
86
|
-
// - Running:
|
|
86
|
+
// - Running: green spinner + "Running..."
|
|
87
87
|
// - Finished (success): green dot
|
|
88
88
|
// - Finished (error): red dot
|
|
89
89
|
if (message.role === 'tool') {
|
|
@@ -95,10 +95,10 @@ export const MessageItem = memo(({ message }) => {
|
|
|
95
95
|
const parenIndex = message.content.indexOf('(');
|
|
96
96
|
const toolName = parenIndex > 0 ? message.content.slice(0, parenIndex) : message.content;
|
|
97
97
|
const toolArgs = parenIndex > 0 ? message.content.slice(parenIndex) : '';
|
|
98
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, width: "100%", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(ToolIcon, { status: message.toolStatus || 'finished', isError: message.isError ?? false }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { bold: true, children: toolName }), _jsx(Text, { children: toolArgs }), isRunning && _jsx(Text, { color: "
|
|
98
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, width: "100%", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(ToolIcon, { status: message.toolStatus || 'finished', isError: message.isError ?? false }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { bold: true, children: toolName }), _jsx(Text, { children: toolArgs }), isRunning && _jsx(Text, { color: "green", children: " Running..." }), isPending && _jsx(Text, { color: "yellowBright", children: " Waiting..." })] }) })] }), hasStructuredDisplay ? (_jsx(ToolResultRenderer, { display: message.toolDisplayData, content: message.toolContent })) : (message.toolResult && (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { color: "gray", children: [" \u23BF ", message.toolResult] }) })))] }));
|
|
99
99
|
}
|
|
100
100
|
// System message: Compact gray text
|
|
101
|
-
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, width: "100%", children: _jsx(Text, { color: "gray",
|
|
101
|
+
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, width: "100%", children: _jsx(Text, { color: "gray", children: message.content }) }));
|
|
102
102
|
},
|
|
103
103
|
// Custom comparator: only re-render if message content actually changed
|
|
104
104
|
(prev, next) => {
|
|
@@ -16,5 +16,5 @@ export function MessageList({ messages, maxVisible = 50 }) {
|
|
|
16
16
|
return messages.slice(-maxVisible);
|
|
17
17
|
}, [messages, maxVisible]);
|
|
18
18
|
const hasMoreMessages = messages.length > maxVisible;
|
|
19
|
-
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: [hasMoreMessages && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: "gray",
|
|
19
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: [hasMoreMessages && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: "gray", children: ["... (", messages.length - maxVisible, " earlier messages hidden)"] }) })), visibleMessages.length === 0 && (_jsx(Box, { marginY: 2, children: _jsx(Text, { color: "greenBright", children: "Welcome to Dexto CLI! Type your message below or use /help for commands." }) })), visibleMessages.map((msg) => (_jsx(MessageItem, { message: msg }, msg.id)))] }));
|
|
20
20
|
}
|
|
@@ -23,5 +23,5 @@ function truncateText(text, maxLength = 60) {
|
|
|
23
23
|
export function QueuedMessagesDisplay({ messages }) {
|
|
24
24
|
if (messages.length === 0)
|
|
25
25
|
return null;
|
|
26
|
-
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsxs(Text, {
|
|
26
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsxs(Text, { color: "gray", children: [messages.length, " message", messages.length !== 1 ? 's' : '', " queued"] }), _jsx(Text, { color: "gray", children: " \u2022 " }), _jsx(Text, { color: "gray", children: "\u2191 to edit" })] }), messages.map((message, index) => (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: "gray", children: index === messages.length - 1 ? '↳ ' : '│ ' }), _jsx(Text, { color: "gray", italic: true, children: truncateText(getMessageText(message.content)) })] }, message.id)))] }));
|
|
27
27
|
}
|
|
@@ -9,7 +9,7 @@ interface ToolIconProps {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Animated tool icon that changes based on execution status
|
|
12
|
-
* - Running: Animated spinner (
|
|
12
|
+
* - Running: Animated spinner (green/teal)
|
|
13
13
|
* - Finished (success): Green dot
|
|
14
14
|
* - Finished (error): Red dot
|
|
15
15
|
*/
|
|
@@ -9,7 +9,7 @@ import { Text } from 'ink';
|
|
|
9
9
|
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
10
10
|
/**
|
|
11
11
|
* Animated tool icon that changes based on execution status
|
|
12
|
-
* - Running: Animated spinner (
|
|
12
|
+
* - Running: Animated spinner (green/teal)
|
|
13
13
|
* - Finished (success): Green dot
|
|
14
14
|
* - Finished (error): Red dot
|
|
15
15
|
*/
|
|
@@ -29,9 +29,9 @@ export function ToolIcon({ status, isError }) {
|
|
|
29
29
|
if (status === 'pending') {
|
|
30
30
|
return _jsx(Text, { color: "gray", children: "\u25CF " });
|
|
31
31
|
}
|
|
32
|
-
// Pending approval: static
|
|
32
|
+
// Pending approval: static yellowBright dot (waiting for user)
|
|
33
33
|
if (status === 'pending_approval') {
|
|
34
|
-
return (_jsxs(Text, { color: "
|
|
34
|
+
return (_jsxs(Text, { color: "yellowBright", bold: true, children: ["\u25CF", ' '] }));
|
|
35
35
|
}
|
|
36
36
|
if (status === 'finished') {
|
|
37
37
|
// Error state: red dot
|
|
@@ -42,5 +42,5 @@ export function ToolIcon({ status, isError }) {
|
|
|
42
42
|
return (_jsxs(Text, { color: "green", bold: true, children: ["\u25CF", ' '] }));
|
|
43
43
|
}
|
|
44
44
|
// Running state with spinner
|
|
45
|
-
return (_jsxs(Text, { color: "
|
|
45
|
+
return (_jsxs(Text, { color: "green", bold: true, children: [SPINNER_FRAMES[frame], ' '] }));
|
|
46
46
|
}
|
|
@@ -2,5 +2,5 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import { StyledBox, StyledSection, StyledRow } from './StyledBox.js';
|
|
4
4
|
export function ConfigBox({ data }) {
|
|
5
|
-
return (_jsxs(StyledBox, { title: "Runtime Configuration", titleColor: "cyan", children: [data.configFilePath && (_jsxs(Box, { children: [_jsx(Text, {
|
|
5
|
+
return (_jsxs(StyledBox, { title: "Runtime Configuration", titleColor: "cyan", children: [data.configFilePath && (_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Agent config: " }), _jsx(Text, { color: "blue", children: data.configFilePath })] })), _jsxs(StyledSection, { title: "LLM", children: [_jsx(StyledRow, { label: "Provider", value: data.provider }), _jsx(StyledRow, { label: "Model", value: data.model }), data.maxTokens !== null && (_jsx(StyledRow, { label: "Max Tokens", value: data.maxTokens.toString() })), data.temperature !== null && (_jsx(StyledRow, { label: "Temperature", value: data.temperature.toString() }))] }), _jsx(StyledSection, { title: "Tool Confirmation", children: _jsx(StyledRow, { label: "Mode", value: data.toolConfirmationMode }) }), _jsxs(StyledSection, { title: "Sessions", children: [_jsx(StyledRow, { label: "Max Sessions", value: data.maxSessions }), _jsx(StyledRow, { label: "Session TTL", value: data.sessionTTL })] }), _jsx(StyledSection, { title: "MCP Servers", children: data.mcpServers.length > 0 ? (data.mcpServers.map((server) => (_jsx(Box, { children: _jsx(Text, { color: "cyan", children: server }) }, server)))) : (_jsx(Text, { color: "gray", children: "No MCP servers configured" })) }), data.promptsCount > 0 && (_jsx(StyledSection, { title: "Prompts", children: _jsxs(Text, { color: "gray", children: [data.promptsCount, " prompt(s) configured"] }) })), data.pluginsEnabled.length > 0 && (_jsx(StyledSection, { title: "Plugins", children: data.pluginsEnabled.map((plugin) => (_jsx(Box, { children: _jsx(Text, { color: "green", children: plugin }) }, plugin))) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", italic: true, children: "Note: Some fields (logs, database paths) are auto-populated by the CLI." }) })] }));
|
|
6
6
|
}
|
|
@@ -11,5 +11,5 @@ export function HelpBox({ data }) {
|
|
|
11
11
|
acc[cat].push(cmd);
|
|
12
12
|
return acc;
|
|
13
13
|
}, {});
|
|
14
|
-
return (_jsx(StyledBox, { title: "Available Commands", children: Object.entries(categories).map(([category, commands]) => (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true,
|
|
14
|
+
return (_jsx(StyledBox, { title: "Available Commands", children: Object.entries(categories).map(([category, commands]) => (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, color: "gray", children: category }), commands.map((cmd) => (_jsxs(Box, { marginLeft: 2, children: [_jsx(Box, { width: 16, children: _jsxs(Text, { color: "cyan", children: ["/", cmd.name] }) }), _jsx(Text, { color: "gray", children: cmd.description })] }, cmd.name)))] }, category))) }));
|
|
15
15
|
}
|
|
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import { StyledBox, StyledRow, StyledListItem } from './StyledBox.js';
|
|
4
4
|
export function LogConfigBox({ data }) {
|
|
5
|
-
return (_jsxs(StyledBox, { title: "Logging Configuration", children: [_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(StyledRow, { label: "Current level", value: data.currentLevel, valueColor: "green" }), data.logFile && _jsx(StyledRow, { label: "Log file", value: data.logFile })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, {
|
|
5
|
+
return (_jsxs(StyledBox, { title: "Logging Configuration", children: [_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(StyledRow, { label: "Current level", value: data.currentLevel, valueColor: "green" }), data.logFile && _jsx(StyledRow, { label: "Log file", value: data.logFile })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "gray", children: "Available levels (least to most verbose):" }), data.availableLevels.map((level) => {
|
|
6
6
|
const isCurrent = level === data.currentLevel;
|
|
7
7
|
return (_jsx(StyledListItem, { icon: isCurrent ? '>' : ' ', text: level, isActive: isCurrent }, level));
|
|
8
|
-
})] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, {
|
|
8
|
+
})] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Use /log <level> to change level" }) })] }));
|
|
9
9
|
}
|
|
@@ -19,19 +19,19 @@ function getRoleStyle(role) {
|
|
|
19
19
|
case 'assistant':
|
|
20
20
|
return { color: 'green', icon: '|' };
|
|
21
21
|
case 'system':
|
|
22
|
-
return { color: '
|
|
22
|
+
return { color: 'orange', icon: '#' };
|
|
23
23
|
case 'tool':
|
|
24
|
-
return { color: '
|
|
24
|
+
return { color: 'green', icon: '*' };
|
|
25
25
|
default:
|
|
26
26
|
return { color: 'white', icon: '-' };
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
export function SessionHistoryBox({ data }) {
|
|
30
30
|
if (data.messages.length === 0) {
|
|
31
|
-
return (_jsx(StyledBox, { title: `Session History: ${data.sessionId.slice(0, 8)}`, children: _jsx(Box, { marginTop: 1, children: _jsx(Text, {
|
|
31
|
+
return (_jsx(StyledBox, { title: `Session History: ${data.sessionId.slice(0, 8)}`, children: _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "No messages in this session yet." }) }) }));
|
|
32
32
|
}
|
|
33
33
|
return (_jsxs(StyledBox, { title: `Session History: ${data.sessionId.slice(0, 8)}`, children: [data.messages.map((msg, index) => {
|
|
34
34
|
const style = getRoleStyle(msg.role);
|
|
35
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: index === 0 ? 1 : 0, children: [_jsxs(Box, { children: [_jsxs(Text, { color: style.color, bold: true, children: [style.icon, ' '] }), _jsxs(Text, { color: style.color, children: ["[", msg.role, "]"] }), _jsxs(Text, {
|
|
36
|
-
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, {
|
|
35
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: index === 0 ? 1 : 0, children: [_jsxs(Box, { children: [_jsxs(Text, { color: style.color, bold: true, children: [style.icon, ' '] }), _jsxs(Text, { color: style.color, children: ["[", msg.role, "]"] }), _jsxs(Text, { color: "gray", children: [" ", msg.timestamp] })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { children: truncateContent(msg.content) }) })] }, index));
|
|
36
|
+
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["Total: ", data.total, " messages"] }) })] }));
|
|
37
37
|
}
|
|
@@ -3,7 +3,7 @@ import { Box, Text } from 'ink';
|
|
|
3
3
|
import { StyledBox } from './StyledBox.js';
|
|
4
4
|
export function SessionListBox({ data }) {
|
|
5
5
|
if (data.sessions.length === 0) {
|
|
6
|
-
return (_jsxs(StyledBox, { title: "Sessions", children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, {
|
|
6
|
+
return (_jsxs(StyledBox, { title: "Sessions", children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "No sessions found." }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Run `dexto` to start a new session." }) })] }));
|
|
7
7
|
}
|
|
8
|
-
return (_jsxs(StyledBox, { title: "Sessions", children: [data.sessions.map((session) => (_jsxs(Box, { marginTop: 1, children: [_jsx(Box, { width: 12, children: _jsxs(Text, { color: session.isCurrent ? 'green' : 'cyan', bold: session.isCurrent, children: [session.isCurrent ? '>' : ' ', " ", session.id.slice(0, 8)] }) }), _jsx(Box, { width: 14, children: _jsxs(Text, {
|
|
8
|
+
return (_jsxs(StyledBox, { title: "Sessions", children: [data.sessions.map((session) => (_jsxs(Box, { marginTop: 1, children: [_jsx(Box, { width: 12, children: _jsxs(Text, { color: session.isCurrent ? 'green' : 'cyan', bold: session.isCurrent, children: [session.isCurrent ? '>' : ' ', " ", session.id.slice(0, 8)] }) }), _jsx(Box, { width: 14, children: _jsxs(Text, { color: "gray", children: [session.messageCount, " messages"] }) }), _jsx(Text, { color: "gray", children: session.lastActive })] }, session.id))), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["Total: ", data.total, " sessions"] }) }), _jsx(Box, { children: _jsx(Text, { color: "gray", children: "Use /resume to switch sessions" }) })] }));
|
|
9
9
|
}
|
|
@@ -2,5 +2,5 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
3
|
import { StyledBox } from './StyledBox.js';
|
|
4
4
|
export function ShortcutsBox({ data }) {
|
|
5
|
-
return (_jsx(StyledBox, { title: "Keyboard Shortcuts", children: data.categories.map((category, catIndex) => (_jsxs(Box, { flexDirection: "column", marginTop: catIndex === 0 ? 0 : 1, children: [_jsx(Text, { bold: true, color: "
|
|
5
|
+
return (_jsx(StyledBox, { title: "Keyboard Shortcuts", children: data.categories.map((category, catIndex) => (_jsxs(Box, { flexDirection: "column", marginTop: catIndex === 0 ? 0 : 1, children: [_jsx(Text, { bold: true, color: "cyan", children: category.name }), category.shortcuts.map((shortcut) => (_jsxs(Box, { marginLeft: 2, children: [_jsx(Box, { width: 16, children: _jsx(Text, { color: "cyan", children: shortcut.keys }) }), _jsx(Text, { color: "gray", children: shortcut.description })] }, shortcut.keys)))] }, category.name))) }));
|
|
6
6
|
}
|
|
@@ -25,5 +25,5 @@ function formatCost(cost) {
|
|
|
25
25
|
return `$${cost.toFixed(2)}`;
|
|
26
26
|
}
|
|
27
27
|
export function StatsBox({ data }) {
|
|
28
|
-
return (_jsxs(StyledBox, { title: "System Statistics", children: [_jsxs(StyledSection, { title: "Sessions", children: [_jsx(StyledRow, { label: "Total Sessions", value: data.sessions.total.toString() }), _jsx(StyledRow, { label: "In Memory", value: data.sessions.inMemory.toString() }), _jsx(StyledRow, { label: "Max Allowed", value: data.sessions.maxAllowed.toString() })] }), _jsxs(StyledSection, { title: "MCP Servers", children: [_jsx(StyledRow, { label: "Connected", value: data.mcp.connected.toString(), valueColor: "green" }), data.mcp.failed > 0 && (_jsx(StyledRow, { label: "Failed", value: data.mcp.failed.toString(), valueColor: "red" })), _jsx(StyledRow, { label: "Available Tools", value: data.mcp.toolCount.toString() })] }), data.tokenUsage && (_jsxs(StyledSection, { title: "Token Usage (This Session)", children: [_jsx(StyledRow, { label: "Input", value: formatTokenCount(data.tokenUsage.inputTokens) }), _jsx(StyledRow, { label: "Output", value: formatTokenCount(data.tokenUsage.outputTokens) }), data.tokenUsage.reasoningTokens > 0 && (_jsx(StyledRow, { label: "Reasoning", value: formatTokenCount(data.tokenUsage.reasoningTokens) })), data.tokenUsage.cacheReadTokens > 0 && (_jsx(StyledRow, { label: "Cache Read", value: formatTokenCount(data.tokenUsage.cacheReadTokens), valueColor: "cyan" })), data.tokenUsage.cacheWriteTokens > 0 && (_jsx(StyledRow, { label: "Cache Write", value: formatTokenCount(data.tokenUsage.cacheWriteTokens), valueColor: "
|
|
28
|
+
return (_jsxs(StyledBox, { title: "System Statistics", children: [_jsxs(StyledSection, { title: "Sessions", children: [_jsx(StyledRow, { label: "Total Sessions", value: data.sessions.total.toString() }), _jsx(StyledRow, { label: "In Memory", value: data.sessions.inMemory.toString() }), _jsx(StyledRow, { label: "Max Allowed", value: data.sessions.maxAllowed.toString() })] }), _jsxs(StyledSection, { title: "MCP Servers", children: [_jsx(StyledRow, { label: "Connected", value: data.mcp.connected.toString(), valueColor: "green" }), data.mcp.failed > 0 && (_jsx(StyledRow, { label: "Failed", value: data.mcp.failed.toString(), valueColor: "red" })), _jsx(StyledRow, { label: "Available Tools", value: data.mcp.toolCount.toString() })] }), data.tokenUsage && (_jsxs(StyledSection, { title: "Token Usage (This Session)", children: [_jsx(StyledRow, { label: "Input", value: formatTokenCount(data.tokenUsage.inputTokens) }), _jsx(StyledRow, { label: "Output", value: formatTokenCount(data.tokenUsage.outputTokens) }), data.tokenUsage.reasoningTokens > 0 && (_jsx(StyledRow, { label: "Reasoning", value: formatTokenCount(data.tokenUsage.reasoningTokens) })), data.tokenUsage.cacheReadTokens > 0 && (_jsx(StyledRow, { label: "Cache Read", value: formatTokenCount(data.tokenUsage.cacheReadTokens), valueColor: "cyan" })), data.tokenUsage.cacheWriteTokens > 0 && (_jsx(StyledRow, { label: "Cache Write", value: formatTokenCount(data.tokenUsage.cacheWriteTokens), valueColor: "orange" })), _jsx(StyledRow, { label: "Total", value: formatTokenCount(data.tokenUsage.totalTokens), valueColor: "blue" }), data.estimatedCost !== undefined && (_jsx(StyledRow, { label: "Est. Cost", value: formatCost(data.estimatedCost), valueColor: "green" }))] }))] }));
|
|
29
29
|
}
|
|
@@ -19,7 +19,7 @@ export function StyledSection({ title, icon, children }) {
|
|
|
19
19
|
* Key-value row within a section
|
|
20
20
|
*/
|
|
21
21
|
export function StyledRow({ label, value, valueColor = 'cyan' }) {
|
|
22
|
-
return (_jsxs(Box, { children: [_jsxs(Text, {
|
|
22
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: "gray", children: [label, ": "] }), _jsx(Text, { color: valueColor, children: value })] }));
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* List item with optional icon and active state
|
|
@@ -32,7 +32,7 @@ export function StyledListItem({ icon, text, isActive, dimmed }) {
|
|
|
32
32
|
textProps.bold = true;
|
|
33
33
|
}
|
|
34
34
|
if (dimmed) {
|
|
35
|
-
textProps.
|
|
35
|
+
textProps.color = 'gray';
|
|
36
36
|
}
|
|
37
37
|
return (_jsxs(Box, { children: [icon && _jsxs(Text, { ...textProps, children: [icon, " "] }), _jsx(Text, { ...textProps, children: text })] }));
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlternateBufferCLI.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/modes/AlternateBufferCLI.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA2BjE,UAAU,uBAAuB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,YAAmB,GACtB,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"AlternateBufferCLI.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/modes/AlternateBufferCLI.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA2BjE,UAAU,uBAAuB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,YAAmB,GACtB,EAAE,uBAAuB,2CAgTzB"}
|
|
@@ -162,5 +162,5 @@ export function AlternateBufferCLI({ agent, initialSessionId, startupInfo, onSel
|
|
|
162
162
|
return 'header';
|
|
163
163
|
return item.message.id;
|
|
164
164
|
}, []);
|
|
165
|
-
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Box, { ref: listContainerRef, flexGrow: 1, flexShrink: 1, minHeight: 0, children: _jsx(VirtualizedList, { ref: listRef, data: listData, renderItem: renderListItem, estimatedItemHeight: estimateItemHeight, keyExtractor: getItemKey, initialScrollIndex: SCROLL_TO_ITEM_END, initialScrollOffsetInIndex: SCROLL_TO_ITEM_END }) }), _jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(StatusBar, { agent: agent, isProcessing: ui.isProcessing, isThinking: ui.isThinking, approvalQueueCount: approvalQueue.length, copyModeEnabled: ui.copyModeEnabled, isAwaitingApproval: approval !== null }), selectionHintVisible && (_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "
|
|
165
|
+
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Box, { ref: listContainerRef, flexGrow: 1, flexShrink: 1, minHeight: 0, children: _jsx(VirtualizedList, { ref: listRef, data: listData, renderItem: renderListItem, estimatedItemHeight: estimateItemHeight, keyExtractor: getItemKey, initialScrollIndex: SCROLL_TO_ITEM_END, initialScrollOffsetInIndex: SCROLL_TO_ITEM_END }) }), _jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(StatusBar, { agent: agent, isProcessing: ui.isProcessing, isThinking: ui.isThinking, approvalQueueCount: approvalQueue.length, copyModeEnabled: ui.copyModeEnabled, isAwaitingApproval: approval !== null }), selectionHintVisible && (_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "yellowBright", children: "\uD83D\uDCA1 Tip: Hold Option (\u2325) and click to select text, or press Ctrl+S to toggle copy mode" }) })), _jsx(QueuedMessagesDisplay, { messages: queuedMessages }), _jsx(InputContainer, { ref: inputContainerRef, buffer: buffer, input: input, ui: ui, session: session, approval: approval, queuedMessages: queuedMessages, setInput: setInput, setUi: setUi, setSession: setSession, setMessages: setMessages, setPendingMessages: setPendingMessages, setDequeuedBuffer: setDequeuedBuffer, setQueuedMessages: setQueuedMessages, setApproval: setApproval, setApprovalQueue: setApprovalQueue, agent: agent, inputService: inputService, onKeyboardScroll: handleKeyboardScroll, useStreaming: useStreaming }), _jsx(OverlayContainer, { ref: overlayContainerRef, ui: ui, input: input, session: session, approval: approval, setInput: setInput, setUi: setUi, setSession: setSession, setMessages: setMessages, setApproval: setApproval, setApprovalQueue: setApprovalQueue, agent: agent, inputService: inputService, buffer: buffer, onSubmitPromptCommand: handleSubmitPromptCommand }), ui.exitWarningShown && (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: "yellowBright", bold: true, children: "\u26A0 Press Ctrl+C again to exit" }), _jsx(Text, { color: "gray", children: " (or press any key to cancel)" })] })), _jsx(Footer, { modelName: session.modelName, cwd: process.cwd(), autoApproveEdits: ui.autoApproveEdits }), ui.historySearch.isActive && (_jsx(HistorySearchBar, { query: ui.historySearch.query, hasMatch: historySearchHasMatch }))] })] }));
|
|
166
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StaticCLI.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/modes/StaticCLI.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAkBxD,UAAU,cAAc;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,YAAmB,GACtB,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"StaticCLI.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/modes/StaticCLI.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAkBxD,UAAU,cAAc;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,YAAmB,GACtB,EAAE,cAAc,2CA2MhB"}
|
|
@@ -91,5 +91,5 @@ export function StaticCLI({ agent, initialSessionId, startupInfo, useStreaming =
|
|
|
91
91
|
];
|
|
92
92
|
return items;
|
|
93
93
|
}, [visibleMessages, session.modelName, session.id, session.hasActiveSession, startupInfo]);
|
|
94
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: staticItems, children: (item) => item }, staticRemountKey), pendingMessages.map((message) => (_jsx(MessageItem, { message: message }, message.id))), dequeuedBuffer.map((message) => (_jsx(MessageItem, { message: message }, message.id))), _jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(StatusBar, { agent: agent, isProcessing: ui.isProcessing, isThinking: ui.isThinking, approvalQueueCount: approvalQueue.length, copyModeEnabled: ui.copyModeEnabled, isAwaitingApproval: approval !== null }), _jsx(QueuedMessagesDisplay, { messages: queuedMessages }), _jsx(InputContainer, { ref: inputContainerRef, buffer: buffer, input: input, ui: ui, session: session, approval: approval, queuedMessages: queuedMessages, setInput: setInput, setUi: setUi, setSession: setSession, setMessages: setMessages, setPendingMessages: setPendingMessages, setDequeuedBuffer: setDequeuedBuffer, setQueuedMessages: setQueuedMessages, setApproval: setApproval, setApprovalQueue: setApprovalQueue, agent: agent, inputService: inputService, useStreaming: useStreaming }), _jsx(OverlayContainer, { ref: overlayContainerRef, ui: ui, input: input, session: session, approval: approval, setInput: setInput, setUi: setUi, setSession: setSession, setMessages: setMessages, setApproval: setApproval, setApprovalQueue: setApprovalQueue, agent: agent, inputService: inputService, buffer: buffer, refreshStatic: refreshStatic, onSubmitPromptCommand: handleSubmitPromptCommand }), ui.exitWarningShown && (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: "
|
|
94
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: staticItems, children: (item) => item }, staticRemountKey), pendingMessages.map((message) => (_jsx(MessageItem, { message: message }, message.id))), dequeuedBuffer.map((message) => (_jsx(MessageItem, { message: message }, message.id))), _jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(StatusBar, { agent: agent, isProcessing: ui.isProcessing, isThinking: ui.isThinking, approvalQueueCount: approvalQueue.length, copyModeEnabled: ui.copyModeEnabled, isAwaitingApproval: approval !== null }), _jsx(QueuedMessagesDisplay, { messages: queuedMessages }), _jsx(InputContainer, { ref: inputContainerRef, buffer: buffer, input: input, ui: ui, session: session, approval: approval, queuedMessages: queuedMessages, setInput: setInput, setUi: setUi, setSession: setSession, setMessages: setMessages, setPendingMessages: setPendingMessages, setDequeuedBuffer: setDequeuedBuffer, setQueuedMessages: setQueuedMessages, setApproval: setApproval, setApprovalQueue: setApprovalQueue, agent: agent, inputService: inputService, useStreaming: useStreaming }), _jsx(OverlayContainer, { ref: overlayContainerRef, ui: ui, input: input, session: session, approval: approval, setInput: setInput, setUi: setUi, setSession: setSession, setMessages: setMessages, setApproval: setApproval, setApprovalQueue: setApprovalQueue, agent: agent, inputService: inputService, buffer: buffer, refreshStatic: refreshStatic, onSubmitPromptCommand: handleSubmitPromptCommand }), ui.exitWarningShown && (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: "yellowBright", bold: true, children: "\u26A0 Press Ctrl+C again to exit" }), _jsx(Text, { color: "gray", children: " (or press any key to cancel)" })] })), _jsx(Footer, { modelName: session.modelName, cwd: process.cwd(), autoApproveEdits: ui.autoApproveEdits }), ui.historySearch.isActive && (_jsx(HistorySearchBar, { query: ui.historySearch.query, hasMatch: historySearchHasMatch }))] })] }));
|
|
95
95
|
}
|
|
@@ -87,6 +87,6 @@ const ApiKeyInput = forwardRef(function ApiKeyInput({ isVisible, provider, onSav
|
|
|
87
87
|
const maskedKey = apiKey.length > 8
|
|
88
88
|
? `${apiKey.slice(0, 4)}${'*'.repeat(Math.min(apiKey.length - 8, 20))}${apiKey.slice(-4)}`
|
|
89
89
|
: '*'.repeat(apiKey.length);
|
|
90
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, color: "cyan", children: ["API Key Required for ", providerName] }) }), instructions && (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Text, {
|
|
90
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { bold: true, color: "cyan", children: ["API Key Required for ", providerName] }) }), instructions && (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Text, { color: "gray", children: instructions.content }) })), _jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: "gray", children: "This key will be saved to " }), _jsx(Text, { color: "yellowBright", children: envVar }), _jsx(Text, { color: "gray", children: " in your .env file" })] }), _jsx(Box, { flexDirection: "column", children: _jsxs(Text, { bold: true, children: ["Enter your ", providerName, " API key:"] }) }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "cyan", children: "> " }), _jsx(Text, { children: maskedKey }), !isSaving && _jsx(Text, { color: "cyan", children: "_" })] }), isSaving && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "yellowBright", children: "Saving API key..." }) })), error && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: error }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Enter to save \u2022 Esc to cancel" }) })] }));
|
|
91
91
|
});
|
|
92
92
|
export default ApiKeyInput;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CustomModelWizard Component
|
|
3
|
-
* Multi-step wizard for adding
|
|
3
|
+
* Multi-step wizard for adding custom models (openai-compatible, openrouter, litellm, glama, bedrock)
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - Provider configs centralized in ./custom-model-wizard/provider-config.ts
|
|
7
|
+
* - Shared UI components in ./custom-model-wizard/shared/
|
|
8
|
+
* - This file is the orchestrator - handles state, navigation, and keyboard input
|
|
4
9
|
*/
|
|
5
10
|
import React from 'react';
|
|
6
11
|
import type { Key } from '../../hooks/useInputOrchestrator.js';
|
|
@@ -9,12 +14,15 @@ interface CustomModelWizardProps {
|
|
|
9
14
|
isVisible: boolean;
|
|
10
15
|
onComplete: (model: CustomModel) => void;
|
|
11
16
|
onClose: () => void;
|
|
17
|
+
/** Optional model to edit - if provided, form will be pre-populated */
|
|
18
|
+
initialModel?: CustomModel | null;
|
|
12
19
|
}
|
|
13
20
|
export interface CustomModelWizardHandle {
|
|
14
21
|
handleInput: (input: string, key: Key) => boolean;
|
|
15
22
|
}
|
|
16
23
|
/**
|
|
17
|
-
* Multi-step wizard for custom model configuration
|
|
24
|
+
* Multi-step wizard for custom model configuration.
|
|
25
|
+
* Uses data-driven provider configs instead of scattered conditionals.
|
|
18
26
|
*/
|
|
19
27
|
declare const CustomModelWizard: React.ForwardRefExoticComponent<CustomModelWizardProps & React.RefAttributes<CustomModelWizardHandle>>;
|
|
20
28
|
export default CustomModelWizard;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomModelWizard.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/CustomModelWizard.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"CustomModelWizard.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/CustomModelWizard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAIH,KAAK,WAAW,EAMnB,MAAM,yBAAyB,CAAC;AAmBjC,UAAU,sBAAsB;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,uEAAuE;IACvE,YAAY,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAED;;;GAGG;AACH,QAAA,MAAM,iBAAiB,wGAqXtB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|