@blackbox_ai/blackbox-cli 0.0.9 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -183
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +11 -2
- package/dist/src/built-in-extensions/conductor/README.md +242 -0
- package/dist/src/built-in-extensions/conductor/blackbox-extension.json +5 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/implement.toml +170 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/newTrack.toml +142 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/revert.toml +122 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/setup.toml +424 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/status.toml +57 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/general.md +23 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/go.md +48 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/html-css.md +49 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/javascript.md +51 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/python.md +37 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/typescript.md +43 -0
- package/dist/src/built-in-extensions/conductor/templates/workflow.md +333 -0
- package/dist/src/built-in-extensions-data.d.ts +15 -0
- package/dist/src/built-in-extensions-data.js +61 -0
- package/dist/src/built-in-extensions-data.js.map +1 -0
- package/dist/src/commands/configure/ConfigureUI.d.ts +5 -2
- package/dist/src/commands/configure/ConfigureUI.js +181 -41
- package/dist/src/commands/configure/ConfigureUI.js.map +1 -1
- package/dist/src/commands/configure/index.js +35 -3
- package/dist/src/commands/configure/index.js.map +1 -1
- package/dist/src/commands/configure.js +20 -3
- package/dist/src/commands/configure.js.map +1 -1
- package/dist/src/commands/extensions/enable.js +1 -1
- package/dist/src/commands/extensions/enable.js.map +1 -1
- package/dist/src/commands/extensions/examples/context/CONTEXT.md +16 -0
- package/dist/src/commands/extensions/examples/context/blackbox-extension.json +5 -0
- package/dist/src/commands/extensions/examples/custom-commands/blackbox-extension.json +4 -0
- package/dist/src/commands/extensions/examples/custom-commands/commands/deploy.toml +12 -0
- package/dist/src/commands/extensions/examples/exclude-tools/README.md +28 -0
- package/dist/src/commands/extensions/examples/exclude-tools/blackbox-extension.json +5 -0
- package/dist/src/commands/extensions/install.d.ts +6 -2
- package/dist/src/commands/extensions/install.js +109 -15
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/link.d.ts +12 -0
- package/dist/src/commands/extensions/link.js +53 -0
- package/dist/src/commands/extensions/link.js.map +1 -0
- package/dist/src/commands/extensions/list.js +2 -2
- package/dist/src/commands/extensions/list.js.map +1 -1
- package/dist/src/commands/extensions/new.d.ts +13 -0
- package/dist/src/commands/extensions/new.js +145 -0
- package/dist/src/commands/extensions/new.js.map +1 -0
- package/dist/src/commands/extensions/settings.d.ts +18 -0
- package/dist/src/commands/extensions/settings.js +98 -0
- package/dist/src/commands/extensions/settings.js.map +1 -0
- package/dist/src/commands/extensions/update.d.ts +2 -1
- package/dist/src/commands/extensions/update.js +59 -10
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/extensions/validate.d.ts +12 -0
- package/dist/src/commands/extensions/validate.js +72 -0
- package/dist/src/commands/extensions/validate.js.map +1 -0
- package/dist/src/commands/extensions.js +10 -1
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/commands/mcp/add.d.ts +11 -0
- package/dist/src/commands/mcp/add.js +61 -7
- package/dist/src/commands/mcp/add.js.map +1 -1
- package/dist/src/commands/update.d.ts +7 -0
- package/dist/src/commands/update.js +103 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/commands/voice.d.ts +7 -0
- package/dist/src/commands/voice.js +510 -0
- package/dist/src/commands/voice.js.map +1 -0
- package/dist/src/config/auth.d.ts +4 -2
- package/dist/src/config/auth.js +36 -1
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.d.ts +7 -1
- package/dist/src/config/config.js +68 -9
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +6 -1
- package/dist/src/config/extension.js +137 -11
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/github.d.ts +48 -0
- package/dist/src/config/extensions/github.js +308 -0
- package/dist/src/config/extensions/github.js.map +1 -0
- package/dist/src/config/keyBindings.d.ts +1 -0
- package/dist/src/config/keyBindings.js +3 -0
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/modelFetcher.js +14 -39
- package/dist/src/config/modelFetcher.js.map +1 -1
- package/dist/src/config/settings.js +64 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +351 -0
- package/dist/src/config/settingsSchema.js +351 -0
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/voice.d.ts +31 -0
- package/dist/src/config/voice.js +82 -0
- package/dist/src/config/voice.js.map +1 -0
- package/dist/src/encrypt/attestation.d.ts +5 -0
- package/dist/src/encrypt/attestation.js +100 -0
- package/dist/src/encrypt/attestation.js.map +1 -0
- package/dist/src/encrypt/bridge.d.ts +30 -0
- package/dist/src/encrypt/bridge.js +32 -0
- package/dist/src/encrypt/bridge.js.map +1 -0
- package/dist/src/encrypt/client.d.ts +14 -0
- package/dist/src/encrypt/client.js +133 -0
- package/dist/src/encrypt/client.js.map +1 -0
- package/dist/src/encrypt/config.d.ts +26 -0
- package/dist/src/encrypt/config.js +51 -0
- package/dist/src/encrypt/config.js.map +1 -0
- package/dist/src/encrypt/crypto-utils.d.ts +57 -0
- package/dist/src/encrypt/crypto-utils.js +257 -0
- package/dist/src/encrypt/crypto-utils.js.map +1 -0
- package/dist/src/encrypt/index.d.ts +12 -0
- package/dist/src/encrypt/index.js +13 -0
- package/dist/src/encrypt/index.js.map +1 -0
- package/dist/src/encrypt/retry-utils.d.ts +20 -0
- package/dist/src/encrypt/retry-utils.js +60 -0
- package/dist/src/encrypt/retry-utils.js.map +1 -0
- package/dist/src/encrypt/sessions.d.ts +17 -0
- package/dist/src/encrypt/sessions.js +221 -0
- package/dist/src/encrypt/sessions.js.map +1 -0
- package/dist/src/encrypt/streaming-client.d.ts +29 -0
- package/dist/src/encrypt/streaming-client.js +226 -0
- package/dist/src/encrypt/streaming-client.js.map +1 -0
- package/dist/src/encrypt/types.d.ts +81 -0
- package/dist/src/encrypt/types.js +2 -0
- package/dist/src/encrypt/types.js.map +1 -0
- package/dist/src/gemini.d.ts +1 -1
- package/dist/src/gemini.js +57 -27
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/nonInteractiveCli.d.ts +4 -0
- package/dist/src/nonInteractiveCli.js +418 -5
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/on-demand-extensions/README.md +266 -0
- package/dist/src/on-demand-extensions/git-helper/README.md +16 -0
- package/dist/src/on-demand-extensions/git-helper/blackbox-extension.json +5 -0
- package/dist/src/on-demand-extensions/git-helper/commands/git/branch-cleanup.toml +18 -0
- package/dist/src/on-demand-extensions/git-helper/commands/git/smart-commit.toml +22 -0
- package/dist/src/on-demand-extensions/greet/README.md +76 -0
- package/dist/src/on-demand-extensions/greet/blackbox-extension.json +5 -0
- package/dist/src/on-demand-extensions/greet/commands/greet/hello.toml +9 -0
- package/dist/src/on-demand-extensions/registry.json +251 -0
- package/dist/src/services/BuiltinCommandLoader.js +20 -2
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/EncryptedContentGenerator.d.ts +63 -0
- package/dist/src/services/EncryptedContentGenerator.js +426 -0
- package/dist/src/services/EncryptedContentGenerator.js.map +1 -0
- package/dist/src/services/McpCommandLoader.d.ts +24 -0
- package/dist/src/services/McpCommandLoader.js +50 -0
- package/dist/src/services/McpCommandLoader.js.map +1 -0
- package/dist/src/services/McpPromptLoader.js +17 -2
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/services/ReleaseNotesCache.d.ts +57 -0
- package/dist/src/services/ReleaseNotesCache.js +186 -0
- package/dist/src/services/ReleaseNotesCache.js.map +1 -0
- package/dist/src/services/elevenLabsErrors.d.ts +65 -0
- package/dist/src/services/elevenLabsErrors.js +233 -0
- package/dist/src/services/elevenLabsErrors.js.map +1 -0
- package/dist/src/services/elevenLabsService.d.ts +62 -0
- package/dist/src/services/elevenLabsService.js +186 -0
- package/dist/src/services/elevenLabsService.js.map +1 -0
- package/dist/src/services/elevenLabsStreamingService.d.ts +59 -0
- package/dist/src/services/elevenLabsStreamingService.js +202 -0
- package/dist/src/services/elevenLabsStreamingService.js.map +1 -0
- package/dist/src/services/elevenLabsTokenService.d.ts +21 -0
- package/dist/src/services/elevenLabsTokenService.js +42 -0
- package/dist/src/services/elevenLabsTokenService.js.map +1 -0
- package/dist/src/services/voiceInputHandler.d.ts +26 -0
- package/dist/src/services/voiceInputHandler.js +209 -0
- package/dist/src/services/voiceInputHandler.js.map +1 -0
- package/dist/src/services/voiceRecordingService.d.ts +69 -0
- package/dist/src/services/voiceRecordingService.js +397 -0
- package/dist/src/services/voiceRecordingService.js.map +1 -0
- package/dist/src/ui/App.d.ts +1 -0
- package/dist/src/ui/App.js +412 -63
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/browseExtensionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/browseExtensionsCommand.js +16 -0
- package/dist/src/ui/commands/browseExtensionsCommand.js.map +1 -0
- package/dist/src/ui/commands/chatCommand.js +356 -16
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/dbCommand.d.ts +7 -0
- package/dist/src/ui/commands/dbCommand.js +37 -0
- package/dist/src/ui/commands/dbCommand.js.map +1 -0
- package/dist/src/ui/commands/docsCommand.js +1 -1
- package/dist/src/ui/commands/docsCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +3 -2
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpInvokeCommand.d.ts +16 -0
- package/dist/src/ui/commands/mcpInvokeCommand.js +263 -0
- package/dist/src/ui/commands/mcpInvokeCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.js +79 -5
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/multiAgentCommand.d.ts +7 -0
- package/dist/src/ui/commands/multiAgentCommand.js +833 -0
- package/dist/src/ui/commands/multiAgentCommand.js.map +1 -0
- package/dist/src/ui/commands/multiAgentConfigureCommand.d.ts +7 -0
- package/dist/src/ui/commands/multiAgentConfigureCommand.js +17 -0
- package/dist/src/ui/commands/multiAgentConfigureCommand.js.map +1 -0
- package/dist/src/ui/commands/quitCommand.js +71 -2
- package/dist/src/ui/commands/quitCommand.js.map +1 -1
- package/dist/src/ui/commands/releasesCommand.d.ts +7 -0
- package/dist/src/ui/commands/releasesCommand.js +16 -0
- package/dist/src/ui/commands/releasesCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/shellPermissionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/shellPermissionsCommand.js +109 -0
- package/dist/src/ui/commands/shellPermissionsCommand.js.map +1 -0
- package/dist/src/ui/commands/skillCommand.d.ts +7 -0
- package/dist/src/ui/commands/skillCommand.js +240 -0
- package/dist/src/ui/commands/skillCommand.js.map +1 -0
- package/dist/src/ui/commands/statsCommand.js +243 -1
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/tasksCommand.d.ts +7 -0
- package/dist/src/ui/commands/tasksCommand.js +535 -0
- package/dist/src/ui/commands/tasksCommand.js.map +1 -0
- package/dist/src/ui/commands/toolPermissionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/toolPermissionsCommand.js +408 -0
- package/dist/src/ui/commands/toolPermissionsCommand.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +10 -2
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/commands/voiceCommand.d.ts +7 -0
- package/dist/src/ui/commands/voiceCommand.js +525 -0
- package/dist/src/ui/commands/voiceCommand.js.map +1 -0
- package/dist/src/ui/components/AuthDialog.d.ts +5 -4
- package/dist/src/ui/components/AuthDialog.js +89 -52
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/AuthInProgress.js +3 -1
- package/dist/src/ui/components/AuthInProgress.js.map +1 -1
- package/dist/src/ui/components/ExtensionsDialog.d.ts +11 -0
- package/dist/src/ui/components/ExtensionsDialog.js +303 -0
- package/dist/src/ui/components/ExtensionsDialog.js.map +1 -0
- package/dist/src/ui/components/GenericProviderKeyPrompt.d.ts +3 -1
- package/dist/src/ui/components/GenericProviderKeyPrompt.js +17 -4
- package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/Header.js +10 -1
- package/dist/src/ui/components/Header.js.map +1 -1
- package/dist/src/ui/components/HistoryBrowserDialog.d.ts +15 -0
- package/dist/src/ui/components/HistoryBrowserDialog.js +166 -0
- package/dist/src/ui/components/HistoryBrowserDialog.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +13 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +22 -8
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.d.ts +4 -0
- package/dist/src/ui/components/LoadingIndicator.js +16 -4
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.test.js +108 -16
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/components/ModelSelectionDialog.d.ts +2 -0
- package/dist/src/ui/components/ModelSelectionDialog.js +33 -4
- package/dist/src/ui/components/ModelSelectionDialog.js.map +1 -1
- package/dist/src/ui/components/ModelSelectionDialog.test.js +41 -4
- package/dist/src/ui/components/ModelSelectionDialog.test.js.map +1 -1
- package/dist/src/ui/components/ReleaseNotesDialog.d.ts +23 -0
- package/dist/src/ui/components/ReleaseNotesDialog.js +150 -0
- package/dist/src/ui/components/ReleaseNotesDialog.js.map +1 -0
- package/dist/src/ui/components/ReleaseNotesDisplay.d.ts +18 -0
- package/dist/src/ui/components/ReleaseNotesDisplay.js +14 -0
- package/dist/src/ui/components/ReleaseNotesDisplay.js.map +1 -0
- package/dist/src/ui/components/SessionSummaryDisplay.d.ts +2 -0
- package/dist/src/ui/components/SessionSummaryDisplay.js +1 -1
- package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.d.ts +3 -1
- package/dist/src/ui/components/SettingsDialog.js +17 -7
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ShellConfirmationDialog.d.ts +2 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js +7 -3
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.d.ts +2 -0
- package/dist/src/ui/components/StatsDisplay.js +92 -7
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +6 -1
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.d.ts +3 -1
- package/dist/src/ui/components/ThemeDialog.js +5 -2
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/Tips.js +1 -4
- package/dist/src/ui/components/Tips.js.map +1 -1
- package/dist/src/ui/components/TodoListDialog.d.ts +13 -0
- package/dist/src/ui/components/TodoListDialog.js +29 -0
- package/dist/src/ui/components/TodoListDialog.js.map +1 -0
- package/dist/src/ui/components/TodoListDialog.test.d.ts +6 -0
- package/dist/src/ui/components/TodoListDialog.test.js +60 -0
- package/dist/src/ui/components/TodoListDialog.test.js.map +1 -0
- package/dist/src/ui/components/VoiceConfigDialog.d.ts +17 -0
- package/dist/src/ui/components/VoiceConfigDialog.js +47 -0
- package/dist/src/ui/components/VoiceConfigDialog.js.map +1 -0
- package/dist/src/ui/components/messages/GeminiMessage.js +4 -0
- package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
- package/dist/src/ui/components/messages/GeminiMessageContent.js +4 -0
- package/dist/src/ui/components/messages/GeminiMessageContent.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +2 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +96 -9
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +3 -3
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js +9 -12
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.d.ts +25 -0
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js +179 -0
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js.map +1 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js +57 -18
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/TextInput.d.ts +2 -1
- package/dist/src/ui/components/shared/TextInput.js +5 -2
- package/dist/src/ui/components/shared/TextInput.js.map +1 -1
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js +3 -3
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js.map +1 -1
- package/dist/src/ui/constants.d.ts +3 -3
- package/dist/src/ui/constants.js +3 -3
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
- package/dist/src/ui/contexts/SessionContext.js +24 -2
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +139 -57
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +189 -17
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAdaptiveStream.d.ts +42 -0
- package/dist/src/ui/hooks/useAdaptiveStream.js +31 -0
- package/dist/src/ui/hooks/useAdaptiveStream.js.map +1 -0
- package/dist/src/ui/hooks/useAtCompletion.js +20 -4
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -2
- package/dist/src/ui/hooks/useAuthCommand.js +99 -5
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.js +14 -10
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useDialogClose.d.ts +10 -0
- package/dist/src/ui/hooks/useDialogClose.js +25 -0
- package/dist/src/ui/hooks/useDialogClose.js.map +1 -1
- package/dist/src/ui/hooks/useDialogCloseAnimation.d.ts +22 -0
- package/dist/src/ui/hooks/useDialogCloseAnimation.js +68 -0
- package/dist/src/ui/hooks/useDialogCloseAnimation.js.map +1 -0
- package/dist/src/ui/hooks/useEncryptedStream.d.ts +22 -0
- package/dist/src/ui/hooks/useEncryptedStream.js +378 -0
- package/dist/src/ui/hooks/useEncryptedStream.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionsDialog.d.ts +10 -0
- package/dist/src/ui/hooks/useExtensionsDialog.js +21 -0
- package/dist/src/ui/hooks/useExtensionsDialog.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.js +4 -2
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +3 -2
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +27 -5
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useMultiAgentConfigCommand.d.ts +10 -0
- package/dist/src/ui/hooks/useMultiAgentConfigCommand.js +21 -0
- package/dist/src/ui/hooks/useMultiAgentConfigCommand.js.map +1 -0
- package/dist/src/ui/hooks/useReleasesDialog.d.ts +20 -0
- package/dist/src/ui/hooks/useReleasesDialog.js +214 -0
- package/dist/src/ui/hooks/useReleasesDialog.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +10 -8
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useTodoList.d.ts +17 -0
- package/dist/src/ui/hooks/useTodoList.js +51 -0
- package/dist/src/ui/hooks/useTodoList.js.map +1 -0
- package/dist/src/ui/keyMatchers.test.js +6 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/themes/blackbox-dark.js +1 -1
- package/dist/src/ui/themes/blackbox-dark.js.map +1 -1
- package/dist/src/ui/themes/blackbox-light.js +1 -1
- package/dist/src/ui/themes/blackbox-light.js.map +1 -1
- package/dist/src/ui/types.d.ts +15 -2
- package/dist/src/ui/types.js +1 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/computeStats.d.ts +25 -1
- package/dist/src/ui/utils/computeStats.js +58 -1
- package/dist/src/ui/utils/computeStats.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.js +37 -54
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/utils/backgroundUpdateCheck.d.ts +15 -0
- package/dist/src/utils/backgroundUpdateCheck.js +48 -0
- package/dist/src/utils/backgroundUpdateCheck.js.map +1 -0
- package/dist/src/utils/gitAutoDetect.d.ts +16 -0
- package/dist/src/utils/gitAutoDetect.js +45 -0
- package/dist/src/utils/gitAutoDetect.js.map +1 -0
- package/dist/src/utils/installationInfo.d.ts +1 -0
- package/dist/src/utils/installationInfo.js +24 -4
- package/dist/src/utils/installationInfo.js.map +1 -1
- package/dist/src/utils/preLaunchUpdateCheck.d.ts +17 -0
- package/dist/src/utils/preLaunchUpdateCheck.js +75 -0
- package/dist/src/utils/preLaunchUpdateCheck.js.map +1 -0
- package/dist/src/utils/version.js +12 -1
- package/dist/src/utils/version.js.map +1 -1
- package/dist/src/utils/versionStorage.d.ts +50 -0
- package/dist/src/utils/versionStorage.js +224 -0
- package/dist/src/utils/versionStorage.js.map +1 -0
- package/dist/src/validateNonInterActiveAuth.js +10 -3
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/virtual-extensions.d.ts +14 -0
- package/dist/src/virtual-extensions.js +56 -0
- package/dist/src/virtual-extensions.js.map +1 -0
- package/dist/src/zed-integration/fileSystemService.d.ts +3 -3
- package/dist/src/zed-integration/fileSystemService.js +5 -7
- package/dist/src/zed-integration/fileSystemService.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.js +62 -17
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -2
- package/dist/src/utils/handleAutoUpdate.d.ts +0 -11
- package/dist/src/utils/handleAutoUpdate.js +0 -102
- package/dist/src/utils/handleAutoUpdate.js.map +0 -1
- package/dist/src/utils/updateEventEmitter.d.ts +0 -11
- package/dist/src/utils/updateEventEmitter.js +0 -12
- package/dist/src/utils/updateEventEmitter.js.map +0 -1
- package/dist/src/zed-integration/acp.d.ts +0 -63
- package/dist/src/zed-integration/acp.js +0 -226
- package/dist/src/zed-integration/acp.js.map +0 -1
- package/dist/src/zed-integration/schema.d.ts +0 -11782
- package/dist/src/zed-integration/schema.js +0 -311
- package/dist/src/zed-integration/schema.js.map +0 -1
package/dist/src/ui/App.js
CHANGED
|
@@ -8,19 +8,23 @@ import { useCallback, useEffect, useMemo, useState, useRef } from 'react';
|
|
|
8
8
|
import { Box, measureElement, Static, Text, useStdin, useStdout, } from 'ink';
|
|
9
9
|
import { StreamingState, MessageType, ToolCallStatus, } from './types.js';
|
|
10
10
|
import { useTerminalSize } from './hooks/useTerminalSize.js';
|
|
11
|
-
import {
|
|
11
|
+
import { useAdaptiveStream } from './hooks/useAdaptiveStream.js';
|
|
12
12
|
import { useLoadingIndicator } from './hooks/useLoadingIndicator.js';
|
|
13
|
+
import { useTodoList } from './hooks/useTodoList.js';
|
|
13
14
|
import { useThemeCommand } from './hooks/useThemeCommand.js';
|
|
14
15
|
import { useAuthCommand } from './hooks/useAuthCommand.js';
|
|
16
|
+
import { useReleasesDialog } from './hooks/useReleasesDialog.js';
|
|
15
17
|
import { useBlackboxAuth } from './hooks/useBlackboxAuth.js';
|
|
16
18
|
import { useFolderTrust } from './hooks/useFolderTrust.js';
|
|
17
19
|
import { useEditorSettings } from './hooks/useEditorSettings.js';
|
|
18
20
|
import { useQuitConfirmation } from './hooks/useQuitConfirmation.js';
|
|
19
21
|
import { useWelcomeBack } from './hooks/useWelcomeBack.js';
|
|
20
22
|
import { useDialogClose } from './hooks/useDialogClose.js';
|
|
23
|
+
import { useDialogCloseAnimation } from './hooks/useDialogCloseAnimation.js';
|
|
21
24
|
import { useSlashCommandProcessor } from './hooks/slashCommandProcessor.js';
|
|
22
25
|
import { useSubagentCreateDialog } from './hooks/useSubagentCreateDialog.js';
|
|
23
26
|
import { useAgentsManagerDialog } from './hooks/useAgentsManagerDialog.js';
|
|
27
|
+
import { useMultiAgentConfigCommand } from './hooks/useMultiAgentConfigCommand.js';
|
|
24
28
|
import { useAutoAcceptIndicator } from './hooks/useAutoAcceptIndicator.js';
|
|
25
29
|
import { useMessageQueue } from './hooks/useMessageQueue.js';
|
|
26
30
|
import { useConsoleMessages } from './hooks/useConsoleMessages.js';
|
|
@@ -31,6 +35,7 @@ import { ShellModeIndicator } from './components/ShellModeIndicator.js';
|
|
|
31
35
|
import { InputPrompt } from './components/InputPrompt.js';
|
|
32
36
|
import { Footer } from './components/Footer.js';
|
|
33
37
|
import { ThemeDialog } from './components/ThemeDialog.js';
|
|
38
|
+
import { ReleaseNotesDialog } from './components/ReleaseNotesDialog.js';
|
|
34
39
|
import { AuthDialog } from './components/AuthDialog.js';
|
|
35
40
|
import { AuthInProgress } from './components/AuthInProgress.js';
|
|
36
41
|
import { BlackboxOAuthProgress } from './components/BlackboxOAuthProgress.js';
|
|
@@ -42,8 +47,10 @@ import { RadioButtonSelect } from './components/shared/RadioButtonSelect.js';
|
|
|
42
47
|
import { ModelSelectionDialog } from './components/ModelSelectionDialog.js';
|
|
43
48
|
import { ModelSwitchDialog, } from './components/ModelSwitchDialog.js';
|
|
44
49
|
import { getOpenAIAvailableModelFromEnv, getFilteredBlackboxModels, } from './models/availableModels.js';
|
|
50
|
+
import { HistoryBrowserDialog } from './components/HistoryBrowserDialog.js';
|
|
45
51
|
import { processVisionSwitchOutcome } from './hooks/useVisionAutoSwitch.js';
|
|
46
52
|
import { AgentCreationWizard, AgentsManagerDialog, } from './components/subagents/index.js';
|
|
53
|
+
import { MultiAgentConfigDialog } from './components/multiagent/MultiAgentConfigDialog.js';
|
|
47
54
|
import { Colors } from './colors.js';
|
|
48
55
|
import { loadHierarchicalGeminiMemory } from '../config/config.js';
|
|
49
56
|
import { SettingScope } from '../config/settings.js';
|
|
@@ -56,7 +63,6 @@ import { ContextSummaryDisplay } from './components/ContextSummaryDisplay.js';
|
|
|
56
63
|
import { useHistory } from './hooks/useHistoryManager.js';
|
|
57
64
|
import process from 'node:process';
|
|
58
65
|
import { ApprovalMode, getAllGeminiMdFilenames, isEditorAvailable, getErrorMessage, AuthType, logFlashFallback, FlashFallbackEvent, ideContext, isProQuotaExceededError, isGenericQuotaExceededError, UserTierId, } from '@blackbox_ai/blackbox-cli-core';
|
|
59
|
-
import { IdeIntegrationNudge } from './IdeIntegrationNudge.js';
|
|
60
66
|
import { validateAuthMethod } from '../config/auth.js';
|
|
61
67
|
import { useLogger } from './hooks/useLogger.js';
|
|
62
68
|
import { StreamingContext } from './contexts/StreamingContext.js';
|
|
@@ -79,12 +85,16 @@ import { ShowMoreLines } from './components/ShowMoreLines.js';
|
|
|
79
85
|
import { PrivacyNotice } from './privacy/PrivacyNotice.js';
|
|
80
86
|
import { useSettingsCommand } from './hooks/useSettingsCommand.js';
|
|
81
87
|
import { SettingsDialog } from './components/SettingsDialog.js';
|
|
82
|
-
import {
|
|
88
|
+
import { ExtensionsDialog } from './components/ExtensionsDialog.js';
|
|
89
|
+
import { useExtensionsDialog } from './hooks/useExtensionsDialog.js';
|
|
83
90
|
import { appEvents, AppEvent } from '../utils/events.js';
|
|
84
91
|
import { isNarrowWidth } from './utils/isNarrowWidth.js';
|
|
85
92
|
import { useWorkspaceMigration } from './hooks/useWorkspaceMigration.js';
|
|
86
93
|
import { WorkspaceMigrationDialog } from './components/WorkspaceMigrationDialog.js';
|
|
87
94
|
import { WelcomeBackDialog } from './components/WelcomeBackDialog.js';
|
|
95
|
+
import { TodoListDialog } from './components/TodoListDialog.js';
|
|
96
|
+
import { ConfigureUI } from '../commands/configure/ConfigureUI.js';
|
|
97
|
+
import { VoiceConfigDialog } from './components/VoiceConfigDialog.js';
|
|
88
98
|
// Maximum number of queued messages to display in UI to prevent performance issues
|
|
89
99
|
const MAX_DISPLAYED_QUEUED_MESSAGES = 3;
|
|
90
100
|
function isToolExecuting(pendingHistoryItems) {
|
|
@@ -100,26 +110,36 @@ export const AppWrapper = (props) => {
|
|
|
100
110
|
const nodeMajorVersion = parseInt(process.versions.node.split('.')[0], 10);
|
|
101
111
|
return (_jsx(KeypressProvider, { kittyProtocolEnabled: kittyProtocolStatus.enabled, pasteWorkaround: process.platform === 'win32' || nodeMajorVersion < 20, config: props.config, debugKeystrokeLogging: props.settings.merged.general?.debugKeystrokeLogging, children: _jsx(SessionStatsProvider, { children: _jsx(VimModeProvider, { settings: props.settings, children: _jsx(App, { ...props }) }) }) }));
|
|
102
112
|
};
|
|
103
|
-
|
|
113
|
+
// Wrapper component to add animation to ShellConfirmationDialog
|
|
114
|
+
const ShellConfirmationDialogWithAnimation = ({ request }) => {
|
|
115
|
+
// Animation hook for shell confirmation dialog
|
|
116
|
+
const shellDialogAnimation = useDialogCloseAnimation(() => {
|
|
117
|
+
// Close handler - will be called after animation
|
|
118
|
+
// The original onConfirm already handles closing via setShellConfirmationRequest(null)
|
|
119
|
+
});
|
|
120
|
+
// Wrap the onConfirm to trigger animation before calling original
|
|
121
|
+
const wrappedRequest = {
|
|
122
|
+
...request,
|
|
123
|
+
onConfirm: (outcome, approvedCommands) => {
|
|
124
|
+
// Start animation first
|
|
125
|
+
shellDialogAnimation.startClosing();
|
|
126
|
+
// Then call original handler (which closes the dialog)
|
|
127
|
+
request.onConfirm(outcome, approvedCommands);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
return (_jsx(ShellConfirmationDialog, { request: wrappedRequest, isClosing: shellDialogAnimation.isClosing }));
|
|
131
|
+
};
|
|
132
|
+
const App = ({ config, settings, startupWarnings = [], version, initialSlashCommand, }) => {
|
|
104
133
|
const isFocused = useFocus();
|
|
105
134
|
useBracketedPaste();
|
|
106
|
-
const [updateInfo,
|
|
135
|
+
const [updateInfo, _setUpdateInfo] = useState(null);
|
|
107
136
|
const { stdout } = useStdout();
|
|
108
137
|
const nightly = version.includes('nightly');
|
|
109
138
|
const { history, addItem, clearItems, loadHistory } = useHistory();
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}, [config]);
|
|
115
|
-
const shouldShowIdePrompt = currentIDE &&
|
|
116
|
-
!config.getIdeMode() &&
|
|
117
|
-
!settings.merged.ide?.hasSeenNudge &&
|
|
118
|
-
!idePromptAnswered;
|
|
119
|
-
useEffect(() => {
|
|
120
|
-
const cleanup = setUpdateHandler(addItem, setUpdateInfo);
|
|
121
|
-
return cleanup;
|
|
122
|
-
}, [addItem]);
|
|
139
|
+
// const currentIDE = config.getIdeClient().getCurrentIde();
|
|
140
|
+
// useEffect(() => {
|
|
141
|
+
// registerCleanup(() => config.getIdeClient().disconnect());
|
|
142
|
+
// }, [config]);
|
|
123
143
|
const { consoleMessages, handleNewMessage, clearConsoleMessages: clearConsoleMessagesState, } = useConsoleMessages();
|
|
124
144
|
useEffect(() => {
|
|
125
145
|
const consolePatcher = new ConsolePatcher({
|
|
@@ -160,6 +180,10 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
160
180
|
const [ideContextState, setIdeContextState] = useState();
|
|
161
181
|
const [showEscapePrompt, setShowEscapePrompt] = useState(false);
|
|
162
182
|
const [isProcessing, setIsProcessing] = useState(false);
|
|
183
|
+
const [showTodoListDialog, setShowTodoListDialog] = useState(false);
|
|
184
|
+
const [isVoiceConfigDialogOpen, setIsVoiceConfigDialogOpen] = useState(false);
|
|
185
|
+
// Releases dialog hook
|
|
186
|
+
const { isReleasesDialogOpen, openReleasesDialog, closeReleasesDialog, releasesVersions, isReleasesLoading, } = useReleasesDialog();
|
|
163
187
|
const { showWorkspaceMigrationDialog, workspaceExtensions, onWorkspaceMigrationDialogOpen, onWorkspaceMigrationDialogClose, } = useWorkspaceMigration(settings);
|
|
164
188
|
// Model selection dialog states
|
|
165
189
|
const [isModelSelectionDialogOpen, setIsModelSelectionDialogOpen] = useState(false);
|
|
@@ -193,6 +217,74 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
193
217
|
const openPrivacyNotice = useCallback(() => {
|
|
194
218
|
setShowPrivacyNotice(true);
|
|
195
219
|
}, []);
|
|
220
|
+
const [isDbConfigureDialogOpen, setIsDbConfigureDialogOpen] = useState(false);
|
|
221
|
+
const openDbConfigureDialog = useCallback(() => {
|
|
222
|
+
setIsDbConfigureDialogOpen(true);
|
|
223
|
+
}, []);
|
|
224
|
+
const closeDbConfigureDialog = useCallback(() => {
|
|
225
|
+
setIsDbConfigureDialogOpen(false);
|
|
226
|
+
}, []);
|
|
227
|
+
// Cancel DB configure - closes dialog AND resolves the pending promise with null
|
|
228
|
+
const cancelDbConfigure = useCallback(() => {
|
|
229
|
+
setIsDbConfigureDialogOpen(false);
|
|
230
|
+
// Resolve the pending promise with null to signal cancellation
|
|
231
|
+
dbConfigureRequestRef.current?.resolve(null);
|
|
232
|
+
dbConfigureRequestRef.current = null;
|
|
233
|
+
}, []);
|
|
234
|
+
const inferDbTypeFromUri = useCallback((connectionUri) => {
|
|
235
|
+
const trimmed = connectionUri.trim();
|
|
236
|
+
if (!trimmed)
|
|
237
|
+
return undefined;
|
|
238
|
+
try {
|
|
239
|
+
const url = new URL(trimmed);
|
|
240
|
+
const protocol = url.protocol.replace(':', '').toLowerCase();
|
|
241
|
+
if (protocol === 'postgres' || protocol === 'postgresql')
|
|
242
|
+
return 'postgres';
|
|
243
|
+
if (protocol === 'mysql')
|
|
244
|
+
return 'mysql';
|
|
245
|
+
if (protocol === 'mongodb' || protocol === 'mongodb+srv')
|
|
246
|
+
return 'mongodb';
|
|
247
|
+
if (protocol === 'redis' || protocol === 'rediss')
|
|
248
|
+
return 'redis';
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
}, []);
|
|
255
|
+
const dbConfigureRequestRef = useRef(null);
|
|
256
|
+
const openDbConfigureDialogAsync = useCallback(() => {
|
|
257
|
+
if (dbConfigureRequestRef.current) {
|
|
258
|
+
return dbConfigureRequestRef.current.promise;
|
|
259
|
+
}
|
|
260
|
+
let resolve;
|
|
261
|
+
const promise = new Promise((res) => {
|
|
262
|
+
resolve = res;
|
|
263
|
+
});
|
|
264
|
+
dbConfigureRequestRef.current = { promise, resolve };
|
|
265
|
+
openDbConfigureDialog();
|
|
266
|
+
return promise;
|
|
267
|
+
}, [openDbConfigureDialog]);
|
|
268
|
+
const completeDbConfigure = useCallback(() => {
|
|
269
|
+
closeDbConfigureDialog();
|
|
270
|
+
const connectionUri = (process.env['DB_CONNECTION_URI'] || '').trim();
|
|
271
|
+
const dbType = connectionUri ? inferDbTypeFromUri(connectionUri) : undefined;
|
|
272
|
+
const result = connectionUri && dbType ? { dbType, connectionUri } : null;
|
|
273
|
+
dbConfigureRequestRef.current?.resolve(result);
|
|
274
|
+
dbConfigureRequestRef.current = null;
|
|
275
|
+
addItem({
|
|
276
|
+
type: MessageType.INFO,
|
|
277
|
+
text: '✓ DB connection saved in env variable DB_CONNECTION_URI and not passed to the agent directly.',
|
|
278
|
+
}, Date.now());
|
|
279
|
+
}, [addItem, closeDbConfigureDialog, inferDbTypeFromUri]);
|
|
280
|
+
useEffect(() => {
|
|
281
|
+
config.setInteractiveUiActions({
|
|
282
|
+
sqlDbConfigure: openDbConfigureDialogAsync,
|
|
283
|
+
});
|
|
284
|
+
return () => {
|
|
285
|
+
config.setInteractiveUiActions(undefined);
|
|
286
|
+
};
|
|
287
|
+
}, [config, openDbConfigureDialogAsync]);
|
|
196
288
|
const handleEscapePromptChange = useCallback((showPrompt) => {
|
|
197
289
|
setShowEscapePrompt(showPrompt);
|
|
198
290
|
}, []);
|
|
@@ -200,18 +292,87 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
200
292
|
const errorCount = useMemo(() => consoleMessages
|
|
201
293
|
.filter((msg) => msg.type === 'error')
|
|
202
294
|
.reduce((total, msg) => total + msg.count, 0), [consoleMessages]);
|
|
203
|
-
const { isThemeDialogOpen, openThemeDialog, handleThemeSelect, handleThemeHighlight, } = useThemeCommand(settings, setThemeError, addItem);
|
|
204
|
-
|
|
295
|
+
const { isThemeDialogOpen, openThemeDialog, handleThemeSelect: handleThemeSelectOriginal, handleThemeHighlight, } = useThemeCommand(settings, setThemeError, addItem);
|
|
296
|
+
// Animation hook for theme dialog
|
|
297
|
+
const themeDialogAnimation = useDialogCloseAnimation(() => {
|
|
298
|
+
// Close handler - will be called after animation
|
|
299
|
+
// For ESC, we call the original with undefined
|
|
300
|
+
// For selections, the work is already done, so we just need to ensure dialog closes
|
|
301
|
+
// But the original handler already closes, so this is mainly for ESC case
|
|
302
|
+
});
|
|
303
|
+
// Wrapped handler that triggers animation before closing
|
|
304
|
+
const handleThemeSelect = useCallback((themeName, scope) => {
|
|
305
|
+
// Start animation first
|
|
306
|
+
themeDialogAnimation.startClosing();
|
|
307
|
+
// Then do the work (original handler does work and closes)
|
|
308
|
+
// The close happens immediately, but isClosing state will be true briefly
|
|
309
|
+
// showing the dimmed appearance during the transition
|
|
310
|
+
handleThemeSelectOriginal(themeName, scope);
|
|
311
|
+
}, [handleThemeSelectOriginal, themeDialogAnimation]);
|
|
312
|
+
const { isSettingsDialogOpen, openSettingsDialog, closeSettingsDialog: closeSettingsDialogOriginal } = useSettingsCommand();
|
|
313
|
+
const { isExtensionsDialogOpen, openExtensionsDialog, closeExtensionsDialog: closeExtensionsDialogOriginal } = useExtensionsDialog();
|
|
314
|
+
// Animation hook for settings dialog
|
|
315
|
+
const settingsDialogAnimation = useDialogCloseAnimation(() => {
|
|
316
|
+
closeSettingsDialogOriginal();
|
|
317
|
+
});
|
|
318
|
+
// Animation hook for extensions dialog
|
|
319
|
+
const extensionsDialogAnimation = useDialogCloseAnimation(() => {
|
|
320
|
+
closeExtensionsDialogOriginal();
|
|
321
|
+
});
|
|
322
|
+
// Wrapped handler that triggers animation before closing
|
|
323
|
+
const closeSettingsDialog = useCallback(() => {
|
|
324
|
+
settingsDialogAnimation.startClosing();
|
|
325
|
+
}, [settingsDialogAnimation]);
|
|
326
|
+
const closeExtensionsDialog = useCallback(() => {
|
|
327
|
+
extensionsDialogAnimation.startClosing();
|
|
328
|
+
}, [extensionsDialogAnimation]);
|
|
329
|
+
// Voice config dialog handlers
|
|
330
|
+
const openVoiceConfigDialog = useCallback(() => {
|
|
331
|
+
setIsVoiceConfigDialogOpen(true);
|
|
332
|
+
}, []);
|
|
333
|
+
const closeVoiceConfigDialogOriginal = useCallback(() => {
|
|
334
|
+
setIsVoiceConfigDialogOpen(false);
|
|
335
|
+
}, []);
|
|
336
|
+
// Animation hook for voice config dialog
|
|
337
|
+
const voiceConfigDialogAnimation = useDialogCloseAnimation(() => {
|
|
338
|
+
closeVoiceConfigDialogOriginal();
|
|
339
|
+
});
|
|
340
|
+
const closeVoiceConfigDialog = useCallback(() => {
|
|
341
|
+
voiceConfigDialogAnimation.startClosing();
|
|
342
|
+
}, [voiceConfigDialogAnimation]);
|
|
205
343
|
const { isSubagentCreateDialogOpen, openSubagentCreateDialog, closeSubagentCreateDialog, } = useSubagentCreateDialog();
|
|
206
344
|
const { isAgentsManagerDialogOpen, openAgentsManagerDialog, closeAgentsManagerDialog, } = useAgentsManagerDialog();
|
|
345
|
+
const { isMultiAgentConfigDialogOpen, openMultiAgentConfigDialog, closeMultiAgentConfigDialog, } = useMultiAgentConfigCommand();
|
|
207
346
|
const { isFolderTrustDialogOpen, handleFolderTrustSelect, isRestarting } = useFolderTrust(settings, setIsTrustedFolder);
|
|
208
347
|
const { showQuitConfirmation, handleQuitConfirmationSelect } = useQuitConfirmation();
|
|
209
|
-
const
|
|
348
|
+
const [isHistoryBrowserOpen, setIsHistoryBrowserOpen] = useState(false);
|
|
349
|
+
const openHistoryBrowser = useCallback(() => {
|
|
350
|
+
setIsHistoryBrowserOpen(true);
|
|
351
|
+
}, []);
|
|
352
|
+
// Create a ref to store reloadCommands that will be set later
|
|
353
|
+
const reloadCommandsRef = useRef(null);
|
|
354
|
+
const { isAuthDialogOpen, openAuthDialog, handleAuthSelect: handleAuthSelectOriginal, isAuthenticating, cancelAuthentication, } = useAuthCommand(settings, setAuthError, config, () => {
|
|
355
|
+
if (reloadCommandsRef.current) {
|
|
356
|
+
reloadCommandsRef.current();
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
// Animation hook for auth dialog
|
|
360
|
+
const authDialogAnimation = useDialogCloseAnimation(() => {
|
|
361
|
+
// Close handler - for ESC case
|
|
362
|
+
});
|
|
363
|
+
// Wrapped handler that triggers animation before closing
|
|
364
|
+
const handleAuthSelect = useCallback(async (authMethod, scope, providerName) => {
|
|
365
|
+
// Start animation first
|
|
366
|
+
authDialogAnimation.startClosing();
|
|
367
|
+
// Then do the work (original handler does work and closes)
|
|
368
|
+
void handleAuthSelectOriginal(authMethod, scope, providerName);
|
|
369
|
+
}, [handleAuthSelectOriginal, authDialogAnimation]);
|
|
210
370
|
const { isBlackboxAuthenticating, deviceAuth, isBlackboxAuth, cancelBlackboxAuth, authStatus, authMessage, } = useBlackboxAuth(settings, isAuthenticating);
|
|
211
371
|
useEffect(() => {
|
|
212
372
|
if (settings.merged.security?.auth?.selectedType &&
|
|
213
373
|
!settings.merged.security?.auth?.useExternal) {
|
|
214
|
-
const
|
|
374
|
+
const selectedProvider = settings.merged.security?.auth?.selectedProvider;
|
|
375
|
+
const error = validateAuthMethod(settings.merged.security.auth.selectedType, selectedProvider);
|
|
215
376
|
if (error) {
|
|
216
377
|
setAuthError(error);
|
|
217
378
|
openAuthDialog();
|
|
@@ -220,6 +381,7 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
220
381
|
}, [
|
|
221
382
|
settings.merged.security?.auth?.selectedType,
|
|
222
383
|
settings.merged.security?.auth?.useExternal,
|
|
384
|
+
settings.merged.security?.auth?.selectedProvider,
|
|
223
385
|
openAuthDialog,
|
|
224
386
|
setAuthError,
|
|
225
387
|
]);
|
|
@@ -233,11 +395,10 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
233
395
|
// Handle Blackbox OAuth timeout
|
|
234
396
|
useEffect(() => {
|
|
235
397
|
if (isBlackboxAuth && authStatus === 'timeout') {
|
|
236
|
-
|
|
237
|
-
|
|
398
|
+
// Don't set error or open dialog - just cancel and return to agent
|
|
399
|
+
// The user will see they're back at the agent prompt
|
|
238
400
|
cancelBlackboxAuth();
|
|
239
401
|
cancelAuthentication();
|
|
240
|
-
openAuthDialog();
|
|
241
402
|
}
|
|
242
403
|
}, [
|
|
243
404
|
isBlackboxAuth,
|
|
@@ -245,8 +406,6 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
245
406
|
authMessage,
|
|
246
407
|
cancelBlackboxAuth,
|
|
247
408
|
cancelAuthentication,
|
|
248
|
-
openAuthDialog,
|
|
249
|
-
setAuthError,
|
|
250
409
|
]);
|
|
251
410
|
const { isEditorDialogOpen, openEditorDialog, handleEditorSelect, exitEditorDialog, } = useEditorSettings(settings, setEditorError, addItem);
|
|
252
411
|
const toggleCorgiMode = useCallback(() => {
|
|
@@ -417,11 +576,16 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
417
576
|
const handleModelSelectionClose = useCallback(() => {
|
|
418
577
|
setIsModelSelectionDialogOpen(false);
|
|
419
578
|
}, []);
|
|
579
|
+
// Animation hook for model selection dialog
|
|
580
|
+
const modelDialogAnimation = useDialogCloseAnimation(() => {
|
|
581
|
+
setIsModelSelectionDialogOpen(false);
|
|
582
|
+
});
|
|
420
583
|
const handleModelSelect = useCallback(async (modelId) => {
|
|
421
584
|
try {
|
|
422
585
|
await config.setModel(modelId);
|
|
423
586
|
setCurrentModel(modelId);
|
|
424
|
-
|
|
587
|
+
// Start animation before closing
|
|
588
|
+
modelDialogAnimation.startClosing();
|
|
425
589
|
addItem({
|
|
426
590
|
type: MessageType.INFO,
|
|
427
591
|
text: `Switched model to \`${modelId}\` for this session.`,
|
|
@@ -434,8 +598,9 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
434
598
|
text: `Failed to switch to model \`${modelId}\`. Please try again.`,
|
|
435
599
|
}, Date.now());
|
|
436
600
|
}
|
|
437
|
-
}, [config, setCurrentModel, addItem]);
|
|
438
|
-
const
|
|
601
|
+
}, [config, setCurrentModel, addItem, modelDialogAnimation]);
|
|
602
|
+
const [availableModelsForDialog, setAvailableModelsForDialog] = useState([]);
|
|
603
|
+
const getAvailableModelsForCurrentAuth = useCallback(async () => {
|
|
439
604
|
const contentGeneratorConfig = config.getContentGeneratorConfig();
|
|
440
605
|
if (!contentGeneratorConfig)
|
|
441
606
|
return [];
|
|
@@ -443,17 +608,69 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
443
608
|
switch (contentGeneratorConfig.authType) {
|
|
444
609
|
case AuthType.BLACKBOX_OAUTH:
|
|
445
610
|
return getFilteredBlackboxModels(visionModelPreviewEnabled);
|
|
446
|
-
case AuthType.USE_OPENAI:
|
|
447
|
-
|
|
448
|
-
|
|
611
|
+
case AuthType.USE_OPENAI:
|
|
612
|
+
case AuthType.USE_BLACKBOX_API: {
|
|
613
|
+
const apiKey = contentGeneratorConfig.apiKey;
|
|
614
|
+
if (!apiKey) {
|
|
615
|
+
if (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API) {
|
|
616
|
+
return [];
|
|
617
|
+
}
|
|
618
|
+
const openAIModel = getOpenAIAvailableModelFromEnv();
|
|
619
|
+
return openAIModel ? [openAIModel] : [];
|
|
620
|
+
}
|
|
621
|
+
try {
|
|
622
|
+
// Import fetchModelsForProvider dynamically
|
|
623
|
+
const { fetchModelsForProvider } = await import('../config/modelFetcher.js');
|
|
624
|
+
// IMPORTANT: Get provider name from settings - this determines which provider's models to show
|
|
625
|
+
// The /model command should ONLY show models from the currently configured provider
|
|
626
|
+
// To switch providers, users must use /configure command
|
|
627
|
+
const providerName = settings.merged.security?.auth?.selectedProvider ||
|
|
628
|
+
(contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API ? 'blackbox' : 'openai');
|
|
629
|
+
// Get baseUrl from config
|
|
630
|
+
const baseUrl = contentGeneratorConfig.baseUrl || 'https://api.openai.com';
|
|
631
|
+
// Fetch models using the unified function - this will only return models from the active provider
|
|
632
|
+
const modelIds = await fetchModelsForProvider(providerName, apiKey, baseUrl);
|
|
633
|
+
if (modelIds.length === 0) {
|
|
634
|
+
if (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API) {
|
|
635
|
+
return [];
|
|
636
|
+
}
|
|
637
|
+
const openAIModel = getOpenAIAvailableModelFromEnv();
|
|
638
|
+
return openAIModel ? [openAIModel] : [];
|
|
639
|
+
}
|
|
640
|
+
// Convert model IDs to AvailableModel format
|
|
641
|
+
return modelIds.map((id) => ({
|
|
642
|
+
id,
|
|
643
|
+
label: id,
|
|
644
|
+
}));
|
|
645
|
+
}
|
|
646
|
+
catch (error) {
|
|
647
|
+
console.warn('Failed to fetch models:', error);
|
|
648
|
+
if (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API) {
|
|
649
|
+
return [];
|
|
650
|
+
}
|
|
651
|
+
const openAIModel = getOpenAIAvailableModelFromEnv();
|
|
652
|
+
return openAIModel ? [openAIModel] : [];
|
|
653
|
+
}
|
|
449
654
|
}
|
|
450
655
|
default:
|
|
451
656
|
return [];
|
|
452
657
|
}
|
|
453
|
-
}, [config, settings.merged.experimental?.visionModelPreview]);
|
|
658
|
+
}, [config, settings.merged.experimental?.visionModelPreview, settings.merged.security?.auth?.selectedProvider]);
|
|
659
|
+
// Fetch models when dialog opens
|
|
660
|
+
useEffect(() => {
|
|
661
|
+
if (isModelSelectionDialogOpen) {
|
|
662
|
+
getAvailableModelsForCurrentAuth().then(setAvailableModelsForDialog);
|
|
663
|
+
}
|
|
664
|
+
}, [isModelSelectionDialogOpen, getAvailableModelsForCurrentAuth]);
|
|
454
665
|
// Core hooks and processors
|
|
455
666
|
const { vimEnabled: vimModeEnabled, vimMode, toggleVimEnabled, } = useVimMode();
|
|
456
|
-
const { handleSlashCommand, slashCommands, pendingHistoryItems: pendingSlashCommandHistoryItems, commandContext, shellConfirmationRequest, confirmationRequest, quitConfirmationRequest, } = useSlashCommandProcessor(config, settings, addItem, clearItems, loadHistory, refreshStatic, setDebugMessage, openThemeDialog, openAuthDialog, openEditorDialog, toggleCorgiMode, setQuittingMessages, openPrivacyNotice, openSettingsDialog, handleModelSelectionOpen, openSubagentCreateDialog, openAgentsManagerDialog, toggleVimEnabled, setIsProcessing, setGeminiMdFileCount, showQuitConfirmation);
|
|
667
|
+
const { handleSlashCommand, slashCommands, pendingHistoryItems: pendingSlashCommandHistoryItems, commandContext, shellConfirmationRequest, confirmationRequest, quitConfirmationRequest, } = useSlashCommandProcessor(config, settings, addItem, clearItems, loadHistory, refreshStatic, setDebugMessage, openThemeDialog, openAuthDialog, openEditorDialog, toggleCorgiMode, setQuittingMessages, openPrivacyNotice, openSettingsDialog, openExtensionsDialog, handleModelSelectionOpen, openSubagentCreateDialog, openAgentsManagerDialog, openMultiAgentConfigDialog, openHistoryBrowser, openDbConfigureDialog, toggleVimEnabled, setIsProcessing, setGeminiMdFileCount, showQuitConfirmation, openVoiceConfigDialog, openReleasesDialog);
|
|
668
|
+
// Set the reloadCommands ref when commandContext is available
|
|
669
|
+
useEffect(() => {
|
|
670
|
+
if (commandContext?.ui?.reloadCommands) {
|
|
671
|
+
reloadCommandsRef.current = commandContext.ui.reloadCommands;
|
|
672
|
+
}
|
|
673
|
+
}, [commandContext]);
|
|
457
674
|
const buffer = useTextBuffer({
|
|
458
675
|
initialText: '',
|
|
459
676
|
viewport: { height: 10, width: inputWidth },
|
|
@@ -465,11 +682,37 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
465
682
|
const [userMessages, setUserMessages] = useState([]);
|
|
466
683
|
// Stable reference for cancel handler to avoid circular dependency
|
|
467
684
|
const cancelHandlerRef = useRef(() => { });
|
|
468
|
-
const { streamingState, submitQuery, initError, pendingHistoryItems: pendingGeminiHistoryItems, thought, cancelOngoingRequest, } =
|
|
685
|
+
const { streamingState, submitQuery, initError, pendingHistoryItems: pendingGeminiHistoryItems, thought, cancelOngoingRequest, isEncryptedMode: _isEncryptedMode, } = useAdaptiveStream(config, history, addItem, setDebugMessage, () => cancelHandlerRef.current(), {
|
|
686
|
+
handleSlashCommand,
|
|
687
|
+
shellModeActive,
|
|
688
|
+
getPreferredEditor,
|
|
689
|
+
onAuthError,
|
|
690
|
+
performMemoryRefresh,
|
|
691
|
+
modelSwitchedFromQuotaError,
|
|
692
|
+
setModelSwitchedFromQuotaError,
|
|
693
|
+
onEditorClose: refreshStatic,
|
|
694
|
+
visionModelPreviewEnabled: settings.merged.experimental?.visionModelPreview ?? true,
|
|
695
|
+
onVisionSwitchRequired: handleVisionSwitchRequired,
|
|
696
|
+
});
|
|
469
697
|
const pendingHistoryItems = useMemo(() => [...pendingSlashCommandHistoryItems, ...pendingGeminiHistoryItems].map((item, index) => ({
|
|
470
698
|
...item,
|
|
471
699
|
id: index,
|
|
472
700
|
})), [pendingSlashCommandHistoryItems, pendingGeminiHistoryItems]);
|
|
701
|
+
// Callback for when voice config is completed successfully
|
|
702
|
+
// Placed here after submitQuery is defined
|
|
703
|
+
const handleVoiceConfigComplete = useCallback(() => {
|
|
704
|
+
// Always auto-start recording after config is saved
|
|
705
|
+
closeVoiceConfigDialog();
|
|
706
|
+
// Start voice recording immediately after dialog closes
|
|
707
|
+
// Small delay only for dialog animation to complete smoothly
|
|
708
|
+
setTimeout(async () => {
|
|
709
|
+
const result = await handleSlashCommand('/voice record');
|
|
710
|
+
// If the voice command returns a prompt to submit, submit it to the model
|
|
711
|
+
if (result && result.type === 'submit_prompt') {
|
|
712
|
+
submitQuery(result.content);
|
|
713
|
+
}
|
|
714
|
+
}, 150); // Minimal delay for smooth animation transition
|
|
715
|
+
}, [closeVoiceConfigDialog, handleSlashCommand, submitQuery]);
|
|
473
716
|
// Welcome back functionality
|
|
474
717
|
const { welcomeBackInfo, showWelcomeBackDialog, welcomeBackChoice, handleWelcomeBackSelection, handleWelcomeBackClose, } = useWelcomeBack(config, submitQuery, buffer, settings.merged);
|
|
475
718
|
// Dialog close functionality
|
|
@@ -483,12 +726,22 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
483
726
|
exitEditorDialog,
|
|
484
727
|
isSettingsDialogOpen,
|
|
485
728
|
closeSettingsDialog,
|
|
729
|
+
isExtensionsDialogOpen,
|
|
730
|
+
closeExtensionsDialog,
|
|
731
|
+
isVoiceConfigDialogOpen,
|
|
732
|
+
closeVoiceConfigDialog,
|
|
733
|
+
isReleasesDialogOpen,
|
|
734
|
+
closeReleasesDialog,
|
|
486
735
|
isFolderTrustDialogOpen,
|
|
487
736
|
showPrivacyNotice,
|
|
488
737
|
setShowPrivacyNotice,
|
|
489
738
|
showWelcomeBackDialog,
|
|
490
739
|
handleWelcomeBackClose,
|
|
491
740
|
quitConfirmationRequest,
|
|
741
|
+
showTodoListDialog,
|
|
742
|
+
setShowTodoListDialog,
|
|
743
|
+
isDbConfigureDialogOpen,
|
|
744
|
+
closeDbConfigureDialog: cancelDbConfigure,
|
|
492
745
|
});
|
|
493
746
|
// Message queue for handling input during streaming
|
|
494
747
|
const { messageQueue, addMessage, clearQueue, getQueuedMessagesText } = useMessageQueue({
|
|
@@ -523,23 +776,9 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
523
776
|
const handleFinalSubmit = useCallback((submittedValue) => {
|
|
524
777
|
addMessage(submittedValue);
|
|
525
778
|
}, [addMessage]);
|
|
526
|
-
const handleIdePromptComplete = useCallback((result) => {
|
|
527
|
-
if (result.userSelection === 'yes') {
|
|
528
|
-
if (result.isExtensionPreInstalled) {
|
|
529
|
-
handleSlashCommand('/ide enable');
|
|
530
|
-
}
|
|
531
|
-
else {
|
|
532
|
-
handleSlashCommand('/ide install');
|
|
533
|
-
}
|
|
534
|
-
settings.setValue(SettingScope.User, 'hasSeenIdeIntegrationNudge', true);
|
|
535
|
-
}
|
|
536
|
-
else if (result.userSelection === 'dismiss') {
|
|
537
|
-
settings.setValue(SettingScope.User, 'hasSeenIdeIntegrationNudge', true);
|
|
538
|
-
}
|
|
539
|
-
setIdePromptAnswered(true);
|
|
540
|
-
}, [handleSlashCommand, settings]);
|
|
541
779
|
const { handleInput: vimHandleInput } = useVim(buffer, handleFinalSubmit);
|
|
542
|
-
const {
|
|
780
|
+
const { todos, currentTodo, nextTodo } = useTodoList(config.getSessionId());
|
|
781
|
+
const { elapsedTime, currentLoadingPhrase } = useLoadingIndicator(streamingState, currentTodo?.content || null);
|
|
543
782
|
const showAutoAcceptIndicator = useAutoAcceptIndicator({ config, addItem });
|
|
544
783
|
const handleExit = useCallback((pressedOnce, setPressedOnce, timerRef) => {
|
|
545
784
|
// Fast double-press: Direct quit (preserve user habit)
|
|
@@ -594,6 +833,9 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
594
833
|
if (keyMatchers[Command.SHOW_ERROR_DETAILS](key)) {
|
|
595
834
|
setShowErrorDetails((prev) => !prev);
|
|
596
835
|
}
|
|
836
|
+
else if (keyMatchers[Command.SHOW_TODO_LIST](key)) {
|
|
837
|
+
setShowTodoListDialog((prev) => !prev);
|
|
838
|
+
}
|
|
597
839
|
else if (keyMatchers[Command.TOGGLE_TOOL_DESCRIPTIONS](key)) {
|
|
598
840
|
const newValue = !showToolDescriptions;
|
|
599
841
|
setShowToolDescriptions(newValue);
|
|
@@ -773,6 +1015,37 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
773
1015
|
isModelSelectionDialogOpen,
|
|
774
1016
|
isVisionSwitchDialogOpen,
|
|
775
1017
|
]);
|
|
1018
|
+
const initialSlashCommandSubmitted = useRef(false);
|
|
1019
|
+
useEffect(() => {
|
|
1020
|
+
if (initialSlashCommand &&
|
|
1021
|
+
!initialSlashCommandSubmitted.current &&
|
|
1022
|
+
!isAuthenticating &&
|
|
1023
|
+
!isAuthDialogOpen &&
|
|
1024
|
+
!isThemeDialogOpen &&
|
|
1025
|
+
!isEditorDialogOpen &&
|
|
1026
|
+
!isModelSelectionDialogOpen &&
|
|
1027
|
+
!isVisionSwitchDialogOpen &&
|
|
1028
|
+
!isSubagentCreateDialogOpen &&
|
|
1029
|
+
!showPrivacyNotice &&
|
|
1030
|
+
!showWelcomeBackDialog &&
|
|
1031
|
+
welcomeBackChoice !== 'restart') {
|
|
1032
|
+
handleSlashCommand(initialSlashCommand);
|
|
1033
|
+
initialSlashCommandSubmitted.current = true;
|
|
1034
|
+
}
|
|
1035
|
+
}, [
|
|
1036
|
+
initialSlashCommand,
|
|
1037
|
+
handleSlashCommand,
|
|
1038
|
+
isAuthenticating,
|
|
1039
|
+
isAuthDialogOpen,
|
|
1040
|
+
isThemeDialogOpen,
|
|
1041
|
+
isEditorDialogOpen,
|
|
1042
|
+
isSubagentCreateDialogOpen,
|
|
1043
|
+
showPrivacyNotice,
|
|
1044
|
+
showWelcomeBackDialog,
|
|
1045
|
+
welcomeBackChoice,
|
|
1046
|
+
isModelSelectionDialogOpen,
|
|
1047
|
+
isVisionSwitchDialogOpen,
|
|
1048
|
+
]);
|
|
776
1049
|
if (quittingMessages) {
|
|
777
1050
|
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: quittingMessages.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: terminalWidth, item: item, isPending: false, config: config }, item.id))) }));
|
|
778
1051
|
}
|
|
@@ -787,7 +1060,7 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
787
1060
|
return (_jsx(StreamingContext.Provider, { value: streamingState, children: _jsxs(Box, { flexDirection: "column", width: "90%", children: [_jsx(Static, { items: [
|
|
788
1061
|
_jsxs(Box, { flexDirection: "column", children: [!(settings.merged.ui?.hideBanner || config.getScreenReader()) && _jsx(Header, { version: version, nightly: nightly }), !(settings.merged.ui?.hideTips || config.getScreenReader()) && (_jsx(Tips, { config: config }))] }, "header"),
|
|
789
1062
|
...history.map((h) => (_jsx(HistoryItemDisplay, { terminalWidth: mainAreaWidth, availableTerminalHeight: staticAreaMaxItemHeight, item: h, isPending: false, config: config, commands: slashCommands }, h.id))),
|
|
790
|
-
], children: (item) => item }, staticKey), _jsx(OverflowProvider, { children: _jsxs(Box, { ref: pendingHistoryItemRef, flexDirection: "column", children: [pendingHistoryItems.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: mainAreaWidth, item: item, isPending: true, config: config, isFocused: !isEditorDialogOpen }, item.id))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.
|
|
1063
|
+
], children: (item) => item }, staticKey), _jsx(OverflowProvider, { children: _jsxs(Box, { ref: pendingHistoryItemRef, flexDirection: "column", children: [pendingHistoryItems.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: mainAreaWidth, item: item, isPending: true, config: config, isFocused: !isEditorDialogOpen }, item.id))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.Gray, paddingX: 1, marginY: 1, flexDirection: "column", children: startupWarnings.map((warning, index) => (_jsx(Text, { color: Colors.Gray, children: warning }, index))) })), showWelcomeBackDialog && welcomeBackInfo?.hasHistory && (_jsx(WelcomeBackDialog, { welcomeBackInfo: welcomeBackInfo, onSelect: handleWelcomeBackSelection, onClose: handleWelcomeBackClose })), showWorkspaceMigrationDialog ? (_jsx(WorkspaceMigrationDialog, { workspaceExtensions: workspaceExtensions, onOpen: onWorkspaceMigrationDialogOpen, onClose: onWorkspaceMigrationDialogClose })) : isFolderTrustDialogOpen ? (_jsx(FolderTrustDialog, { onSelect: handleFolderTrustSelect, isRestarting: isRestarting })) : quitConfirmationRequest ? (_jsx(QuitConfirmationDialog, { onSelect: (choice) => {
|
|
791
1064
|
const result = handleQuitConfirmationSelect(choice);
|
|
792
1065
|
if (result?.shouldQuit) {
|
|
793
1066
|
quitConfirmationRequest.onConfirm(true, result.action);
|
|
@@ -795,35 +1068,111 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
|
|
|
795
1068
|
else {
|
|
796
1069
|
quitConfirmationRequest.onConfirm(false);
|
|
797
1070
|
}
|
|
798
|
-
} })) : shellConfirmationRequest ? (_jsx(
|
|
1071
|
+
} })) : shellConfirmationRequest ? (_jsx(ShellConfirmationDialogWithAnimation, { request: shellConfirmationRequest })) : isDbConfigureDialogOpen ? (_jsx(ConfigureUI, { mode: "db", embedded: true, onComplete: completeDbConfigure, onCancel: cancelDbConfigure })) : confirmationRequest ? (_jsxs(Box, { flexDirection: "column", children: [confirmationRequest.prompt, _jsx(Box, { paddingY: 1, children: _jsx(RadioButtonSelect, { isFocused: !!confirmationRequest, items: [
|
|
799
1072
|
{ label: 'Yes', value: true },
|
|
800
1073
|
{ label: 'No', value: false },
|
|
801
1074
|
], onSelect: (value) => {
|
|
802
1075
|
confirmationRequest.onConfirm(value);
|
|
803
1076
|
} }) })] })) : isThemeDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [themeError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: themeError }) })), _jsx(ThemeDialog, { onSelect: handleThemeSelect, onHighlight: handleThemeHighlight, settings: settings, availableTerminalHeight: constrainHeight
|
|
804
1077
|
? terminalHeight - staticExtraHeight
|
|
805
|
-
: undefined, terminalWidth: mainAreaWidth
|
|
806
|
-
|
|
1078
|
+
: undefined, terminalWidth: mainAreaWidth, isClosing: themeDialogAnimation.isClosing })] })) : isReleasesDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(ReleaseNotesDialog, { versions: releasesVersions, onClose: closeReleasesDialog, availableTerminalHeight: constrainHeight
|
|
1079
|
+
? terminalHeight - staticExtraHeight
|
|
1080
|
+
: undefined, terminalWidth: mainAreaWidth, isLoading: isReleasesLoading }) })) : isSettingsDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(SettingsDialog, { settings: settings, onSelect: () => closeSettingsDialog(), onRestartRequest: () => process.exit(0), isClosing: settingsDialogAnimation.isClosing }) })) : isExtensionsDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(ExtensionsDialog, { onClose: () => closeExtensionsDialog() }) })) : isSubagentCreateDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AgentCreationWizard, { onClose: closeSubagentCreateDialog, config: config }) })) : isAgentsManagerDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AgentsManagerDialog, { onClose: closeAgentsManagerDialog, config: config }) })) : isMultiAgentConfigDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(MultiAgentConfigDialog, { onComplete: (multiAgentConfig) => {
|
|
1081
|
+
// Save configuration to settings
|
|
1082
|
+
settings.setValue(SettingScope.User, 'multiAgent', multiAgentConfig);
|
|
1083
|
+
closeMultiAgentConfigDialog();
|
|
1084
|
+
addItem({
|
|
1085
|
+
type: MessageType.INFO,
|
|
1086
|
+
text: 'Multi-agent configuration saved successfully.',
|
|
1087
|
+
}, Date.now());
|
|
1088
|
+
}, onCancel: closeMultiAgentConfigDialog, initialConfig: {
|
|
1089
|
+
blackbox: {
|
|
1090
|
+
enabled: settings.merged.multiAgent?.blackbox?.enabled ?? true,
|
|
1091
|
+
model: settings.merged.multiAgent?.blackbox?.model || 'blackboxai/anthropic/claude-sonnet-4.5',
|
|
1092
|
+
},
|
|
1093
|
+
claude: {
|
|
1094
|
+
enabled: settings.merged.multiAgent?.claude?.enabled ?? true,
|
|
1095
|
+
model: settings.merged.multiAgent?.claude?.model || 'blackboxai/anthropic/claude-sonnet-4.5',
|
|
1096
|
+
},
|
|
1097
|
+
codex: {
|
|
1098
|
+
enabled: settings.merged.multiAgent?.codex?.enabled ?? true,
|
|
1099
|
+
model: settings.merged.multiAgent?.codex?.model || 'gpt-5-codex',
|
|
1100
|
+
},
|
|
1101
|
+
gemini: {
|
|
1102
|
+
enabled: settings.merged.multiAgent?.gemini?.enabled ?? false,
|
|
1103
|
+
model: settings.merged.multiAgent?.gemini?.model || 'gemini-2.0-flash-exp',
|
|
1104
|
+
},
|
|
1105
|
+
}, hasOpenAIKey: !!process.env['OPENAI_API_KEY']?.startsWith('sk-'), hasGeminiKey: !!process.env['GEMINI_API_KEY'] }) })) : isHistoryBrowserOpen && logger ? (_jsx(Box, { flexDirection: "column", children: _jsx(HistoryBrowserDialog, { logger: logger, onResume: async (tag) => {
|
|
1106
|
+
try {
|
|
1107
|
+
const conversation = await logger.loadCheckpoint(tag);
|
|
1108
|
+
if (conversation) {
|
|
1109
|
+
setIsHistoryBrowserOpen(false);
|
|
1110
|
+
// Set the client history so AI has context
|
|
1111
|
+
config.getGeminiClient()?.setHistory(conversation);
|
|
1112
|
+
// Convert Content[] to HistoryItem[] using the same logic as resumeCommand
|
|
1113
|
+
const rolemap = {
|
|
1114
|
+
user: MessageType.USER,
|
|
1115
|
+
model: MessageType.GEMINI,
|
|
1116
|
+
};
|
|
1117
|
+
const uiHistory = [];
|
|
1118
|
+
let hasSystemPrompt = false;
|
|
1119
|
+
let i = 0;
|
|
1120
|
+
for (const item of conversation) {
|
|
1121
|
+
i += 1;
|
|
1122
|
+
const text = item.parts
|
|
1123
|
+
?.filter((m) => !!m.text)
|
|
1124
|
+
.map((m) => m.text)
|
|
1125
|
+
.join('') || '';
|
|
1126
|
+
if (!text) {
|
|
1127
|
+
continue;
|
|
1128
|
+
}
|
|
1129
|
+
if (i === 1 && text.match(/context for our chat/)) {
|
|
1130
|
+
hasSystemPrompt = true;
|
|
1131
|
+
}
|
|
1132
|
+
if (i > 2 || !hasSystemPrompt) {
|
|
1133
|
+
uiHistory.push({
|
|
1134
|
+
type: (item.role && rolemap[item.role]) || MessageType.GEMINI,
|
|
1135
|
+
text,
|
|
1136
|
+
});
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
// Add IDs to history items
|
|
1140
|
+
const historyWithIds = uiHistory.map((item, index) => ({
|
|
1141
|
+
...item,
|
|
1142
|
+
id: index,
|
|
1143
|
+
}));
|
|
1144
|
+
loadHistory(historyWithIds);
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
catch (error) {
|
|
1148
|
+
console.error('Failed to resume conversation:', error);
|
|
1149
|
+
}
|
|
1150
|
+
}, onDelete: async (tag) => {
|
|
1151
|
+
try {
|
|
1152
|
+
await logger.deleteCheckpoint(tag);
|
|
1153
|
+
}
|
|
1154
|
+
catch (error) {
|
|
1155
|
+
console.error('Failed to delete checkpoint:', error);
|
|
1156
|
+
}
|
|
1157
|
+
}, onClose: () => setIsHistoryBrowserOpen(false) }) })) : isAuthenticating ? (_jsxs(_Fragment, { children: [isBlackboxAuth && isBlackboxAuthenticating ? (_jsx(BlackboxOAuthProgress, { deviceAuth: deviceAuth || undefined, authStatus: authStatus, authMessage: authMessage, onTimeout: () => {
|
|
1158
|
+
// User cancelled - just return to agent without showing dialog
|
|
807
1159
|
cancelBlackboxAuth();
|
|
808
1160
|
cancelAuthentication();
|
|
809
|
-
openAuthDialog();
|
|
810
1161
|
}, onCancel: () => {
|
|
811
|
-
|
|
1162
|
+
// User cancelled - just return to agent without showing dialog
|
|
812
1163
|
cancelBlackboxAuth();
|
|
813
1164
|
cancelAuthentication();
|
|
814
|
-
openAuthDialog();
|
|
815
1165
|
} })) : (_jsx(AuthInProgress, { onTimeout: () => {
|
|
816
|
-
|
|
1166
|
+
// User cancelled - just return to agent without showing dialog
|
|
817
1167
|
cancelAuthentication();
|
|
818
|
-
|
|
819
|
-
} })), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }))] })) : isAuthDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AuthDialog, { onSelect: handleAuthSelect, settings: settings, initialErrorMessage: authError, config: config }) })) : isEditorDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [editorError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: editorError }) })), _jsx(EditorSettingsDialog, { onSelect: handleEditorSelect, settings: settings, onExit: exitEditorDialog })] })) : isModelSelectionDialogOpen ? (_jsx(ModelSelectionDialog, { availableModels: getAvailableModelsForCurrentAuth(), currentModel: currentModel, onSelect: handleModelSelect, onCancel: handleModelSelectionClose })) : isVisionSwitchDialogOpen ? (_jsx(ModelSwitchDialog, { onSelect: handleVisionSwitchSelect })) : showPrivacyNotice ? (_jsx(PrivacyNotice, { onExit: () => setShowPrivacyNotice(false), config: config })) : (_jsxs(_Fragment, { children: [_jsx(LoadingIndicator, { thought: streamingState === StreamingState.WaitingForConfirmation ||
|
|
1168
|
+
} })), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }))] })) : isAuthDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AuthDialog, { onSelect: handleAuthSelect, settings: settings, initialErrorMessage: authError, isClosing: authDialogAnimation.isClosing }) })) : isEditorDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [editorError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: editorError }) })), _jsx(EditorSettingsDialog, { onSelect: handleEditorSelect, settings: settings, onExit: exitEditorDialog })] })) : isModelSelectionDialogOpen ? (_jsx(ModelSelectionDialog, { availableModels: availableModelsForDialog, currentModel: currentModel, onSelect: handleModelSelect, onCancel: handleModelSelectionClose, isClosing: modelDialogAnimation.isClosing })) : isVisionSwitchDialogOpen ? (_jsx(ModelSwitchDialog, { onSelect: handleVisionSwitchSelect })) : isVoiceConfigDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(VoiceConfigDialog, { settings: settings, onClose: closeVoiceConfigDialog, isClosing: voiceConfigDialogAnimation.isClosing, onConfigComplete: handleVoiceConfigComplete }) })) : showPrivacyNotice ? (_jsx(PrivacyNotice, { onExit: () => setShowPrivacyNotice(false), config: config })) : (_jsxs(_Fragment, { children: [showTodoListDialog && (_jsx(TodoListDialog, { todos: todos, onClose: () => setShowTodoListDialog(false) })), _jsx(LoadingIndicator, { thought: streamingState === StreamingState.WaitingForConfirmation ||
|
|
820
1169
|
config.getAccessibility()?.disableLoadingPhrases ||
|
|
821
1170
|
config.getScreenReader()
|
|
822
1171
|
? undefined
|
|
823
1172
|
: thought, currentLoadingPhrase: config.getAccessibility()?.disableLoadingPhrases ||
|
|
824
1173
|
config.getScreenReader()
|
|
825
1174
|
? undefined
|
|
826
|
-
: currentLoadingPhrase, elapsedTime: elapsedTime }), messageQueue.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [messageQueue
|
|
1175
|
+
: currentLoadingPhrase, currentTodo: currentTodo?.content, nextTodo: nextTodo?.content, tokenCount: sessionStats.lastPromptTokenCount, hasTodos: todos.length > 0, elapsedTime: elapsedTime }), messageQueue.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [messageQueue
|
|
827
1176
|
.slice(0, MAX_DISPLAYED_QUEUED_MESSAGES)
|
|
828
1177
|
.map((message, index) => {
|
|
829
1178
|
// Ensure multi-line messages are collapsed for the preview.
|