dexto 1.5.6 → 1.5.8
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 +13 -0
- package/dist/agents/coding-agent/coding-agent.yml +17 -0
- package/dist/agents/coding-agent/skills/code-review.md +46 -0
- package/dist/agents/explore-agent/explore-agent.yml +2 -0
- package/dist/analytics/events.d.ts +1 -1
- package/dist/analytics/events.d.ts.map +1 -1
- package/dist/api/server-hono.d.ts.map +1 -1
- package/dist/api/server-hono.js +55 -10
- package/dist/cli/assets/dexto-logo.svg +31 -0
- package/dist/cli/auth/api-client.d.ts +49 -0
- package/dist/cli/auth/api-client.d.ts.map +1 -0
- package/dist/cli/auth/api-client.js +127 -0
- package/dist/cli/auth/constants.d.ts +27 -0
- package/dist/cli/auth/constants.d.ts.map +1 -0
- package/dist/cli/auth/constants.js +28 -0
- package/dist/cli/auth/index.d.ts +5 -0
- package/dist/cli/auth/index.d.ts.map +1 -0
- package/dist/cli/auth/index.js +6 -0
- package/dist/cli/auth/oauth.d.ts +26 -0
- package/dist/cli/auth/oauth.d.ts.map +1 -0
- package/dist/cli/auth/oauth.js +327 -0
- package/dist/cli/auth/service.d.ts +20 -0
- package/dist/cli/auth/service.d.ts.map +1 -0
- package/dist/cli/auth/service.js +147 -0
- package/dist/cli/commands/auth/index.d.ts +4 -0
- package/dist/cli/commands/auth/index.d.ts.map +1 -0
- package/dist/cli/commands/auth/index.js +4 -0
- package/dist/cli/commands/auth/login.d.ts +9 -0
- package/dist/cli/commands/auth/login.d.ts.map +1 -0
- package/dist/cli/commands/auth/login.js +255 -0
- package/dist/cli/commands/auth/logout.d.ts +5 -0
- package/dist/cli/commands/auth/logout.d.ts.map +1 -0
- package/dist/cli/commands/auth/logout.js +51 -0
- package/dist/cli/commands/auth/status.d.ts +2 -0
- package/dist/cli/commands/auth/status.d.ts.map +1 -0
- package/dist/cli/commands/auth/status.js +22 -0
- package/dist/cli/commands/billing/index.d.ts +2 -0
- package/dist/cli/commands/billing/index.d.ts.map +1 -0
- package/dist/cli/commands/billing/index.js +2 -0
- package/dist/cli/commands/billing/status.d.ts +8 -0
- package/dist/cli/commands/billing/status.d.ts.map +1 -0
- package/dist/cli/commands/billing/status.js +82 -0
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +8 -0
- package/dist/cli/commands/interactive-commands/auth/index.d.ts +12 -0
- package/dist/cli/commands/interactive-commands/auth/index.d.ts.map +1 -0
- package/dist/cli/commands/interactive-commands/auth/index.js +20 -0
- package/dist/cli/commands/interactive-commands/command-parser.d.ts +5 -0
- package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/command-parser.js +6 -0
- package/dist/cli/commands/interactive-commands/commands.d.ts +1 -0
- package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/commands.js +8 -0
- package/dist/cli/commands/interactive-commands/mcp/index.d.ts +2 -2
- package/dist/cli/commands/interactive-commands/mcp/index.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/mcp/index.js +4 -7
- package/dist/cli/commands/interactive-commands/model/index.d.ts +2 -2
- package/dist/cli/commands/interactive-commands/model/index.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/model/index.js +4 -7
- package/dist/cli/commands/interactive-commands/plugin/index.d.ts +13 -0
- package/dist/cli/commands/interactive-commands/plugin/index.d.ts.map +1 -0
- package/dist/cli/commands/interactive-commands/plugin/index.js +18 -0
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +3 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +88 -36
- package/dist/cli/commands/list-agents.d.ts.map +1 -1
- package/dist/cli/commands/list-agents.js +3 -2
- package/dist/cli/commands/plugin.d.ts +161 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +376 -0
- package/dist/cli/commands/setup.d.ts +9 -9
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +944 -176
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/InkCLIRefactored.js +13 -2
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.js +80 -12
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts +18 -0
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.js +48 -0
- package/dist/cli/ink-cli/components/ErrorBoundary.js +1 -1
- package/dist/cli/ink-cli/components/Footer.d.ts +2 -1
- package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/Footer.js +6 -2
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ResourceAutocomplete.js +150 -41
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +15 -7
- package/dist/cli/ink-cli/components/StatusBar.d.ts +7 -1
- package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/StatusBar.js +18 -2
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.js +23 -6
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +5 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.js +5 -1
- package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.js +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +8 -4
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts +1 -0
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +31 -20
- package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.d.ts +20 -0
- package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.js +81 -0
- package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.d.ts +31 -0
- package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.js +297 -0
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +8 -2
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.js +9 -0
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerList.js +9 -2
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +1 -0
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +150 -34
- package/dist/cli/ink-cli/components/overlays/PluginActions.d.ts +27 -0
- package/dist/cli/ink-cli/components/overlays/PluginActions.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PluginActions.js +66 -0
- package/dist/cli/ink-cli/components/overlays/PluginList.d.ts +21 -0
- package/dist/cli/ink-cli/components/overlays/PluginList.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PluginList.js +70 -0
- package/dist/cli/ink-cli/components/overlays/PluginManager.d.ts +21 -0
- package/dist/cli/ink-cli/components/overlays/PluginManager.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/PluginManager.js +63 -0
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptList.js +4 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +1 -0
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +281 -39
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +10 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +87 -2
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts +4 -2
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +4 -4
- package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/InputContainer.js +32 -5
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.js +384 -28
- package/dist/cli/ink-cli/hooks/index.d.ts +1 -0
- package/dist/cli/ink-cli/hooks/index.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/index.js +1 -0
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.js +61 -0
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useCLIState.js +5 -0
- package/dist/cli/ink-cli/hooks/useGitBranch.d.ts +13 -0
- package/dist/cli/ink-cli/hooks/useGitBranch.d.ts.map +1 -0
- package/dist/cli/ink-cli/hooks/useGitBranch.js +35 -0
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +53 -6
- package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/processStream.js +92 -12
- package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
- package/dist/cli/ink-cli/state/initialState.js +5 -0
- package/dist/cli/ink-cli/state/types.d.ts +12 -1
- package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/commandOverlays.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/commandOverlays.js +1 -0
- package/dist/cli/ink-cli/utils/llm-provider-display.d.ts +3 -0
- package/dist/cli/ink-cli/utils/llm-provider-display.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/llm-provider-display.js +22 -0
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts +18 -7
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.js +143 -15
- package/dist/cli/ink-cli/utils/toolUtils.d.ts +11 -0
- package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/toolUtils.js +17 -0
- package/dist/cli/mcp/index.d.ts +8 -0
- package/dist/cli/mcp/index.d.ts.map +1 -0
- package/dist/cli/mcp/index.js +7 -0
- package/dist/cli/mcp/oauth-factory.d.ts +6 -0
- package/dist/cli/mcp/oauth-factory.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-factory.js +25 -0
- package/dist/cli/mcp/oauth-provider.d.ts +10 -0
- package/dist/cli/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-provider.js +77 -0
- package/dist/cli/mcp/oauth-redirect.d.ts +3 -0
- package/dist/cli/mcp/oauth-redirect.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-redirect.js +4 -0
- package/dist/cli/mcp/oauth-server.d.ts +2 -0
- package/dist/cli/mcp/oauth-server.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-server.js +70 -0
- package/dist/cli/mcp/oauth-store.d.ts +10 -0
- package/dist/cli/mcp/oauth-store.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-store.js +27 -0
- package/dist/cli/mcp/oauth-ui.d.ts +2 -0
- package/dist/cli/mcp/oauth-ui.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-ui.js +12 -0
- package/dist/cli/mcp/oauth-utils.d.ts +2 -0
- package/dist/cli/mcp/oauth-utils.d.ts.map +1 -0
- package/dist/cli/mcp/oauth-utils.js +17 -0
- package/dist/cli/utils/api-key-verification.d.ts.map +1 -1
- package/dist/cli/utils/api-key-verification.js +36 -0
- package/dist/cli/utils/config-validation.d.ts +3 -1
- package/dist/cli/utils/config-validation.d.ts.map +1 -1
- package/dist/cli/utils/config-validation.js +42 -19
- package/dist/cli/utils/dexto-auth-check.d.ts +53 -0
- package/dist/cli/utils/dexto-auth-check.d.ts.map +1 -0
- package/dist/cli/utils/dexto-auth-check.js +104 -0
- package/dist/cli/utils/dexto-setup.d.ts +8 -0
- package/dist/cli/utils/dexto-setup.d.ts.map +1 -0
- package/dist/cli/utils/dexto-setup.js +17 -0
- package/dist/cli/utils/options.d.ts.map +1 -1
- package/dist/cli/utils/options.js +5 -1
- package/dist/cli/utils/provider-setup.d.ts +5 -1
- package/dist/cli/utils/provider-setup.d.ts.map +1 -1
- package/dist/cli/utils/provider-setup.js +29 -1
- package/dist/config/cli-overrides.d.ts +17 -8
- package/dist/config/cli-overrides.d.ts.map +1 -1
- package/dist/config/cli-overrides.js +36 -22
- package/dist/config/effective-llm.d.ts +123 -0
- package/dist/config/effective-llm.d.ts.map +1 -0
- package/dist/config/effective-llm.js +171 -0
- package/dist/index.js +404 -99
- package/dist/webui/assets/index-C9JXwpvo.css +1 -0
- package/dist/webui/assets/{index-DVQWNLpT.js → index-Cz2z7NQ8.js} +218 -218
- package/dist/webui/index.html +2 -2
- package/package.json +9 -8
- package/dist/webui/assets/index-BglIVTSG.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpServerList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/McpServerList.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAGpF,MAAM,MAAM,mBAAmB,GACzB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;
|
|
1
|
+
{"version":3,"file":"McpServerList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/McpServerList.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAGpF,MAAM,MAAM,mBAAmB,GACzB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAwCD;;GAEG;AACH,QAAA,MAAM,aAAa,gGA+HjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -16,6 +16,8 @@ function getStatusIcon(status) {
|
|
|
16
16
|
return '🟢';
|
|
17
17
|
case 'disconnected':
|
|
18
18
|
return '⚪';
|
|
19
|
+
case 'auth-required':
|
|
20
|
+
return '🔐';
|
|
19
21
|
case 'error':
|
|
20
22
|
return '🔴';
|
|
21
23
|
}
|
|
@@ -29,6 +31,8 @@ function getStatusText(status) {
|
|
|
29
31
|
return 'connected';
|
|
30
32
|
case 'disconnected':
|
|
31
33
|
return 'disabled';
|
|
34
|
+
case 'auth-required':
|
|
35
|
+
return 'auth required';
|
|
32
36
|
case 'error':
|
|
33
37
|
return 'failed';
|
|
34
38
|
}
|
|
@@ -59,7 +63,8 @@ const McpServerList = forwardRef(function McpServerList({ isVisible, onAction, o
|
|
|
59
63
|
const order = {
|
|
60
64
|
connected: 0,
|
|
61
65
|
disconnected: 1,
|
|
62
|
-
|
|
66
|
+
'auth-required': 2,
|
|
67
|
+
error: 3,
|
|
63
68
|
};
|
|
64
69
|
return order[a.status] - order[b.status];
|
|
65
70
|
});
|
|
@@ -93,7 +98,9 @@ const McpServerList = forwardRef(function McpServerList({ isVisible, onAction, o
|
|
|
93
98
|
? 'green'
|
|
94
99
|
: server.status === 'disconnected'
|
|
95
100
|
? 'gray'
|
|
96
|
-
: '
|
|
101
|
+
: server.status === 'auth-required'
|
|
102
|
+
? 'yellow'
|
|
103
|
+
: 'red', children: ["[", statusText, "]"] })] }));
|
|
97
104
|
};
|
|
98
105
|
// Handle selection
|
|
99
106
|
const handleSelect = (item) => {
|
|
@@ -11,6 +11,7 @@ type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
|
11
11
|
interface ModelSelectorProps {
|
|
12
12
|
isVisible: boolean;
|
|
13
13
|
onSelectModel: (provider: LLMProvider, model: string, displayName?: string, baseURL?: string, reasoningEffort?: ReasoningEffort) => void;
|
|
14
|
+
onSetDefaultModel: (provider: LLMProvider, model: string, displayName?: string, baseURL?: string, reasoningEffort?: ReasoningEffort) => Promise<void>;
|
|
14
15
|
onClose: () => void;
|
|
15
16
|
onAddCustomModel: () => void;
|
|
16
17
|
onEditCustomModel: (model: CustomModel) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelSelectorRefactored.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/ModelSelectorRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO3D,OAAO,
|
|
1
|
+
{"version":3,"file":"ModelSelectorRefactored.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/ModelSelectorRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO3D,OAAO,EAMH,KAAK,WAAW,EACnB,MAAM,yBAAyB,CAAC;AAGjC,KAAK,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhF,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,eAAe,KAChC,IAAI,CAAC;IACV,iBAAiB,EAAE,CACf,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,eAAe,KAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAoDD;;GAEG;AACH,QAAA,MAAM,aAAa,oHAq3BjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -8,7 +8,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
8
8
|
import { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, useCallback, } from 'react';
|
|
9
9
|
import { Box, Text } from 'ink';
|
|
10
10
|
import { listOllamaModels, DEFAULT_OLLAMA_URL, getLocalModelById, isReasoningCapableModel, } from '@dexto/core';
|
|
11
|
-
import { loadCustomModels, deleteCustomModel, getAllInstalledModels, } from '@dexto/agent-management';
|
|
11
|
+
import { loadCustomModels, deleteCustomModel, getAllInstalledModels, loadGlobalPreferences, isDextoAuthEnabled, } from '@dexto/agent-management';
|
|
12
|
+
import { getLLMProviderDisplayName } from '../../utils/llm-provider-display.js';
|
|
12
13
|
function isAddCustomOption(item) {
|
|
13
14
|
return 'type' in item && item.type === 'add-custom';
|
|
14
15
|
}
|
|
@@ -34,7 +35,7 @@ const REASONING_EFFORT_OPTIONS = [
|
|
|
34
35
|
/**
|
|
35
36
|
* Model selector with search and custom model support
|
|
36
37
|
*/
|
|
37
|
-
const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectModel, onClose, onAddCustomModel, onEditCustomModel, agent }, ref) {
|
|
38
|
+
const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectModel, onSetDefaultModel, onClose, onAddCustomModel, onEditCustomModel, agent, }, ref) {
|
|
38
39
|
const [models, setModels] = useState([]);
|
|
39
40
|
const [customModels, setCustomModels] = useState([]);
|
|
40
41
|
const [isLoading, setIsLoading] = useState(false);
|
|
@@ -48,6 +49,8 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
48
49
|
// Reasoning effort sub-step state
|
|
49
50
|
const [pendingReasoningModel, setPendingReasoningModel] = useState(null);
|
|
50
51
|
const [reasoningEffortIndex, setReasoningEffortIndex] = useState(0); // Default to 'Auto' (index 0)
|
|
52
|
+
const [isSettingDefault, setIsSettingDefault] = useState(false); // Track if setting as default vs normal selection
|
|
53
|
+
const [refreshVersion, setRefreshVersion] = useState(0);
|
|
51
54
|
// Keep ref in sync
|
|
52
55
|
selectedIndexRef.current = selectedIndex;
|
|
53
56
|
// Clear delete confirmation timeout on unmount
|
|
@@ -70,6 +73,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
70
73
|
setCustomModelAction(null);
|
|
71
74
|
setPendingDeleteConfirm(false);
|
|
72
75
|
setPendingReasoningModel(null);
|
|
76
|
+
setIsSettingDefault(false);
|
|
73
77
|
setReasoningEffortIndex(0); // Default to 'Auto'
|
|
74
78
|
if (deleteTimeoutRef.current) {
|
|
75
79
|
clearTimeout(deleteTimeoutRef.current);
|
|
@@ -77,13 +81,18 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
77
81
|
}
|
|
78
82
|
const fetchModels = async () => {
|
|
79
83
|
try {
|
|
80
|
-
const [allModels, providers, currentConfig, loadedCustomModels] = await Promise.all([
|
|
84
|
+
const [allModels, providers, currentConfig, loadedCustomModels, preferences] = await Promise.all([
|
|
81
85
|
Promise.resolve(agent.getSupportedModels()),
|
|
82
86
|
Promise.resolve(agent.getSupportedProviders()),
|
|
83
87
|
Promise.resolve(agent.getCurrentLLMConfig()),
|
|
84
88
|
loadCustomModels(),
|
|
89
|
+
loadGlobalPreferences().catch(() => null),
|
|
85
90
|
]);
|
|
86
91
|
const modelList = [];
|
|
92
|
+
const defaultProvider = preferences?.llm.provider;
|
|
93
|
+
const defaultModel = preferences?.llm.model;
|
|
94
|
+
const defaultBaseURL = preferences?.llm.baseURL;
|
|
95
|
+
const defaultReasoningEffort = preferences?.llm.reasoningEffort;
|
|
87
96
|
// Fetch dynamic models for local providers
|
|
88
97
|
let ollamaModels = [];
|
|
89
98
|
let localModels = [];
|
|
@@ -109,8 +118,8 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
109
118
|
provider: customProvider,
|
|
110
119
|
name: custom.name,
|
|
111
120
|
displayName: custom.displayName || custom.name,
|
|
112
|
-
maxInputTokens: custom.maxInputTokens
|
|
113
|
-
isDefault:
|
|
121
|
+
maxInputTokens: custom.maxInputTokens ?? 128000,
|
|
122
|
+
isDefault: customProvider === defaultProvider && custom.name === defaultModel,
|
|
114
123
|
isCurrent: currentConfig.provider === customProvider &&
|
|
115
124
|
currentConfig.model === custom.name,
|
|
116
125
|
isCustom: true,
|
|
@@ -118,6 +127,9 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
118
127
|
if (custom.baseURL) {
|
|
119
128
|
modelOption.baseURL = custom.baseURL;
|
|
120
129
|
}
|
|
130
|
+
if (custom.reasoningEffort) {
|
|
131
|
+
modelOption.reasoningEffort = custom.reasoningEffort;
|
|
132
|
+
}
|
|
121
133
|
modelList.push(modelOption);
|
|
122
134
|
}
|
|
123
135
|
// Add registry models
|
|
@@ -134,17 +146,36 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
134
146
|
if (provider === 'ollama' || provider === 'local' || provider === 'vertex') {
|
|
135
147
|
continue;
|
|
136
148
|
}
|
|
149
|
+
// Skip dexto-nova provider when feature is not enabled
|
|
150
|
+
if (provider === 'dexto-nova' && !isDextoAuthEnabled()) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
137
153
|
const providerModels = allModels[provider];
|
|
138
154
|
for (const model of providerModels) {
|
|
155
|
+
// For dexto-nova provider, models have originalProvider field
|
|
156
|
+
// showing which provider the model originally came from
|
|
157
|
+
const originalProvider = 'originalProvider' in model ? model.originalProvider : undefined;
|
|
139
158
|
modelList.push({
|
|
140
159
|
provider,
|
|
141
160
|
name: model.name,
|
|
142
161
|
displayName: model.displayName,
|
|
143
162
|
maxInputTokens: model.maxInputTokens,
|
|
144
|
-
isDefault: model.
|
|
163
|
+
isDefault: provider === defaultProvider && model.name === defaultModel,
|
|
145
164
|
isCurrent: provider === currentConfig.provider &&
|
|
146
165
|
model.name === currentConfig.model,
|
|
147
166
|
isCustom: false,
|
|
167
|
+
...(defaultReasoningEffort &&
|
|
168
|
+
provider === defaultProvider &&
|
|
169
|
+
model.name === defaultModel
|
|
170
|
+
? { reasoningEffort: defaultReasoningEffort }
|
|
171
|
+
: {}),
|
|
172
|
+
...(defaultBaseURL &&
|
|
173
|
+
provider === defaultProvider &&
|
|
174
|
+
model.name === defaultModel
|
|
175
|
+
? { baseURL: defaultBaseURL }
|
|
176
|
+
: {}),
|
|
177
|
+
// Store original provider for display purposes
|
|
178
|
+
...(originalProvider && { originalProvider }),
|
|
148
179
|
});
|
|
149
180
|
}
|
|
150
181
|
}
|
|
@@ -155,7 +186,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
155
186
|
name: ollamaModel.name,
|
|
156
187
|
displayName: ollamaModel.name,
|
|
157
188
|
maxInputTokens: 128000, // Default, actual varies by model
|
|
158
|
-
isDefault:
|
|
189
|
+
isDefault: defaultProvider === 'ollama' && defaultModel === ollamaModel.name,
|
|
159
190
|
isCurrent: currentConfig.provider === 'ollama' &&
|
|
160
191
|
currentConfig.model === ollamaModel.name,
|
|
161
192
|
isCustom: false,
|
|
@@ -172,7 +203,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
172
203
|
name: localModel.id,
|
|
173
204
|
displayName,
|
|
174
205
|
maxInputTokens,
|
|
175
|
-
isDefault:
|
|
206
|
+
isDefault: defaultProvider === 'local' && defaultModel === localModel.id,
|
|
176
207
|
isCurrent: currentConfig.provider === 'local' &&
|
|
177
208
|
currentConfig.model === localModel.id,
|
|
178
209
|
isCustom: false,
|
|
@@ -187,10 +218,15 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
187
218
|
name: model.name,
|
|
188
219
|
displayName: model.displayName,
|
|
189
220
|
maxInputTokens: model.maxInputTokens,
|
|
190
|
-
isDefault: model.
|
|
221
|
+
isDefault: defaultProvider === 'vertex' && defaultModel === model.name,
|
|
191
222
|
isCurrent: currentConfig.provider === 'vertex' &&
|
|
192
223
|
currentConfig.model === model.name,
|
|
193
224
|
isCustom: false,
|
|
225
|
+
...(defaultReasoningEffort &&
|
|
226
|
+
defaultProvider === 'vertex' &&
|
|
227
|
+
defaultModel === model.name
|
|
228
|
+
? { reasoningEffort: defaultReasoningEffort }
|
|
229
|
+
: {}),
|
|
194
230
|
});
|
|
195
231
|
}
|
|
196
232
|
}
|
|
@@ -217,7 +253,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
217
253
|
return () => {
|
|
218
254
|
cancelled = true;
|
|
219
255
|
};
|
|
220
|
-
}, [isVisible, agent]);
|
|
256
|
+
}, [isVisible, agent, refreshVersion]);
|
|
221
257
|
// Filter models based on search query
|
|
222
258
|
const filteredItems = useMemo(() => {
|
|
223
259
|
const addCustomOption = { type: 'add-custom' };
|
|
@@ -284,6 +320,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
284
320
|
if (key.escape) {
|
|
285
321
|
// Go back to model selection
|
|
286
322
|
setPendingReasoningModel(null);
|
|
323
|
+
setIsSettingDefault(false);
|
|
287
324
|
return true;
|
|
288
325
|
}
|
|
289
326
|
if (key.upArrow) {
|
|
@@ -297,8 +334,21 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
297
334
|
if (key.return) {
|
|
298
335
|
const selectedOption = REASONING_EFFORT_OPTIONS[reasoningEffortIndex];
|
|
299
336
|
const reasoningEffort = selectedOption?.value === 'auto' ? undefined : selectedOption?.value;
|
|
300
|
-
|
|
337
|
+
if (isSettingDefault) {
|
|
338
|
+
// Setting as default model
|
|
339
|
+
clearActionState();
|
|
340
|
+
void (async () => {
|
|
341
|
+
await onSetDefaultModel(pendingReasoningModel.provider, pendingReasoningModel.name, pendingReasoningModel.displayName, pendingReasoningModel.baseURL, reasoningEffort);
|
|
342
|
+
setRefreshVersion((prev) => prev + 1);
|
|
343
|
+
onClose(); // Close overlay after setting default
|
|
344
|
+
})();
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
// Normal model selection
|
|
348
|
+
onSelectModel(pendingReasoningModel.provider, pendingReasoningModel.name, pendingReasoningModel.displayName, pendingReasoningModel.baseURL, reasoningEffort);
|
|
349
|
+
}
|
|
301
350
|
setPendingReasoningModel(null);
|
|
351
|
+
setIsSettingDefault(false);
|
|
302
352
|
return true;
|
|
303
353
|
}
|
|
304
354
|
return true; // Consume all input in reasoning effort mode
|
|
@@ -315,26 +365,50 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
315
365
|
}
|
|
316
366
|
const itemsLength = filteredItems.length;
|
|
317
367
|
const currentItem = filteredItems[selectedIndexRef.current];
|
|
318
|
-
const
|
|
319
|
-
|
|
368
|
+
const isCustomActionItem = currentItem && !isAddCustomOption(currentItem) && currentItem.isCustom;
|
|
369
|
+
const isSelectableItem = currentItem && !isAddCustomOption(currentItem);
|
|
370
|
+
const isOnActionItem = isCustomActionItem || isSelectableItem;
|
|
371
|
+
// Right arrow - enter/advance action mode for custom or selectable models
|
|
320
372
|
if (key.rightArrow) {
|
|
321
|
-
if (!
|
|
373
|
+
if (!isOnActionItem)
|
|
322
374
|
return false;
|
|
323
375
|
if (customModelAction === null) {
|
|
324
|
-
|
|
325
|
-
|
|
376
|
+
if (isCustomActionItem) {
|
|
377
|
+
setCustomModelAction('edit');
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
setCustomModelAction('default');
|
|
381
|
+
}
|
|
326
382
|
return true;
|
|
327
383
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
setCustomModelAction('delete');
|
|
331
|
-
setPendingDeleteConfirm(false);
|
|
384
|
+
if (customModelAction === 'edit') {
|
|
385
|
+
setCustomModelAction('default');
|
|
332
386
|
return true;
|
|
333
387
|
}
|
|
334
|
-
|
|
335
|
-
|
|
388
|
+
if (customModelAction === 'default') {
|
|
389
|
+
if (isCustomActionItem) {
|
|
390
|
+
setCustomModelAction('delete');
|
|
391
|
+
setPendingDeleteConfirm(false);
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
const actionItem = currentItem;
|
|
395
|
+
// Check if reasoning-capable, show reasoning effort selection
|
|
396
|
+
if (isReasoningCapableModel(actionItem.name)) {
|
|
397
|
+
setPendingReasoningModel(actionItem);
|
|
398
|
+
setIsSettingDefault(true);
|
|
399
|
+
setReasoningEffortIndex(0); // Default to 'Auto'
|
|
400
|
+
return true;
|
|
401
|
+
}
|
|
402
|
+
clearActionState();
|
|
403
|
+
void (async () => {
|
|
404
|
+
await onSetDefaultModel(actionItem.provider, actionItem.name, actionItem.displayName, actionItem.baseURL, actionItem.reasoningEffort);
|
|
405
|
+
setRefreshVersion((prev) => prev + 1);
|
|
406
|
+
onClose(); // Close overlay after setting default
|
|
407
|
+
})();
|
|
408
|
+
return true;
|
|
409
|
+
}
|
|
410
|
+
if (customModelAction === 'delete') {
|
|
336
411
|
if (pendingDeleteConfirm) {
|
|
337
|
-
// Second press - actually delete
|
|
338
412
|
if (deleteTimeoutRef.current) {
|
|
339
413
|
clearTimeout(deleteTimeoutRef.current);
|
|
340
414
|
deleteTimeoutRef.current = null;
|
|
@@ -343,7 +417,6 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
343
417
|
void handleDeleteCustomModel(currentItem);
|
|
344
418
|
}
|
|
345
419
|
else {
|
|
346
|
-
// First press in delete mode - set pending confirmation
|
|
347
420
|
setPendingDeleteConfirm(true);
|
|
348
421
|
if (deleteTimeoutRef.current) {
|
|
349
422
|
clearTimeout(deleteTimeoutRef.current);
|
|
@@ -351,7 +424,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
351
424
|
deleteTimeoutRef.current = setTimeout(() => {
|
|
352
425
|
setPendingDeleteConfirm(false);
|
|
353
426
|
deleteTimeoutRef.current = null;
|
|
354
|
-
}, 3000);
|
|
427
|
+
}, 3000);
|
|
355
428
|
}
|
|
356
429
|
return true;
|
|
357
430
|
}
|
|
@@ -359,7 +432,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
359
432
|
// Left arrow - go back in action mode
|
|
360
433
|
if (key.leftArrow) {
|
|
361
434
|
if (customModelAction === 'delete') {
|
|
362
|
-
setCustomModelAction('
|
|
435
|
+
setCustomModelAction('default');
|
|
363
436
|
setPendingDeleteConfirm(false);
|
|
364
437
|
if (deleteTimeoutRef.current) {
|
|
365
438
|
clearTimeout(deleteTimeoutRef.current);
|
|
@@ -367,7 +440,16 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
367
440
|
}
|
|
368
441
|
return true;
|
|
369
442
|
}
|
|
370
|
-
|
|
443
|
+
if (customModelAction === 'default') {
|
|
444
|
+
if (isCustomActionItem) {
|
|
445
|
+
setCustomModelAction('edit');
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
setCustomModelAction(null);
|
|
449
|
+
}
|
|
450
|
+
return true;
|
|
451
|
+
}
|
|
452
|
+
if (customModelAction === 'edit') {
|
|
371
453
|
setCustomModelAction(null);
|
|
372
454
|
return true;
|
|
373
455
|
}
|
|
@@ -436,6 +518,22 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
436
518
|
}
|
|
437
519
|
return true;
|
|
438
520
|
}
|
|
521
|
+
if (customModelAction === 'default') {
|
|
522
|
+
// Check if reasoning-capable, show reasoning effort selection
|
|
523
|
+
if (isReasoningCapableModel(item.name)) {
|
|
524
|
+
setPendingReasoningModel(item);
|
|
525
|
+
setIsSettingDefault(true);
|
|
526
|
+
setReasoningEffortIndex(0); // Default to 'Auto'
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
clearActionState();
|
|
530
|
+
void (async () => {
|
|
531
|
+
await onSetDefaultModel(item.provider, item.name, item.displayName, item.baseURL, item.reasoningEffort);
|
|
532
|
+
setRefreshVersion((prev) => prev + 1);
|
|
533
|
+
onClose(); // Close overlay after setting default
|
|
534
|
+
})();
|
|
535
|
+
return true;
|
|
536
|
+
}
|
|
439
537
|
if (customModelAction === 'delete' && item.isCustom) {
|
|
440
538
|
if (pendingDeleteConfirm) {
|
|
441
539
|
// Already confirmed, delete
|
|
@@ -473,6 +571,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
473
571
|
filteredItems,
|
|
474
572
|
onClose,
|
|
475
573
|
onSelectModel,
|
|
574
|
+
onSetDefaultModel,
|
|
476
575
|
onAddCustomModel,
|
|
477
576
|
onEditCustomModel,
|
|
478
577
|
customModelAction,
|
|
@@ -481,6 +580,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
481
580
|
handleDeleteCustomModel,
|
|
482
581
|
pendingReasoningModel,
|
|
483
582
|
reasoningEffortIndex,
|
|
583
|
+
isSettingDefault,
|
|
484
584
|
]);
|
|
485
585
|
if (!isVisible)
|
|
486
586
|
return null;
|
|
@@ -489,26 +589,42 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
|
|
|
489
589
|
}
|
|
490
590
|
// Reasoning effort sub-step UI
|
|
491
591
|
if (pendingReasoningModel) {
|
|
492
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children:
|
|
592
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "cyan", bold: true, children: ["Configure Reasoning Effort", isSettingDefault && _jsx(Text, { color: "gray", children: " (Setting as Default)" })] }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "gray", children: ["for ", pendingReasoningModel.displayName || pendingReasoningModel.name] }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: "\u2191\u2193 navigate, Enter select, Esc back" }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: '─'.repeat(50) }) }), REASONING_EFFORT_OPTIONS.map((option, index) => {
|
|
493
593
|
const isSelected = index === reasoningEffortIndex;
|
|
494
594
|
return (_jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsxs(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: [isSelected ? '› ' : ' ', option.label] }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [' ', "- ", option.description] })] }, option.value));
|
|
495
595
|
})] }));
|
|
496
596
|
}
|
|
497
597
|
const visibleItems = filteredItems.slice(scrollOffset, scrollOffset + MAX_VISIBLE_ITEMS);
|
|
498
598
|
const hasCustomModels = customModels.length > 0;
|
|
499
|
-
|
|
599
|
+
const hasActionableItems = filteredItems.some((item) => !isAddCustomOption(item));
|
|
600
|
+
const selectedItem = filteredItems[selectedIndex];
|
|
601
|
+
const isSelectedCustom = selectedItem && !isAddCustomOption(selectedItem) && selectedItem.isCustom;
|
|
602
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "cyan", bold: true, children: ["Select Model (", selectedIndex + 1, "/", filteredItems.length, ")"] }) }), _jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsx(Text, { color: "gray", children: "\u2191\u2193 navigate, Enter select, Esc close" }), hasActionableItems && _jsx(Text, { color: "gray", children: ", \u2192\u2190 for actions" })] }), _jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsx(Text, { color: "gray", children: "\uD83D\uDD0D " }), _jsx(Text, { color: searchQuery ? 'white' : 'gray', children: searchQuery || 'Type to search...' }), _jsx(Text, { color: "cyan", children: "\u258C" })] }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: '─'.repeat(50) }) }), visibleItems.map((item, visibleIndex) => {
|
|
500
603
|
const actualIndex = scrollOffset + visibleIndex;
|
|
501
604
|
const isSelected = actualIndex === selectedIndex;
|
|
502
605
|
if (isAddCustomOption(item)) {
|
|
503
606
|
return (_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: isSelected ? 'green' : 'gray', bold: isSelected, children: "\u2795 Add custom model..." }) }, "add-custom"));
|
|
504
607
|
}
|
|
505
608
|
// Show action buttons for selected custom models
|
|
506
|
-
const showActions = isSelected && item
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
609
|
+
const showActions = isSelected && !isAddCustomOption(item);
|
|
610
|
+
// Keep the UI label simple: show the actual provider being selected.
|
|
611
|
+
// Gateway routing details are intentionally hidden from the main picker.
|
|
612
|
+
const providerDisplay = getLLMProviderDisplayName(item.provider);
|
|
613
|
+
return (_jsxs(Box, { paddingX: 0, paddingY: 0, children: [item.isCustom && _jsx(Text, { color: isSelected ? 'orange' : 'gray', children: "\u2605 " }), _jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: item.displayName || item.name }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [" (", providerDisplay, ")"] }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [' ', "\u2022 ", item.maxInputTokens.toLocaleString(), " tokens"] }), item.isDefault && (_jsx(Text, { color: isSelected ? 'white' : 'gray', children: " [DEFAULT]" })), item.isCurrent && !showActions && (_jsxs(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: [' ', "\u2190 Current"] })), showActions && (_jsxs(_Fragment, { children: [item.isCustom && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'edit' ? 'green' : 'gray', bold: customModelAction === 'edit', inverse: customModelAction === 'edit', children: [' ', "Edit", ' '] })] })), _jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'default' ? 'cyan' : 'gray', bold: customModelAction === 'default', inverse: customModelAction === 'default', children: [' ', "Set as Default", ' '] }), item.isCustom && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'delete' ? 'red' : 'gray', bold: customModelAction === 'delete', inverse: customModelAction === 'delete', children: [' ', "Delete", ' '] })] }))] }))] }, `${item.provider}-${item.name}-${item.isCustom ? 'custom' : 'registry'}`));
|
|
614
|
+
}), filteredItems.length > MAX_VISIBLE_ITEMS && (_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "gray", wrap: "truncate", children: [scrollOffset > 0 ? '↑ more above' : '', scrollOffset > 0 && scrollOffset + MAX_VISIBLE_ITEMS < filteredItems.length
|
|
615
|
+
? ' • '
|
|
510
616
|
: '', scrollOffset + MAX_VISIBLE_ITEMS < filteredItems.length
|
|
511
617
|
? '↓ more below'
|
|
512
|
-
: ''] }) })), customModelAction === 'delete' && pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsx(Text, { color: "yellowBright", children: "\u26A0\uFE0F Press \u2192 or Enter again to confirm delete" }) })), customModelAction && !pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["\u2190
|
|
618
|
+
: ''] }) })), customModelAction === 'delete' && pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsx(Text, { color: "yellowBright", children: "\u26A0\uFE0F Press \u2192 or Enter again to confirm delete" }) })), customModelAction && !pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["\u2190", ' ', customModelAction === 'edit'
|
|
619
|
+
? 'deselect'
|
|
620
|
+
: isSelectedCustom
|
|
621
|
+
? 'edit'
|
|
622
|
+
: 'deselect', ' ', "| \u2192", ' ', customModelAction === 'edit'
|
|
623
|
+
? 'default'
|
|
624
|
+
: customModelAction === 'default'
|
|
625
|
+
? isSelectedCustom
|
|
626
|
+
? 'delete'
|
|
627
|
+
: 'confirm'
|
|
628
|
+
: 'confirm', ' ', "| Enter ", customModelAction] }) }))] }));
|
|
513
629
|
});
|
|
514
630
|
export default ModelSelector;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluginActions Component
|
|
3
|
+
* Clean action menu for a selected plugin
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { Key } from '../../hooks/useInputOrchestrator.js';
|
|
7
|
+
import type { ListedPlugin } from '@dexto/agent-management';
|
|
8
|
+
export type PluginActionType = 'uninstall' | 'back';
|
|
9
|
+
export interface PluginActionResult {
|
|
10
|
+
type: PluginActionType;
|
|
11
|
+
plugin: ListedPlugin;
|
|
12
|
+
}
|
|
13
|
+
interface PluginActionsProps {
|
|
14
|
+
isVisible: boolean;
|
|
15
|
+
plugin: ListedPlugin | null;
|
|
16
|
+
onAction: (action: PluginActionResult) => void;
|
|
17
|
+
onClose: () => void;
|
|
18
|
+
}
|
|
19
|
+
export interface PluginActionsHandle {
|
|
20
|
+
handleInput: (input: string, key: Key) => boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Plugin Actions - action menu for a specific plugin
|
|
24
|
+
*/
|
|
25
|
+
declare const PluginActions: React.ForwardRefExoticComponent<PluginActionsProps & React.RefAttributes<PluginActionsHandle>>;
|
|
26
|
+
export default PluginActions;
|
|
27
|
+
//# sourceMappingURL=PluginActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginActions.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/PluginActions.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAUD;;GAEG;AACH,QAAA,MAAM,aAAa,gGA+FjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* PluginActions Component
|
|
4
|
+
* Clean action menu for a selected plugin
|
|
5
|
+
*/
|
|
6
|
+
import { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, } from 'react';
|
|
7
|
+
import { Box, Text } from 'ink';
|
|
8
|
+
import { BaseSelector } from '../base/BaseSelector.js';
|
|
9
|
+
/**
|
|
10
|
+
* Plugin Actions - action menu for a specific plugin
|
|
11
|
+
*/
|
|
12
|
+
const PluginActions = forwardRef(function PluginActions({ isVisible, plugin, onAction, onClose }, ref) {
|
|
13
|
+
const baseSelectorRef = useRef(null);
|
|
14
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
15
|
+
// Forward handleInput to BaseSelector
|
|
16
|
+
useImperativeHandle(ref, () => ({
|
|
17
|
+
handleInput: (input, key) => {
|
|
18
|
+
return baseSelectorRef.current?.handleInput(input, key) ?? false;
|
|
19
|
+
},
|
|
20
|
+
}), []);
|
|
21
|
+
// Reset selection when becoming visible or plugin changes
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (isVisible) {
|
|
24
|
+
setSelectedIndex(0);
|
|
25
|
+
}
|
|
26
|
+
}, [isVisible, plugin]);
|
|
27
|
+
// Build action items
|
|
28
|
+
const items = useMemo(() => {
|
|
29
|
+
if (!plugin)
|
|
30
|
+
return [];
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
id: 'back',
|
|
34
|
+
type: 'back',
|
|
35
|
+
label: 'Back to list',
|
|
36
|
+
icon: '←',
|
|
37
|
+
color: 'gray',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'uninstall',
|
|
41
|
+
type: 'uninstall',
|
|
42
|
+
label: 'Uninstall',
|
|
43
|
+
icon: '🗑',
|
|
44
|
+
color: 'red',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
}, [plugin]);
|
|
48
|
+
// Format item for display - clean single line
|
|
49
|
+
const formatItem = (item, isSelected) => {
|
|
50
|
+
const isBack = item.type === 'back';
|
|
51
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'cyan' : 'gray', children: isSelected ? '▸ ' : ' ' }), _jsxs(Text, { color: isBack ? 'gray' : isSelected ? item.color : 'gray', children: [item.icon, " "] }), _jsx(Text, { color: isBack ? (isSelected ? 'white' : 'gray') : isSelected ? item.color : 'white', bold: isSelected && !isBack, children: item.label })] }));
|
|
52
|
+
};
|
|
53
|
+
// Handle selection
|
|
54
|
+
const handleSelect = (item) => {
|
|
55
|
+
if (!plugin)
|
|
56
|
+
return;
|
|
57
|
+
onAction({ type: item.type, plugin });
|
|
58
|
+
};
|
|
59
|
+
if (!plugin)
|
|
60
|
+
return null;
|
|
61
|
+
const version = plugin.version || 'unknown';
|
|
62
|
+
const scopeBadge = plugin.scope ? ` [${plugin.scope}]` : '';
|
|
63
|
+
const title = `📦 ${plugin.name}@${version}${scopeBadge}`;
|
|
64
|
+
return (_jsx(BaseSelector, { ref: baseSelectorRef, items: items, isVisible: isVisible, isLoading: false, selectedIndex: selectedIndex, onSelectIndex: setSelectedIndex, onSelect: handleSelect, onClose: onClose, formatItem: formatItem, title: title, borderColor: "magenta", emptyMessage: "No actions available" }));
|
|
65
|
+
});
|
|
66
|
+
export default PluginActions;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluginList Component
|
|
3
|
+
* Clean table-like view of installed plugins
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { type ListedPlugin } from '@dexto/agent-management';
|
|
7
|
+
import type { Key } from '../../hooks/useInputOrchestrator.js';
|
|
8
|
+
interface PluginListProps {
|
|
9
|
+
isVisible: boolean;
|
|
10
|
+
onPluginSelect: (plugin: ListedPlugin) => void;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
}
|
|
13
|
+
export interface PluginListHandle {
|
|
14
|
+
handleInput: (input: string, key: Key) => boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Plugin list overlay - shows installed plugins in clean table format
|
|
18
|
+
*/
|
|
19
|
+
declare const PluginList: React.ForwardRefExoticComponent<PluginListProps & React.RefAttributes<PluginListHandle>>;
|
|
20
|
+
export default PluginList;
|
|
21
|
+
//# sourceMappingURL=PluginList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/PluginList.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAG/D,UAAU,eAAe;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAaD;;GAEG;AACH,QAAA,MAAM,UAAU,0FA0Hd,CAAC;AAEH,eAAe,UAAU,CAAC"}
|