@blackbox_ai/blackbox-cli 0.0.7 → 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 +13 -3
- 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 +14 -0
- package/dist/src/commands/configure/ConfigureUI.js +556 -0
- package/dist/src/commands/configure/ConfigureUI.js.map +1 -0
- package/dist/src/commands/configure/index.d.ts +7 -0
- package/dist/src/commands/configure/index.js +62 -0
- package/dist/src/commands/configure/index.js.map +1 -0
- package/dist/src/commands/configure.d.ts +7 -0
- package/dist/src/commands/configure.js +276 -0
- package/dist/src/commands/configure.js.map +1 -0
- package/dist/src/commands/configure.test.d.ts +6 -0
- package/dist/src/commands/configure.test.js +32 -0
- package/dist/src/commands/configure.test.js.map +1 -0
- 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 +32 -1
- package/dist/src/config/auth.js +317 -2
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.d.ts +7 -1
- package/dist/src/config/config.js +71 -10
- 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.d.ts +21 -0
- package/dist/src/config/modelFetcher.js +226 -0
- package/dist/src/config/modelFetcher.js.map +1 -0
- package/dist/src/config/settings.js +101 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +626 -0
- package/dist/src/config/settingsSchema.js +626 -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 +61 -28
- 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 +563 -6
- 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 +4 -2
- package/dist/src/ui/components/AuthDialog.js +349 -64
- 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 +24 -0
- package/dist/src/ui/components/GenericProviderKeyPrompt.js +99 -0
- package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -0
- 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 +6 -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 +13 -3
- 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
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { toB64, fromB64 } from './crypto-utils.js';
|
|
2
|
+
import { performSecureAttestation } from './attestation.js';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import * as os from 'node:os';
|
|
6
|
+
/**
|
|
7
|
+
* Session storage directory for CLI (replaces browser sessionStorage)
|
|
8
|
+
*/
|
|
9
|
+
const getSessionStorageDir = () => {
|
|
10
|
+
const homeDir = os.homedir();
|
|
11
|
+
const sessionDir = path.join(homeDir, '.blackboxcli', 'sessions');
|
|
12
|
+
if (!fs.existsSync(sessionDir)) {
|
|
13
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
return sessionDir;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Session file prefix for secure sessions
|
|
19
|
+
*/
|
|
20
|
+
const SESSION_FILE_PREFIX = 'blackbox_secure_session_';
|
|
21
|
+
/**
|
|
22
|
+
* Deserializes session data from storage
|
|
23
|
+
*/
|
|
24
|
+
const deserializeSession = (data) => {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(data);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Gets the session file path for a chatId
|
|
34
|
+
*/
|
|
35
|
+
const getSessionFilePath = (chatId) => path.join(getSessionStorageDir(), `${SESSION_FILE_PREFIX}${chatId}.json`);
|
|
36
|
+
/**
|
|
37
|
+
* Hydrates a session from sessionStorage by reconstructing crypto keys
|
|
38
|
+
* so that attestation is NOT required again for the same chatId.
|
|
39
|
+
*/
|
|
40
|
+
export const getHydratedSessionByChatId = async (chatId) => {
|
|
41
|
+
try {
|
|
42
|
+
const filePath = getSessionFilePath(chatId);
|
|
43
|
+
if (!fs.existsSync(filePath))
|
|
44
|
+
return undefined;
|
|
45
|
+
const stored = fs.readFileSync(filePath, 'utf8');
|
|
46
|
+
const data = JSON.parse(stored);
|
|
47
|
+
if (!data['sessionId'] || !data['initialized'])
|
|
48
|
+
return undefined;
|
|
49
|
+
if (!data['serverPublicKeys_b64'] || !data['sharedKeys_b64']) {
|
|
50
|
+
console.warn('⚠️ Session is not attestation format or missing required data');
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
if (!data['ecdsaPrivatePkcs8_b64'] || !data['ecdsaPublicSpki_b64']) {
|
|
54
|
+
console.warn('⚠️ Attestation session missing crypto key data');
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const pkcs8Array = fromB64(data['ecdsaPrivatePkcs8_b64']);
|
|
58
|
+
const spkiArray = fromB64(data['ecdsaPublicSpki_b64']);
|
|
59
|
+
// Reconstruct local keys
|
|
60
|
+
const ecdsaPrivate = await crypto.subtle.importKey('pkcs8', pkcs8Array.slice().buffer, { name: 'ECDSA', namedCurve: 'P-384' }, true, ['sign']);
|
|
61
|
+
const ecdsaPublic = await crypto.subtle.importKey('spki', spkiArray.slice().buffer, { name: 'ECDSA', namedCurve: 'P-384' }, true, ['verify']);
|
|
62
|
+
const ecdhPrivate = await crypto.subtle.importKey('pkcs8', pkcs8Array.slice().buffer, { name: 'ECDH', namedCurve: 'P-384' }, false, ['deriveBits']);
|
|
63
|
+
// Reconstruct server public keys
|
|
64
|
+
const serverPublicKeys = data['serverPublicKeys_b64'].map((keyData) => ({
|
|
65
|
+
id: keyData.id,
|
|
66
|
+
publicKeySpki: fromB64(keyData.publicKeySpki_b64),
|
|
67
|
+
publicKeyPem: keyData.publicKeyPem
|
|
68
|
+
}));
|
|
69
|
+
// Reconstruct shared keys
|
|
70
|
+
const sharedKeys = data['sharedKeys_b64'].map((keyData) => ({
|
|
71
|
+
id: keyData.id,
|
|
72
|
+
sharedKey: fromB64(keyData.sharedKey_b64)
|
|
73
|
+
}));
|
|
74
|
+
// Create ProcessedAttestationData for attestation sessions
|
|
75
|
+
const attestationData = {
|
|
76
|
+
sessionId: data['sessionId'],
|
|
77
|
+
nonce: data['nonce'],
|
|
78
|
+
history: data['history'] || [],
|
|
79
|
+
serverPublicKeys,
|
|
80
|
+
localKeys: { ecdhPrivate, ecdsaPrivate, ecdsaPublic },
|
|
81
|
+
sharedKeys
|
|
82
|
+
};
|
|
83
|
+
const session = {
|
|
84
|
+
sessionId: data['sessionId'],
|
|
85
|
+
initialized: true,
|
|
86
|
+
nonce: data['nonce'],
|
|
87
|
+
history: data['history'] || [],
|
|
88
|
+
serverPublicKeySpki: undefined, // API will select the key
|
|
89
|
+
localKeys: { ecdhPrivate, ecdsaPrivate, ecdsaPublic },
|
|
90
|
+
sharedKey: undefined, // API will select the key
|
|
91
|
+
createdAt: data['createdAt'] || Date.now(),
|
|
92
|
+
};
|
|
93
|
+
// Store the full attestation data for use by StreamingClient
|
|
94
|
+
session.attestationData = attestationData;
|
|
95
|
+
return session;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.warn('⚠️ Failed to hydrate session from storage:', error);
|
|
99
|
+
console.warn('Error details:', error);
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Initializes a secure session for encrypted communication.
|
|
105
|
+
* Sessions are stored in sessionStorage and keyed by chatId to ensure one session per chat per tab.
|
|
106
|
+
* Attestation happens only once per chatId - subsequent calls reuse existing crypto keys.
|
|
107
|
+
*/
|
|
108
|
+
export const initializeSecureSession = async (chatId, systemPrompt) => {
|
|
109
|
+
// First try to hydrate from sessionStorage (includes crypto keys)
|
|
110
|
+
const hydratedSession = await getHydratedSessionByChatId(chatId);
|
|
111
|
+
if (hydratedSession && hydratedSession.initialized) {
|
|
112
|
+
return hydratedSession;
|
|
113
|
+
}
|
|
114
|
+
// Perform attestation
|
|
115
|
+
const attestationData = await performSecureAttestation(systemPrompt);
|
|
116
|
+
// Create session object
|
|
117
|
+
const session = {
|
|
118
|
+
sessionId: attestationData.sessionId,
|
|
119
|
+
initialized: true,
|
|
120
|
+
nonce: attestationData.nonce,
|
|
121
|
+
history: attestationData.history,
|
|
122
|
+
localKeys: attestationData.localKeys,
|
|
123
|
+
createdAt: Date.now(),
|
|
124
|
+
};
|
|
125
|
+
// Store the full attestation data for use by StreamingClient
|
|
126
|
+
session.attestationData = attestationData;
|
|
127
|
+
// Store attestation data in sessionStorage for potential reuse
|
|
128
|
+
try {
|
|
129
|
+
// Store complex attestation data
|
|
130
|
+
const serverPublicKeysB64 = attestationData.serverPublicKeys.map(key => ({
|
|
131
|
+
id: key.id,
|
|
132
|
+
publicKeySpki_b64: toB64(key.publicKeySpki),
|
|
133
|
+
publicKeyPem: key.publicKeyPem
|
|
134
|
+
}));
|
|
135
|
+
const sharedKeysB64 = attestationData.sharedKeys.map(key => ({
|
|
136
|
+
id: key.id,
|
|
137
|
+
sharedKey_b64: toB64(key.sharedKey)
|
|
138
|
+
}));
|
|
139
|
+
const ecdsaPrivPkcs8 = await crypto.subtle.exportKey('pkcs8', attestationData.localKeys.ecdsaPrivate);
|
|
140
|
+
const ecdsaPrivB64 = toB64(new Uint8Array(ecdsaPrivPkcs8));
|
|
141
|
+
const ecdsaPubSpki = await crypto.subtle.exportKey('spki', attestationData.localKeys.ecdsaPublic);
|
|
142
|
+
const ecdsaPubB64 = toB64(new Uint8Array(ecdsaPubSpki));
|
|
143
|
+
const storedObj = {
|
|
144
|
+
sessionId: attestationData.sessionId,
|
|
145
|
+
initialized: true,
|
|
146
|
+
nonce: attestationData.nonce,
|
|
147
|
+
history: attestationData.history,
|
|
148
|
+
createdAt: Date.now(),
|
|
149
|
+
serverPublicKeys_b64: serverPublicKeysB64,
|
|
150
|
+
sharedKeys_b64: sharedKeysB64,
|
|
151
|
+
ecdsaPrivatePkcs8_b64: ecdsaPrivB64,
|
|
152
|
+
ecdsaPublicSpki_b64: ecdsaPubB64
|
|
153
|
+
};
|
|
154
|
+
fs.writeFileSync(getSessionFilePath(chatId), JSON.stringify(storedObj));
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.warn('⚠️ Failed to store session in sessionStorage:', error);
|
|
158
|
+
}
|
|
159
|
+
// Cleanup old sessions
|
|
160
|
+
cleanupOldSessions();
|
|
161
|
+
return session;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Internal cleanup for sessions older than one hour
|
|
165
|
+
*/
|
|
166
|
+
const cleanupOldSessions = () => {
|
|
167
|
+
try {
|
|
168
|
+
const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
169
|
+
const sessionDir = getSessionStorageDir();
|
|
170
|
+
const files = fs.readdirSync(sessionDir);
|
|
171
|
+
for (const file of files) {
|
|
172
|
+
if (file.startsWith(SESSION_FILE_PREFIX) && file.endsWith('.json')) {
|
|
173
|
+
const filePath = path.join(sessionDir, file);
|
|
174
|
+
try {
|
|
175
|
+
const stored = fs.readFileSync(filePath, 'utf8');
|
|
176
|
+
const session = deserializeSession(stored);
|
|
177
|
+
if (session.createdAt && session.createdAt < oneHourAgo) {
|
|
178
|
+
fs.unlinkSync(filePath);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (_fileError) {
|
|
182
|
+
// If we can't read the file, delete it
|
|
183
|
+
fs.unlinkSync(filePath);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.warn('⚠️ Failed to cleanup old sessions:', error);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Initializes session cleanup on page load and sets up cleanup on page unload
|
|
194
|
+
* Call this once when the app starts to ensure proper session lifecycle management
|
|
195
|
+
*/
|
|
196
|
+
export const initializeSessionCleanup = () => {
|
|
197
|
+
// Cleanup old sessions on page load
|
|
198
|
+
cleanupOldSessions();
|
|
199
|
+
// Setup cleanup on page unload (when user closes tab or navigates away)
|
|
200
|
+
const handleBeforeUnload = () => {
|
|
201
|
+
try {
|
|
202
|
+
// Optional: You could implement more aggressive cleanup here
|
|
203
|
+
// For now, we rely on the time-based cleanup
|
|
204
|
+
console.log('🔄 Page unloading, sessions will be cleaned up on next load');
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
console.warn('⚠️ Error during page unload cleanup:', error);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
// Add event listener for page unload
|
|
211
|
+
if (typeof window !== 'undefined') {
|
|
212
|
+
window.addEventListener('beforeunload', handleBeforeUnload);
|
|
213
|
+
// Also cleanup when the page becomes hidden (mobile browsers)
|
|
214
|
+
document.addEventListener('visibilitychange', () => {
|
|
215
|
+
if (document.hidden) {
|
|
216
|
+
cleanupOldSessions();
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/encrypt/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type FileData, type ProcessedAttestationData } from './types.js';
|
|
2
|
+
interface ChatMessage {
|
|
3
|
+
role: 'system' | 'user' | 'assistant';
|
|
4
|
+
content: string;
|
|
5
|
+
image_url?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* StreamingClient handles the complete encrypted streaming protocol
|
|
9
|
+
*/
|
|
10
|
+
export declare class StreamingClient {
|
|
11
|
+
private baseUrl;
|
|
12
|
+
private initialized;
|
|
13
|
+
private nonce;
|
|
14
|
+
private history;
|
|
15
|
+
private attestationData?;
|
|
16
|
+
constructor(baseUrl: string, _attestationUrl: string, systemPrompt?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Initialize from existing session data (avoids re-attestation)
|
|
19
|
+
* Now uses the session management layer
|
|
20
|
+
*/
|
|
21
|
+
initializeFromSession(sessionData: {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
nonce: number;
|
|
24
|
+
history: ChatMessage[];
|
|
25
|
+
attestationData: ProcessedAttestationData;
|
|
26
|
+
}): void;
|
|
27
|
+
sendMessageStream(userText: string, fileData?: FileData): Promise<ReadableStream<Uint8Array>>;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { serializePublicKeyPem, encryptAndSign, decryptAndVerify } from './crypto-utils.js';
|
|
2
|
+
import {} from './types.js';
|
|
3
|
+
import { ENCRYPTION_CONFIG } from './config.js';
|
|
4
|
+
import { retryWithBackoff, isRetryableStatusCode } from './retry-utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* StreamingClient handles the complete encrypted streaming protocol
|
|
7
|
+
*/
|
|
8
|
+
export class StreamingClient {
|
|
9
|
+
baseUrl;
|
|
10
|
+
initialized = false;
|
|
11
|
+
nonce = 1000;
|
|
12
|
+
history = [];
|
|
13
|
+
attestationData;
|
|
14
|
+
constructor(baseUrl, _attestationUrl, systemPrompt) {
|
|
15
|
+
this.baseUrl = baseUrl;
|
|
16
|
+
if (systemPrompt) {
|
|
17
|
+
this.history.push({ role: 'system', content: systemPrompt });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize from existing session data (avoids re-attestation)
|
|
22
|
+
* Now uses the session management layer
|
|
23
|
+
*/
|
|
24
|
+
initializeFromSession(sessionData) {
|
|
25
|
+
// sessionId is stored in attestationData, no need to store separately
|
|
26
|
+
this.nonce = sessionData.nonce;
|
|
27
|
+
this.history = sessionData.history || [];
|
|
28
|
+
this.attestationData = sessionData.attestationData;
|
|
29
|
+
this.initialized = true;
|
|
30
|
+
}
|
|
31
|
+
async sendMessageStream(userText, fileData) {
|
|
32
|
+
if (!this.initialized || !this.attestationData) {
|
|
33
|
+
throw new Error('StreamingClient not initialized with attestation data. Call initializeFromSession() first.');
|
|
34
|
+
}
|
|
35
|
+
// Validate user text is not empty
|
|
36
|
+
if (!userText || userText.trim().length === 0) {
|
|
37
|
+
throw new Error('User message cannot be empty');
|
|
38
|
+
}
|
|
39
|
+
// Process file data and build context
|
|
40
|
+
let processedMessage = userText;
|
|
41
|
+
const contextParts = [];
|
|
42
|
+
// Process file data if provided
|
|
43
|
+
if (fileData) {
|
|
44
|
+
// Handle PDF/text content
|
|
45
|
+
if (fileData.fileText) {
|
|
46
|
+
contextParts.push(fileData.fileText);
|
|
47
|
+
}
|
|
48
|
+
// Build message with context
|
|
49
|
+
if (contextParts.length > 0) {
|
|
50
|
+
const contextText = contextParts.join('\n\n');
|
|
51
|
+
processedMessage = `Context:\n\n${contextText}\n\nQuery: ${userText}`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Create message object
|
|
55
|
+
const messageObj = {
|
|
56
|
+
role: 'user',
|
|
57
|
+
content: processedMessage
|
|
58
|
+
};
|
|
59
|
+
// Process image if provided
|
|
60
|
+
if (fileData?.imagesData && fileData.imagesData.length > 0) {
|
|
61
|
+
// Use the first image for now (following the sample pattern)
|
|
62
|
+
const firstImage = fileData.imagesData[0];
|
|
63
|
+
if (firstImage?.contents) {
|
|
64
|
+
// Extract base64 data (remove data:image/...;base64, prefix if present)
|
|
65
|
+
const base64Data = firstImage.contents.includes(',')
|
|
66
|
+
? firstImage.contents.split(',')[1]
|
|
67
|
+
: firstImage.contents;
|
|
68
|
+
messageObj.image_url = base64Data;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Ensure we have a valid history array - add the current message to history for encryption
|
|
72
|
+
const currentHistory = [...this.history, messageObj];
|
|
73
|
+
// Validate history is not empty
|
|
74
|
+
if (currentHistory.length === 0) {
|
|
75
|
+
throw new Error('Message history cannot be empty');
|
|
76
|
+
}
|
|
77
|
+
const historyJson = JSON.stringify(currentHistory);
|
|
78
|
+
const localKeys = this.attestationData.localKeys;
|
|
79
|
+
// Encrypt with all shared keys for attestation
|
|
80
|
+
const encryptedPayloads = {};
|
|
81
|
+
for (const sharedKeyData of this.attestationData.sharedKeys) {
|
|
82
|
+
// Use the imported encryptAndSign function for each shared key
|
|
83
|
+
const payload = await encryptAndSign(historyJson, sharedKeyData.sharedKey, localKeys.ecdsaPrivate, this.nonce);
|
|
84
|
+
const peerPubPem = await serializePublicKeyPem(localKeys.ecdsaPublic);
|
|
85
|
+
encryptedPayloads[sharedKeyData.id] = {
|
|
86
|
+
peer_public_key: peerPubPem,
|
|
87
|
+
payload
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Build request with all encrypted payloads
|
|
91
|
+
const request = {
|
|
92
|
+
payloads: encryptedPayloads
|
|
93
|
+
};
|
|
94
|
+
// Send to /message_stream endpoint with retry logic
|
|
95
|
+
const url = `${this.baseUrl.replace(/\/$/, '')}/message_stream`;
|
|
96
|
+
const response = await retryWithBackoff(async () => {
|
|
97
|
+
const res = await fetch(url, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: { 'Content-Type': 'application/json' },
|
|
100
|
+
body: JSON.stringify(request),
|
|
101
|
+
signal: AbortSignal.timeout(ENCRYPTION_CONFIG.streamingTimeout)
|
|
102
|
+
});
|
|
103
|
+
if (!res.ok) {
|
|
104
|
+
// Provide helpful error messages for common failure cases
|
|
105
|
+
if (res.status === 401 || res.status === 403) {
|
|
106
|
+
throw new Error(`Authentication failed (${res.status}). ` +
|
|
107
|
+
`Please ensure BLACKBOX_API_KEY is set correctly. ` +
|
|
108
|
+
`Run 'blackbox configure' to set up your API key.`);
|
|
109
|
+
}
|
|
110
|
+
throw new Error(`Streaming request failed: ${res.status}`);
|
|
111
|
+
}
|
|
112
|
+
return res;
|
|
113
|
+
}, {
|
|
114
|
+
maxRetries: ENCRYPTION_CONFIG.retryCount,
|
|
115
|
+
onRetry: (attempt, error, delay) => {
|
|
116
|
+
console.error(`⚠️ Streaming request failed (attempt ${attempt}/${ENCRYPTION_CONFIG.retryCount}). ` +
|
|
117
|
+
`Retrying in ${delay}ms... Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
118
|
+
},
|
|
119
|
+
shouldRetry: (error) => {
|
|
120
|
+
// Retry on network errors and 5xx server errors
|
|
121
|
+
if (error instanceof Error) {
|
|
122
|
+
const message = error.message;
|
|
123
|
+
// Check if it's a retryable status code (500, 502, 503, 504)
|
|
124
|
+
const statusMatch = message.match(/Streaming request failed: (\d+)/);
|
|
125
|
+
if (statusMatch) {
|
|
126
|
+
const statusCode = parseInt(statusMatch[1], 10);
|
|
127
|
+
return isRetryableStatusCode(statusCode);
|
|
128
|
+
}
|
|
129
|
+
// Also retry on network/timeout errors
|
|
130
|
+
return (message.includes('network') ||
|
|
131
|
+
message.includes('timeout') ||
|
|
132
|
+
message.includes('ECONNRESET') ||
|
|
133
|
+
message.includes('ECONNREFUSED') ||
|
|
134
|
+
message.includes('ETIMEDOUT'));
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
// Process streaming response using ReadableStream (NDJSON format)
|
|
140
|
+
let buffer = '';
|
|
141
|
+
let fullResponse = '';
|
|
142
|
+
const attestationData = this.attestationData;
|
|
143
|
+
// FIX: Use arrow functions to preserve 'this' context
|
|
144
|
+
const transformStream = new TransformStream({
|
|
145
|
+
transform: async (chunk, controller) => {
|
|
146
|
+
try {
|
|
147
|
+
buffer += new TextDecoder().decode(chunk);
|
|
148
|
+
// Process complete lines
|
|
149
|
+
const lines = buffer.split('\n');
|
|
150
|
+
buffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
151
|
+
for (const line of lines) {
|
|
152
|
+
const trimmed = line.trim();
|
|
153
|
+
if (!trimmed)
|
|
154
|
+
continue;
|
|
155
|
+
try {
|
|
156
|
+
const jsonData = JSON.parse(trimmed);
|
|
157
|
+
// Check for end-of-stream marker
|
|
158
|
+
if (jsonData.eos === true) {
|
|
159
|
+
// Add the complete response to history when stream ends
|
|
160
|
+
if (fullResponse.trim().length > 0) {
|
|
161
|
+
// 'this' correctly refers to the class instance here
|
|
162
|
+
this.history.push({ role: 'assistant', content: fullResponse });
|
|
163
|
+
this.nonce = this.nonce + 1;
|
|
164
|
+
}
|
|
165
|
+
controller.terminate();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// The server should indicate which key was used for encryption
|
|
169
|
+
// Try to decrypt with the appropriate key based on server response
|
|
170
|
+
let decryptedChunk = null;
|
|
171
|
+
// If server indicates which key was used
|
|
172
|
+
if (jsonData.key_id) {
|
|
173
|
+
const keyData = attestationData.sharedKeys.find((k) => k.id === jsonData.key_id);
|
|
174
|
+
const serverKey = attestationData.serverPublicKeys.find((k) => k.id === jsonData.key_id);
|
|
175
|
+
if (keyData && serverKey) {
|
|
176
|
+
try {
|
|
177
|
+
decryptedChunk = await decryptAndVerify(jsonData, keyData.sharedKey, serverKey.publicKeySpki);
|
|
178
|
+
}
|
|
179
|
+
catch (_error) {
|
|
180
|
+
// Failed to decrypt with specified key, will try all keys
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// If no key_id specified or decryption failed, try all keys
|
|
185
|
+
if (!decryptedChunk) {
|
|
186
|
+
for (let i = 0; i < attestationData.sharedKeys.length; i++) {
|
|
187
|
+
const keyData = attestationData.sharedKeys[i];
|
|
188
|
+
const serverKey = attestationData.serverPublicKeys[i];
|
|
189
|
+
try {
|
|
190
|
+
decryptedChunk = await decryptAndVerify(jsonData, keyData.sharedKey, serverKey.publicKeySpki);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
catch (_error) {
|
|
194
|
+
// Try next key
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!decryptedChunk) {
|
|
200
|
+
throw new Error('Failed to decrypt chunk with any available key');
|
|
201
|
+
}
|
|
202
|
+
fullResponse += decryptedChunk;
|
|
203
|
+
// Enqueue the decrypted chunk
|
|
204
|
+
controller.enqueue(new TextEncoder().encode(decryptedChunk));
|
|
205
|
+
}
|
|
206
|
+
catch (_e) {
|
|
207
|
+
// Error processing chunk, skip this line
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
controller.error(error);
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
flush: () => {
|
|
216
|
+
// Handle case where stream ends without explicit EOS marker
|
|
217
|
+
if (fullResponse.trim().length > 0) {
|
|
218
|
+
this.history.push({ role: 'assistant', content: fullResponse });
|
|
219
|
+
this.nonce = this.nonce + 1;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
return response.body.pipeThrough(transformStream);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=streaming-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-client.js","sourceRoot":"","sources":["../../../src/encrypt/streaming-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { CryptoKeyPair } from './crypto-utils.js';
|
|
2
|
+
export interface EncryptedMessage {
|
|
3
|
+
id: string;
|
|
4
|
+
content: string;
|
|
5
|
+
role: 'user' | 'assistant' | 'system';
|
|
6
|
+
encrypted?: boolean;
|
|
7
|
+
encryptionKey?: string;
|
|
8
|
+
image_url?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface FileData {
|
|
11
|
+
imagesData?: Array<{
|
|
12
|
+
filePath: string;
|
|
13
|
+
contents: string;
|
|
14
|
+
}>;
|
|
15
|
+
fileText?: string;
|
|
16
|
+
title?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SecureSession {
|
|
19
|
+
sessionId: string;
|
|
20
|
+
initialized: boolean;
|
|
21
|
+
nonce: number;
|
|
22
|
+
history: Array<{
|
|
23
|
+
role: 'user' | 'assistant' | 'system';
|
|
24
|
+
content: string;
|
|
25
|
+
}>;
|
|
26
|
+
serverPublicKeySpki?: Uint8Array;
|
|
27
|
+
localKeys?: CryptoKeyPair;
|
|
28
|
+
sharedKey?: Uint8Array;
|
|
29
|
+
createdAt: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Single attestation result interface
|
|
33
|
+
*/
|
|
34
|
+
export interface AttestationResult {
|
|
35
|
+
id: string;
|
|
36
|
+
status: number;
|
|
37
|
+
body: AttestationResponse;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Attestation response interface for list-based results
|
|
41
|
+
*/
|
|
42
|
+
export interface AttestationListResponse {
|
|
43
|
+
broadcast: boolean;
|
|
44
|
+
successful_servers: number;
|
|
45
|
+
total_servers: number;
|
|
46
|
+
results: AttestationResult[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Attestation response interface
|
|
50
|
+
*/
|
|
51
|
+
export interface AttestationResponse {
|
|
52
|
+
public_key?: string;
|
|
53
|
+
public_key_worker?: string;
|
|
54
|
+
nonce_b64?: string;
|
|
55
|
+
nonceB64?: string;
|
|
56
|
+
nonce?: string;
|
|
57
|
+
report_json: string;
|
|
58
|
+
signature: string;
|
|
59
|
+
gpu_eat: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Processed attestation data
|
|
63
|
+
*/
|
|
64
|
+
export interface ProcessedAttestationData {
|
|
65
|
+
sessionId: string;
|
|
66
|
+
nonce: number;
|
|
67
|
+
history: Array<{
|
|
68
|
+
role: 'user' | 'assistant' | 'system';
|
|
69
|
+
content: string;
|
|
70
|
+
}>;
|
|
71
|
+
serverPublicKeys: Array<{
|
|
72
|
+
id: string;
|
|
73
|
+
publicKeySpki: Uint8Array;
|
|
74
|
+
publicKeyPem: string;
|
|
75
|
+
}>;
|
|
76
|
+
localKeys: CryptoKeyPair;
|
|
77
|
+
sharedKeys: Array<{
|
|
78
|
+
id: string;
|
|
79
|
+
sharedKey: Uint8Array;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/encrypt/types.ts"],"names":[],"mappings":""}
|
package/dist/src/gemini.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ import type { Config } from '@blackbox_ai/blackbox-cli-core';
|
|
|
7
7
|
import type { DnsResolutionOrder, LoadedSettings } from './config/settings.js';
|
|
8
8
|
export declare function validateDnsResolutionOrder(order: string | undefined): DnsResolutionOrder;
|
|
9
9
|
export declare function setupUnhandledRejectionHandler(): void;
|
|
10
|
-
export declare function startInteractiveUI(config: Config, settings: LoadedSettings, startupWarnings: string[], workspaceRoot: string): Promise<void>;
|
|
10
|
+
export declare function startInteractiveUI(config: Config, settings: LoadedSettings, startupWarnings: string[], workspaceRoot: string, initialSlashCommand?: string): Promise<void>;
|
|
11
11
|
export declare function main(): Promise<void>;
|