@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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ENCRYPTION_CONFIG } from './config.js';
|
|
2
|
+
import { fromB64, generateUuid, generateKeyPair, deserializePublicKeyPem, deriveSharedKey } from './crypto-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Basic attestation verification extracted from streaming-client.ts
|
|
5
|
+
* Validates structure, nonce binding, and key presence.
|
|
6
|
+
* Internal function - not exported since it's only used within this module.
|
|
7
|
+
*/
|
|
8
|
+
async function verifyAttestationBasic(reportJson, signature, gpuEat, publicKeyPem, nonce) {
|
|
9
|
+
// Perform minimal structural checks consistent with previous implementation
|
|
10
|
+
const report = JSON.parse(reportJson);
|
|
11
|
+
const expectedNonceB64 = btoa(String.fromCharCode.apply(null, Array.from(nonce)));
|
|
12
|
+
if (report.nonce !== expectedNonceB64) {
|
|
13
|
+
throw new Error(`Nonce mismatch: expected ${expectedNonceB64}, got ${report.nonce}`);
|
|
14
|
+
}
|
|
15
|
+
if (!signature || signature.length === 0) {
|
|
16
|
+
throw new Error('Missing signature');
|
|
17
|
+
}
|
|
18
|
+
if (!publicKeyPem.includes('BEGIN PUBLIC KEY')) {
|
|
19
|
+
throw new Error('Invalid public key format');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Process a single attestation result
|
|
24
|
+
*/
|
|
25
|
+
async function processAttestationResult(result, localKeys) {
|
|
26
|
+
const { body } = result;
|
|
27
|
+
// Extract server public key
|
|
28
|
+
const serverPubPem = body.public_key || body.public_key_worker;
|
|
29
|
+
if (!serverPubPem) {
|
|
30
|
+
throw new Error(`Attestation result ${result.id} missing server public key`);
|
|
31
|
+
}
|
|
32
|
+
// Extract nonce
|
|
33
|
+
const nonceB64 = body.nonce_b64 || body.nonceB64 || body.nonce;
|
|
34
|
+
if (!nonceB64) {
|
|
35
|
+
throw new Error(`Attestation result ${result.id} missing nonce_b64`);
|
|
36
|
+
}
|
|
37
|
+
const nonceBytes = fromB64(nonceB64);
|
|
38
|
+
// Verify attestation
|
|
39
|
+
await verifyAttestationBasic(body.report_json, body.signature, body.gpu_eat, serverPubPem, nonceBytes);
|
|
40
|
+
// Deserialize public key and derive shared key
|
|
41
|
+
const serverPublicKeySpki = deserializePublicKeyPem(serverPubPem);
|
|
42
|
+
const sharedKey = await deriveSharedKey(localKeys.ecdhPrivate, serverPublicKeySpki);
|
|
43
|
+
return {
|
|
44
|
+
id: result.id,
|
|
45
|
+
publicKeySpki: serverPublicKeySpki,
|
|
46
|
+
publicKeyPem: serverPubPem,
|
|
47
|
+
sharedKey
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Performs secure attestation and key generation for a new session
|
|
52
|
+
*/
|
|
53
|
+
export const performSecureAttestation = async (systemPrompt) => {
|
|
54
|
+
// Perform attestation
|
|
55
|
+
const response = await fetch(ENCRYPTION_CONFIG.attestationUrl);
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
throw new Error(`Attestation request failed: ${response.status}`);
|
|
58
|
+
}
|
|
59
|
+
const responseData = await response.json();
|
|
60
|
+
// Generate local keys once for all attestations
|
|
61
|
+
const localKeys = await generateKeyPair();
|
|
62
|
+
const serverPublicKeys = [];
|
|
63
|
+
const sharedKeys = [];
|
|
64
|
+
// Process each attestation result
|
|
65
|
+
for (const result of responseData.results) {
|
|
66
|
+
try {
|
|
67
|
+
if (result.status === 200) {
|
|
68
|
+
const processed = await processAttestationResult(result, localKeys);
|
|
69
|
+
serverPublicKeys.push({
|
|
70
|
+
id: processed.id,
|
|
71
|
+
publicKeySpki: processed.publicKeySpki,
|
|
72
|
+
publicKeyPem: processed.publicKeyPem
|
|
73
|
+
});
|
|
74
|
+
sharedKeys.push({
|
|
75
|
+
id: processed.id,
|
|
76
|
+
sharedKey: processed.sharedKey
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.warn(`⚠️ Skipping attestation result ${result.id} with status ${result.status}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error(`❌ Failed to process attestation result ${result.id}:`, error);
|
|
85
|
+
// Continue processing other results even if one fails
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (sharedKeys.length === 0) {
|
|
89
|
+
throw new Error('No successful attestation results could be processed');
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
sessionId: generateUuid(),
|
|
93
|
+
nonce: 1000,
|
|
94
|
+
history: systemPrompt ? [{ role: 'system', content: systemPrompt }] : [],
|
|
95
|
+
serverPublicKeys,
|
|
96
|
+
localKeys,
|
|
97
|
+
sharedKeys,
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=attestation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../../src/encrypt/attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge module to register the encryption service globally
|
|
3
|
+
* so the core package can access it without direct imports
|
|
4
|
+
*/
|
|
5
|
+
import { sendMessageStream } from './client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Interface for the encryption service bridge
|
|
8
|
+
*/
|
|
9
|
+
interface EncryptionServiceBridge {
|
|
10
|
+
sendMessageStream: typeof sendMessageStream;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extended global interface to include our encryption service
|
|
14
|
+
*/
|
|
15
|
+
declare global {
|
|
16
|
+
var blackboxEncryptionService: EncryptionServiceBridge | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register the encryption service globally for use by the core package
|
|
20
|
+
*/
|
|
21
|
+
export declare function registerEncryptionService(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Unregister the encryption service
|
|
24
|
+
*/
|
|
25
|
+
export declare function unregisterEncryptionService(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Check if the encryption service is registered
|
|
28
|
+
*/
|
|
29
|
+
export declare function isEncryptionServiceRegistered(): boolean;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge module to register the encryption service globally
|
|
3
|
+
* so the core package can access it without direct imports
|
|
4
|
+
*/
|
|
5
|
+
import { sendMessageStream } from './client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Register the encryption service globally for use by the core package
|
|
8
|
+
*/
|
|
9
|
+
export function registerEncryptionService() {
|
|
10
|
+
if (typeof globalThis !== 'undefined') {
|
|
11
|
+
const bridge = {
|
|
12
|
+
sendMessageStream
|
|
13
|
+
};
|
|
14
|
+
globalThis.blackboxEncryptionService = bridge;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Unregister the encryption service
|
|
19
|
+
*/
|
|
20
|
+
export function unregisterEncryptionService() {
|
|
21
|
+
if (typeof globalThis !== 'undefined') {
|
|
22
|
+
delete globalThis.blackboxEncryptionService;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if the encryption service is registered
|
|
27
|
+
*/
|
|
28
|
+
export function isEncryptionServiceRegistered() {
|
|
29
|
+
return typeof globalThis !== 'undefined' &&
|
|
30
|
+
globalThis.blackboxEncryptionService !== undefined;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../src/encrypt/bridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAiBhD;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,MAAM,MAAM,GAA4B;YACtC,iBAAiB;SAClB,CAAC;QAEF,UAAU,CAAC,yBAAyB,GAAG,MAAM,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC,yBAAyB,CAAC;IAC9C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO,OAAO,UAAU,KAAK,WAAW;QACjC,UAAU,CAAC,yBAAyB,KAAK,SAAS,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type FileData } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sends a message through the encrypted stream using the StreamingClient.
|
|
4
|
+
* Now supports both sessionId and chatId for backward compatibility.
|
|
5
|
+
*
|
|
6
|
+
* @param sessionIdOrChatId - The session or chat ID
|
|
7
|
+
* @param userText - The current user message text
|
|
8
|
+
* @param fullMessageHistory - Optional full conversation history for proper context in followup messages
|
|
9
|
+
* @param fileData - Optional file data (images, PDFs, etc.)
|
|
10
|
+
*/
|
|
11
|
+
export declare const sendMessageStream: (sessionIdOrChatId: string, userText: string, fullMessageHistory?: Array<{
|
|
12
|
+
role: "system" | "user" | "assistant";
|
|
13
|
+
content: string;
|
|
14
|
+
}>, fileData?: FileData) => Promise<ReadableStream<Uint8Array>>;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ENCRYPTION_CONFIG } from './config.js';
|
|
2
|
+
import { getHydratedSessionByChatId, initializeSecureSession } from './sessions.js';
|
|
3
|
+
import { StreamingClient } from './streaming-client.js';
|
|
4
|
+
import {} from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Sends a message through the encrypted stream using the StreamingClient.
|
|
7
|
+
* Now supports both sessionId and chatId for backward compatibility.
|
|
8
|
+
*
|
|
9
|
+
* @param sessionIdOrChatId - The session or chat ID
|
|
10
|
+
* @param userText - The current user message text
|
|
11
|
+
* @param fullMessageHistory - Optional full conversation history for proper context in followup messages
|
|
12
|
+
* @param fileData - Optional file data (images, PDFs, etc.)
|
|
13
|
+
*/
|
|
14
|
+
export const sendMessageStream = async (sessionIdOrChatId, userText, fullMessageHistory, fileData) => {
|
|
15
|
+
// Validate input parameters
|
|
16
|
+
if (!sessionIdOrChatId || sessionIdOrChatId.trim().length === 0) {
|
|
17
|
+
throw new Error('Session ID or Chat ID cannot be empty');
|
|
18
|
+
}
|
|
19
|
+
if (!userText || userText.trim().length === 0) {
|
|
20
|
+
throw new Error('User message cannot be empty');
|
|
21
|
+
}
|
|
22
|
+
// Try to get hydrated session by chatId first (includes crypto keys)
|
|
23
|
+
let session = await getHydratedSessionByChatId(sessionIdOrChatId);
|
|
24
|
+
// If no session exists, create a new one
|
|
25
|
+
if (!session || !session.initialized) {
|
|
26
|
+
const systemPrompt = fullMessageHistory?.find((m) => m.role === 'system')?.content;
|
|
27
|
+
session = await initializeSecureSession(sessionIdOrChatId, systemPrompt);
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
// Use provided message history or fall back to session history
|
|
31
|
+
// Ensure we always have a valid array
|
|
32
|
+
const messageHistory = fullMessageHistory && fullMessageHistory.length > 0
|
|
33
|
+
? fullMessageHistory
|
|
34
|
+
: session.history || [];
|
|
35
|
+
// Create a streaming client for this session (system prompt from message history)
|
|
36
|
+
const systemPrompt = messageHistory.find((m) => m.role === 'system')?.content;
|
|
37
|
+
const client = new StreamingClient(ENCRYPTION_CONFIG.baseUrl, ENCRYPTION_CONFIG.attestationUrl, systemPrompt);
|
|
38
|
+
// Initialize from existing session data to avoid re-attestation
|
|
39
|
+
if (session.attestationData) {
|
|
40
|
+
client.initializeFromSession({
|
|
41
|
+
sessionId: session.sessionId,
|
|
42
|
+
nonce: session.nonce,
|
|
43
|
+
history: messageHistory,
|
|
44
|
+
attestationData: session.attestationData
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Send the message and get the encrypted stream
|
|
48
|
+
const encryptedStream = await client.sendMessageStream(userText, fileData);
|
|
49
|
+
// Update session history with the new user message
|
|
50
|
+
// If fullMessageHistory was provided, sync session.history with it
|
|
51
|
+
if (fullMessageHistory && fullMessageHistory.length > 0) {
|
|
52
|
+
session.history = [...fullMessageHistory];
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Ensure session.history is initialized
|
|
56
|
+
if (!session.history) {
|
|
57
|
+
session.history = [];
|
|
58
|
+
}
|
|
59
|
+
session.history.push({ role: 'user', content: userText });
|
|
60
|
+
}
|
|
61
|
+
session.nonce += 1;
|
|
62
|
+
// Update the session in sessionStorage with crypto materials
|
|
63
|
+
try {
|
|
64
|
+
// Import toB64 helper from crypto-utils
|
|
65
|
+
const { toB64 } = await import('./crypto-utils.js');
|
|
66
|
+
const attestationData = session.attestationData;
|
|
67
|
+
if (!attestationData) {
|
|
68
|
+
throw new Error('No attestation data available for storage update');
|
|
69
|
+
}
|
|
70
|
+
// Store multi-attestation data
|
|
71
|
+
const serverPublicKeysB64 = attestationData.serverPublicKeys.map((key) => ({
|
|
72
|
+
id: key.id,
|
|
73
|
+
publicKeySpki_b64: toB64(key.publicKeySpki),
|
|
74
|
+
publicKeyPem: key.publicKeyPem
|
|
75
|
+
}));
|
|
76
|
+
const sharedKeysB64 = attestationData.sharedKeys.map((key) => ({
|
|
77
|
+
id: key.id,
|
|
78
|
+
sharedKey_b64: toB64(key.sharedKey)
|
|
79
|
+
}));
|
|
80
|
+
const ecdsaPrivPkcs8 = await crypto.subtle.exportKey('pkcs8', attestationData.localKeys.ecdsaPrivate);
|
|
81
|
+
const ecdsaPrivB64 = toB64(new Uint8Array(ecdsaPrivPkcs8));
|
|
82
|
+
const ecdsaPubSpki = await crypto.subtle.exportKey('spki', attestationData.localKeys.ecdsaPublic);
|
|
83
|
+
const ecdsaPubB64 = toB64(new Uint8Array(ecdsaPubSpki));
|
|
84
|
+
const sessionFilePath = `${process.env['HOME'] || process.env['USERPROFILE']}/.blackboxcli/sessions/blackbox_secure_session_${sessionIdOrChatId}.json`;
|
|
85
|
+
const storedObj = {
|
|
86
|
+
sessionId: session.sessionId,
|
|
87
|
+
initialized: session.initialized,
|
|
88
|
+
nonce: session.nonce,
|
|
89
|
+
history: session.history,
|
|
90
|
+
createdAt: session.createdAt,
|
|
91
|
+
serverPublicKeys_b64: serverPublicKeysB64,
|
|
92
|
+
sharedKeys_b64: sharedKeysB64,
|
|
93
|
+
ecdsaPrivatePkcs8_b64: ecdsaPrivB64,
|
|
94
|
+
ecdsaPublicSpki_b64: ecdsaPubB64
|
|
95
|
+
};
|
|
96
|
+
// Import fs for file operations
|
|
97
|
+
const fs = await import('node:fs');
|
|
98
|
+
const path = await import('node:path');
|
|
99
|
+
// Ensure directory exists
|
|
100
|
+
const sessionDir = path.dirname(sessionFilePath);
|
|
101
|
+
if (!fs.existsSync(sessionDir)) {
|
|
102
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
103
|
+
}
|
|
104
|
+
fs.writeFileSync(sessionFilePath, JSON.stringify(storedObj));
|
|
105
|
+
}
|
|
106
|
+
catch (storageError) {
|
|
107
|
+
console.warn('⚠️ Failed to update session in storage:', storageError);
|
|
108
|
+
}
|
|
109
|
+
return encryptedStream;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error('❌ Failed to send encrypted message:', error);
|
|
113
|
+
// Instead of creating a fake fallback response, throw the actual error
|
|
114
|
+
// This allows the model to learn from real errors and users to see actual issues
|
|
115
|
+
if (error instanceof Error) {
|
|
116
|
+
// Enhance the error with additional context for better debugging
|
|
117
|
+
const enhancedError = new Error(`Encryption service failed: ${error.message}\n` +
|
|
118
|
+
`Session ID: ${sessionIdOrChatId}\n` +
|
|
119
|
+
`Error Type: ${error.constructor.name}\n` +
|
|
120
|
+
`Timestamp: ${new Date().toISOString()}`);
|
|
121
|
+
enhancedError.stack = error.stack;
|
|
122
|
+
enhancedError.cause = error;
|
|
123
|
+
throw enhancedError;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Handle non-Error objects
|
|
127
|
+
throw new Error(`Encryption service failed with unknown error: ${String(error)}\n` +
|
|
128
|
+
`Session ID: ${sessionIdOrChatId}\n` +
|
|
129
|
+
`Timestamp: ${new Date().toISOString()}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/encrypt/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypted model identifiers - used to detect if a model requires encryption
|
|
3
|
+
*/
|
|
4
|
+
export declare const ENCRYPTED_MODELS: string[];
|
|
5
|
+
/**
|
|
6
|
+
* Timeout constants for encrypted operations
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_ENCRYPTED_TIMEOUT: number;
|
|
9
|
+
export declare const DEFAULT_ENCRYPTED_RETRY_COUNT: number;
|
|
10
|
+
export declare const ATTESTATION_TIMEOUT: number;
|
|
11
|
+
export declare const RETRY_INITIAL_DELAY: number;
|
|
12
|
+
export declare const RETRY_MAX_DELAY: number;
|
|
13
|
+
export declare const RETRY_BACKOFF_MULTIPLIER: number;
|
|
14
|
+
export declare const RETRYABLE_STATUS_CODES: number[];
|
|
15
|
+
export declare const ENCRYPTION_CONFIG: {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
attestationUrl: string;
|
|
18
|
+
messageStreamUrl: string;
|
|
19
|
+
streamingTimeout: number;
|
|
20
|
+
attestationTimeout: number;
|
|
21
|
+
retryCount: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Detects if the selected model requires encryption
|
|
25
|
+
*/
|
|
26
|
+
export declare const isEncryptedModel: (modelName: string) => boolean;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypted model identifiers - used to detect if a model requires encryption
|
|
3
|
+
*/
|
|
4
|
+
export const ENCRYPTED_MODELS = [
|
|
5
|
+
'blackboxai/encrypted',
|
|
6
|
+
'blackboxai/encrypted-pro',
|
|
7
|
+
'blackboxai/secure-coder',
|
|
8
|
+
'blackbox/encrypted',
|
|
9
|
+
'encrypted-gpt-4',
|
|
10
|
+
'encrypted-claude',
|
|
11
|
+
'secure-model'
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Timeout constants for encrypted operations
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_ENCRYPTED_TIMEOUT = parseInt(process.env['BLACKBOX_ENCRYPTED_TIMEOUT'] || '1800000', 10);
|
|
17
|
+
export const DEFAULT_ENCRYPTED_RETRY_COUNT = parseInt(process.env['BLACKBOX_ENCRYPTED_RETRY_COUNT'] || '3', 10);
|
|
18
|
+
// Connection timeout for initial attestation
|
|
19
|
+
export const ATTESTATION_TIMEOUT = parseInt(process.env['BLACKBOX_ATTESTATION_TIMEOUT'] || '30000', // 30 seconds
|
|
20
|
+
10);
|
|
21
|
+
// Retry configuration for streaming requests
|
|
22
|
+
export const RETRY_INITIAL_DELAY = parseInt(process.env['BLACKBOX_RETRY_INITIAL_DELAY'] || '1000', // 1 second
|
|
23
|
+
10);
|
|
24
|
+
export const RETRY_MAX_DELAY = parseInt(process.env['BLACKBOX_RETRY_MAX_DELAY'] || '10000', // 10 seconds
|
|
25
|
+
10);
|
|
26
|
+
export const RETRY_BACKOFF_MULTIPLIER = parseFloat(process.env['BLACKBOX_RETRY_BACKOFF_MULTIPLIER'] || '2');
|
|
27
|
+
// HTTP status codes that should trigger a retry
|
|
28
|
+
export const RETRYABLE_STATUS_CODES = [500, 502, 503, 504];
|
|
29
|
+
/**
|
|
30
|
+
* Configuration for encryption service endpoints
|
|
31
|
+
*/
|
|
32
|
+
// CLI environment - always use direct URL
|
|
33
|
+
const baseUrl = process.env['BLACKBOX_ENCRYPTION_BASE_URL'] || 'https://encrypt.blackboxai.app';
|
|
34
|
+
export const ENCRYPTION_CONFIG = {
|
|
35
|
+
baseUrl,
|
|
36
|
+
attestationUrl: `${baseUrl}/attestation`,
|
|
37
|
+
messageStreamUrl: `${baseUrl}/message_stream`,
|
|
38
|
+
// Timeout configuration
|
|
39
|
+
streamingTimeout: DEFAULT_ENCRYPTED_TIMEOUT,
|
|
40
|
+
attestationTimeout: ATTESTATION_TIMEOUT,
|
|
41
|
+
retryCount: DEFAULT_ENCRYPTED_RETRY_COUNT,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Detects if the selected model requires encryption
|
|
45
|
+
*/
|
|
46
|
+
export const isEncryptedModel = (modelName) => {
|
|
47
|
+
if (!modelName)
|
|
48
|
+
return false;
|
|
49
|
+
return ENCRYPTED_MODELS.some(encryptedModel => modelName.toLowerCase().includes(encryptedModel.toLowerCase()));
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/encrypt/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,sBAAsB;IACtB,0BAA0B;IAC1B,yBAAyB;IACzB,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAC/C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,SAAS,EACtD,EAAE,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAQ,CACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,IAAI,GAAG,EACpD,EAAE,CACH,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CACzC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,OAAO,EAAE,aAAa;AACrE,EAAE,CACH,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CACzC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,MAAM,EAAE,WAAW;AAClE,EAAE,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CACrC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,OAAO,EAAE,aAAa;AACjE,EAAE,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAChD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,IAAI,GAAG,CACxD,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE3D;;GAEG;AAEH,0CAA0C;AAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,gCAAgC,CAAC;AAEhG,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO;IACP,cAAc,EAAE,GAAG,OAAO,cAAc;IACxC,gBAAgB,EAAE,GAAG,OAAO,iBAAiB;IAC7C,wBAAwB;IACxB,gBAAgB,EAAE,yBAAyB;IAC3C,kBAAkB,EAAE,mBAAmB;IACvC,UAAU,EAAE,6BAA6B;CAC1C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAW,EAAE;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,OAAO,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAC5C,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level cryptographic utilities extracted from streaming-client.ts
|
|
3
|
+
*/
|
|
4
|
+
export interface CryptoKeyPair {
|
|
5
|
+
ecdhPrivate: CryptoKey;
|
|
6
|
+
ecdsaPrivate: CryptoKey;
|
|
7
|
+
ecdsaPublic: CryptoKey;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Convert Uint8Array to base64 string
|
|
11
|
+
*/
|
|
12
|
+
export declare const toB64: (u8: Uint8Array) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Convert base64 string to Uint8Array
|
|
15
|
+
*/
|
|
16
|
+
export declare const fromB64: (b64: string) => Uint8Array;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a UUID for identification (moved from streaming-client.ts)
|
|
19
|
+
*/
|
|
20
|
+
export declare const generateUuid: () => string;
|
|
21
|
+
/**
|
|
22
|
+
* Generate a P-384 keypair for both ECDSA and ECDH operations (moved from streaming-client.ts)
|
|
23
|
+
* Reuses the same key material for both operations (matching Rust behavior)
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateKeyPair(): Promise<CryptoKeyPair>;
|
|
26
|
+
export declare function ecdsaRawToDer(raw: Uint8Array): Uint8Array;
|
|
27
|
+
export declare function ecdsaDerToRaw(der: Uint8Array): Uint8Array;
|
|
28
|
+
/**
|
|
29
|
+
* Serialize a WebCrypto ECDSA/ECDH public key to PEM (SPKI)
|
|
30
|
+
*/
|
|
31
|
+
export declare function serializePublicKeyPem(publicKey: CryptoKey): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Deserialize PEM (SPKI) public key string to Uint8Array bytes
|
|
34
|
+
*/
|
|
35
|
+
export declare function deserializePublicKeyPem(pem: string): Uint8Array;
|
|
36
|
+
/**
|
|
37
|
+
* Derive a shared key using ECDH + HKDF (SHA-256) from local private key and server public key (SPKI)
|
|
38
|
+
* Matches the Rust implementation detail (using only X coordinate for HKDF input).
|
|
39
|
+
*/
|
|
40
|
+
export declare function deriveSharedKey(localPrivateKey: CryptoKey, serverPublicKeySpki: Uint8Array): Promise<Uint8Array>;
|
|
41
|
+
/**
|
|
42
|
+
* Encrypted payload interface (moved from streaming-client.ts)
|
|
43
|
+
*/
|
|
44
|
+
export interface EncryptedPayload {
|
|
45
|
+
nonce: number;
|
|
46
|
+
iv: string;
|
|
47
|
+
ciphertext: string;
|
|
48
|
+
signature: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Encrypt and sign a message using AES-GCM and ECDSA (moved from streaming-client.ts)
|
|
52
|
+
*/
|
|
53
|
+
export declare function encryptAndSign(plaintext: string, sharedKey: Uint8Array, signingKey: CryptoKey, nonce: number): Promise<EncryptedPayload>;
|
|
54
|
+
/**
|
|
55
|
+
* Decrypt and verify a message using AES-GCM and ECDSA (moved from streaming-client.ts)
|
|
56
|
+
*/
|
|
57
|
+
export declare function decryptAndVerify(payload: EncryptedPayload, sharedKey: Uint8Array, serverVerifyingKeySpki: Uint8Array): Promise<string>;
|