dexto 1.6.1 → 1.6.2
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/dist/analytics/wrapper.js +1 -1
- package/dist/cli/auth/dexto-api-key.d.ts +34 -0
- package/dist/cli/auth/dexto-api-key.d.ts.map +1 -0
- package/dist/cli/auth/dexto-api-key.js +161 -0
- package/dist/cli/auth/index.d.ts +2 -1
- package/dist/cli/auth/index.d.ts.map +1 -1
- package/dist/cli/auth/index.js +2 -1
- package/dist/cli/auth/oauth.d.ts +10 -0
- package/dist/cli/auth/oauth.d.ts.map +1 -1
- package/dist/cli/auth/oauth.js +113 -36
- package/dist/cli/auth/service.d.ts +1 -0
- package/dist/cli/auth/service.d.ts.map +1 -1
- package/dist/cli/auth/service.js +1 -0
- package/dist/cli/commands/auth/login.d.ts.map +1 -1
- package/dist/cli/commands/auth/login.js +40 -105
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +157 -120
- package/dist/cli/utils/config-validation.js +3 -3
- package/dist/cli/utils/options.d.ts.map +1 -1
- package/dist/cli/utils/options.js +6 -0
- package/dist/index-main.js +36 -2
- package/dist/webui/assets/index-BPlk2Wbt.css +1 -0
- package/dist/webui/assets/index-BZvrpxyh.js +2059 -0
- package/dist/webui/index.html +2 -2
- package/package.json +12 -22
- package/dist/cli/assets/sounds/SOURCES.md +0 -35
- package/dist/cli/assets/sounds/boot.wav +0 -0
- package/dist/cli/assets/sounds/chime.wav +0 -0
- package/dist/cli/assets/sounds/coin.wav +0 -0
- package/dist/cli/assets/sounds/confirm.wav +0 -0
- package/dist/cli/assets/sounds/levelup.wav +0 -0
- package/dist/cli/assets/sounds/ping.wav +0 -0
- package/dist/cli/assets/sounds/powerup.wav +0 -0
- package/dist/cli/assets/sounds/startup.wav +0 -0
- package/dist/cli/assets/sounds/success.wav +0 -0
- package/dist/cli/assets/sounds/treasure.wav +0 -0
- package/dist/cli/assets/sounds/win.wav +0 -0
- package/dist/cli/commands/interactive-commands/auth/index.d.ts +0 -12
- package/dist/cli/commands/interactive-commands/auth/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/auth/index.js +0 -20
- package/dist/cli/commands/interactive-commands/command-parser.d.ts +0 -56
- package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/command-parser.js +0 -173
- package/dist/cli/commands/interactive-commands/commands.d.ts +0 -52
- package/dist/cli/commands/interactive-commands/commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/commands.js +0 -142
- package/dist/cli/commands/interactive-commands/documentation-commands.d.ts +0 -15
- package/dist/cli/commands/interactive-commands/documentation-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/documentation-commands.js +0 -39
- package/dist/cli/commands/interactive-commands/exit-handler.d.ts +0 -12
- package/dist/cli/commands/interactive-commands/exit-handler.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/exit-handler.js +0 -20
- package/dist/cli/commands/interactive-commands/exit-stats.d.ts +0 -24
- package/dist/cli/commands/interactive-commands/exit-stats.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/exit-stats.js +0 -17
- package/dist/cli/commands/interactive-commands/export/index.d.ts +0 -13
- package/dist/cli/commands/interactive-commands/export/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/export/index.js +0 -21
- package/dist/cli/commands/interactive-commands/general-commands.d.ts +0 -22
- package/dist/cli/commands/interactive-commands/general-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/general-commands.js +0 -508
- package/dist/cli/commands/interactive-commands/mcp/index.d.ts +0 -13
- package/dist/cli/commands/interactive-commands/mcp/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/mcp/index.js +0 -18
- package/dist/cli/commands/interactive-commands/model/index.d.ts +0 -13
- package/dist/cli/commands/interactive-commands/model/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/model/index.js +0 -19
- package/dist/cli/commands/interactive-commands/plugin/index.d.ts +0 -13
- package/dist/cli/commands/interactive-commands/plugin/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/plugin/index.js +0 -18
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +0 -25
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +0 -284
- package/dist/cli/commands/interactive-commands/session/index.d.ts +0 -16
- package/dist/cli/commands/interactive-commands/session/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/session/index.js +0 -15
- package/dist/cli/commands/interactive-commands/session/session-commands.d.ts +0 -32
- package/dist/cli/commands/interactive-commands/session/session-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/session/session-commands.js +0 -65
- package/dist/cli/commands/interactive-commands/system/index.d.ts +0 -13
- package/dist/cli/commands/interactive-commands/system/index.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/system/index.js +0 -12
- package/dist/cli/commands/interactive-commands/system/system-commands.d.ts +0 -6
- package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/system/system-commands.js +0 -188
- package/dist/cli/commands/interactive-commands/tool-commands.d.ts +0 -15
- package/dist/cli/commands/interactive-commands/tool-commands.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/tool-commands.js +0 -24
- package/dist/cli/commands/interactive-commands/utils/arg-parser.d.ts +0 -57
- package/dist/cli/commands/interactive-commands/utils/arg-parser.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/utils/arg-parser.js +0 -81
- package/dist/cli/commands/interactive-commands/utils/command-output.d.ts +0 -40
- package/dist/cli/commands/interactive-commands/utils/command-output.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/utils/command-output.js +0 -56
- package/dist/cli/commands/interactive-commands/utils/format-output.d.ts +0 -14
- package/dist/cli/commands/interactive-commands/utils/format-output.d.ts.map +0 -1
- package/dist/cli/commands/interactive-commands/utils/format-output.js +0 -18
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts +0 -52
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +0 -1
- package/dist/cli/ink-cli/InkCLIRefactored.js +0 -231
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +0 -44
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.js +0 -323
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts +0 -18
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.js +0 -48
- package/dist/cli/ink-cli/components/CustomInput.d.ts +0 -17
- package/dist/cli/ink-cli/components/CustomInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/CustomInput.js +0 -51
- package/dist/cli/ink-cli/components/CustomTextInput.d.ts +0 -16
- package/dist/cli/ink-cli/components/CustomTextInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/CustomTextInput.js +0 -36
- package/dist/cli/ink-cli/components/EditableMultiLineInput.d.ts +0 -19
- package/dist/cli/ink-cli/components/EditableMultiLineInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/EditableMultiLineInput.js +0 -120
- package/dist/cli/ink-cli/components/ElicitationForm.d.ts +0 -24
- package/dist/cli/ink-cli/components/ElicitationForm.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/ElicitationForm.js +0 -592
- package/dist/cli/ink-cli/components/ErrorBoundary.d.ts +0 -20
- package/dist/cli/ink-cli/components/ErrorBoundary.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/ErrorBoundary.js +0 -29
- package/dist/cli/ink-cli/components/Footer.d.ts +0 -22
- package/dist/cli/ink-cli/components/Footer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/Footer.js +0 -76
- package/dist/cli/ink-cli/components/HistorySearchBar.d.ts +0 -17
- package/dist/cli/ink-cli/components/HistorySearchBar.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/HistorySearchBar.js +0 -8
- package/dist/cli/ink-cli/components/MultiLineInput.d.ts +0 -12
- package/dist/cli/ink-cli/components/MultiLineInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/MultiLineInput.js +0 -27
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts +0 -26
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/ResourceAutocomplete.js +0 -385
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts +0 -28
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +0 -412
- package/dist/cli/ink-cli/components/StatusBar.d.ts +0 -41
- package/dist/cli/ink-cli/components/StatusBar.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/StatusBar.js +0 -116
- package/dist/cli/ink-cli/components/TextBufferInput.d.ts +0 -52
- package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/TextBufferInput.js +0 -490
- package/dist/cli/ink-cli/components/TodoPanel.d.ts +0 -26
- package/dist/cli/ink-cli/components/TodoPanel.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/TodoPanel.js +0 -62
- package/dist/cli/ink-cli/components/base/BaseAutocomplete.d.ts +0 -29
- package/dist/cli/ink-cli/components/base/BaseAutocomplete.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/base/BaseAutocomplete.js +0 -98
- package/dist/cli/ink-cli/components/base/BaseSelector.d.ts +0 -37
- package/dist/cli/ink-cli/components/base/BaseSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/base/BaseSelector.js +0 -128
- package/dist/cli/ink-cli/components/base/index.d.ts +0 -6
- package/dist/cli/ink-cli/components/base/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/base/index.js +0 -5
- package/dist/cli/ink-cli/components/chat/ChatView.d.ts +0 -19
- package/dist/cli/ink-cli/components/chat/ChatView.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/ChatView.js +0 -11
- package/dist/cli/ink-cli/components/chat/Footer.d.ts +0 -9
- package/dist/cli/ink-cli/components/chat/Footer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/Footer.js +0 -8
- package/dist/cli/ink-cli/components/chat/Header.d.ts +0 -18
- package/dist/cli/ink-cli/components/chat/Header.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/Header.js +0 -16
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts +0 -21
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.js +0 -182
- package/dist/cli/ink-cli/components/chat/MessageList.d.ts +0 -16
- package/dist/cli/ink-cli/components/chat/MessageList.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/MessageList.js +0 -20
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts +0 -16
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.js +0 -27
- package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts +0 -18
- package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/ToolIcon.js +0 -36
- package/dist/cli/ink-cli/components/chat/index.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/index.js +0 -9
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +0 -6
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.js +0 -15
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.js +0 -9
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.js +0 -37
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.js +0 -9
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.js +0 -6
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.js +0 -29
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts +0 -45
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.js +0 -38
- package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts +0 -10
- package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.js +0 -6
- package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts +0 -13
- package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/index.js +0 -12
- package/dist/cli/ink-cli/components/input/InputArea.d.ts +0 -46
- package/dist/cli/ink-cli/components/input/InputArea.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/input/InputArea.js +0 -6
- package/dist/cli/ink-cli/components/input/index.d.ts +0 -5
- package/dist/cli/ink-cli/components/input/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/input/index.js +0 -4
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts +0 -27
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +0 -182
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts +0 -29
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.js +0 -114
- package/dist/cli/ink-cli/components/modes/index.d.ts +0 -10
- package/dist/cli/ink-cli/components/modes/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/modes/index.js +0 -9
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts +0 -26
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.js +0 -92
- package/dist/cli/ink-cli/components/overlays/CommandOutputOverlay.d.ts +0 -13
- package/dist/cli/ink-cli/components/overlays/CommandOutputOverlay.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/CommandOutputOverlay.js +0 -60
- package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.d.ts +0 -26
- package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.js +0 -241
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts +0 -29
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +0 -301
- package/dist/cli/ink-cli/components/overlays/ExportWizard.d.ts +0 -22
- package/dist/cli/ink-cli/components/overlays/ExportWizard.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/ExportWizard.js +0 -308
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts +0 -23
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +0 -70
- package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.d.ts +0 -20
- package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.js +0 -81
- package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.d.ts +0 -31
- package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.js +0 -297
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts +0 -22
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.js +0 -59
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts +0 -26
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.js +0 -73
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.js +0 -51
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts +0 -29
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.js +0 -215
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts +0 -22
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +0 -80
- package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpSelector.js +0 -52
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts +0 -28
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.js +0 -93
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts +0 -29
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/McpServerList.js +0 -116
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +0 -28
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +0 -743
- package/dist/cli/ink-cli/components/overlays/PluginActions.d.ts +0 -27
- package/dist/cli/ink-cli/components/overlays/PluginActions.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PluginActions.js +0 -66
- package/dist/cli/ink-cli/components/overlays/PluginList.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/PluginList.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PluginList.js +0 -70
- package/dist/cli/ink-cli/components/overlays/PluginManager.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/PluginManager.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PluginManager.js +0 -63
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts +0 -22
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.js +0 -52
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts +0 -29
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.js +0 -166
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts +0 -27
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.js +0 -119
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts +0 -33
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/PromptList.js +0 -143
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts +0 -23
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.js +0 -189
- package/dist/cli/ink-cli/components/overlays/SessionRenameOverlay.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/SessionRenameOverlay.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/SessionRenameOverlay.js +0 -63
- package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts +0 -26
- package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.js +0 -126
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.js +0 -42
- package/dist/cli/ink-cli/components/overlays/SoundsSelector.d.ts +0 -21
- package/dist/cli/ink-cli/components/overlays/SoundsSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/SoundsSelector.js +0 -566
- package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts +0 -20
- package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/StreamSelector.js +0 -58
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +0 -26
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +0 -697
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts +0 -25
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.js +0 -604
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts +0 -15
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.js +0 -14
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +0 -42
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +0 -547
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts +0 -25
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.js +0 -29
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts +0 -17
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.js +0 -11
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts +0 -20
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.js +0 -10
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts +0 -30
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.js +0 -13
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts +0 -8
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.js +0 -7
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts +0 -85
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.js +0 -38
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts +0 -21
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.js +0 -65
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts +0 -30
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +0 -67
- package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts +0 -21
- package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/FileRenderer.js +0 -37
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts +0 -21
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +0 -26
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts +0 -20
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +0 -26
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts +0 -21
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.js +0 -15
- package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts +0 -61
- package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/diff-shared.js +0 -158
- package/dist/cli/ink-cli/components/renderers/index.d.ts +0 -28
- package/dist/cli/ink-cli/components/renderers/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/renderers/index.js +0 -36
- package/dist/cli/ink-cli/components/shared/FocusOverlayFrame.d.ts +0 -7
- package/dist/cli/ink-cli/components/shared/FocusOverlayFrame.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/shared/FocusOverlayFrame.js +0 -8
- package/dist/cli/ink-cli/components/shared/HintBar.d.ts +0 -6
- package/dist/cli/ink-cli/components/shared/HintBar.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/shared/HintBar.js +0 -6
- package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts +0 -38
- package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/shared/MarkdownText.js +0 -389
- package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts +0 -44
- package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/shared/VirtualizedList.js +0 -300
- package/dist/cli/ink-cli/components/shared/text-buffer.d.ts +0 -185
- package/dist/cli/ink-cli/components/shared/text-buffer.d.ts.map +0 -1
- package/dist/cli/ink-cli/components/shared/text-buffer.js +0 -1338
- package/dist/cli/ink-cli/constants/processingPhrases.d.ts +0 -10
- package/dist/cli/ink-cli/constants/processingPhrases.d.ts.map +0 -1
- package/dist/cli/ink-cli/constants/processingPhrases.js +0 -92
- package/dist/cli/ink-cli/constants/spinnerFrames.d.ts +0 -2
- package/dist/cli/ink-cli/constants/spinnerFrames.d.ts.map +0 -1
- package/dist/cli/ink-cli/constants/spinnerFrames.js +0 -1
- package/dist/cli/ink-cli/constants/tips.d.ts +0 -15
- package/dist/cli/ink-cli/constants/tips.d.ts.map +0 -1
- package/dist/cli/ink-cli/constants/tips.js +0 -58
- package/dist/cli/ink-cli/containers/InputContainer.d.ts +0 -62
- package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +0 -1
- package/dist/cli/ink-cli/containers/InputContainer.js +0 -643
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts +0 -42
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +0 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.js +0 -1840
- package/dist/cli/ink-cli/containers/index.d.ts +0 -6
- package/dist/cli/ink-cli/containers/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/containers/index.js +0 -5
- package/dist/cli/ink-cli/contexts/KeypressContext.d.ts +0 -36
- package/dist/cli/ink-cli/contexts/KeypressContext.d.ts.map +0 -1
- package/dist/cli/ink-cli/contexts/KeypressContext.js +0 -461
- package/dist/cli/ink-cli/contexts/MouseContext.d.ts +0 -27
- package/dist/cli/ink-cli/contexts/MouseContext.d.ts.map +0 -1
- package/dist/cli/ink-cli/contexts/MouseContext.js +0 -102
- package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts +0 -33
- package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts.map +0 -1
- package/dist/cli/ink-cli/contexts/ScrollProvider.js +0 -170
- package/dist/cli/ink-cli/contexts/SoundContext.d.ts +0 -23
- package/dist/cli/ink-cli/contexts/SoundContext.d.ts.map +0 -1
- package/dist/cli/ink-cli/contexts/SoundContext.js +0 -22
- package/dist/cli/ink-cli/contexts/index.d.ts +0 -8
- package/dist/cli/ink-cli/contexts/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/contexts/index.js +0 -7
- package/dist/cli/ink-cli/hooks/index.d.ts +0 -12
- package/dist/cli/ink-cli/hooks/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/index.js +0 -14
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts +0 -49
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.js +0 -369
- package/dist/cli/ink-cli/hooks/useAnimationTick.d.ts +0 -11
- package/dist/cli/ink-cli/hooks/useAnimationTick.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useAnimationTick.js +0 -54
- package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts +0 -14
- package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useBatchedScroll.js +0 -25
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts +0 -52
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useCLIState.js +0 -224
- package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts +0 -24
- package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useElapsedTime.js +0 -69
- package/dist/cli/ink-cli/hooks/useGitBranch.d.ts +0 -13
- package/dist/cli/ink-cli/hooks/useGitBranch.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useGitBranch.js +0 -35
- package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts +0 -61
- package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useHistorySearch.js +0 -210
- package/dist/cli/ink-cli/hooks/useInputHistory.d.ts +0 -18
- package/dist/cli/ink-cli/hooks/useInputHistory.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useInputHistory.js +0 -26
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts +0 -136
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +0 -715
- package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.d.ts +0 -21
- package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.js +0 -80
- package/dist/cli/ink-cli/hooks/useKeypress.d.ts +0 -18
- package/dist/cli/ink-cli/hooks/useKeypress.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useKeypress.js +0 -26
- package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts +0 -30
- package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/usePhraseCycler.js +0 -68
- package/dist/cli/ink-cli/hooks/useStreaming.d.ts +0 -19
- package/dist/cli/ink-cli/hooks/useStreaming.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useStreaming.js +0 -26
- package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts +0 -14
- package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useTerminalSize.js +0 -31
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts +0 -46
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +0 -1
- package/dist/cli/ink-cli/hooks/useTokenCounter.js +0 -122
- package/dist/cli/ink-cli/services/CommandService.d.ts +0 -58
- package/dist/cli/ink-cli/services/CommandService.d.ts.map +0 -1
- package/dist/cli/ink-cli/services/CommandService.js +0 -64
- package/dist/cli/ink-cli/services/InputService.d.ts +0 -40
- package/dist/cli/ink-cli/services/InputService.d.ts.map +0 -1
- package/dist/cli/ink-cli/services/InputService.js +0 -87
- package/dist/cli/ink-cli/services/MessageService.d.ts +0 -35
- package/dist/cli/ink-cli/services/MessageService.d.ts.map +0 -1
- package/dist/cli/ink-cli/services/MessageService.js +0 -49
- package/dist/cli/ink-cli/services/index.d.ts +0 -8
- package/dist/cli/ink-cli/services/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/services/index.js +0 -7
- package/dist/cli/ink-cli/services/processStream.d.ts +0 -75
- package/dist/cli/ink-cli/services/processStream.d.ts.map +0 -1
- package/dist/cli/ink-cli/services/processStream.js +0 -951
- package/dist/cli/ink-cli/state/actions.d.ts +0 -124
- package/dist/cli/ink-cli/state/actions.d.ts.map +0 -1
- package/dist/cli/ink-cli/state/actions.js +0 -8
- package/dist/cli/ink-cli/state/index.d.ts +0 -10
- package/dist/cli/ink-cli/state/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/state/index.js +0 -8
- package/dist/cli/ink-cli/state/initialState.d.ts +0 -12
- package/dist/cli/ink-cli/state/initialState.d.ts.map +0 -1
- package/dist/cli/ink-cli/state/initialState.js +0 -58
- package/dist/cli/ink-cli/state/reducer.d.ts +0 -15
- package/dist/cli/ink-cli/state/reducer.d.ts.map +0 -1
- package/dist/cli/ink-cli/state/reducer.js +0 -341
- package/dist/cli/ink-cli/state/streaming-state.d.ts +0 -27
- package/dist/cli/ink-cli/state/streaming-state.d.ts.map +0 -1
- package/dist/cli/ink-cli/state/streaming-state.js +0 -39
- package/dist/cli/ink-cli/state/types.d.ts +0 -378
- package/dist/cli/ink-cli/state/types.d.ts.map +0 -1
- package/dist/cli/ink-cli/state/types.js +0 -5
- package/dist/cli/ink-cli/utils/bracketedPaste.d.ts +0 -22
- package/dist/cli/ink-cli/utils/bracketedPaste.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/bracketedPaste.js +0 -27
- package/dist/cli/ink-cli/utils/clipboardUtils.d.ts +0 -49
- package/dist/cli/ink-cli/utils/clipboardUtils.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/clipboardUtils.js +0 -356
- package/dist/cli/ink-cli/utils/commandOverlays.d.ts +0 -33
- package/dist/cli/ink-cli/utils/commandOverlays.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/commandOverlays.js +0 -85
- package/dist/cli/ink-cli/utils/debugLog.d.ts +0 -38
- package/dist/cli/ink-cli/utils/debugLog.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/debugLog.js +0 -66
- package/dist/cli/ink-cli/utils/elicitationSchema.d.ts +0 -11
- package/dist/cli/ink-cli/utils/elicitationSchema.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/elicitationSchema.js +0 -80
- package/dist/cli/ink-cli/utils/idGenerator.d.ts +0 -10
- package/dist/cli/ink-cli/utils/idGenerator.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/idGenerator.js +0 -12
- package/dist/cli/ink-cli/utils/index.d.ts +0 -9
- package/dist/cli/ink-cli/utils/index.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/index.js +0 -13
- package/dist/cli/ink-cli/utils/input.d.ts +0 -25
- package/dist/cli/ink-cli/utils/input.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/input.js +0 -56
- package/dist/cli/ink-cli/utils/inputParsing.d.ts +0 -31
- package/dist/cli/ink-cli/utils/inputParsing.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/inputParsing.js +0 -70
- package/dist/cli/ink-cli/utils/llm-provider-display.d.ts +0 -3
- package/dist/cli/ink-cli/utils/llm-provider-display.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/llm-provider-display.js +0 -22
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts +0 -125
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/messageFormatting.js +0 -485
- package/dist/cli/ink-cli/utils/mouse.d.ts +0 -61
- package/dist/cli/ink-cli/utils/mouse.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/mouse.js +0 -209
- package/dist/cli/ink-cli/utils/overlayPresentation.d.ts +0 -19
- package/dist/cli/ink-cli/utils/overlayPresentation.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/overlayPresentation.js +0 -33
- package/dist/cli/ink-cli/utils/overlaySizing.d.ts +0 -19
- package/dist/cli/ink-cli/utils/overlaySizing.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/overlaySizing.js +0 -11
- package/dist/cli/ink-cli/utils/soundNotification.d.ts +0 -77
- package/dist/cli/ink-cli/utils/soundNotification.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/soundNotification.js +0 -226
- package/dist/cli/ink-cli/utils/streamSplitter.d.ts +0 -44
- package/dist/cli/ink-cli/utils/streamSplitter.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/streamSplitter.js +0 -154
- package/dist/cli/ink-cli/utils/textUtils.d.ts +0 -63
- package/dist/cli/ink-cli/utils/textUtils.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/textUtils.js +0 -248
- package/dist/cli/ink-cli/utils/toolUtils.d.ts +0 -20
- package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +0 -1
- package/dist/cli/ink-cli/utils/toolUtils.js +0 -25
- package/dist/webui/assets/index-C9JXwpvo.css +0 -1
- package/dist/webui/assets/index-CKhumsZA.js +0 -2059
|
@@ -1,1840 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* OverlayContainer Component
|
|
4
|
-
* Smart container for managing all overlays (selectors, autocomplete, approval)
|
|
5
|
-
*/
|
|
6
|
-
import React, { useCallback, useRef, useImperativeHandle, forwardRef, useState } from 'react';
|
|
7
|
-
import { Box } from 'ink';
|
|
8
|
-
import path from 'path';
|
|
9
|
-
import { ApprovalStatus, DenialReason, isUserMessage } from '@dexto/core';
|
|
10
|
-
import { ApprovalPrompt, } from '../components/ApprovalPrompt.js';
|
|
11
|
-
import { SlashCommandAutocomplete, } from '../components/SlashCommandAutocomplete.js';
|
|
12
|
-
import ResourceAutocomplete from '../components/ResourceAutocomplete.js';
|
|
13
|
-
import ModelSelectorRefactored from '../components/overlays/ModelSelectorRefactored.js';
|
|
14
|
-
import SessionSelectorRefactored from '../components/overlays/SessionSelectorRefactored.js';
|
|
15
|
-
import LogLevelSelector from '../components/overlays/LogLevelSelector.js';
|
|
16
|
-
import StreamSelector from '../components/overlays/StreamSelector.js';
|
|
17
|
-
import SoundsSelector from '../components/overlays/SoundsSelector.js';
|
|
18
|
-
import ToolBrowser from '../components/overlays/ToolBrowser.js';
|
|
19
|
-
import { CommandOutputOverlay, } from '../components/overlays/CommandOutputOverlay.js';
|
|
20
|
-
import McpServerList from '../components/overlays/McpServerList.js';
|
|
21
|
-
import McpServerActions from '../components/overlays/McpServerActions.js';
|
|
22
|
-
import McpAddChoice from '../components/overlays/McpAddChoice.js';
|
|
23
|
-
import McpAddSelector from '../components/overlays/McpAddSelector.js';
|
|
24
|
-
import SessionSubcommandSelector from '../components/overlays/SessionSubcommandSelector.js';
|
|
25
|
-
import McpCustomTypeSelector from '../components/overlays/McpCustomTypeSelector.js';
|
|
26
|
-
import McpCustomWizard from '../components/overlays/McpCustomWizard.js';
|
|
27
|
-
import CustomModelWizard from '../components/overlays/CustomModelWizard.js';
|
|
28
|
-
import { getProviderKeyStatus, loadGlobalPreferences, updateGlobalPreferences, } from '@dexto/agent-management';
|
|
29
|
-
import ApiKeyInput from '../components/overlays/ApiKeyInput.js';
|
|
30
|
-
import SearchOverlay from '../components/overlays/SearchOverlay.js';
|
|
31
|
-
import PromptList from '../components/overlays/PromptList.js';
|
|
32
|
-
import PromptAddChoice from '../components/overlays/PromptAddChoice.js';
|
|
33
|
-
import PromptAddWizard from '../components/overlays/PromptAddWizard.js';
|
|
34
|
-
import PromptDeleteSelector from '../components/overlays/PromptDeleteSelector.js';
|
|
35
|
-
import SessionRenameOverlay from '../components/overlays/SessionRenameOverlay.js';
|
|
36
|
-
import ContextStatsOverlay from '../components/overlays/ContextStatsOverlay.js';
|
|
37
|
-
import ExportWizard from '../components/overlays/ExportWizard.js';
|
|
38
|
-
import PluginManager from '../components/overlays/PluginManager.js';
|
|
39
|
-
import PluginList from '../components/overlays/PluginList.js';
|
|
40
|
-
import PluginActions from '../components/overlays/PluginActions.js';
|
|
41
|
-
import MarketplaceBrowser from '../components/overlays/MarketplaceBrowser.js';
|
|
42
|
-
import MarketplaceAddPrompt from '../components/overlays/MarketplaceAddPrompt.js';
|
|
43
|
-
import { DextoValidationError, LLMErrorCode, getModelDisplayName } from '@dexto/core';
|
|
44
|
-
import { createUserMessage, convertHistoryToUIMessages } from '../utils/messageFormatting.js';
|
|
45
|
-
import { generateMessageId } from '../utils/idGenerator.js';
|
|
46
|
-
import { capture } from '../../../analytics/index.js';
|
|
47
|
-
import { FocusOverlayFrame } from '../components/shared/FocusOverlayFrame.js';
|
|
48
|
-
import { shouldHideCliChrome } from '../utils/overlayPresentation.js';
|
|
49
|
-
/**
|
|
50
|
-
* Smart container for managing overlays
|
|
51
|
-
* Handles all modal interactions (selectors, autocomplete, approval)
|
|
52
|
-
*/
|
|
53
|
-
export const OverlayContainer = forwardRef(function OverlayContainer({ ui, input, session, approval, setInput, setUi, setSession, setMessages, setApproval, setApprovalQueue, agent, inputService, buffer, configFilePath, refreshStatic, onSubmitPromptCommand, }, ref) {
|
|
54
|
-
// Refs to overlay components for input handling
|
|
55
|
-
const approvalRef = useRef(null);
|
|
56
|
-
const slashAutocompleteRef = useRef(null);
|
|
57
|
-
const resourceAutocompleteRef = useRef(null);
|
|
58
|
-
const modelSelectorRef = useRef(null);
|
|
59
|
-
const sessionSelectorRef = useRef(null);
|
|
60
|
-
const logLevelSelectorRef = useRef(null);
|
|
61
|
-
const streamSelectorRef = useRef(null);
|
|
62
|
-
const soundsSelectorRef = useRef(null);
|
|
63
|
-
const toolBrowserRef = useRef(null);
|
|
64
|
-
const commandOutputRef = useRef(null);
|
|
65
|
-
const mcpServerListRef = useRef(null);
|
|
66
|
-
const mcpServerActionsRef = useRef(null);
|
|
67
|
-
const mcpAddChoiceRef = useRef(null);
|
|
68
|
-
const mcpAddSelectorRef = useRef(null);
|
|
69
|
-
const mcpCustomTypeSelectorRef = useRef(null);
|
|
70
|
-
const mcpCustomWizardRef = useRef(null);
|
|
71
|
-
const customModelWizardRef = useRef(null);
|
|
72
|
-
const sessionSubcommandSelectorRef = useRef(null);
|
|
73
|
-
const apiKeyInputRef = useRef(null);
|
|
74
|
-
const searchOverlayRef = useRef(null);
|
|
75
|
-
const promptListRef = useRef(null);
|
|
76
|
-
const promptAddChoiceRef = useRef(null);
|
|
77
|
-
const promptAddWizardRef = useRef(null);
|
|
78
|
-
const promptDeleteSelectorRef = useRef(null);
|
|
79
|
-
const sessionRenameRef = useRef(null);
|
|
80
|
-
const contextStatsRef = useRef(null);
|
|
81
|
-
const exportWizardRef = useRef(null);
|
|
82
|
-
const pluginManagerRef = useRef(null);
|
|
83
|
-
const pluginListRef = useRef(null);
|
|
84
|
-
const pluginActionsRef = useRef(null);
|
|
85
|
-
const marketplaceBrowserRef = useRef(null);
|
|
86
|
-
// State for selected plugin (for plugin-actions overlay)
|
|
87
|
-
const [selectedPlugin, setSelectedPlugin] = useState(null);
|
|
88
|
-
const marketplaceAddPromptRef = useRef(null);
|
|
89
|
-
const getConfigFilePathOrWarn = useCallback((action) => {
|
|
90
|
-
if (configFilePath) {
|
|
91
|
-
return configFilePath;
|
|
92
|
-
}
|
|
93
|
-
setMessages((prev) => [
|
|
94
|
-
...prev,
|
|
95
|
-
{
|
|
96
|
-
id: generateMessageId('system'),
|
|
97
|
-
role: 'system',
|
|
98
|
-
content: `⚠️ Cannot ${action}: this agent is not file-backed (no config path).`,
|
|
99
|
-
timestamp: new Date(),
|
|
100
|
-
},
|
|
101
|
-
]);
|
|
102
|
-
return null;
|
|
103
|
-
}, [configFilePath, setMessages]);
|
|
104
|
-
// Expose handleInput method via ref - routes to appropriate overlay
|
|
105
|
-
useImperativeHandle(ref, () => ({
|
|
106
|
-
handleInput: (inputStr, key) => {
|
|
107
|
-
// Route to approval first (highest priority)
|
|
108
|
-
if (approval && approvalRef.current) {
|
|
109
|
-
return approvalRef.current.handleInput(inputStr, key);
|
|
110
|
-
}
|
|
111
|
-
// Route to active overlay based on type
|
|
112
|
-
switch (ui.activeOverlay) {
|
|
113
|
-
case 'slash-autocomplete':
|
|
114
|
-
return (slashAutocompleteRef.current?.handleInput(inputStr, key) ?? false);
|
|
115
|
-
case 'resource-autocomplete':
|
|
116
|
-
return (resourceAutocompleteRef.current?.handleInput(inputStr, key) ?? false);
|
|
117
|
-
case 'model-selector':
|
|
118
|
-
return modelSelectorRef.current?.handleInput(inputStr, key) ?? false;
|
|
119
|
-
case 'session-selector':
|
|
120
|
-
return sessionSelectorRef.current?.handleInput(inputStr, key) ?? false;
|
|
121
|
-
case 'log-level-selector':
|
|
122
|
-
return logLevelSelectorRef.current?.handleInput(inputStr, key) ?? false;
|
|
123
|
-
case 'stream-selector':
|
|
124
|
-
return streamSelectorRef.current?.handleInput(inputStr, key) ?? false;
|
|
125
|
-
case 'sounds-selector':
|
|
126
|
-
return soundsSelectorRef.current?.handleInput(inputStr, key) ?? false;
|
|
127
|
-
case 'tool-browser':
|
|
128
|
-
return toolBrowserRef.current?.handleInput(inputStr, key) ?? false;
|
|
129
|
-
case 'command-output':
|
|
130
|
-
return commandOutputRef.current?.handleInput(inputStr, key) ?? false;
|
|
131
|
-
case 'mcp-server-list':
|
|
132
|
-
return mcpServerListRef.current?.handleInput(inputStr, key) ?? false;
|
|
133
|
-
case 'mcp-server-actions':
|
|
134
|
-
return mcpServerActionsRef.current?.handleInput(inputStr, key) ?? false;
|
|
135
|
-
case 'mcp-add-choice':
|
|
136
|
-
return mcpAddChoiceRef.current?.handleInput(inputStr, key) ?? false;
|
|
137
|
-
case 'mcp-add-selector':
|
|
138
|
-
return mcpAddSelectorRef.current?.handleInput(inputStr, key) ?? false;
|
|
139
|
-
case 'mcp-custom-type-selector':
|
|
140
|
-
return (mcpCustomTypeSelectorRef.current?.handleInput(inputStr, key) ??
|
|
141
|
-
false);
|
|
142
|
-
case 'mcp-custom-wizard':
|
|
143
|
-
return mcpCustomWizardRef.current?.handleInput(inputStr, key) ?? false;
|
|
144
|
-
case 'custom-model-wizard':
|
|
145
|
-
return (customModelWizardRef.current?.handleInput(inputStr, key) ?? false);
|
|
146
|
-
case 'session-subcommand-selector':
|
|
147
|
-
return (sessionSubcommandSelectorRef.current?.handleInput(inputStr, key) ??
|
|
148
|
-
false);
|
|
149
|
-
case 'api-key-input':
|
|
150
|
-
return apiKeyInputRef.current?.handleInput(inputStr, key) ?? false;
|
|
151
|
-
case 'search':
|
|
152
|
-
return searchOverlayRef.current?.handleInput(inputStr, key) ?? false;
|
|
153
|
-
case 'prompt-list':
|
|
154
|
-
return promptListRef.current?.handleInput(inputStr, key) ?? false;
|
|
155
|
-
case 'prompt-add-choice':
|
|
156
|
-
return promptAddChoiceRef.current?.handleInput(inputStr, key) ?? false;
|
|
157
|
-
case 'prompt-add-wizard':
|
|
158
|
-
return promptAddWizardRef.current?.handleInput(inputStr, key) ?? false;
|
|
159
|
-
case 'prompt-delete-selector':
|
|
160
|
-
return (promptDeleteSelectorRef.current?.handleInput(inputStr, key) ?? false);
|
|
161
|
-
case 'session-rename':
|
|
162
|
-
return sessionRenameRef.current?.handleInput(inputStr, key) ?? false;
|
|
163
|
-
case 'context-stats':
|
|
164
|
-
return contextStatsRef.current?.handleInput(inputStr, key) ?? false;
|
|
165
|
-
case 'export-wizard':
|
|
166
|
-
return exportWizardRef.current?.handleInput(inputStr, key) ?? false;
|
|
167
|
-
case 'plugin-manager':
|
|
168
|
-
return pluginManagerRef.current?.handleInput(inputStr, key) ?? false;
|
|
169
|
-
case 'plugin-list':
|
|
170
|
-
return pluginListRef.current?.handleInput(inputStr, key) ?? false;
|
|
171
|
-
case 'plugin-actions':
|
|
172
|
-
return pluginActionsRef.current?.handleInput(inputStr, key) ?? false;
|
|
173
|
-
case 'marketplace-browser':
|
|
174
|
-
return (marketplaceBrowserRef.current?.handleInput(inputStr, key) ?? false);
|
|
175
|
-
case 'marketplace-add':
|
|
176
|
-
return (marketplaceAddPromptRef.current?.handleInput(inputStr, key) ?? false);
|
|
177
|
-
default:
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
},
|
|
181
|
-
}), [approval, ui.activeOverlay]);
|
|
182
|
-
// NOTE: Automatic overlay detection removed to prevent infinite loop
|
|
183
|
-
// Overlays are now shown explicitly via setUi from InputContainer
|
|
184
|
-
// or from the main component's input detection logic
|
|
185
|
-
// Helper: Complete approval and process queue
|
|
186
|
-
const completeApproval = useCallback(() => {
|
|
187
|
-
setApprovalQueue((queue) => {
|
|
188
|
-
if (queue.length > 0) {
|
|
189
|
-
// Show next approval from queue
|
|
190
|
-
const [next, ...rest] = queue;
|
|
191
|
-
setApproval(next);
|
|
192
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'approval' }));
|
|
193
|
-
return rest;
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
// No more approvals
|
|
197
|
-
setApproval(null);
|
|
198
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
|
|
199
|
-
return [];
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
}, [setApproval, setApprovalQueue, setUi]);
|
|
203
|
-
// Handle approval responses
|
|
204
|
-
const handleApprove = useCallback((options) => {
|
|
205
|
-
if (!approval)
|
|
206
|
-
return;
|
|
207
|
-
// Enable "accept all edits" mode if requested
|
|
208
|
-
if (options.enableAcceptEditsMode) {
|
|
209
|
-
setUi((prev) => ({ ...prev, autoApproveEdits: true }));
|
|
210
|
-
}
|
|
211
|
-
// Auto-disable plan mode when plan_create or plan_review is approved
|
|
212
|
-
// This signals the transition from planning phase to execution phase
|
|
213
|
-
const toolName = approval.metadata.toolName;
|
|
214
|
-
if (toolName === 'plan_create' || toolName === 'plan_review') {
|
|
215
|
-
setUi((prev) => ({
|
|
216
|
-
...prev,
|
|
217
|
-
planModeActive: false,
|
|
218
|
-
planModeInitialized: false,
|
|
219
|
-
}));
|
|
220
|
-
}
|
|
221
|
-
agent.emit('approval:response', {
|
|
222
|
-
approvalId: approval.approvalId,
|
|
223
|
-
status: ApprovalStatus.APPROVED,
|
|
224
|
-
sessionId: approval.sessionId,
|
|
225
|
-
data: {
|
|
226
|
-
rememberChoice: options.rememberChoice,
|
|
227
|
-
rememberPattern: options.rememberPattern,
|
|
228
|
-
formData: options.formData,
|
|
229
|
-
rememberDirectory: options.rememberDirectory,
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
completeApproval();
|
|
233
|
-
}, [approval, agent, completeApproval, setUi]);
|
|
234
|
-
const handleDeny = useCallback((feedback) => {
|
|
235
|
-
if (!approval)
|
|
236
|
-
return;
|
|
237
|
-
// Include user feedback in the denial message if provided
|
|
238
|
-
const message = feedback
|
|
239
|
-
? `User requested changes: ${feedback}`
|
|
240
|
-
: 'User denied the tool execution';
|
|
241
|
-
agent.emit('approval:response', {
|
|
242
|
-
approvalId: approval.approvalId,
|
|
243
|
-
status: ApprovalStatus.DENIED,
|
|
244
|
-
sessionId: approval.sessionId,
|
|
245
|
-
reason: DenialReason.USER_DENIED,
|
|
246
|
-
message,
|
|
247
|
-
});
|
|
248
|
-
completeApproval();
|
|
249
|
-
}, [approval, agent, completeApproval]);
|
|
250
|
-
const handleCancelApproval = useCallback(() => {
|
|
251
|
-
if (!approval)
|
|
252
|
-
return;
|
|
253
|
-
agent.emit('approval:response', {
|
|
254
|
-
approvalId: approval.approvalId,
|
|
255
|
-
status: ApprovalStatus.CANCELLED,
|
|
256
|
-
sessionId: approval.sessionId,
|
|
257
|
-
reason: DenialReason.USER_CANCELLED,
|
|
258
|
-
message: 'User cancelled the approval request',
|
|
259
|
-
});
|
|
260
|
-
completeApproval();
|
|
261
|
-
}, [approval, agent, completeApproval]);
|
|
262
|
-
// Helper: Check if error is due to missing API key
|
|
263
|
-
const isApiKeyMissingError = (error) => {
|
|
264
|
-
if (error instanceof DextoValidationError) {
|
|
265
|
-
const apiKeyIssue = error.issues.find((issue) => issue.code === LLMErrorCode.API_KEY_MISSING);
|
|
266
|
-
if (apiKeyIssue && apiKeyIssue.context) {
|
|
267
|
-
// Extract provider from context
|
|
268
|
-
const context = apiKeyIssue.context;
|
|
269
|
-
if (context.provider) {
|
|
270
|
-
return context.provider;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return null;
|
|
275
|
-
};
|
|
276
|
-
// Handle model selection (session-only)
|
|
277
|
-
const handleModelSelect = useCallback(async (provider, model, displayName, baseURL, reasoningEffort) => {
|
|
278
|
-
// Session-only switch (default is set via explicit action)
|
|
279
|
-
// Pre-check: Dexto Nova provider requires OAuth login AND API key
|
|
280
|
-
// Check BEFORE closing the overlay so user can pick a different model
|
|
281
|
-
if (provider === 'dexto-nova') {
|
|
282
|
-
try {
|
|
283
|
-
const { canUseDextoProvider } = await import('../../utils/dexto-setup.js');
|
|
284
|
-
const canUse = await canUseDextoProvider();
|
|
285
|
-
if (!canUse) {
|
|
286
|
-
setMessages((prev) => [
|
|
287
|
-
...prev,
|
|
288
|
-
{
|
|
289
|
-
id: generateMessageId('system'),
|
|
290
|
-
role: 'system',
|
|
291
|
-
content: 'Cannot switch to Dexto Nova model - authentication required. Run /login to authenticate.',
|
|
292
|
-
timestamp: new Date(),
|
|
293
|
-
},
|
|
294
|
-
]);
|
|
295
|
-
// Don't close the overlay - let user pick a different model
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
catch (error) {
|
|
300
|
-
setMessages((prev) => [
|
|
301
|
-
...prev,
|
|
302
|
-
{
|
|
303
|
-
id: generateMessageId('error'),
|
|
304
|
-
role: 'system',
|
|
305
|
-
content: `Failed to verify Dexto Nova auth: ${error instanceof Error ? error.message : String(error)}`,
|
|
306
|
-
timestamp: new Date(),
|
|
307
|
-
},
|
|
308
|
-
]);
|
|
309
|
-
// Don't close the overlay - let user pick a different model
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
314
|
-
buffer.setText('');
|
|
315
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
316
|
-
try {
|
|
317
|
-
setMessages((prev) => [
|
|
318
|
-
...prev,
|
|
319
|
-
{
|
|
320
|
-
id: generateMessageId('system'),
|
|
321
|
-
role: 'system',
|
|
322
|
-
content: `🔄 Switching to ${displayName || model} (${provider})...`,
|
|
323
|
-
timestamp: new Date(),
|
|
324
|
-
},
|
|
325
|
-
]);
|
|
326
|
-
await agent.switchLLM({ provider: provider, model, baseURL, reasoningEffort }, session.id || undefined);
|
|
327
|
-
// Update session state with display name (fallback to model ID)
|
|
328
|
-
setSession((prev) => ({ ...prev, modelName: displayName || model }));
|
|
329
|
-
setMessages((prev) => [
|
|
330
|
-
...prev,
|
|
331
|
-
{
|
|
332
|
-
id: generateMessageId('system'),
|
|
333
|
-
role: 'system',
|
|
334
|
-
content: `✅ Successfully switched to ${displayName || model} (${provider})`,
|
|
335
|
-
timestamp: new Date(),
|
|
336
|
-
},
|
|
337
|
-
]);
|
|
338
|
-
}
|
|
339
|
-
catch (error) {
|
|
340
|
-
// Check if error is due to missing API key
|
|
341
|
-
const missingProvider = isApiKeyMissingError(error);
|
|
342
|
-
if (missingProvider) {
|
|
343
|
-
// Store pending model switch and show API key input
|
|
344
|
-
// Use missingProvider (from error) as the authoritative source
|
|
345
|
-
setUi((prev) => ({
|
|
346
|
-
...prev,
|
|
347
|
-
activeOverlay: 'api-key-input',
|
|
348
|
-
pendingModelSwitch: {
|
|
349
|
-
provider: missingProvider,
|
|
350
|
-
model,
|
|
351
|
-
...(displayName && { displayName }),
|
|
352
|
-
...(baseURL && { baseURL }),
|
|
353
|
-
...(reasoningEffort && { reasoningEffort }),
|
|
354
|
-
},
|
|
355
|
-
}));
|
|
356
|
-
setMessages((prev) => [
|
|
357
|
-
...prev,
|
|
358
|
-
{
|
|
359
|
-
id: generateMessageId('system'),
|
|
360
|
-
role: 'system',
|
|
361
|
-
content: `🔑 API key required for ${provider}`,
|
|
362
|
-
timestamp: new Date(),
|
|
363
|
-
},
|
|
364
|
-
]);
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
setMessages((prev) => [
|
|
368
|
-
...prev,
|
|
369
|
-
{
|
|
370
|
-
id: generateMessageId('error'),
|
|
371
|
-
role: 'system',
|
|
372
|
-
content: `Failed to switch model: ${error instanceof Error ? error.message : String(error)}`,
|
|
373
|
-
timestamp: new Date(),
|
|
374
|
-
},
|
|
375
|
-
]);
|
|
376
|
-
}
|
|
377
|
-
}, [setUi, setInput, setMessages, setSession, agent, session.id, buffer]);
|
|
378
|
-
const handleSetDefaultModel = useCallback(async (provider, model, displayName, baseURL, reasoningEffort) => {
|
|
379
|
-
try {
|
|
380
|
-
const preferencesUpdate = {
|
|
381
|
-
provider,
|
|
382
|
-
model,
|
|
383
|
-
...(baseURL ? { baseURL } : {}),
|
|
384
|
-
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
385
|
-
};
|
|
386
|
-
let providerEnvVar;
|
|
387
|
-
try {
|
|
388
|
-
const providerKeyStatus = await getProviderKeyStatus(provider);
|
|
389
|
-
providerEnvVar = providerKeyStatus?.envVar;
|
|
390
|
-
}
|
|
391
|
-
catch (error) {
|
|
392
|
-
agent.logger.debug(`Failed to resolve provider API key env var: ${error instanceof Error ? error.message : String(error)}`);
|
|
393
|
-
}
|
|
394
|
-
let existing = null;
|
|
395
|
-
try {
|
|
396
|
-
existing = await loadGlobalPreferences();
|
|
397
|
-
}
|
|
398
|
-
catch {
|
|
399
|
-
existing = null;
|
|
400
|
-
}
|
|
401
|
-
// Only preserve the API key if the provider hasn't changed
|
|
402
|
-
// If provider changed, use the new provider's env var
|
|
403
|
-
if (existing?.llm.provider === provider && existing?.llm.apiKey) {
|
|
404
|
-
preferencesUpdate.apiKey = existing.llm.apiKey;
|
|
405
|
-
}
|
|
406
|
-
else if (providerEnvVar) {
|
|
407
|
-
preferencesUpdate.apiKey = '$' + providerEnvVar;
|
|
408
|
-
}
|
|
409
|
-
await updateGlobalPreferences({
|
|
410
|
-
llm: preferencesUpdate,
|
|
411
|
-
});
|
|
412
|
-
try {
|
|
413
|
-
await agent.switchLLM({ provider: provider, model, baseURL, reasoningEffort }, session.id || undefined);
|
|
414
|
-
setSession((prev) => ({ ...prev, modelName: displayName || model }));
|
|
415
|
-
setMessages((prev) => [
|
|
416
|
-
...prev,
|
|
417
|
-
{
|
|
418
|
-
id: generateMessageId('system'),
|
|
419
|
-
role: 'system',
|
|
420
|
-
content: `✅ Default model set to ${displayName || model} (${provider})`,
|
|
421
|
-
timestamp: new Date(),
|
|
422
|
-
},
|
|
423
|
-
]);
|
|
424
|
-
}
|
|
425
|
-
catch (error) {
|
|
426
|
-
const missingProvider = isApiKeyMissingError(error);
|
|
427
|
-
if (missingProvider) {
|
|
428
|
-
setUi((prev) => ({
|
|
429
|
-
...prev,
|
|
430
|
-
activeOverlay: 'api-key-input',
|
|
431
|
-
pendingModelSwitch: {
|
|
432
|
-
provider: missingProvider,
|
|
433
|
-
model,
|
|
434
|
-
...(displayName && { displayName }),
|
|
435
|
-
...(baseURL && { baseURL }),
|
|
436
|
-
...(reasoningEffort && { reasoningEffort }),
|
|
437
|
-
},
|
|
438
|
-
}));
|
|
439
|
-
setMessages((prev) => [
|
|
440
|
-
...prev,
|
|
441
|
-
{
|
|
442
|
-
id: generateMessageId('system'),
|
|
443
|
-
role: 'system',
|
|
444
|
-
content: `🔑 API key required for ${provider}`,
|
|
445
|
-
timestamp: new Date(),
|
|
446
|
-
},
|
|
447
|
-
]);
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
throw error;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
catch (error) {
|
|
454
|
-
setMessages((prev) => [
|
|
455
|
-
...prev,
|
|
456
|
-
{
|
|
457
|
-
id: generateMessageId('error'),
|
|
458
|
-
role: 'system',
|
|
459
|
-
content: `Failed to set default model: ${error instanceof Error ? error.message : String(error)}`,
|
|
460
|
-
timestamp: new Date(),
|
|
461
|
-
},
|
|
462
|
-
]);
|
|
463
|
-
}
|
|
464
|
-
}, [agent, setMessages, setSession, setUi, session.id]);
|
|
465
|
-
// State for editing custom model
|
|
466
|
-
const [editingModel, setEditingModel] = useState(null);
|
|
467
|
-
// Handle "Add custom model" from model selector
|
|
468
|
-
const handleAddCustomModel = useCallback(() => {
|
|
469
|
-
setEditingModel(null);
|
|
470
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'custom-model-wizard' }));
|
|
471
|
-
}, [setUi]);
|
|
472
|
-
// Handle "Edit custom model" from model selector
|
|
473
|
-
const handleEditCustomModel = useCallback((model) => {
|
|
474
|
-
setEditingModel(model);
|
|
475
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'custom-model-wizard' }));
|
|
476
|
-
}, [setUi]);
|
|
477
|
-
// Handle custom model wizard completion
|
|
478
|
-
const handleCustomModelComplete = useCallback(async (model) => {
|
|
479
|
-
const wasEditing = editingModel !== null;
|
|
480
|
-
setEditingModel(null);
|
|
481
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
|
|
482
|
-
buffer.setText('');
|
|
483
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
484
|
-
if (wasEditing) {
|
|
485
|
-
// For edits, just show confirmation message
|
|
486
|
-
setMessages((prev) => [
|
|
487
|
-
...prev,
|
|
488
|
-
{
|
|
489
|
-
id: generateMessageId('system'),
|
|
490
|
-
role: 'system',
|
|
491
|
-
content: `✅ Custom model "${model.displayName || model.name}" updated`,
|
|
492
|
-
timestamp: new Date(),
|
|
493
|
-
},
|
|
494
|
-
]);
|
|
495
|
-
}
|
|
496
|
-
else {
|
|
497
|
-
// For new models, auto-switch to the newly created model
|
|
498
|
-
setMessages((prev) => [
|
|
499
|
-
...prev,
|
|
500
|
-
{
|
|
501
|
-
id: generateMessageId('system'),
|
|
502
|
-
role: 'system',
|
|
503
|
-
content: `✅ Custom model "${model.displayName || model.name}" saved`,
|
|
504
|
-
timestamp: new Date(),
|
|
505
|
-
},
|
|
506
|
-
]);
|
|
507
|
-
// Switch to the new model
|
|
508
|
-
await handleModelSelect(model.provider, model.name, model.displayName, model.baseURL);
|
|
509
|
-
}
|
|
510
|
-
}, [setUi, setInput, setMessages, buffer, editingModel, handleModelSelect]);
|
|
511
|
-
// Handle API key saved - retry the model switch
|
|
512
|
-
const handleApiKeySaved = useCallback(async (meta) => {
|
|
513
|
-
const pending = ui.pendingModelSwitch;
|
|
514
|
-
if (!pending) {
|
|
515
|
-
// No pending switch, just close
|
|
516
|
-
setUi((prev) => ({
|
|
517
|
-
...prev,
|
|
518
|
-
activeOverlay: 'none',
|
|
519
|
-
pendingModelSwitch: null,
|
|
520
|
-
}));
|
|
521
|
-
return;
|
|
522
|
-
}
|
|
523
|
-
setUi((prev) => ({
|
|
524
|
-
...prev,
|
|
525
|
-
activeOverlay: 'none',
|
|
526
|
-
pendingModelSwitch: null,
|
|
527
|
-
}));
|
|
528
|
-
setMessages((prev) => [
|
|
529
|
-
...prev,
|
|
530
|
-
{
|
|
531
|
-
id: generateMessageId('system'),
|
|
532
|
-
role: 'system',
|
|
533
|
-
content: `✅ API key saved for ${meta.provider}`,
|
|
534
|
-
timestamp: new Date(),
|
|
535
|
-
},
|
|
536
|
-
]);
|
|
537
|
-
// Retry the model switch
|
|
538
|
-
try {
|
|
539
|
-
const pendingDisplayName = pending.displayName || pending.model;
|
|
540
|
-
setMessages((prev) => [
|
|
541
|
-
...prev,
|
|
542
|
-
{
|
|
543
|
-
id: generateMessageId('system'),
|
|
544
|
-
role: 'system',
|
|
545
|
-
content: `🔄 Retrying switch to ${pendingDisplayName} (${pending.provider})...`,
|
|
546
|
-
timestamp: new Date(),
|
|
547
|
-
},
|
|
548
|
-
]);
|
|
549
|
-
await agent.switchLLM({
|
|
550
|
-
provider: pending.provider,
|
|
551
|
-
model: pending.model,
|
|
552
|
-
...(pending.baseURL && { baseURL: pending.baseURL }),
|
|
553
|
-
...(pending.reasoningEffort && {
|
|
554
|
-
reasoningEffort: pending.reasoningEffort,
|
|
555
|
-
}),
|
|
556
|
-
}, session.id || undefined);
|
|
557
|
-
// Update session state with display name (fallback to model ID)
|
|
558
|
-
setSession((prev) => ({ ...prev, modelName: pendingDisplayName }));
|
|
559
|
-
setMessages((prev) => [
|
|
560
|
-
...prev,
|
|
561
|
-
{
|
|
562
|
-
id: generateMessageId('system'),
|
|
563
|
-
role: 'system',
|
|
564
|
-
content: `✅ Successfully switched to ${pendingDisplayName} (${pending.provider})`,
|
|
565
|
-
timestamp: new Date(),
|
|
566
|
-
},
|
|
567
|
-
]);
|
|
568
|
-
}
|
|
569
|
-
catch (error) {
|
|
570
|
-
setMessages((prev) => [
|
|
571
|
-
...prev,
|
|
572
|
-
{
|
|
573
|
-
id: generateMessageId('error'),
|
|
574
|
-
role: 'system',
|
|
575
|
-
content: `Failed to switch model: ${error instanceof Error ? error.message : String(error)}`,
|
|
576
|
-
timestamp: new Date(),
|
|
577
|
-
},
|
|
578
|
-
]);
|
|
579
|
-
}
|
|
580
|
-
}, [ui.pendingModelSwitch, setUi, setMessages, setSession, agent, session.id]);
|
|
581
|
-
// Handle API key input close (without saving)
|
|
582
|
-
const handleApiKeyClose = useCallback(() => {
|
|
583
|
-
setUi((prev) => ({
|
|
584
|
-
...prev,
|
|
585
|
-
activeOverlay: 'none',
|
|
586
|
-
pendingModelSwitch: null,
|
|
587
|
-
}));
|
|
588
|
-
}, [setUi]);
|
|
589
|
-
// Handle search result selection - display the result context
|
|
590
|
-
const handleSearchResultSelect = useCallback((result) => {
|
|
591
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
|
|
592
|
-
buffer.setText('');
|
|
593
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
594
|
-
// Display the selected search result as a system message
|
|
595
|
-
const roleLabel = result.message.role === 'user'
|
|
596
|
-
? '👤 User'
|
|
597
|
-
: result.message.role === 'assistant'
|
|
598
|
-
? '🤖 Assistant'
|
|
599
|
-
: `📋 ${result.message.role}`;
|
|
600
|
-
setMessages((prev) => [
|
|
601
|
-
...prev,
|
|
602
|
-
{
|
|
603
|
-
id: generateMessageId('system'),
|
|
604
|
-
role: 'system',
|
|
605
|
-
content: `🔍 Search Result from session ${result.sessionId.slice(0, 8)}:\n\n${roleLabel}:\n${result.context}`,
|
|
606
|
-
timestamp: new Date(),
|
|
607
|
-
},
|
|
608
|
-
]);
|
|
609
|
-
}, [setUi, setInput, setMessages, buffer]);
|
|
610
|
-
// Handle session selection
|
|
611
|
-
const handleSessionSelect = useCallback(async (newSessionId) => {
|
|
612
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
613
|
-
buffer.setText('');
|
|
614
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
615
|
-
try {
|
|
616
|
-
// Check if already on this session
|
|
617
|
-
if (newSessionId === session.id) {
|
|
618
|
-
setMessages((prev) => [
|
|
619
|
-
...prev,
|
|
620
|
-
{
|
|
621
|
-
id: generateMessageId('system'),
|
|
622
|
-
role: 'system',
|
|
623
|
-
content: `ℹ️ Already using session ${newSessionId.slice(0, 8)}`,
|
|
624
|
-
timestamp: new Date(),
|
|
625
|
-
},
|
|
626
|
-
]);
|
|
627
|
-
return;
|
|
628
|
-
}
|
|
629
|
-
// Track session switch analytics
|
|
630
|
-
capture('dexto_session_switched', {
|
|
631
|
-
source: 'cli',
|
|
632
|
-
fromSessionId: session.id || null,
|
|
633
|
-
toSessionId: newSessionId,
|
|
634
|
-
});
|
|
635
|
-
// Clear messages and session state before switching
|
|
636
|
-
setMessages([]);
|
|
637
|
-
setApproval(null);
|
|
638
|
-
setApprovalQueue([]);
|
|
639
|
-
// Verify session exists first
|
|
640
|
-
const sessionData = await agent.getSession(newSessionId);
|
|
641
|
-
if (!sessionData) {
|
|
642
|
-
throw new Error(`Session ${newSessionId} not found`);
|
|
643
|
-
}
|
|
644
|
-
// Get the actual model being used for this session (respects llmOverride)
|
|
645
|
-
const newSessionConfig = agent.getCurrentLLMConfig(newSessionId);
|
|
646
|
-
const newSessionModelName = getModelDisplayName(newSessionConfig.model, newSessionConfig.provider);
|
|
647
|
-
setSession({
|
|
648
|
-
id: newSessionId,
|
|
649
|
-
hasActiveSession: true,
|
|
650
|
-
modelName: newSessionModelName,
|
|
651
|
-
});
|
|
652
|
-
// Load session history
|
|
653
|
-
const history = await agent.getSessionHistory(newSessionId);
|
|
654
|
-
if (history && history.length > 0) {
|
|
655
|
-
const historyMessages = convertHistoryToUIMessages(history, newSessionId);
|
|
656
|
-
setMessages(historyMessages);
|
|
657
|
-
// Extract user messages for input history (arrow up navigation)
|
|
658
|
-
const userInputHistory = history
|
|
659
|
-
.filter(isUserMessage)
|
|
660
|
-
.map((msg) => {
|
|
661
|
-
// Extract text content from user message
|
|
662
|
-
if (typeof msg.content === 'string') {
|
|
663
|
-
return msg.content;
|
|
664
|
-
}
|
|
665
|
-
// Handle array content (text parts)
|
|
666
|
-
if (Array.isArray(msg.content)) {
|
|
667
|
-
return msg.content
|
|
668
|
-
.filter((part) => typeof part === 'object' && part.type === 'text')
|
|
669
|
-
.map((part) => part.text)
|
|
670
|
-
.join('\n');
|
|
671
|
-
}
|
|
672
|
-
return '';
|
|
673
|
-
})
|
|
674
|
-
.filter((text) => text.trim().length > 0);
|
|
675
|
-
setInput((prev) => ({
|
|
676
|
-
...prev,
|
|
677
|
-
history: userInputHistory,
|
|
678
|
-
historyIndex: -1,
|
|
679
|
-
}));
|
|
680
|
-
}
|
|
681
|
-
setMessages((prev) => [
|
|
682
|
-
...prev,
|
|
683
|
-
{
|
|
684
|
-
id: generateMessageId('system'),
|
|
685
|
-
role: 'system',
|
|
686
|
-
content: `✅ Switched to session ${newSessionId.slice(0, 8)}`,
|
|
687
|
-
timestamp: new Date(),
|
|
688
|
-
},
|
|
689
|
-
]);
|
|
690
|
-
// Force Static component to re-render with the new history
|
|
691
|
-
refreshStatic?.();
|
|
692
|
-
}
|
|
693
|
-
catch (error) {
|
|
694
|
-
setMessages((prev) => [
|
|
695
|
-
...prev,
|
|
696
|
-
{
|
|
697
|
-
id: generateMessageId('error'),
|
|
698
|
-
role: 'system',
|
|
699
|
-
content: `Failed to switch session: ${error instanceof Error ? error.message : String(error)}`,
|
|
700
|
-
timestamp: new Date(),
|
|
701
|
-
},
|
|
702
|
-
]);
|
|
703
|
-
}
|
|
704
|
-
}, [
|
|
705
|
-
setUi,
|
|
706
|
-
setInput,
|
|
707
|
-
setMessages,
|
|
708
|
-
setApproval,
|
|
709
|
-
setApprovalQueue,
|
|
710
|
-
setSession,
|
|
711
|
-
agent,
|
|
712
|
-
session.id,
|
|
713
|
-
session.modelName,
|
|
714
|
-
buffer,
|
|
715
|
-
refreshStatic,
|
|
716
|
-
]);
|
|
717
|
-
// Handle slash command/prompt selection
|
|
718
|
-
const handlePromptSelect = useCallback(async (prompt) => {
|
|
719
|
-
// Use displayName for command text (user-friendly name without prefix)
|
|
720
|
-
const commandName = prompt.displayName || prompt.name;
|
|
721
|
-
const commandText = `/${commandName}`;
|
|
722
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
723
|
-
buffer.setText('');
|
|
724
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
725
|
-
// Route prompts through InputContainer for streaming pipeline
|
|
726
|
-
if (onSubmitPromptCommand) {
|
|
727
|
-
await onSubmitPromptCommand(commandText);
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
// Fallback when callback not provided (shouldn't happen in normal usage)
|
|
731
|
-
// Show user message for the executed command
|
|
732
|
-
const userMessage = createUserMessage(commandText);
|
|
733
|
-
setMessages((prev) => [...prev, userMessage]);
|
|
734
|
-
setUi((prev) => ({ ...prev, isProcessing: true, isCancelling: false }));
|
|
735
|
-
const { CommandService } = await import('../services/CommandService.js');
|
|
736
|
-
const commandService = new CommandService();
|
|
737
|
-
try {
|
|
738
|
-
// Use displayName to match the registered command name
|
|
739
|
-
const result = await commandService.executeCommand(commandName, [], agent, session.id || undefined);
|
|
740
|
-
if (result.type === 'output' && result.output) {
|
|
741
|
-
const output = result.output;
|
|
742
|
-
setMessages((prev) => [
|
|
743
|
-
...prev,
|
|
744
|
-
{
|
|
745
|
-
id: generateMessageId('command'),
|
|
746
|
-
role: 'system',
|
|
747
|
-
content: output,
|
|
748
|
-
timestamp: new Date(),
|
|
749
|
-
},
|
|
750
|
-
]);
|
|
751
|
-
}
|
|
752
|
-
if (result.type === 'styled' && result.styled) {
|
|
753
|
-
const { fallbackText, styledType, styledData } = result.styled;
|
|
754
|
-
setMessages((prev) => [
|
|
755
|
-
...prev,
|
|
756
|
-
{
|
|
757
|
-
id: generateMessageId('command'),
|
|
758
|
-
role: 'system',
|
|
759
|
-
content: fallbackText,
|
|
760
|
-
timestamp: new Date(),
|
|
761
|
-
styledType,
|
|
762
|
-
styledData,
|
|
763
|
-
},
|
|
764
|
-
]);
|
|
765
|
-
}
|
|
766
|
-
setUi((prev) => ({
|
|
767
|
-
...prev,
|
|
768
|
-
isProcessing: false,
|
|
769
|
-
isCancelling: false,
|
|
770
|
-
isThinking: false,
|
|
771
|
-
}));
|
|
772
|
-
}
|
|
773
|
-
catch (error) {
|
|
774
|
-
setMessages((prev) => [
|
|
775
|
-
...prev,
|
|
776
|
-
{
|
|
777
|
-
id: generateMessageId('error'),
|
|
778
|
-
role: 'system',
|
|
779
|
-
content: `${error instanceof Error ? error.message : String(error)}`,
|
|
780
|
-
timestamp: new Date(),
|
|
781
|
-
},
|
|
782
|
-
]);
|
|
783
|
-
setUi((prev) => ({
|
|
784
|
-
...prev,
|
|
785
|
-
isProcessing: false,
|
|
786
|
-
isCancelling: false,
|
|
787
|
-
isThinking: false,
|
|
788
|
-
}));
|
|
789
|
-
}
|
|
790
|
-
}, [setUi, setInput, setMessages, agent, session.id, buffer, onSubmitPromptCommand]);
|
|
791
|
-
// Handle loading command/prompt into input for editing (Tab key)
|
|
792
|
-
const handleSystemCommandSelect = useCallback(async (command) => {
|
|
793
|
-
// Check if this command has an interactive overlay
|
|
794
|
-
const { getCommandOverlayForSelect } = await import('../utils/commandOverlays.js');
|
|
795
|
-
const overlay = getCommandOverlayForSelect(command);
|
|
796
|
-
if (overlay) {
|
|
797
|
-
buffer.setText('');
|
|
798
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
799
|
-
setUi((prev) => ({
|
|
800
|
-
...prev,
|
|
801
|
-
activeOverlay: overlay,
|
|
802
|
-
mcpWizardServerType: null,
|
|
803
|
-
}));
|
|
804
|
-
return;
|
|
805
|
-
}
|
|
806
|
-
const commandText = `/${command}`;
|
|
807
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
808
|
-
buffer.setText('');
|
|
809
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
810
|
-
// Show user message for the executed command
|
|
811
|
-
const userMessage = createUserMessage(commandText);
|
|
812
|
-
setMessages((prev) => [...prev, userMessage]);
|
|
813
|
-
setUi((prev) => ({ ...prev, isProcessing: true, isCancelling: false }));
|
|
814
|
-
const { CommandService } = await import('../services/CommandService.js');
|
|
815
|
-
const commandService = new CommandService();
|
|
816
|
-
try {
|
|
817
|
-
const result = await commandService.executeCommand(command, [], agent, session.id || undefined);
|
|
818
|
-
if (result.type === 'output' && result.output) {
|
|
819
|
-
const output = result.output;
|
|
820
|
-
setMessages((prev) => [
|
|
821
|
-
...prev,
|
|
822
|
-
{
|
|
823
|
-
id: generateMessageId('command'),
|
|
824
|
-
role: 'system',
|
|
825
|
-
content: output,
|
|
826
|
-
timestamp: new Date(),
|
|
827
|
-
},
|
|
828
|
-
]);
|
|
829
|
-
}
|
|
830
|
-
if (result.type === 'styled' && result.styled) {
|
|
831
|
-
const { fallbackText, styledType, styledData } = result.styled;
|
|
832
|
-
setMessages((prev) => [
|
|
833
|
-
...prev,
|
|
834
|
-
{
|
|
835
|
-
id: generateMessageId('command'),
|
|
836
|
-
role: 'system',
|
|
837
|
-
content: fallbackText,
|
|
838
|
-
timestamp: new Date(),
|
|
839
|
-
styledType,
|
|
840
|
-
styledData,
|
|
841
|
-
},
|
|
842
|
-
]);
|
|
843
|
-
}
|
|
844
|
-
setUi((prev) => ({
|
|
845
|
-
...prev,
|
|
846
|
-
isProcessing: false,
|
|
847
|
-
isCancelling: false,
|
|
848
|
-
isThinking: false,
|
|
849
|
-
}));
|
|
850
|
-
}
|
|
851
|
-
catch (error) {
|
|
852
|
-
setMessages((prev) => [
|
|
853
|
-
...prev,
|
|
854
|
-
{
|
|
855
|
-
id: generateMessageId('error'),
|
|
856
|
-
role: 'system',
|
|
857
|
-
content: `${error instanceof Error ? error.message : String(error)}`,
|
|
858
|
-
timestamp: new Date(),
|
|
859
|
-
},
|
|
860
|
-
]);
|
|
861
|
-
setUi((prev) => ({
|
|
862
|
-
...prev,
|
|
863
|
-
isProcessing: false,
|
|
864
|
-
isCancelling: false,
|
|
865
|
-
isThinking: false,
|
|
866
|
-
}));
|
|
867
|
-
}
|
|
868
|
-
}, [setInput, setUi, setMessages, agent, session.id, buffer]);
|
|
869
|
-
const handleLoadIntoInput = useCallback((text) => {
|
|
870
|
-
// Update both buffer (source of truth) and state
|
|
871
|
-
buffer.setText(text);
|
|
872
|
-
setInput((prev) => ({ ...prev, value: text }));
|
|
873
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
874
|
-
}, [buffer, setInput, setUi]);
|
|
875
|
-
// Handle resource selection
|
|
876
|
-
const handleResourceSelect = useCallback((resource) => {
|
|
877
|
-
// Insert resource reference into input
|
|
878
|
-
const atIndex = input.value.lastIndexOf('@');
|
|
879
|
-
if (atIndex >= 0) {
|
|
880
|
-
const before = input.value.slice(0, atIndex + 1);
|
|
881
|
-
const uriParts = resource.uri.split(/[\\/]/);
|
|
882
|
-
let reference = resource.name || uriParts[uriParts.length - 1] || resource.uri;
|
|
883
|
-
// If it's an absolute path, use relative path as reference to be more descriptive and less bulky
|
|
884
|
-
const rawUri = resource.uri.replace(/^(fs|file):\/\//, ''); // Stripped prefix
|
|
885
|
-
if (path.isAbsolute(rawUri)) {
|
|
886
|
-
try {
|
|
887
|
-
const relativePath = path.relative(process.cwd(), rawUri);
|
|
888
|
-
// Prioritize relative path for local files to avoid ambiguity
|
|
889
|
-
reference = relativePath;
|
|
890
|
-
}
|
|
891
|
-
catch {
|
|
892
|
-
// Keep fallback if relative fails
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
const newValue = `${before}${reference} `;
|
|
896
|
-
buffer.setText(newValue);
|
|
897
|
-
setInput((prev) => ({ ...prev, value: newValue }));
|
|
898
|
-
}
|
|
899
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
900
|
-
}, [input.value, buffer, setInput, setUi]);
|
|
901
|
-
const handleClose = useCallback(() => {
|
|
902
|
-
setUi((prev) => ({
|
|
903
|
-
...prev,
|
|
904
|
-
activeOverlay: 'none',
|
|
905
|
-
mcpWizardServerType: null,
|
|
906
|
-
commandOutput: null,
|
|
907
|
-
}));
|
|
908
|
-
}, [setUi]);
|
|
909
|
-
// Handle log level selection
|
|
910
|
-
const handleLogLevelSelect = useCallback((level) => {
|
|
911
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
912
|
-
buffer.setText('');
|
|
913
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
914
|
-
void agent.setLogLevel(level, session.id ? { sessionId: session.id } : undefined);
|
|
915
|
-
setMessages((prev) => [
|
|
916
|
-
...prev,
|
|
917
|
-
{
|
|
918
|
-
id: generateMessageId('system'),
|
|
919
|
-
role: 'system',
|
|
920
|
-
content: `📊 Log level set to: ${level}`,
|
|
921
|
-
timestamp: new Date(),
|
|
922
|
-
},
|
|
923
|
-
]);
|
|
924
|
-
}, [setUi, setInput, setMessages, agent, buffer, getConfigFilePathOrWarn, session.id]);
|
|
925
|
-
// Handle stream mode selection
|
|
926
|
-
const handleStreamSelect = useCallback((enabled) => {
|
|
927
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
928
|
-
buffer.setText('');
|
|
929
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
930
|
-
setMessages((prev) => [
|
|
931
|
-
...prev,
|
|
932
|
-
{
|
|
933
|
-
id: generateMessageId('system'),
|
|
934
|
-
role: 'system',
|
|
935
|
-
content: enabled
|
|
936
|
-
? '▶️ Streaming enabled - responses will appear as they are generated'
|
|
937
|
-
: '⏸️ Streaming disabled - responses will appear when complete',
|
|
938
|
-
timestamp: new Date(),
|
|
939
|
-
},
|
|
940
|
-
]);
|
|
941
|
-
}, [setUi, setInput, setMessages, buffer]);
|
|
942
|
-
// Handle MCP server list actions (select server or add new)
|
|
943
|
-
const handleMcpServerListAction = useCallback((action) => {
|
|
944
|
-
if (action.type === 'select-server') {
|
|
945
|
-
// Show server actions overlay
|
|
946
|
-
setUi((prev) => ({
|
|
947
|
-
...prev,
|
|
948
|
-
activeOverlay: 'mcp-server-actions',
|
|
949
|
-
selectedMcpServer: action.server,
|
|
950
|
-
}));
|
|
951
|
-
}
|
|
952
|
-
else if (action.type === 'add-new') {
|
|
953
|
-
// Show add choice overlay
|
|
954
|
-
setUi((prev) => ({
|
|
955
|
-
...prev,
|
|
956
|
-
activeOverlay: 'mcp-add-choice',
|
|
957
|
-
}));
|
|
958
|
-
}
|
|
959
|
-
}, [setUi]);
|
|
960
|
-
// Handle MCP server actions (enable/disable/delete/back)
|
|
961
|
-
const handleMcpServerAction = useCallback(async (action) => {
|
|
962
|
-
const { server } = action;
|
|
963
|
-
if (action.type === 'back') {
|
|
964
|
-
// Go back to server list
|
|
965
|
-
setUi((prev) => ({
|
|
966
|
-
...prev,
|
|
967
|
-
activeOverlay: 'mcp-server-list',
|
|
968
|
-
selectedMcpServer: null,
|
|
969
|
-
}));
|
|
970
|
-
return;
|
|
971
|
-
}
|
|
972
|
-
// Close overlay and reset input for actual actions
|
|
973
|
-
setUi((prev) => ({
|
|
974
|
-
...prev,
|
|
975
|
-
activeOverlay: 'none',
|
|
976
|
-
selectedMcpServer: null,
|
|
977
|
-
mcpWizardServerType: null,
|
|
978
|
-
isProcessing: true,
|
|
979
|
-
isCancelling: false,
|
|
980
|
-
}));
|
|
981
|
-
buffer.setText('');
|
|
982
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
983
|
-
if (action.type === 'enable' || action.type === 'disable') {
|
|
984
|
-
const newEnabled = action.type === 'enable';
|
|
985
|
-
setMessages((prev) => [
|
|
986
|
-
...prev,
|
|
987
|
-
{
|
|
988
|
-
id: generateMessageId('system'),
|
|
989
|
-
role: 'system',
|
|
990
|
-
content: `${newEnabled ? '▶️' : '⏸️'} ${newEnabled ? 'Enabling' : 'Disabling'} ${server.name}...`,
|
|
991
|
-
timestamp: new Date(),
|
|
992
|
-
},
|
|
993
|
-
]);
|
|
994
|
-
try {
|
|
995
|
-
// Enable or disable the server FIRST (before persisting)
|
|
996
|
-
// This ensures config only reflects successful state changes
|
|
997
|
-
if (newEnabled) {
|
|
998
|
-
try {
|
|
999
|
-
await agent.enableMcpServer(server.name);
|
|
1000
|
-
}
|
|
1001
|
-
catch (connectError) {
|
|
1002
|
-
// Connection failed - don't persist to config
|
|
1003
|
-
setMessages((prev) => [
|
|
1004
|
-
...prev,
|
|
1005
|
-
{
|
|
1006
|
-
id: generateMessageId('system'),
|
|
1007
|
-
role: 'system',
|
|
1008
|
-
content: `⚠️ Failed to enable server: ${connectError instanceof Error ? connectError.message : String(connectError)}`,
|
|
1009
|
-
timestamp: new Date(),
|
|
1010
|
-
},
|
|
1011
|
-
]);
|
|
1012
|
-
setUi((prev) => ({
|
|
1013
|
-
...prev,
|
|
1014
|
-
isProcessing: false,
|
|
1015
|
-
isCancelling: false,
|
|
1016
|
-
isThinking: false,
|
|
1017
|
-
}));
|
|
1018
|
-
return;
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
else {
|
|
1022
|
-
await agent.disableMcpServer(server.name);
|
|
1023
|
-
}
|
|
1024
|
-
// Import persistence utilities
|
|
1025
|
-
const { updateMcpServerField } = await import('@dexto/agent-management');
|
|
1026
|
-
// Persist to config file AFTER successful enable/disable
|
|
1027
|
-
const agentPath = getConfigFilePathOrWarn('persist MCP server settings');
|
|
1028
|
-
if (!agentPath) {
|
|
1029
|
-
return;
|
|
1030
|
-
}
|
|
1031
|
-
await updateMcpServerField(agentPath, server.name, 'enabled', newEnabled);
|
|
1032
|
-
setMessages((prev) => [
|
|
1033
|
-
...prev,
|
|
1034
|
-
{
|
|
1035
|
-
id: generateMessageId('system'),
|
|
1036
|
-
role: 'system',
|
|
1037
|
-
content: `✅ ${server.name} ${newEnabled ? 'enabled' : 'disabled'}`,
|
|
1038
|
-
timestamp: new Date(),
|
|
1039
|
-
},
|
|
1040
|
-
]);
|
|
1041
|
-
}
|
|
1042
|
-
catch (error) {
|
|
1043
|
-
// Format error message with details if available
|
|
1044
|
-
let errorMessage = error instanceof Error ? error.message : String(error);
|
|
1045
|
-
if (error instanceof DextoValidationError && error.issues.length > 0) {
|
|
1046
|
-
const issueDetails = error.issues
|
|
1047
|
-
.map((i) => {
|
|
1048
|
-
const path = i.path?.length ? `[${i.path.join('.')}] ` : '';
|
|
1049
|
-
return ` - ${path}${i.message}`;
|
|
1050
|
-
})
|
|
1051
|
-
.join('\n');
|
|
1052
|
-
errorMessage = `Validation failed:\n${issueDetails}`;
|
|
1053
|
-
}
|
|
1054
|
-
setMessages((prev) => [
|
|
1055
|
-
...prev,
|
|
1056
|
-
{
|
|
1057
|
-
id: generateMessageId('error'),
|
|
1058
|
-
role: 'system',
|
|
1059
|
-
content: `Failed to ${action.type} server: ${errorMessage}`,
|
|
1060
|
-
timestamp: new Date(),
|
|
1061
|
-
},
|
|
1062
|
-
]);
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
else if (action.type === 'authenticate') {
|
|
1066
|
-
setMessages((prev) => [
|
|
1067
|
-
...prev,
|
|
1068
|
-
{
|
|
1069
|
-
id: generateMessageId('system'),
|
|
1070
|
-
role: 'system',
|
|
1071
|
-
content: `🔐 Authenticating ${server.name}...`,
|
|
1072
|
-
timestamp: new Date(),
|
|
1073
|
-
},
|
|
1074
|
-
]);
|
|
1075
|
-
try {
|
|
1076
|
-
await agent.restartMcpServer(server.name);
|
|
1077
|
-
setMessages((prev) => [
|
|
1078
|
-
...prev,
|
|
1079
|
-
{
|
|
1080
|
-
id: generateMessageId('system'),
|
|
1081
|
-
role: 'system',
|
|
1082
|
-
content: `✅ Authenticated ${server.name}`,
|
|
1083
|
-
timestamp: new Date(),
|
|
1084
|
-
},
|
|
1085
|
-
]);
|
|
1086
|
-
}
|
|
1087
|
-
catch (error) {
|
|
1088
|
-
setMessages((prev) => [
|
|
1089
|
-
...prev,
|
|
1090
|
-
{
|
|
1091
|
-
id: generateMessageId('error'),
|
|
1092
|
-
role: 'system',
|
|
1093
|
-
content: `Failed to authenticate server: ${error instanceof Error ? error.message : String(error)}`,
|
|
1094
|
-
timestamp: new Date(),
|
|
1095
|
-
},
|
|
1096
|
-
]);
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
else if (action.type === 'delete') {
|
|
1100
|
-
setMessages((prev) => [
|
|
1101
|
-
...prev,
|
|
1102
|
-
{
|
|
1103
|
-
id: generateMessageId('system'),
|
|
1104
|
-
role: 'system',
|
|
1105
|
-
content: `🗑️ Deleting ${server.name}...`,
|
|
1106
|
-
timestamp: new Date(),
|
|
1107
|
-
},
|
|
1108
|
-
]);
|
|
1109
|
-
try {
|
|
1110
|
-
// Import persistence utilities
|
|
1111
|
-
const { removeMcpServerFromConfig } = await import('@dexto/agent-management');
|
|
1112
|
-
// Persist to config file using surgical removal
|
|
1113
|
-
const agentPath = getConfigFilePathOrWarn('persist MCP server deletion');
|
|
1114
|
-
if (agentPath) {
|
|
1115
|
-
await removeMcpServerFromConfig(agentPath, server.name);
|
|
1116
|
-
}
|
|
1117
|
-
// Also disconnect if connected
|
|
1118
|
-
try {
|
|
1119
|
-
await agent.removeMcpServer(server.name);
|
|
1120
|
-
}
|
|
1121
|
-
catch {
|
|
1122
|
-
// Ignore - server might not be connected
|
|
1123
|
-
}
|
|
1124
|
-
setMessages((prev) => [
|
|
1125
|
-
...prev,
|
|
1126
|
-
{
|
|
1127
|
-
id: generateMessageId('system'),
|
|
1128
|
-
role: 'system',
|
|
1129
|
-
content: `✅ Deleted ${server.name}`,
|
|
1130
|
-
timestamp: new Date(),
|
|
1131
|
-
},
|
|
1132
|
-
]);
|
|
1133
|
-
}
|
|
1134
|
-
catch (error) {
|
|
1135
|
-
setMessages((prev) => [
|
|
1136
|
-
...prev,
|
|
1137
|
-
{
|
|
1138
|
-
id: generateMessageId('error'),
|
|
1139
|
-
role: 'system',
|
|
1140
|
-
content: `Failed to delete server: ${error instanceof Error ? error.message : String(error)}`,
|
|
1141
|
-
timestamp: new Date(),
|
|
1142
|
-
},
|
|
1143
|
-
]);
|
|
1144
|
-
}
|
|
1145
|
-
}
|
|
1146
|
-
setUi((prev) => ({
|
|
1147
|
-
...prev,
|
|
1148
|
-
isProcessing: false,
|
|
1149
|
-
isCancelling: false,
|
|
1150
|
-
isThinking: false,
|
|
1151
|
-
}));
|
|
1152
|
-
}, [setUi, setInput, setMessages, agent, buffer]);
|
|
1153
|
-
// Handle MCP add choice (registry/custom/back)
|
|
1154
|
-
const handleMcpAddChoice = useCallback((choice) => {
|
|
1155
|
-
if (choice === 'back') {
|
|
1156
|
-
// Go back to server list
|
|
1157
|
-
setUi((prev) => ({
|
|
1158
|
-
...prev,
|
|
1159
|
-
activeOverlay: 'mcp-server-list',
|
|
1160
|
-
}));
|
|
1161
|
-
}
|
|
1162
|
-
else if (choice === 'registry') {
|
|
1163
|
-
// Show registry selector (McpAddSelector)
|
|
1164
|
-
setUi((prev) => ({
|
|
1165
|
-
...prev,
|
|
1166
|
-
activeOverlay: 'mcp-add-selector',
|
|
1167
|
-
}));
|
|
1168
|
-
}
|
|
1169
|
-
else if (choice === 'custom') {
|
|
1170
|
-
// Show custom type selector
|
|
1171
|
-
setUi((prev) => ({
|
|
1172
|
-
...prev,
|
|
1173
|
-
activeOverlay: 'mcp-custom-type-selector',
|
|
1174
|
-
}));
|
|
1175
|
-
}
|
|
1176
|
-
}, [setUi]);
|
|
1177
|
-
// Handle MCP add selection (presets only)
|
|
1178
|
-
const handleMcpAddSelect = useCallback(async (result) => {
|
|
1179
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
1180
|
-
buffer.setText('');
|
|
1181
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
1182
|
-
setUi((prev) => ({ ...prev, isProcessing: true, isCancelling: false }));
|
|
1183
|
-
setMessages((prev) => [
|
|
1184
|
-
...prev,
|
|
1185
|
-
{
|
|
1186
|
-
id: generateMessageId('system'),
|
|
1187
|
-
role: 'system',
|
|
1188
|
-
content: `🔌 Connecting to ${result.entry.name}...`,
|
|
1189
|
-
timestamp: new Date(),
|
|
1190
|
-
},
|
|
1191
|
-
]);
|
|
1192
|
-
try {
|
|
1193
|
-
const mcpConfig = result.entry.config;
|
|
1194
|
-
await agent.addMcpServer(result.entry.id, mcpConfig);
|
|
1195
|
-
// Track MCP server connected analytics
|
|
1196
|
-
capture('dexto_mcp_server_connected', {
|
|
1197
|
-
source: 'cli',
|
|
1198
|
-
serverName: result.entry.name,
|
|
1199
|
-
transportType: mcpConfig.type,
|
|
1200
|
-
});
|
|
1201
|
-
setMessages((prev) => [
|
|
1202
|
-
...prev,
|
|
1203
|
-
{
|
|
1204
|
-
id: generateMessageId('system'),
|
|
1205
|
-
role: 'system',
|
|
1206
|
-
content: `✅ Connected to ${result.entry.name}`,
|
|
1207
|
-
timestamp: new Date(),
|
|
1208
|
-
},
|
|
1209
|
-
]);
|
|
1210
|
-
}
|
|
1211
|
-
catch (error) {
|
|
1212
|
-
setMessages((prev) => [
|
|
1213
|
-
...prev,
|
|
1214
|
-
{
|
|
1215
|
-
id: generateMessageId('system'),
|
|
1216
|
-
role: 'system',
|
|
1217
|
-
content: `Failed to connect: ${error instanceof Error ? error.message : String(error)}`,
|
|
1218
|
-
timestamp: new Date(),
|
|
1219
|
-
},
|
|
1220
|
-
]);
|
|
1221
|
-
}
|
|
1222
|
-
setUi((prev) => ({
|
|
1223
|
-
...prev,
|
|
1224
|
-
isProcessing: false,
|
|
1225
|
-
isCancelling: false,
|
|
1226
|
-
isThinking: false,
|
|
1227
|
-
}));
|
|
1228
|
-
}, [setUi, setInput, setMessages, agent, buffer]);
|
|
1229
|
-
// Handle MCP custom type selection
|
|
1230
|
-
const handleMcpCustomTypeSelect = useCallback((serverType) => {
|
|
1231
|
-
setUi((prev) => ({
|
|
1232
|
-
...prev,
|
|
1233
|
-
mcpWizardServerType: serverType,
|
|
1234
|
-
activeOverlay: 'mcp-custom-wizard',
|
|
1235
|
-
}));
|
|
1236
|
-
}, [setUi]);
|
|
1237
|
-
// Handle MCP custom wizard completion
|
|
1238
|
-
const handleMcpCustomWizardComplete = useCallback(async (config) => {
|
|
1239
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
1240
|
-
buffer.setText('');
|
|
1241
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
1242
|
-
setUi((prev) => ({ ...prev, isProcessing: true, isCancelling: false }));
|
|
1243
|
-
setMessages((prev) => [
|
|
1244
|
-
...prev,
|
|
1245
|
-
{
|
|
1246
|
-
id: generateMessageId('system'),
|
|
1247
|
-
role: 'system',
|
|
1248
|
-
content: `🔌 Connecting to ${config.name}...`,
|
|
1249
|
-
timestamp: new Date(),
|
|
1250
|
-
},
|
|
1251
|
-
]);
|
|
1252
|
-
try {
|
|
1253
|
-
// Build the appropriate config based on server type
|
|
1254
|
-
let serverConfig;
|
|
1255
|
-
if (config.serverType === 'stdio') {
|
|
1256
|
-
serverConfig = {
|
|
1257
|
-
type: 'stdio',
|
|
1258
|
-
command: config.command,
|
|
1259
|
-
args: config.args || [],
|
|
1260
|
-
};
|
|
1261
|
-
}
|
|
1262
|
-
else if (config.serverType === 'http') {
|
|
1263
|
-
serverConfig = {
|
|
1264
|
-
type: 'http',
|
|
1265
|
-
url: config.url,
|
|
1266
|
-
};
|
|
1267
|
-
}
|
|
1268
|
-
else {
|
|
1269
|
-
// sse
|
|
1270
|
-
serverConfig = {
|
|
1271
|
-
type: 'sse',
|
|
1272
|
-
url: config.url,
|
|
1273
|
-
};
|
|
1274
|
-
}
|
|
1275
|
-
await agent.addMcpServer(config.name, serverConfig);
|
|
1276
|
-
// Track MCP server connected analytics
|
|
1277
|
-
capture('dexto_mcp_server_connected', {
|
|
1278
|
-
source: 'cli',
|
|
1279
|
-
serverName: config.name,
|
|
1280
|
-
transportType: serverConfig.type,
|
|
1281
|
-
});
|
|
1282
|
-
setMessages((prev) => [
|
|
1283
|
-
...prev,
|
|
1284
|
-
{
|
|
1285
|
-
id: generateMessageId('system'),
|
|
1286
|
-
role: 'system',
|
|
1287
|
-
content: `✅ Connected to ${config.name}`,
|
|
1288
|
-
timestamp: new Date(),
|
|
1289
|
-
},
|
|
1290
|
-
]);
|
|
1291
|
-
}
|
|
1292
|
-
catch (error) {
|
|
1293
|
-
setMessages((prev) => [
|
|
1294
|
-
...prev,
|
|
1295
|
-
{
|
|
1296
|
-
id: generateMessageId('system'),
|
|
1297
|
-
role: 'system',
|
|
1298
|
-
content: `Failed to connect: ${error instanceof Error ? error.message : String(error)}`,
|
|
1299
|
-
timestamp: new Date(),
|
|
1300
|
-
},
|
|
1301
|
-
]);
|
|
1302
|
-
}
|
|
1303
|
-
setUi((prev) => ({
|
|
1304
|
-
...prev,
|
|
1305
|
-
isProcessing: false,
|
|
1306
|
-
isCancelling: false,
|
|
1307
|
-
isThinking: false,
|
|
1308
|
-
}));
|
|
1309
|
-
}, [setUi, setInput, setMessages, agent, buffer]);
|
|
1310
|
-
// Handle plugin manager actions
|
|
1311
|
-
const handlePluginManagerAction = useCallback((action) => {
|
|
1312
|
-
if (action === 'list') {
|
|
1313
|
-
setUi((prev) => ({
|
|
1314
|
-
...prev,
|
|
1315
|
-
activeOverlay: 'plugin-list',
|
|
1316
|
-
}));
|
|
1317
|
-
}
|
|
1318
|
-
else if (action === 'marketplace') {
|
|
1319
|
-
setUi((prev) => ({
|
|
1320
|
-
...prev,
|
|
1321
|
-
activeOverlay: 'marketplace-browser',
|
|
1322
|
-
}));
|
|
1323
|
-
}
|
|
1324
|
-
}, [setUi]);
|
|
1325
|
-
// Handle plugin selection from plugin list
|
|
1326
|
-
const handlePluginSelect = useCallback((plugin) => {
|
|
1327
|
-
setSelectedPlugin(plugin);
|
|
1328
|
-
setUi((prev) => ({
|
|
1329
|
-
...prev,
|
|
1330
|
-
activeOverlay: 'plugin-actions',
|
|
1331
|
-
}));
|
|
1332
|
-
}, [setUi]);
|
|
1333
|
-
// Handle plugin actions (uninstall, back)
|
|
1334
|
-
const handlePluginAction = useCallback(async (action) => {
|
|
1335
|
-
if (action.type === 'back') {
|
|
1336
|
-
setSelectedPlugin(null);
|
|
1337
|
-
setUi((prev) => ({
|
|
1338
|
-
...prev,
|
|
1339
|
-
activeOverlay: 'plugin-list',
|
|
1340
|
-
}));
|
|
1341
|
-
return;
|
|
1342
|
-
}
|
|
1343
|
-
if (action.type === 'uninstall') {
|
|
1344
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', isProcessing: true }));
|
|
1345
|
-
try {
|
|
1346
|
-
const { uninstallPlugin, reloadAgentConfigFromFile, enrichAgentConfig } = await import('@dexto/agent-management');
|
|
1347
|
-
await uninstallPlugin(action.plugin.name);
|
|
1348
|
-
setMessages((prev) => [
|
|
1349
|
-
...prev,
|
|
1350
|
-
{
|
|
1351
|
-
id: generateMessageId('system'),
|
|
1352
|
-
role: 'system',
|
|
1353
|
-
content: `Plugin '${action.plugin.name}' has been uninstalled.`,
|
|
1354
|
-
timestamp: new Date(),
|
|
1355
|
-
},
|
|
1356
|
-
]);
|
|
1357
|
-
// Refresh prompts to remove uninstalled plugin skills
|
|
1358
|
-
try {
|
|
1359
|
-
const agentPath = getConfigFilePathOrWarn('refresh prompts after plugin uninstall');
|
|
1360
|
-
if (!agentPath) {
|
|
1361
|
-
return;
|
|
1362
|
-
}
|
|
1363
|
-
const newConfig = await reloadAgentConfigFromFile(agentPath);
|
|
1364
|
-
const enrichedConfig = enrichAgentConfig(newConfig, agentPath);
|
|
1365
|
-
await agent.refreshPrompts(enrichedConfig.prompts);
|
|
1366
|
-
}
|
|
1367
|
-
catch {
|
|
1368
|
-
// Non-critical: prompts will refresh on next agent restart
|
|
1369
|
-
}
|
|
1370
|
-
}
|
|
1371
|
-
catch (error) {
|
|
1372
|
-
setMessages((prev) => [
|
|
1373
|
-
...prev,
|
|
1374
|
-
{
|
|
1375
|
-
id: generateMessageId('error'),
|
|
1376
|
-
role: 'system',
|
|
1377
|
-
content: `Failed to uninstall plugin: ${error instanceof Error ? error.message : String(error)}`,
|
|
1378
|
-
timestamp: new Date(),
|
|
1379
|
-
},
|
|
1380
|
-
]);
|
|
1381
|
-
}
|
|
1382
|
-
setSelectedPlugin(null);
|
|
1383
|
-
setUi((prev) => ({ ...prev, isProcessing: false }));
|
|
1384
|
-
}
|
|
1385
|
-
}, [setUi, setMessages, agent, getConfigFilePathOrWarn]);
|
|
1386
|
-
// Handle marketplace browser actions
|
|
1387
|
-
const handleMarketplaceBrowserAction = useCallback(async (action) => {
|
|
1388
|
-
if (action.type === 'add-marketplace') {
|
|
1389
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'marketplace-add' }));
|
|
1390
|
-
}
|
|
1391
|
-
else if (action.type === 'plugin-installed') {
|
|
1392
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
|
|
1393
|
-
setMessages((prev) => [
|
|
1394
|
-
...prev,
|
|
1395
|
-
{
|
|
1396
|
-
id: generateMessageId('system'),
|
|
1397
|
-
role: 'system',
|
|
1398
|
-
content: `✅ Plugin '${action.pluginName}' installed from ${action.marketplace}`,
|
|
1399
|
-
timestamp: new Date(),
|
|
1400
|
-
},
|
|
1401
|
-
]);
|
|
1402
|
-
// Refresh prompts to include new plugin skills
|
|
1403
|
-
try {
|
|
1404
|
-
const { reloadAgentConfigFromFile, enrichAgentConfig } = await import('@dexto/agent-management');
|
|
1405
|
-
const agentPath = getConfigFilePathOrWarn('refresh prompts after plugin install');
|
|
1406
|
-
if (!agentPath) {
|
|
1407
|
-
return;
|
|
1408
|
-
}
|
|
1409
|
-
const newConfig = await reloadAgentConfigFromFile(agentPath);
|
|
1410
|
-
const enrichedConfig = enrichAgentConfig(newConfig, agentPath);
|
|
1411
|
-
await agent.refreshPrompts(enrichedConfig.prompts);
|
|
1412
|
-
}
|
|
1413
|
-
catch (error) {
|
|
1414
|
-
// Non-critical: prompts will refresh on next agent restart
|
|
1415
|
-
// Log but don't show error to user
|
|
1416
|
-
}
|
|
1417
|
-
}
|
|
1418
|
-
}, [setUi, setMessages, agent, getConfigFilePathOrWarn]);
|
|
1419
|
-
// Handle marketplace add completion
|
|
1420
|
-
const handleMarketplaceAddComplete = useCallback((name, pluginCount) => {
|
|
1421
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'marketplace-browser' }));
|
|
1422
|
-
setMessages((prev) => [
|
|
1423
|
-
...prev,
|
|
1424
|
-
{
|
|
1425
|
-
id: generateMessageId('system'),
|
|
1426
|
-
role: 'system',
|
|
1427
|
-
content: `✅ Marketplace '${name}' added (${pluginCount} plugins found)`,
|
|
1428
|
-
timestamp: new Date(),
|
|
1429
|
-
},
|
|
1430
|
-
]);
|
|
1431
|
-
}, [setUi, setMessages]);
|
|
1432
|
-
// Handle session subcommand selection
|
|
1433
|
-
const handleSessionSubcommandSelect = useCallback(async (action) => {
|
|
1434
|
-
if (action === 'switch') {
|
|
1435
|
-
setInput((prev) => ({ ...prev, value: '/session switch' }));
|
|
1436
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'session-selector' }));
|
|
1437
|
-
return;
|
|
1438
|
-
}
|
|
1439
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none', mcpWizardServerType: null }));
|
|
1440
|
-
buffer.setText('');
|
|
1441
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
1442
|
-
setUi((prev) => ({ ...prev, isProcessing: true, isCancelling: false }));
|
|
1443
|
-
try {
|
|
1444
|
-
const { CommandService } = await import('../services/CommandService.js');
|
|
1445
|
-
const commandService = new CommandService();
|
|
1446
|
-
const result = await commandService.executeCommand('session', [action], agent, session.id || undefined);
|
|
1447
|
-
if (result.type === 'output' && result.output) {
|
|
1448
|
-
const output = result.output;
|
|
1449
|
-
setMessages((prev) => [
|
|
1450
|
-
...prev,
|
|
1451
|
-
{
|
|
1452
|
-
id: generateMessageId('command'),
|
|
1453
|
-
role: 'system',
|
|
1454
|
-
content: output,
|
|
1455
|
-
timestamp: new Date(),
|
|
1456
|
-
},
|
|
1457
|
-
]);
|
|
1458
|
-
}
|
|
1459
|
-
if (result.type === 'styled' && result.styled) {
|
|
1460
|
-
const { fallbackText, styledType, styledData } = result.styled;
|
|
1461
|
-
setMessages((prev) => [
|
|
1462
|
-
...prev,
|
|
1463
|
-
{
|
|
1464
|
-
id: generateMessageId('command'),
|
|
1465
|
-
role: 'system',
|
|
1466
|
-
content: fallbackText,
|
|
1467
|
-
timestamp: new Date(),
|
|
1468
|
-
styledType,
|
|
1469
|
-
styledData,
|
|
1470
|
-
},
|
|
1471
|
-
]);
|
|
1472
|
-
}
|
|
1473
|
-
setUi((prev) => ({
|
|
1474
|
-
...prev,
|
|
1475
|
-
isProcessing: false,
|
|
1476
|
-
isCancelling: false,
|
|
1477
|
-
isThinking: false,
|
|
1478
|
-
}));
|
|
1479
|
-
}
|
|
1480
|
-
catch (error) {
|
|
1481
|
-
setMessages((prev) => [
|
|
1482
|
-
...prev,
|
|
1483
|
-
{
|
|
1484
|
-
id: generateMessageId('error'),
|
|
1485
|
-
role: 'system',
|
|
1486
|
-
content: `${error instanceof Error ? error.message : String(error)}`,
|
|
1487
|
-
timestamp: new Date(),
|
|
1488
|
-
},
|
|
1489
|
-
]);
|
|
1490
|
-
setUi((prev) => ({
|
|
1491
|
-
...prev,
|
|
1492
|
-
isProcessing: false,
|
|
1493
|
-
isCancelling: false,
|
|
1494
|
-
isThinking: false,
|
|
1495
|
-
}));
|
|
1496
|
-
}
|
|
1497
|
-
}, [setInput, setUi, setMessages, agent, session.id, buffer]);
|
|
1498
|
-
// Handle prompt list actions (select/add/delete)
|
|
1499
|
-
const handlePromptListAction = useCallback(async (action) => {
|
|
1500
|
-
if (action.type === 'add-prompt') {
|
|
1501
|
-
setUi((prev) => ({
|
|
1502
|
-
...prev,
|
|
1503
|
-
activeOverlay: 'prompt-add-choice',
|
|
1504
|
-
}));
|
|
1505
|
-
}
|
|
1506
|
-
else if (action.type === 'delete-prompt') {
|
|
1507
|
-
setUi((prev) => ({
|
|
1508
|
-
...prev,
|
|
1509
|
-
activeOverlay: 'prompt-delete-selector',
|
|
1510
|
-
}));
|
|
1511
|
-
}
|
|
1512
|
-
else if (action.type === 'select-prompt') {
|
|
1513
|
-
// Execute the prompt
|
|
1514
|
-
const displayName = action.prompt.displayName || action.prompt.name;
|
|
1515
|
-
const commandText = `/${displayName}`;
|
|
1516
|
-
setUi((prev) => ({
|
|
1517
|
-
...prev,
|
|
1518
|
-
activeOverlay: 'none',
|
|
1519
|
-
promptAddWizard: null,
|
|
1520
|
-
}));
|
|
1521
|
-
buffer.setText('');
|
|
1522
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
1523
|
-
// Route through streaming pipeline
|
|
1524
|
-
if (onSubmitPromptCommand) {
|
|
1525
|
-
await onSubmitPromptCommand(commandText);
|
|
1526
|
-
}
|
|
1527
|
-
}
|
|
1528
|
-
}, [setUi, setInput, buffer, onSubmitPromptCommand]);
|
|
1529
|
-
// Handle prompt list load into input
|
|
1530
|
-
const handlePromptLoadIntoInput = useCallback((text) => {
|
|
1531
|
-
buffer.setText(text);
|
|
1532
|
-
setInput((prev) => ({ ...prev, value: text }));
|
|
1533
|
-
setUi((prev) => ({
|
|
1534
|
-
...prev,
|
|
1535
|
-
activeOverlay: 'none',
|
|
1536
|
-
promptAddWizard: null,
|
|
1537
|
-
}));
|
|
1538
|
-
}, [buffer, setInput, setUi]);
|
|
1539
|
-
// Handle prompt add choice (agent vs shared)
|
|
1540
|
-
const handlePromptAddChoice = useCallback((choice) => {
|
|
1541
|
-
if (choice === 'back') {
|
|
1542
|
-
setUi((prev) => ({
|
|
1543
|
-
...prev,
|
|
1544
|
-
activeOverlay: 'prompt-list',
|
|
1545
|
-
}));
|
|
1546
|
-
}
|
|
1547
|
-
else {
|
|
1548
|
-
setUi((prev) => ({
|
|
1549
|
-
...prev,
|
|
1550
|
-
activeOverlay: 'prompt-add-wizard',
|
|
1551
|
-
promptAddWizard: {
|
|
1552
|
-
scope: choice,
|
|
1553
|
-
step: 'name',
|
|
1554
|
-
name: '',
|
|
1555
|
-
title: '',
|
|
1556
|
-
description: '',
|
|
1557
|
-
content: '',
|
|
1558
|
-
},
|
|
1559
|
-
}));
|
|
1560
|
-
}
|
|
1561
|
-
}, [setUi]);
|
|
1562
|
-
// Handle prompt add wizard completion
|
|
1563
|
-
const handlePromptAddComplete = useCallback(async (data) => {
|
|
1564
|
-
const scope = ui.promptAddWizard?.scope || 'agent';
|
|
1565
|
-
setUi((prev) => ({
|
|
1566
|
-
...prev,
|
|
1567
|
-
activeOverlay: 'none',
|
|
1568
|
-
promptAddWizard: null,
|
|
1569
|
-
}));
|
|
1570
|
-
buffer.setText('');
|
|
1571
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
1572
|
-
setMessages((prev) => [
|
|
1573
|
-
...prev,
|
|
1574
|
-
{
|
|
1575
|
-
id: generateMessageId('system'),
|
|
1576
|
-
role: 'system',
|
|
1577
|
-
content: `📝 Creating ${scope === 'shared' ? 'shared' : 'agent'} prompt "${data.name}"...`,
|
|
1578
|
-
timestamp: new Date(),
|
|
1579
|
-
},
|
|
1580
|
-
]);
|
|
1581
|
-
try {
|
|
1582
|
-
const { mkdir, writeFile } = await import('fs/promises');
|
|
1583
|
-
const { dirname, join } = await import('path');
|
|
1584
|
-
// Validate prompt name to prevent path traversal
|
|
1585
|
-
const SAFE_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]*$/i;
|
|
1586
|
-
if (!SAFE_NAME_PATTERN.test(data.name)) {
|
|
1587
|
-
throw new Error(`Invalid prompt name "${data.name}". Names must start with a letter or number and contain only letters, numbers, hyphens, and underscores.`);
|
|
1588
|
-
}
|
|
1589
|
-
// Build frontmatter
|
|
1590
|
-
const frontmatterLines = [
|
|
1591
|
-
'---',
|
|
1592
|
-
`id: ${data.name}`,
|
|
1593
|
-
data.title ? `title: "${data.title}"` : null,
|
|
1594
|
-
data.description ? `description: "${data.description}"` : null,
|
|
1595
|
-
data.argumentHint ? `argument-hint: ${data.argumentHint}` : null,
|
|
1596
|
-
'---',
|
|
1597
|
-
].filter(Boolean);
|
|
1598
|
-
const fileContent = `${frontmatterLines.join('\n')}\n\n${data.content}\n`;
|
|
1599
|
-
let filePath;
|
|
1600
|
-
if (scope === 'shared') {
|
|
1601
|
-
// Create in commands directory based on execution context
|
|
1602
|
-
// Matches discovery logic in discoverCommandPrompts()
|
|
1603
|
-
const { getExecutionContext, findDextoSourceRoot, findDextoProjectRoot, getDextoGlobalPath, } = await import('@dexto/agent-management');
|
|
1604
|
-
const context = getExecutionContext();
|
|
1605
|
-
let commandsDir;
|
|
1606
|
-
if (context === 'dexto-source') {
|
|
1607
|
-
const isDevMode = process.env.DEXTO_DEV_MODE === 'true';
|
|
1608
|
-
if (isDevMode) {
|
|
1609
|
-
const sourceRoot = findDextoSourceRoot();
|
|
1610
|
-
commandsDir = sourceRoot
|
|
1611
|
-
? join(sourceRoot, 'commands')
|
|
1612
|
-
: getDextoGlobalPath('commands');
|
|
1613
|
-
}
|
|
1614
|
-
else {
|
|
1615
|
-
commandsDir = getDextoGlobalPath('commands');
|
|
1616
|
-
}
|
|
1617
|
-
}
|
|
1618
|
-
else if (context === 'dexto-project') {
|
|
1619
|
-
const projectRoot = findDextoProjectRoot();
|
|
1620
|
-
commandsDir = projectRoot
|
|
1621
|
-
? join(projectRoot, 'commands')
|
|
1622
|
-
: getDextoGlobalPath('commands');
|
|
1623
|
-
}
|
|
1624
|
-
else {
|
|
1625
|
-
// global-cli
|
|
1626
|
-
commandsDir = getDextoGlobalPath('commands');
|
|
1627
|
-
}
|
|
1628
|
-
filePath = join(commandsDir, `${data.name}.md`);
|
|
1629
|
-
await mkdir(commandsDir, { recursive: true });
|
|
1630
|
-
await writeFile(filePath, fileContent, 'utf-8');
|
|
1631
|
-
// Re-discover commands and refresh with enriched prompts
|
|
1632
|
-
const { reloadAgentConfigFromFile, enrichAgentConfig } = await import('@dexto/agent-management');
|
|
1633
|
-
const agentPath = getConfigFilePathOrWarn('refresh prompts after creating shared prompt');
|
|
1634
|
-
if (!agentPath) {
|
|
1635
|
-
return;
|
|
1636
|
-
}
|
|
1637
|
-
const newConfig = await reloadAgentConfigFromFile(agentPath);
|
|
1638
|
-
const enrichedConfig = enrichAgentConfig(newConfig, agentPath);
|
|
1639
|
-
await agent.refreshPrompts(enrichedConfig.prompts);
|
|
1640
|
-
}
|
|
1641
|
-
else {
|
|
1642
|
-
// Create in agent's prompts directory
|
|
1643
|
-
const agentPath = getConfigFilePathOrWarn('create prompt in agent prompts directory');
|
|
1644
|
-
if (!agentPath) {
|
|
1645
|
-
return;
|
|
1646
|
-
}
|
|
1647
|
-
const agentDir = dirname(agentPath);
|
|
1648
|
-
const promptsDir = join(agentDir, 'prompts');
|
|
1649
|
-
filePath = join(promptsDir, `${data.name}.md`);
|
|
1650
|
-
await mkdir(promptsDir, { recursive: true });
|
|
1651
|
-
await writeFile(filePath, fileContent, 'utf-8');
|
|
1652
|
-
// Add file reference to agent config using surgical helper
|
|
1653
|
-
const { addPromptToAgentConfig, reloadAgentConfigFromFile, enrichAgentConfig, } = await import('@dexto/agent-management');
|
|
1654
|
-
await addPromptToAgentConfig(agentPath, {
|
|
1655
|
-
type: 'file',
|
|
1656
|
-
file: `\${{dexto.agent_dir}}/prompts/${data.name}.md`,
|
|
1657
|
-
});
|
|
1658
|
-
// Reload config from disk, enrich to include discovered commands, then refresh
|
|
1659
|
-
const newConfig = await reloadAgentConfigFromFile(agentPath);
|
|
1660
|
-
const enrichedConfig = enrichAgentConfig(newConfig, agentPath);
|
|
1661
|
-
await agent.refreshPrompts(enrichedConfig.prompts);
|
|
1662
|
-
}
|
|
1663
|
-
setMessages((prev) => [
|
|
1664
|
-
...prev,
|
|
1665
|
-
{
|
|
1666
|
-
id: generateMessageId('system'),
|
|
1667
|
-
role: 'system',
|
|
1668
|
-
content: `✅ Created prompt "${data.name}"\n📄 File: ${filePath}\n\nUse /${data.name} to run it.`,
|
|
1669
|
-
timestamp: new Date(),
|
|
1670
|
-
},
|
|
1671
|
-
]);
|
|
1672
|
-
}
|
|
1673
|
-
catch (error) {
|
|
1674
|
-
setMessages((prev) => [
|
|
1675
|
-
...prev,
|
|
1676
|
-
{
|
|
1677
|
-
id: generateMessageId('error'),
|
|
1678
|
-
role: 'system',
|
|
1679
|
-
content: `Failed to create prompt: ${error instanceof Error ? error.message : String(error)}`,
|
|
1680
|
-
timestamp: new Date(),
|
|
1681
|
-
},
|
|
1682
|
-
]);
|
|
1683
|
-
}
|
|
1684
|
-
}, [
|
|
1685
|
-
ui.promptAddWizard?.scope,
|
|
1686
|
-
setUi,
|
|
1687
|
-
setInput,
|
|
1688
|
-
setMessages,
|
|
1689
|
-
buffer,
|
|
1690
|
-
agent,
|
|
1691
|
-
getConfigFilePathOrWarn,
|
|
1692
|
-
]);
|
|
1693
|
-
// Handle prompt delete
|
|
1694
|
-
const handlePromptDelete = useCallback(async (deletable) => {
|
|
1695
|
-
const displayName = deletable.prompt.displayName || deletable.prompt.name;
|
|
1696
|
-
setMessages((prev) => [
|
|
1697
|
-
...prev,
|
|
1698
|
-
{
|
|
1699
|
-
id: generateMessageId('system'),
|
|
1700
|
-
role: 'system',
|
|
1701
|
-
content: `🗑️ Deleting prompt "${displayName}"...`,
|
|
1702
|
-
timestamp: new Date(),
|
|
1703
|
-
},
|
|
1704
|
-
]);
|
|
1705
|
-
try {
|
|
1706
|
-
const { deletePromptByMetadata, reloadAgentConfigFromFile, enrichAgentConfig } = await import('@dexto/agent-management');
|
|
1707
|
-
const agentPath = getConfigFilePathOrWarn('delete prompt');
|
|
1708
|
-
if (!agentPath) {
|
|
1709
|
-
return;
|
|
1710
|
-
}
|
|
1711
|
-
// Use the higher-level delete function that handles file + config
|
|
1712
|
-
// Pass full metadata including originalId for inline prompt deletion
|
|
1713
|
-
const promptMetadata = deletable.prompt.metadata;
|
|
1714
|
-
const result = await deletePromptByMetadata(agentPath, {
|
|
1715
|
-
name: deletable.prompt.name,
|
|
1716
|
-
metadata: {
|
|
1717
|
-
filePath: deletable.filePath,
|
|
1718
|
-
originalId: promptMetadata?.originalId,
|
|
1719
|
-
},
|
|
1720
|
-
}, { deleteFile: true });
|
|
1721
|
-
if (!result.success) {
|
|
1722
|
-
throw new Error(result.error || 'Failed to delete prompt');
|
|
1723
|
-
}
|
|
1724
|
-
// Reload config from disk, enrich to include discovered commands, then refresh
|
|
1725
|
-
const newConfig = await reloadAgentConfigFromFile(agentPath);
|
|
1726
|
-
const enrichedConfig = enrichAgentConfig(newConfig, agentPath);
|
|
1727
|
-
await agent.refreshPrompts(enrichedConfig.prompts);
|
|
1728
|
-
setMessages((prev) => [
|
|
1729
|
-
...prev,
|
|
1730
|
-
{
|
|
1731
|
-
id: generateMessageId('system'),
|
|
1732
|
-
role: 'system',
|
|
1733
|
-
content: `✅ Deleted prompt "${displayName}"`,
|
|
1734
|
-
timestamp: new Date(),
|
|
1735
|
-
},
|
|
1736
|
-
]);
|
|
1737
|
-
// Return to prompt list and refresh
|
|
1738
|
-
setUi((prev) => ({
|
|
1739
|
-
...prev,
|
|
1740
|
-
activeOverlay: 'prompt-list',
|
|
1741
|
-
}));
|
|
1742
|
-
promptListRef.current?.refresh();
|
|
1743
|
-
}
|
|
1744
|
-
catch (error) {
|
|
1745
|
-
setMessages((prev) => [
|
|
1746
|
-
...prev,
|
|
1747
|
-
{
|
|
1748
|
-
id: generateMessageId('error'),
|
|
1749
|
-
role: 'system',
|
|
1750
|
-
content: `Failed to delete prompt: ${error instanceof Error ? error.message : String(error)}`,
|
|
1751
|
-
timestamp: new Date(),
|
|
1752
|
-
},
|
|
1753
|
-
]);
|
|
1754
|
-
// Return to prompt list even on error
|
|
1755
|
-
setUi((prev) => ({
|
|
1756
|
-
...prev,
|
|
1757
|
-
activeOverlay: 'prompt-list',
|
|
1758
|
-
}));
|
|
1759
|
-
}
|
|
1760
|
-
}, [setUi, setMessages, agent, getConfigFilePathOrWarn]);
|
|
1761
|
-
// Handle prompt add wizard close
|
|
1762
|
-
const handlePromptAddWizardClose = useCallback(() => {
|
|
1763
|
-
setUi((prev) => ({
|
|
1764
|
-
...prev,
|
|
1765
|
-
activeOverlay: 'prompt-add-choice',
|
|
1766
|
-
promptAddWizard: null,
|
|
1767
|
-
}));
|
|
1768
|
-
}, [setUi]);
|
|
1769
|
-
// Handle prompt delete selector close
|
|
1770
|
-
const handlePromptDeleteClose = useCallback(() => {
|
|
1771
|
-
setUi((prev) => ({
|
|
1772
|
-
...prev,
|
|
1773
|
-
activeOverlay: 'prompt-list',
|
|
1774
|
-
}));
|
|
1775
|
-
// Refresh prompt list to show updated list
|
|
1776
|
-
promptListRef.current?.refresh();
|
|
1777
|
-
}, [setUi]);
|
|
1778
|
-
// Handle prompt add choice close
|
|
1779
|
-
const handlePromptAddChoiceClose = useCallback(() => {
|
|
1780
|
-
setUi((prev) => ({
|
|
1781
|
-
...prev,
|
|
1782
|
-
activeOverlay: 'prompt-list',
|
|
1783
|
-
}));
|
|
1784
|
-
}, [setUi]);
|
|
1785
|
-
// State for current session title (for rename overlay)
|
|
1786
|
-
const [currentSessionTitle, setCurrentSessionTitle] = useState(undefined);
|
|
1787
|
-
// Fetch current session title when rename overlay opens
|
|
1788
|
-
React.useEffect(() => {
|
|
1789
|
-
if (ui.activeOverlay === 'session-rename' && session.id) {
|
|
1790
|
-
void agent.getSessionTitle(session.id).then(setCurrentSessionTitle);
|
|
1791
|
-
}
|
|
1792
|
-
}, [ui.activeOverlay, session.id, agent]);
|
|
1793
|
-
// Handle session rename
|
|
1794
|
-
const handleSessionRename = useCallback(async (newTitle) => {
|
|
1795
|
-
if (!session.id)
|
|
1796
|
-
return;
|
|
1797
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
|
|
1798
|
-
buffer.setText('');
|
|
1799
|
-
setInput((prev) => ({ ...prev, historyIndex: -1 }));
|
|
1800
|
-
try {
|
|
1801
|
-
await agent.setSessionTitle(session.id, newTitle);
|
|
1802
|
-
setMessages((prev) => [
|
|
1803
|
-
...prev,
|
|
1804
|
-
{
|
|
1805
|
-
id: generateMessageId('system'),
|
|
1806
|
-
role: 'system',
|
|
1807
|
-
content: `✅ Session renamed to: ${newTitle}`,
|
|
1808
|
-
timestamp: new Date(),
|
|
1809
|
-
},
|
|
1810
|
-
]);
|
|
1811
|
-
}
|
|
1812
|
-
catch (error) {
|
|
1813
|
-
setMessages((prev) => [
|
|
1814
|
-
...prev,
|
|
1815
|
-
{
|
|
1816
|
-
id: generateMessageId('error'),
|
|
1817
|
-
role: 'system',
|
|
1818
|
-
content: `Failed to rename session: ${error instanceof Error ? error.message : String(error)}`,
|
|
1819
|
-
timestamp: new Date(),
|
|
1820
|
-
},
|
|
1821
|
-
]);
|
|
1822
|
-
}
|
|
1823
|
-
}, [session.id, setUi, setInput, setMessages, agent, buffer]);
|
|
1824
|
-
// Handle session rename close
|
|
1825
|
-
const handleSessionRenameClose = useCallback(() => {
|
|
1826
|
-
setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
|
|
1827
|
-
}, [setUi]);
|
|
1828
|
-
const hideCliChrome = shouldHideCliChrome(ui.activeOverlay, approval);
|
|
1829
|
-
const overlayContent = (_jsxs(_Fragment, { children: [approval && (_jsx(ApprovalPrompt, { ref: approvalRef, approval: approval, onApprove: handleApprove, onDeny: handleDeny, onCancel: handleCancelApproval })), ui.activeOverlay === 'slash-autocomplete' && (_jsx(Box, { marginTop: 1, children: _jsx(SlashCommandAutocomplete, { ref: slashAutocompleteRef, isVisible: true, searchQuery: input.value, onSelectPrompt: handlePromptSelect, onSelectSystemCommand: handleSystemCommandSelect, onLoadIntoInput: handleLoadIntoInput, onSubmitRaw: onSubmitPromptCommand, onClose: handleClose, agent: agent }) })), ui.activeOverlay === 'resource-autocomplete' && (_jsx(Box, { marginTop: 1, children: _jsx(ResourceAutocomplete, { ref: resourceAutocompleteRef, isVisible: true, searchQuery: input.value, onSelectResource: handleResourceSelect, onLoadIntoInput: handleLoadIntoInput, onClose: handleClose, agent: agent }) })), ui.activeOverlay === 'model-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(ModelSelectorRefactored, { ref: modelSelectorRef, isVisible: true, onSelectModel: handleModelSelect, onSetDefaultModel: handleSetDefaultModel, onClose: handleClose, onAddCustomModel: handleAddCustomModel, onEditCustomModel: handleEditCustomModel, agent: agent }) })), ui.activeOverlay === 'session-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(SessionSelectorRefactored, { ref: sessionSelectorRef, isVisible: true, onSelectSession: handleSessionSelect, onClose: handleClose, agent: agent, currentSessionId: session.id || undefined }) })), ui.activeOverlay === 'log-level-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(LogLevelSelector, { ref: logLevelSelectorRef, isVisible: true, onSelect: handleLogLevelSelect, onClose: handleClose, agent: agent, sessionId: session.id }) })), ui.activeOverlay === 'stream-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(StreamSelector, { ref: streamSelectorRef, isVisible: true, onSelect: handleStreamSelect, onClose: handleClose }) })), ui.activeOverlay === 'sounds-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(SoundsSelector, { ref: soundsSelectorRef, isVisible: true, onClose: handleClose }) })), ui.activeOverlay === 'tool-browser' && (_jsx(Box, { marginTop: 1, children: _jsx(ToolBrowser, { ref: toolBrowserRef, isVisible: true, onClose: handleClose, agent: agent, sessionId: session.id }) })), ui.activeOverlay === 'command-output' && ui.commandOutput && (_jsx(Box, { marginTop: 1, children: _jsx(CommandOutputOverlay, { ref: commandOutputRef, isVisible: true, title: ui.commandOutput.title, content: ui.commandOutput.content, onClose: handleClose }) })), ui.activeOverlay === 'mcp-server-list' && (_jsx(Box, { marginTop: 1, children: _jsx(McpServerList, { ref: mcpServerListRef, isVisible: true, onAction: handleMcpServerListAction, onClose: handleClose, agent: agent }) })), ui.activeOverlay === 'mcp-server-actions' && ui.selectedMcpServer && (_jsx(Box, { marginTop: 1, children: _jsx(McpServerActions, { ref: mcpServerActionsRef, isVisible: true, server: ui.selectedMcpServer, onAction: handleMcpServerAction, onClose: handleClose }) })), ui.activeOverlay === 'mcp-add-choice' && (_jsx(Box, { marginTop: 1, children: _jsx(McpAddChoice, { ref: mcpAddChoiceRef, isVisible: true, onSelect: handleMcpAddChoice, onClose: handleClose }) })), ui.activeOverlay === 'mcp-add-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(McpAddSelector, { ref: mcpAddSelectorRef, isVisible: true, onSelect: handleMcpAddSelect, onClose: handleClose }) })), ui.activeOverlay === 'mcp-custom-type-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(McpCustomTypeSelector, { ref: mcpCustomTypeSelectorRef, isVisible: true, onSelect: handleMcpCustomTypeSelect, onClose: handleClose }) })), ui.activeOverlay === 'mcp-custom-wizard' && ui.mcpWizardServerType && (_jsx(McpCustomWizard, { ref: mcpCustomWizardRef, isVisible: true, serverType: ui.mcpWizardServerType, onComplete: handleMcpCustomWizardComplete, onClose: handleClose })), ui.activeOverlay === 'custom-model-wizard' && (_jsx(CustomModelWizard, { ref: customModelWizardRef, isVisible: true, onComplete: handleCustomModelComplete, onClose: () => {
|
|
1830
|
-
setEditingModel(null);
|
|
1831
|
-
handleClose();
|
|
1832
|
-
}, initialModel: editingModel })), ui.activeOverlay === 'plugin-manager' && (_jsx(Box, { marginTop: 1, children: _jsx(PluginManager, { ref: pluginManagerRef, isVisible: true, onAction: handlePluginManagerAction, onClose: handleClose }) })), ui.activeOverlay === 'plugin-list' && (_jsx(Box, { marginTop: 1, children: _jsx(PluginList, { ref: pluginListRef, isVisible: true, onPluginSelect: handlePluginSelect, onClose: handleClose }) })), ui.activeOverlay === 'plugin-actions' && (_jsx(Box, { marginTop: 1, children: _jsx(PluginActions, { ref: pluginActionsRef, isVisible: true, plugin: selectedPlugin, onAction: handlePluginAction, onClose: () => {
|
|
1833
|
-
setSelectedPlugin(null);
|
|
1834
|
-
setUi((prev) => ({
|
|
1835
|
-
...prev,
|
|
1836
|
-
activeOverlay: 'plugin-list',
|
|
1837
|
-
}));
|
|
1838
|
-
} }) })), ui.activeOverlay === 'marketplace-browser' && (_jsx(Box, { marginTop: 1, children: _jsx(MarketplaceBrowser, { ref: marketplaceBrowserRef, isVisible: true, onAction: handleMarketplaceBrowserAction, onClose: handleClose }) })), ui.activeOverlay === 'marketplace-add' && (_jsx(Box, { marginTop: 1, children: _jsx(MarketplaceAddPrompt, { ref: marketplaceAddPromptRef, isVisible: true, onComplete: handleMarketplaceAddComplete, onClose: () => setUi((prev) => ({ ...prev, activeOverlay: 'marketplace-browser' })) }) })), ui.activeOverlay === 'session-subcommand-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(SessionSubcommandSelector, { ref: sessionSubcommandSelectorRef, isVisible: true, onSelect: handleSessionSubcommandSelect, onClose: handleClose }) })), ui.activeOverlay === 'api-key-input' && ui.pendingModelSwitch && (_jsx(ApiKeyInput, { ref: apiKeyInputRef, isVisible: true, provider: ui.pendingModelSwitch.provider, onSaved: handleApiKeySaved, onClose: handleApiKeyClose })), ui.activeOverlay === 'search' && (_jsx(SearchOverlay, { ref: searchOverlayRef, isVisible: true, agent: agent, onClose: handleClose, onSelectResult: handleSearchResultSelect })), ui.activeOverlay === 'prompt-list' && (_jsx(Box, { marginTop: 1, children: _jsx(PromptList, { ref: promptListRef, isVisible: true, onAction: handlePromptListAction, onLoadIntoInput: handlePromptLoadIntoInput, onClose: handleClose, agent: agent }) })), ui.activeOverlay === 'prompt-add-choice' && (_jsx(Box, { marginTop: 1, children: _jsx(PromptAddChoice, { ref: promptAddChoiceRef, isVisible: true, onSelect: handlePromptAddChoice, onClose: handlePromptAddChoiceClose }) })), ui.activeOverlay === 'prompt-add-wizard' && ui.promptAddWizard && (_jsx(PromptAddWizard, { ref: promptAddWizardRef, isVisible: true, scope: ui.promptAddWizard.scope, onComplete: handlePromptAddComplete, onClose: handlePromptAddWizardClose })), ui.activeOverlay === 'prompt-delete-selector' && (_jsx(Box, { marginTop: 1, children: _jsx(PromptDeleteSelector, { ref: promptDeleteSelectorRef, isVisible: true, onDelete: handlePromptDelete, onClose: handlePromptDeleteClose, agent: agent }) })), ui.activeOverlay === 'session-rename' && (_jsx(SessionRenameOverlay, { ref: sessionRenameRef, isVisible: true, currentTitle: currentSessionTitle, onRename: handleSessionRename, onClose: handleSessionRenameClose })), ui.activeOverlay === 'context-stats' && session.id && (_jsx(Box, { marginTop: 1, children: _jsx(ContextStatsOverlay, { ref: contextStatsRef, isVisible: true, onClose: handleClose, agent: agent, sessionId: session.id ?? '' }) })), ui.activeOverlay === 'export-wizard' && (_jsx(ExportWizard, { ref: exportWizardRef, isVisible: true, agent: agent, sessionId: session.id, onClose: handleClose }))] }));
|
|
1839
|
-
return hideCliChrome ? (_jsx(FocusOverlayFrame, { children: overlayContent })) : (overlayContent);
|
|
1840
|
-
});
|