@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,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { loadSettings } from '../config/settings.js';
|
|
7
|
+
import { VoiceRecordingService } from '../services/voiceRecordingService.js';
|
|
8
|
+
import { getVoiceApiKey, setVoiceApiKey } from '../config/voice.js';
|
|
9
|
+
import { parseElevenLabsError, formatElevenLabsError } from '../services/elevenLabsErrors.js';
|
|
10
|
+
import * as readline from 'node:readline';
|
|
11
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
12
|
+
import WebSocket from 'ws';
|
|
13
|
+
// Debug mode flag - can be set via environment variable
|
|
14
|
+
const DEBUG_MODE = process.env['DEBUG'] === 'true' || process.env['DEBUG'] === '1' || process.env['DEBUG_MODE'] === 'true' || process.env['DEBUG_MODE'] === '1';
|
|
15
|
+
function debugLog(...args) {
|
|
16
|
+
if (DEBUG_MODE) {
|
|
17
|
+
console.debug('[DEBUG][VoiceTest]', ...args);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function sanitizeApiKey(apiKey) {
|
|
21
|
+
if (apiKey.length <= 8)
|
|
22
|
+
return '***';
|
|
23
|
+
return `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`;
|
|
24
|
+
}
|
|
25
|
+
function createReadlineInterface() {
|
|
26
|
+
return readline.createInterface({
|
|
27
|
+
input,
|
|
28
|
+
output,
|
|
29
|
+
terminal: true,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function question(rl, prompt) {
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
rl.question(prompt, (answer) => {
|
|
35
|
+
resolve(answer.trim());
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function configureVoice() {
|
|
40
|
+
const workspaceRoot = process.cwd();
|
|
41
|
+
const settings = loadSettings(workspaceRoot);
|
|
42
|
+
console.log('\nVoice Input Configuration\n');
|
|
43
|
+
console.log('Voice input allows you to use speech-to-text for hands-free coding.');
|
|
44
|
+
console.log('Currently supported provider: ElevenLabs\n');
|
|
45
|
+
console.log('✓ Audio recording is ready (using built-in ffmpeg)\n');
|
|
46
|
+
// Check current configuration
|
|
47
|
+
const currentApiKey = getVoiceApiKey(settings);
|
|
48
|
+
if (currentApiKey) {
|
|
49
|
+
console.log('✓ ElevenLabs API key is already configured');
|
|
50
|
+
console.log(` Current key: ${currentApiKey.substring(0, 8)}...\n`);
|
|
51
|
+
const rl = createReadlineInterface();
|
|
52
|
+
const updateKey = await question(rl, 'Do you want to update the API key? (y/N): ');
|
|
53
|
+
if (updateKey.toLowerCase() !== 'y') {
|
|
54
|
+
console.log('\n✓ Configuration unchanged\n');
|
|
55
|
+
rl.close();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
rl.close();
|
|
59
|
+
}
|
|
60
|
+
// Prompt for API key
|
|
61
|
+
console.log('Get your API key from: \x1b[36mhttps://elevenlabs.io/app/settings/api-keys\x1b[0m');
|
|
62
|
+
console.log('IMPORTANT: Ensure your API key has the "speech_to_text" permission enabled\n');
|
|
63
|
+
const rl = createReadlineInterface();
|
|
64
|
+
const apiKey = await question(rl, 'Enter your ElevenLabs API key: ');
|
|
65
|
+
rl.close();
|
|
66
|
+
if (!apiKey || apiKey.trim().length === 0) {
|
|
67
|
+
console.log('\n✗ No API key provided. Configuration cancelled.\n');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Save the API key
|
|
71
|
+
try {
|
|
72
|
+
setVoiceApiKey(apiKey.trim(), settings);
|
|
73
|
+
console.log('\n✓ API key saved successfully!');
|
|
74
|
+
console.log('✓ Voice input is now configured\n');
|
|
75
|
+
console.log('Usage:');
|
|
76
|
+
console.log(' blackbox voice test Test voice recording');
|
|
77
|
+
console.log(' /voice Use voice in interactive mode\n');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('\n✗ Failed to save API key:', error instanceof Error ? error.message : String(error));
|
|
81
|
+
console.log(' Please try again or set it manually in ~/.blackboxcli/settings.json\n');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function testVoice() {
|
|
85
|
+
const workspaceRoot = process.cwd();
|
|
86
|
+
const settings = loadSettings(workspaceRoot);
|
|
87
|
+
console.log('\nTesting Voice Input with Real-time Transcription\n');
|
|
88
|
+
debugLog('Debug mode enabled for voice test');
|
|
89
|
+
// Initialize voice service with settings optimized for real-time streaming
|
|
90
|
+
const voiceService = new VoiceRecordingService({
|
|
91
|
+
sampleRate: 16000, // Required for ElevenLabs real-time API
|
|
92
|
+
audioFormat: 'wav',
|
|
93
|
+
});
|
|
94
|
+
console.log('✓ Audio recording is ready (using built-in ffmpeg)');
|
|
95
|
+
// Check and validate API key
|
|
96
|
+
const apiKey = getVoiceApiKey(settings);
|
|
97
|
+
if (!apiKey) {
|
|
98
|
+
console.log('✗ ElevenLabs API key is not configured');
|
|
99
|
+
console.log(' Run: blackbox voice configure');
|
|
100
|
+
debugLog('No API key found in settings');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
console.log('✓ ElevenLabs API key is configured');
|
|
104
|
+
debugLog('API key found:', sanitizeApiKey(apiKey));
|
|
105
|
+
// Test real-time transcription
|
|
106
|
+
console.log('\nStarting real-time transcription test...');
|
|
107
|
+
console.log('Speak now! Press Enter when done...\n');
|
|
108
|
+
try {
|
|
109
|
+
let fullTranscript = '';
|
|
110
|
+
let lastPartialTranscript = '';
|
|
111
|
+
let websocketError = null;
|
|
112
|
+
// Create temporary file path for recording
|
|
113
|
+
const os = await import('node:os');
|
|
114
|
+
const path = await import('node:path');
|
|
115
|
+
const tempFilePath = path.join(os.tmpdir(), `voice-test-${Date.now()}.wav`);
|
|
116
|
+
// Connect to ElevenLabs WebSocket for real-time transcription
|
|
117
|
+
const uri = "wss://api.elevenlabs.io/v1/speech-to-text/realtime?model_id=scribe_v2_realtime&language_code=en&commit_strategy=manual";
|
|
118
|
+
debugLog('Connecting to WebSocket:', uri);
|
|
119
|
+
const websocket = new WebSocket(uri, {
|
|
120
|
+
headers: {
|
|
121
|
+
"xi-api-key": apiKey,
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
let sessionStarted = false;
|
|
125
|
+
let isRecordingPhase = true;
|
|
126
|
+
// Set up WebSocket event handlers
|
|
127
|
+
websocket.on("open", () => {
|
|
128
|
+
debugLog('WebSocket connection opened');
|
|
129
|
+
});
|
|
130
|
+
const recordingMessageHandler = (event) => {
|
|
131
|
+
if (!isRecordingPhase)
|
|
132
|
+
return;
|
|
133
|
+
const data = JSON.parse(event.toString());
|
|
134
|
+
debugLog('WebSocket message received:', data.message_type);
|
|
135
|
+
switch (data.message_type) {
|
|
136
|
+
case "session_started":
|
|
137
|
+
sessionStarted = true;
|
|
138
|
+
debugLog('Session started successfully');
|
|
139
|
+
console.log('🔴 Recording... (press Enter to stop, ESC to cancel)\n');
|
|
140
|
+
break;
|
|
141
|
+
case "partial_transcript": {
|
|
142
|
+
const partialText = data.text || '';
|
|
143
|
+
debugLog('Partial transcript:', partialText ? `"${partialText}"` : '(empty)');
|
|
144
|
+
if (partialText && partialText.trim()) {
|
|
145
|
+
lastPartialTranscript = partialText;
|
|
146
|
+
const displayText = fullTranscript
|
|
147
|
+
? `${fullTranscript} ${partialText}`
|
|
148
|
+
: partialText;
|
|
149
|
+
// Clear previous line and show updated transcription
|
|
150
|
+
process.stdout.write('\r\x1b[K'); // Clear line
|
|
151
|
+
process.stdout.write(`💬 ${displayText}`);
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case "committed_transcript": {
|
|
156
|
+
const committedText = data.text || '';
|
|
157
|
+
debugLog('Committed transcript:', committedText ? `"${committedText}"` : '(empty)');
|
|
158
|
+
if (committedText) {
|
|
159
|
+
if (fullTranscript && !fullTranscript.endsWith(' ')) {
|
|
160
|
+
fullTranscript += ' ';
|
|
161
|
+
}
|
|
162
|
+
fullTranscript += committedText;
|
|
163
|
+
lastPartialTranscript = '';
|
|
164
|
+
// Clear previous line and show updated transcription
|
|
165
|
+
process.stdout.write('\r\x1b[K'); // Clear line
|
|
166
|
+
process.stdout.write(`💬 ${fullTranscript}`);
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case "error":
|
|
171
|
+
debugLog('WebSocket error message:', JSON.stringify(data));
|
|
172
|
+
break;
|
|
173
|
+
default:
|
|
174
|
+
debugLog('Unknown message type:', data.message_type, JSON.stringify(data));
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
websocket.on("message", recordingMessageHandler);
|
|
179
|
+
websocket.on("error", (error) => {
|
|
180
|
+
websocketError = error;
|
|
181
|
+
debugLog('WebSocket error event:', error.message, error.stack);
|
|
182
|
+
console.error('\n✗ WebSocket error:', error.message);
|
|
183
|
+
});
|
|
184
|
+
websocket.on("close", (code, reason) => {
|
|
185
|
+
const reasonString = reason.toString();
|
|
186
|
+
debugLog('WebSocket closed - code:', code, 'reason:', reasonString || '(none)');
|
|
187
|
+
// Handle authentication and other errors
|
|
188
|
+
// WebSocket close codes:
|
|
189
|
+
// 1000 = Normal closure
|
|
190
|
+
// 1001 = Going away (e.g., server going down or browser navigating away)
|
|
191
|
+
// 1005 = No Status Received (reserved code, used internally when no close code was received)
|
|
192
|
+
// 1008 = Policy violation (often used for auth failures)
|
|
193
|
+
// 4001 = Unauthorized (custom code used by some APIs)
|
|
194
|
+
// 1002 = Protocol error
|
|
195
|
+
// Handle authentication and protocol errors
|
|
196
|
+
if (code === 1008 || code === 4001 || code === 1002) {
|
|
197
|
+
// Parse the error using our error handler
|
|
198
|
+
const httpStatus = code === 1008 || code === 4001 ? 401 : 403;
|
|
199
|
+
const errorInfo = parseElevenLabsError(httpStatus, reasonString || 'Authentication failed');
|
|
200
|
+
const formattedError = formatElevenLabsError(errorInfo);
|
|
201
|
+
websocketError = new Error(formattedError);
|
|
202
|
+
debugLog('Authentication/protocol error detected');
|
|
203
|
+
console.error('\n✗ WebSocket authentication error:', formattedError);
|
|
204
|
+
}
|
|
205
|
+
else if (code !== 1000 && code !== 1001 && code !== 1005) {
|
|
206
|
+
// Log non-normal closures
|
|
207
|
+
// Exclude 1000 (normal), 1001 (going away), and 1005 (no status received - benign)
|
|
208
|
+
const errorMessage = `WebSocket closed unexpectedly: ${reasonString || 'Unknown reason'} (code: ${code})`;
|
|
209
|
+
websocketError = new Error(errorMessage);
|
|
210
|
+
debugLog('Unexpected WebSocket closure');
|
|
211
|
+
console.error(`\n✗ ${errorMessage}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
debugLog('Normal WebSocket closure');
|
|
215
|
+
}
|
|
216
|
+
// Note: Codes 1000, 1001, and 1005 are considered normal and don't generate errors
|
|
217
|
+
});
|
|
218
|
+
// Wait for session to start with timeout
|
|
219
|
+
debugLog('Waiting for session to start...');
|
|
220
|
+
await new Promise((resolve, reject) => {
|
|
221
|
+
const timeout = setTimeout(() => {
|
|
222
|
+
clearInterval(checkSession);
|
|
223
|
+
debugLog('Session start timeout reached');
|
|
224
|
+
// Check for captured errors first
|
|
225
|
+
if (websocketError) {
|
|
226
|
+
debugLog('Rejecting with captured WebSocket error');
|
|
227
|
+
reject(websocketError);
|
|
228
|
+
}
|
|
229
|
+
else if (websocket.readyState === WebSocket.CLOSED || websocket.readyState === WebSocket.CLOSING) {
|
|
230
|
+
// WebSocket closed without starting session - likely an auth error
|
|
231
|
+
debugLog('WebSocket closed before session started');
|
|
232
|
+
const errorInfo = parseElevenLabsError(401, 'WebSocket connection closed before session started. This usually indicates an authentication issue.');
|
|
233
|
+
const formattedError = formatElevenLabsError(errorInfo);
|
|
234
|
+
reject(new Error(formattedError));
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
debugLog('Session failed to start within timeout');
|
|
238
|
+
reject(new Error('WebSocket session failed to start (timeout after 10s)'));
|
|
239
|
+
}
|
|
240
|
+
}, 10000);
|
|
241
|
+
const checkSession = setInterval(() => {
|
|
242
|
+
// Check for errors first - this is the highest priority
|
|
243
|
+
if (websocketError) {
|
|
244
|
+
clearInterval(checkSession);
|
|
245
|
+
clearTimeout(timeout);
|
|
246
|
+
reject(websocketError);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Check if WebSocket closed without starting session
|
|
250
|
+
if (!sessionStarted && (websocket.readyState === WebSocket.CLOSED || websocket.readyState === WebSocket.CLOSING)) {
|
|
251
|
+
clearInterval(checkSession);
|
|
252
|
+
clearTimeout(timeout);
|
|
253
|
+
// WebSocket closed early - this is likely an authentication error
|
|
254
|
+
const errorInfo = parseElevenLabsError(401, 'WebSocket connection closed before session started. This usually indicates an authentication issue.');
|
|
255
|
+
const formattedError = formatElevenLabsError(errorInfo);
|
|
256
|
+
reject(new Error(formattedError));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Check if session started successfully
|
|
260
|
+
if (sessionStarted) {
|
|
261
|
+
clearInterval(checkSession);
|
|
262
|
+
clearTimeout(timeout);
|
|
263
|
+
resolve();
|
|
264
|
+
}
|
|
265
|
+
}, 50); // Check more frequently (every 50ms instead of 100ms)
|
|
266
|
+
});
|
|
267
|
+
// Track elapsed time
|
|
268
|
+
let isRecording = true;
|
|
269
|
+
let elapsedSeconds = 0;
|
|
270
|
+
const durationInterval = setInterval(() => {
|
|
271
|
+
if (isRecording) {
|
|
272
|
+
elapsedSeconds++;
|
|
273
|
+
}
|
|
274
|
+
}, 1000);
|
|
275
|
+
// WebSocket keepalive - send ping every 5 seconds
|
|
276
|
+
const keepaliveInterval = setInterval(() => {
|
|
277
|
+
if (websocket.readyState === WebSocket.OPEN) {
|
|
278
|
+
websocket.ping();
|
|
279
|
+
}
|
|
280
|
+
}, 5000);
|
|
281
|
+
// Periodic commit interval - commit every 30 seconds
|
|
282
|
+
let lastCommitTime = Date.now();
|
|
283
|
+
const COMMIT_INTERVAL_MS = 30000;
|
|
284
|
+
// Start recording with streaming callback and save to tmp file
|
|
285
|
+
debugLog('Starting audio recording with streaming to WebSocket');
|
|
286
|
+
let audioChunksSent = 0;
|
|
287
|
+
let totalAudioBytesSent = 0;
|
|
288
|
+
await voiceService.startRecording(tempFilePath, (audioChunk) => {
|
|
289
|
+
if (websocket.readyState === WebSocket.OPEN) {
|
|
290
|
+
audioChunksSent++;
|
|
291
|
+
totalAudioBytesSent += audioChunk.length;
|
|
292
|
+
if (audioChunksSent === 1) {
|
|
293
|
+
debugLog('First audio chunk sent to WebSocket, size:', audioChunk.length, 'bytes');
|
|
294
|
+
}
|
|
295
|
+
else if (audioChunksSent % 100 === 0) {
|
|
296
|
+
debugLog(`Audio chunks sent: ${audioChunksSent}, total bytes: ${totalAudioBytesSent}`);
|
|
297
|
+
}
|
|
298
|
+
const chunkBase64 = audioChunk.toString("base64");
|
|
299
|
+
const now = Date.now();
|
|
300
|
+
const shouldCommit = (now - lastCommitTime) >= COMMIT_INTERVAL_MS;
|
|
301
|
+
if (shouldCommit) {
|
|
302
|
+
debugLog('Sending commit with audio chunk');
|
|
303
|
+
}
|
|
304
|
+
websocket.send(JSON.stringify({
|
|
305
|
+
message_type: "input_audio_chunk",
|
|
306
|
+
audio_base_64: chunkBase64,
|
|
307
|
+
commit: shouldCommit,
|
|
308
|
+
sample_rate: 16000,
|
|
309
|
+
}));
|
|
310
|
+
if (shouldCommit) {
|
|
311
|
+
lastCommitTime = now;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
debugLog('WebSocket not open, skipping audio chunk. State:', websocket.readyState);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
// Wait for Enter key
|
|
319
|
+
await new Promise((resolve, reject) => {
|
|
320
|
+
const stdin = process.stdin;
|
|
321
|
+
const wasRaw = stdin.isRaw;
|
|
322
|
+
const wasPaused = stdin.isPaused();
|
|
323
|
+
stdin.setRawMode(true);
|
|
324
|
+
stdin.resume();
|
|
325
|
+
stdin.setEncoding('utf8');
|
|
326
|
+
const cleanup = () => {
|
|
327
|
+
stdin.setRawMode(wasRaw || false);
|
|
328
|
+
if (wasPaused) {
|
|
329
|
+
stdin.pause();
|
|
330
|
+
}
|
|
331
|
+
stdin.removeListener('data', onData);
|
|
332
|
+
};
|
|
333
|
+
const onData = (key) => {
|
|
334
|
+
if (key === '\r' || key === '\n') {
|
|
335
|
+
cleanup();
|
|
336
|
+
resolve();
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
// Ctrl+C
|
|
340
|
+
if (key === '\u0003') {
|
|
341
|
+
cleanup();
|
|
342
|
+
// Synchronously cancel recording to prevent race condition
|
|
343
|
+
isRecording = false;
|
|
344
|
+
isRecordingPhase = false; // Stop message handler immediately
|
|
345
|
+
clearInterval(durationInterval);
|
|
346
|
+
clearInterval(keepaliveInterval);
|
|
347
|
+
// Clear the transcription line
|
|
348
|
+
process.stdout.write('\r\x1b[K');
|
|
349
|
+
// Close WebSocket synchronously
|
|
350
|
+
websocket.close();
|
|
351
|
+
// Cancel recording (fire and forget - don't wait)
|
|
352
|
+
voiceService.cancelRecording().catch((error) => {
|
|
353
|
+
console.error('Error during cleanup:', error);
|
|
354
|
+
});
|
|
355
|
+
// Reject immediately
|
|
356
|
+
reject(new Error('Recording cancelled'));
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
// ESC key
|
|
360
|
+
if (key === '\u001b') {
|
|
361
|
+
cleanup();
|
|
362
|
+
// Synchronously cancel recording to prevent race condition
|
|
363
|
+
isRecording = false;
|
|
364
|
+
isRecordingPhase = false; // Stop message handler immediately
|
|
365
|
+
clearInterval(durationInterval);
|
|
366
|
+
clearInterval(keepaliveInterval);
|
|
367
|
+
// Clear the transcription line
|
|
368
|
+
process.stdout.write('\r\x1b[K');
|
|
369
|
+
// Close WebSocket synchronously
|
|
370
|
+
websocket.close();
|
|
371
|
+
// Cancel recording (fire and forget - don't wait)
|
|
372
|
+
voiceService.cancelRecording().catch((error) => {
|
|
373
|
+
console.error('Error during cleanup:', error);
|
|
374
|
+
});
|
|
375
|
+
// Reject immediately
|
|
376
|
+
reject(new Error('Recording cancelled'));
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
stdin.on('data', onData);
|
|
381
|
+
});
|
|
382
|
+
// Stop recording
|
|
383
|
+
isRecording = false;
|
|
384
|
+
isRecordingPhase = false;
|
|
385
|
+
clearInterval(durationInterval);
|
|
386
|
+
clearInterval(keepaliveInterval);
|
|
387
|
+
debugLog('Stopping audio recording...');
|
|
388
|
+
await voiceService.stopRecording();
|
|
389
|
+
debugLog('Audio recording stopped');
|
|
390
|
+
debugLog('Total audio chunks sent:', audioChunksSent, 'Total bytes:', totalAudioBytesSent);
|
|
391
|
+
// Clear the transcription line and show processing message
|
|
392
|
+
process.stdout.write('\r\x1b[K');
|
|
393
|
+
console.log(`\n⏳ Processing final audio... (${elapsedSeconds}s recorded)`);
|
|
394
|
+
// Send final commit to flush remaining audio
|
|
395
|
+
if (websocket.readyState === WebSocket.OPEN) {
|
|
396
|
+
debugLog('Sending final commit to flush remaining audio');
|
|
397
|
+
websocket.send(JSON.stringify({
|
|
398
|
+
message_type: "input_audio_chunk",
|
|
399
|
+
audio_base_64: "",
|
|
400
|
+
commit: true,
|
|
401
|
+
sample_rate: 16000,
|
|
402
|
+
}));
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
debugLog('WARNING: WebSocket not open for final commit. State:', websocket.readyState);
|
|
406
|
+
}
|
|
407
|
+
// Wait for all remaining committed transcripts
|
|
408
|
+
const baseTimeout = 3000;
|
|
409
|
+
const additionalTimePerMinute = 2000;
|
|
410
|
+
const recordingMinutes = Math.ceil(elapsedSeconds / 60);
|
|
411
|
+
const dynamicTimeout = baseTimeout + (additionalTimePerMinute * recordingMinutes);
|
|
412
|
+
await new Promise((resolve) => {
|
|
413
|
+
let noDataTimeout;
|
|
414
|
+
const mainTimeout = setTimeout(() => {
|
|
415
|
+
clearTimeout(noDataTimeout);
|
|
416
|
+
websocket.removeListener('message', finalTranscriptHandler);
|
|
417
|
+
resolve();
|
|
418
|
+
}, dynamicTimeout);
|
|
419
|
+
const resetNoDataTimeout = () => {
|
|
420
|
+
clearTimeout(noDataTimeout);
|
|
421
|
+
noDataTimeout = setTimeout(() => {
|
|
422
|
+
clearTimeout(mainTimeout);
|
|
423
|
+
websocket.removeListener('message', finalTranscriptHandler);
|
|
424
|
+
resolve();
|
|
425
|
+
}, 1000);
|
|
426
|
+
};
|
|
427
|
+
const finalTranscriptHandler = (event) => {
|
|
428
|
+
const data = JSON.parse(event.toString());
|
|
429
|
+
if (data.message_type === "committed_transcript") {
|
|
430
|
+
const committedText = data.text || '';
|
|
431
|
+
if (committedText) {
|
|
432
|
+
if (fullTranscript && !fullTranscript.endsWith(' ')) {
|
|
433
|
+
fullTranscript += ' ';
|
|
434
|
+
}
|
|
435
|
+
fullTranscript += committedText;
|
|
436
|
+
lastPartialTranscript = '';
|
|
437
|
+
resetNoDataTimeout();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
else if (data.message_type === "partial_transcript") {
|
|
441
|
+
const partialText = data.text || '';
|
|
442
|
+
if (partialText && partialText.trim()) {
|
|
443
|
+
lastPartialTranscript = partialText;
|
|
444
|
+
resetNoDataTimeout();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
websocket.on('message', finalTranscriptHandler);
|
|
449
|
+
resetNoDataTimeout();
|
|
450
|
+
});
|
|
451
|
+
// Close WebSocket
|
|
452
|
+
debugLog('Closing WebSocket connection');
|
|
453
|
+
websocket.close();
|
|
454
|
+
// Combine committed transcript with any remaining partial transcript
|
|
455
|
+
let finalTranscript = fullTranscript;
|
|
456
|
+
if (lastPartialTranscript) {
|
|
457
|
+
debugLog('Adding remaining partial transcript to final result');
|
|
458
|
+
finalTranscript = finalTranscript
|
|
459
|
+
? `${finalTranscript} ${lastPartialTranscript}`
|
|
460
|
+
: lastPartialTranscript;
|
|
461
|
+
}
|
|
462
|
+
debugLog('Final transcript length:', finalTranscript.length);
|
|
463
|
+
debugLog('Final transcript:', finalTranscript ? `"${finalTranscript}"` : '(empty)');
|
|
464
|
+
console.log(`\n✓ Recording complete: ${elapsedSeconds}s`);
|
|
465
|
+
console.log(`✓ Recording saved to: ${tempFilePath}`);
|
|
466
|
+
console.log('\n✓ Real-time transcription successful!');
|
|
467
|
+
console.log(`\nYou said: "${finalTranscript}"\n`);
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
471
|
+
console.error('\n✗ Test failed:');
|
|
472
|
+
// The error message should already be formatted with helpful information from the service
|
|
473
|
+
// Split by newlines to properly indent multi-line error messages
|
|
474
|
+
const errorLines = errorMessage.split('\n');
|
|
475
|
+
errorLines.forEach(line => {
|
|
476
|
+
if (line.trim()) {
|
|
477
|
+
console.error(` ${line}`);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
console.error('\n Run "blackbox voice configure" to update your API key if needed\n');
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
export const voiceCommand = {
|
|
484
|
+
command: 'voice <action>',
|
|
485
|
+
describe: 'Configure and test voice input',
|
|
486
|
+
builder: (yargs) => yargs
|
|
487
|
+
.positional('action', {
|
|
488
|
+
describe: 'Action to perform',
|
|
489
|
+
type: 'string',
|
|
490
|
+
choices: ['configure', 'test'],
|
|
491
|
+
demandOption: true,
|
|
492
|
+
})
|
|
493
|
+
.example('blackbox voice configure', 'Configure voice input settings')
|
|
494
|
+
.example('blackbox voice test', 'Test voice recording and transcription'),
|
|
495
|
+
handler: async (argv) => {
|
|
496
|
+
const action = argv['action'];
|
|
497
|
+
switch (action) {
|
|
498
|
+
case 'configure':
|
|
499
|
+
await configureVoice();
|
|
500
|
+
break;
|
|
501
|
+
case 'test':
|
|
502
|
+
await testVoice();
|
|
503
|
+
break;
|
|
504
|
+
default:
|
|
505
|
+
console.error(`Unknown action: ${action}`);
|
|
506
|
+
process.exit(1);
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
};
|
|
510
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../../src/commands/voice.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,41 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import { type LoadedSettings } from './settings.js';
|
|
7
|
+
export declare const validateAuthMethod: (authMethod: string, providerName?: string) => string | null;
|
|
7
8
|
export declare const setOpenAIApiKey: (apiKey: string) => void;
|
|
8
9
|
export declare const setOpenAIBaseUrl: (baseUrl: string) => void;
|
|
9
10
|
export declare const setOpenAIModel: (model: string) => void;
|
|
10
11
|
export declare const setBlackboxApiKey: (apiKey: string) => void;
|
|
11
12
|
export declare const setBlackboxApiBaseUrl: (baseUrl: string) => void;
|
|
12
13
|
export declare const setBlackboxApiModel: (model: string) => void;
|
|
14
|
+
export declare const setBlackboxEncryptionBaseUrl: (baseUrl: string) => void;
|
|
15
|
+
export declare const setBlackboxEncryptedModel: (model: string) => void;
|
|
16
|
+
export declare const setOpenRouterApiKey: (apiKey: string) => void;
|
|
17
|
+
export declare const setOpenRouterBaseUrl: (baseUrl: string) => void;
|
|
18
|
+
export declare const setOpenRouterModel: (model: string) => void;
|
|
19
|
+
export declare const setCustomApiKey: (apiKey: string) => void;
|
|
20
|
+
export declare const setCustomBaseUrl: (baseUrl: string) => void;
|
|
21
|
+
export declare const setCustomModel: (model: string) => void;
|
|
22
|
+
export declare const setAnthropicApiKey: (apiKey: string) => void;
|
|
23
|
+
export declare const setAnthropicBaseUrl: (baseUrl: string) => void;
|
|
24
|
+
export declare const setAnthropicModel: (model: string) => void;
|
|
25
|
+
export declare const setGoogleApiKey: (apiKey: string) => void;
|
|
26
|
+
export declare const setGoogleBaseUrl: (baseUrl: string) => void;
|
|
27
|
+
export declare const setGoogleModel: (model: string) => void;
|
|
28
|
+
export declare const setXaiApiKey: (apiKey: string) => void;
|
|
29
|
+
export declare const setXaiBaseUrl: (baseUrl: string) => void;
|
|
30
|
+
export declare const setXaiModel: (model: string) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Save provider credentials to settings file for persistence across sessions
|
|
33
|
+
*/
|
|
34
|
+
export declare const saveProviderCredentials: (settings: LoadedSettings, provider: "openai" | "blackbox" | "blackbox-encrypted" | "openrouter" | "custom" | "anthropic" | "google" | "xai", credentials: {
|
|
35
|
+
apiKey?: string;
|
|
36
|
+
baseUrl?: string;
|
|
37
|
+
model?: string;
|
|
38
|
+
}) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Load provider credentials from settings and set them as environment variables
|
|
41
|
+
* This ensures credentials persist across sessions
|
|
42
|
+
*/
|
|
43
|
+
export declare const loadProviderCredentialsFromSettings: (settings: LoadedSettings) => void;
|