@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,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { getErrorMessage } from '@blackbox_ai/blackbox-cli-core';
|
|
7
|
+
import { WebSocket } from 'ws';
|
|
8
|
+
/**
|
|
9
|
+
* Service for real-time streaming transcription using ElevenLabs WebSocket API
|
|
10
|
+
* Based on: https://elevenlabs.io/docs/developers/guides/cookbooks/speech-to-text/streaming
|
|
11
|
+
*/
|
|
12
|
+
export class ElevenLabsStreamingService {
|
|
13
|
+
apiKey;
|
|
14
|
+
model;
|
|
15
|
+
onPartialTranscript;
|
|
16
|
+
onFinalTranscript;
|
|
17
|
+
onError;
|
|
18
|
+
ws = null;
|
|
19
|
+
fullTranscript = '';
|
|
20
|
+
partialTranscripts = [];
|
|
21
|
+
isConnected = false;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.apiKey = config.apiKey;
|
|
24
|
+
this.model = config.model || 'scribe_v2';
|
|
25
|
+
this.onPartialTranscript = config.onPartialTranscript;
|
|
26
|
+
this.onFinalTranscript = config.onFinalTranscript;
|
|
27
|
+
this.onError = config.onError;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start streaming transcription session
|
|
31
|
+
*/
|
|
32
|
+
async startStreaming() {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
try {
|
|
35
|
+
// ElevenLabs WebSocket endpoint - using conversational AI endpoint
|
|
36
|
+
// which supports speech-to-text streaming
|
|
37
|
+
const wsUrl = 'wss://api.elevenlabs.io/v1/convai/conversation';
|
|
38
|
+
this.ws = new WebSocket(wsUrl, {
|
|
39
|
+
headers: {
|
|
40
|
+
'xi-api-key': this.apiKey,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
this.ws.on('open', () => {
|
|
44
|
+
// Send initial configuration for speech-to-text mode
|
|
45
|
+
const config = {
|
|
46
|
+
type: 'conversation_initiation_client_data',
|
|
47
|
+
conversation_config_override: {
|
|
48
|
+
agent: {
|
|
49
|
+
prompt: {
|
|
50
|
+
prompt: 'You are a transcription assistant. Only transcribe what the user says, do not respond.',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
tts: {
|
|
54
|
+
model_id: this.model,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
if (this.ws) {
|
|
59
|
+
this.ws.send(JSON.stringify(config));
|
|
60
|
+
this.isConnected = true;
|
|
61
|
+
resolve();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
this.ws.on('message', (data) => {
|
|
65
|
+
try {
|
|
66
|
+
const message = JSON.parse(data.toString());
|
|
67
|
+
// Handle different message types from conversational AI endpoint
|
|
68
|
+
if (message.type === 'user_transcript' || message.type === 'transcript') {
|
|
69
|
+
const text = message.user_transcript || message.transcript || message.text || '';
|
|
70
|
+
const isFinal = message.is_final !== false; // Default to true if not specified
|
|
71
|
+
if (text) {
|
|
72
|
+
if (isFinal) {
|
|
73
|
+
// Final transcription for this segment
|
|
74
|
+
this.partialTranscripts.push(text);
|
|
75
|
+
this.fullTranscript += (this.fullTranscript ? ' ' : '') + text;
|
|
76
|
+
if (this.onFinalTranscript) {
|
|
77
|
+
this.onFinalTranscript(text);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Partial transcription (interim results)
|
|
82
|
+
if (this.onPartialTranscript) {
|
|
83
|
+
this.onPartialTranscript(text);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (message.type === 'interruption') {
|
|
89
|
+
// User started speaking, clear any previous partial transcripts
|
|
90
|
+
if (this.onPartialTranscript) {
|
|
91
|
+
this.onPartialTranscript('');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (message.type === 'error' || message.error) {
|
|
95
|
+
const errorMsg = message.message || message.error || 'Streaming transcription error';
|
|
96
|
+
const error = new Error(errorMsg);
|
|
97
|
+
if (this.onError) {
|
|
98
|
+
this.onError(error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('Error parsing WebSocket message:', error);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
this.ws.on('error', (error) => {
|
|
107
|
+
this.isConnected = false;
|
|
108
|
+
const err = new Error(`WebSocket error: ${error.message}`);
|
|
109
|
+
if (this.onError) {
|
|
110
|
+
this.onError(err);
|
|
111
|
+
}
|
|
112
|
+
reject(err);
|
|
113
|
+
});
|
|
114
|
+
this.ws.on('close', (code, reason) => {
|
|
115
|
+
this.isConnected = false;
|
|
116
|
+
if (code !== 1000) {
|
|
117
|
+
// Abnormal closure
|
|
118
|
+
console.error(`WebSocket closed with code ${code}: ${reason}`);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
reject(new Error(`Failed to start streaming: ${getErrorMessage(error)}`));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Send audio chunk for transcription
|
|
129
|
+
* Audio should be in the correct format (PCM, 16kHz, mono)
|
|
130
|
+
* @param audioChunk Audio data as Buffer
|
|
131
|
+
*/
|
|
132
|
+
sendAudioChunk(audioChunk) {
|
|
133
|
+
if (!this.ws || !this.isConnected) {
|
|
134
|
+
throw new Error('WebSocket not connected');
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
// For conversational AI endpoint, send audio with proper message type
|
|
138
|
+
const audioMessage = {
|
|
139
|
+
type: 'audio',
|
|
140
|
+
audio: audioChunk.toString('base64'),
|
|
141
|
+
};
|
|
142
|
+
this.ws.send(JSON.stringify(audioMessage));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new Error(`Failed to send audio chunk: ${getErrorMessage(error)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Stop streaming and close connection
|
|
150
|
+
*/
|
|
151
|
+
async stopStreaming() {
|
|
152
|
+
return new Promise((resolve) => {
|
|
153
|
+
if (!this.ws) {
|
|
154
|
+
resolve({
|
|
155
|
+
fullText: this.fullTranscript,
|
|
156
|
+
partialTexts: this.partialTranscripts,
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Send end-of-stream signal (empty buffer or close message)
|
|
161
|
+
try {
|
|
162
|
+
// Some APIs expect an empty buffer or specific close message
|
|
163
|
+
this.ws.send(Buffer.alloc(0));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error('Unable to stop the streaming', error);
|
|
167
|
+
// Ignore errors when sending end signal
|
|
168
|
+
}
|
|
169
|
+
// Wait a bit for final transcriptions
|
|
170
|
+
setTimeout(() => {
|
|
171
|
+
if (this.ws) {
|
|
172
|
+
this.ws.close(1000, 'Normal closure');
|
|
173
|
+
this.ws = null;
|
|
174
|
+
}
|
|
175
|
+
resolve({
|
|
176
|
+
fullText: this.fullTranscript,
|
|
177
|
+
partialTexts: this.partialTranscripts,
|
|
178
|
+
});
|
|
179
|
+
}, 1000); // Increased timeout to ensure we get final results
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get current full transcript
|
|
184
|
+
*/
|
|
185
|
+
getFullTranscript() {
|
|
186
|
+
return this.fullTranscript;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if streaming is active
|
|
190
|
+
*/
|
|
191
|
+
isStreaming() {
|
|
192
|
+
return this.isConnected;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Reset transcript state
|
|
196
|
+
*/
|
|
197
|
+
reset() {
|
|
198
|
+
this.fullTranscript = '';
|
|
199
|
+
this.partialTranscripts = [];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=elevenLabsStreamingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenLabsStreamingService.js","sourceRoot":"","sources":["../../../src/services/elevenLabsStreamingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export interface TokenResponse {
|
|
7
|
+
token: string;
|
|
8
|
+
expiresAt: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Service for generating single-use tokens for ElevenLabs Scribe
|
|
12
|
+
*/
|
|
13
|
+
export declare class ElevenLabsTokenService {
|
|
14
|
+
private readonly apiKey;
|
|
15
|
+
constructor(apiKey: string);
|
|
16
|
+
/**
|
|
17
|
+
* Generate a single-use token for Scribe realtime transcription
|
|
18
|
+
* Token expires after 15 minutes
|
|
19
|
+
*/
|
|
20
|
+
generateScribeToken(): Promise<TokenResponse>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { getErrorMessage } from '@blackbox_ai/blackbox-cli-core';
|
|
7
|
+
/**
|
|
8
|
+
* Service for generating single-use tokens for ElevenLabs Scribe
|
|
9
|
+
*/
|
|
10
|
+
export class ElevenLabsTokenService {
|
|
11
|
+
apiKey;
|
|
12
|
+
constructor(apiKey) {
|
|
13
|
+
this.apiKey = apiKey;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate a single-use token for Scribe realtime transcription
|
|
17
|
+
* Token expires after 15 minutes
|
|
18
|
+
*/
|
|
19
|
+
async generateScribeToken() {
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetch('https://api.elevenlabs.io/v1/single-use-token/realtime_scribe', {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: {
|
|
24
|
+
'xi-api-key': this.apiKey,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
const errorText = await response.text();
|
|
29
|
+
throw new Error(`Failed to generate token: ${response.status} ${response.statusText} - ${errorText}`);
|
|
30
|
+
}
|
|
31
|
+
const data = await response.json();
|
|
32
|
+
return {
|
|
33
|
+
token: data.token,
|
|
34
|
+
expiresAt: data.expires_at || new Date(Date.now() + 15 * 60 * 1000).toISOString(),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw new Error(`Token generation failed: ${getErrorMessage(error)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=elevenLabsTokenService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenLabsTokenService.js","sourceRoot":"","sources":["../../../src/services/elevenLabsTokenService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAOjE;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAChB,MAAM,CAAS;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,+DAA+D,EAC/D;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,MAAM;iBAC1B;aACF,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CACrF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;aAClF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Settings } from '../config/settings.js';
|
|
7
|
+
export interface VoiceInputOptions {
|
|
8
|
+
settings: Settings;
|
|
9
|
+
language?: string;
|
|
10
|
+
onRecordingStart?: () => void;
|
|
11
|
+
onRecordingStop?: () => void;
|
|
12
|
+
onTranscriptionStart?: () => void;
|
|
13
|
+
onTranscriptionComplete?: (text: string) => void;
|
|
14
|
+
onError?: (error: Error) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Handle voice input: record audio and transcribe to text
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleVoiceInput(options: VoiceInputOptions): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if voice input is properly configured
|
|
22
|
+
*/
|
|
23
|
+
export declare function isVoiceConfigured(settings: Settings): Promise<{
|
|
24
|
+
configured: boolean;
|
|
25
|
+
errors: string[];
|
|
26
|
+
}>;
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { getErrorMessage } from '@blackbox_ai/blackbox-cli-core';
|
|
7
|
+
import { ElevenLabsService } from './elevenLabsService.js';
|
|
8
|
+
import { VoiceRecordingService } from './voiceRecordingService.js';
|
|
9
|
+
// Debug mode flag - can be set via environment variable
|
|
10
|
+
const DEBUG_MODE = process.env['DEBUG'] === 'true' || process.env['DEBUG'] === '1' || process.env['DEBUG_MODE'] === 'true' || process.env['DEBUG_MODE'] === '1';
|
|
11
|
+
function debugLog(...args) {
|
|
12
|
+
if (DEBUG_MODE) {
|
|
13
|
+
console.debug('[DEBUG][VoiceInputHandler]', ...args);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function sanitizeApiKey(apiKey) {
|
|
17
|
+
if (apiKey.length <= 8)
|
|
18
|
+
return '***';
|
|
19
|
+
return `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Handle voice input: record audio and transcribe to text
|
|
23
|
+
*/
|
|
24
|
+
export async function handleVoiceInput(options) {
|
|
25
|
+
const { settings, language, onRecordingStart, onRecordingStop, onTranscriptionStart, onTranscriptionComplete, onError, } = options;
|
|
26
|
+
debugLog('handleVoiceInput called');
|
|
27
|
+
try {
|
|
28
|
+
// Get API key from settings or environment
|
|
29
|
+
const apiKey = settings.voice?.elevenLabs?.apiKey || process.env['ELEVENLABS_API_KEY'];
|
|
30
|
+
if (!apiKey) {
|
|
31
|
+
debugLog('No API key found');
|
|
32
|
+
throw new Error('ElevenLabs API key not configured. Run: blackbox voice configure');
|
|
33
|
+
}
|
|
34
|
+
debugLog('API key found:', sanitizeApiKey(apiKey));
|
|
35
|
+
debugLog('Voice settings:', {
|
|
36
|
+
sampleRate: settings.voice?.sampleRate,
|
|
37
|
+
audioFormat: settings.voice?.audioFormat,
|
|
38
|
+
language: language || settings.voice?.language,
|
|
39
|
+
});
|
|
40
|
+
// Initialize services
|
|
41
|
+
const voiceService = new VoiceRecordingService({
|
|
42
|
+
sampleRate: settings.voice?.sampleRate,
|
|
43
|
+
audioFormat: settings.voice?.audioFormat,
|
|
44
|
+
silenceThreshold: settings.voice?.silenceThreshold,
|
|
45
|
+
silenceDuration: settings.voice?.silenceDuration,
|
|
46
|
+
});
|
|
47
|
+
// Start recording
|
|
48
|
+
debugLog('Starting recording...');
|
|
49
|
+
if (onRecordingStart) {
|
|
50
|
+
onRecordingStart();
|
|
51
|
+
}
|
|
52
|
+
// Create temporary file path for recording
|
|
53
|
+
const os = await import('node:os');
|
|
54
|
+
const path = await import('node:path');
|
|
55
|
+
const tempFilePath = path.join(os.tmpdir(), `voice-recording-${Date.now()}.${settings.voice?.audioFormat || 'wav'}`);
|
|
56
|
+
// Start recording (will continue until stopped)
|
|
57
|
+
debugLog('Recording to file:', tempFilePath);
|
|
58
|
+
await voiceService.startRecording(tempFilePath);
|
|
59
|
+
let filePath;
|
|
60
|
+
try {
|
|
61
|
+
// Wait for user to press Enter to stop recording
|
|
62
|
+
debugLog('Waiting for user to stop recording...');
|
|
63
|
+
await waitForEnterKey();
|
|
64
|
+
// Stop recording
|
|
65
|
+
debugLog('Stopping recording...');
|
|
66
|
+
const result = await voiceService.stopRecording();
|
|
67
|
+
filePath = result.filePath;
|
|
68
|
+
debugLog('Recording stopped. File:', filePath, 'Size:', result.size, 'bytes, Duration:', result.duration, 's');
|
|
69
|
+
if (onRecordingStop) {
|
|
70
|
+
onRecordingStop();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Handle cancellation (Ctrl+C or ESC)
|
|
75
|
+
debugLog('Recording cancelled:', getErrorMessage(error));
|
|
76
|
+
await voiceService.cancelRecording();
|
|
77
|
+
if (onRecordingStop) {
|
|
78
|
+
onRecordingStop();
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
// Transcribe audio
|
|
83
|
+
debugLog('Starting transcription...');
|
|
84
|
+
if (onTranscriptionStart) {
|
|
85
|
+
onTranscriptionStart();
|
|
86
|
+
}
|
|
87
|
+
const elevenLabsService = new ElevenLabsService({
|
|
88
|
+
apiKey,
|
|
89
|
+
agentId: settings.voice?.elevenLabs?.agentId,
|
|
90
|
+
model: settings.voice?.elevenLabs?.model,
|
|
91
|
+
language: language || settings.voice?.language,
|
|
92
|
+
});
|
|
93
|
+
debugLog('Calling ElevenLabs transcription service...');
|
|
94
|
+
const transcription = await elevenLabsService.transcribe(filePath);
|
|
95
|
+
debugLog('Transcription received, length:', transcription.text.length);
|
|
96
|
+
debugLog('Transcription text:', transcription.text ? `"${transcription.text}"` : '(empty)');
|
|
97
|
+
// Cleanup audio file
|
|
98
|
+
const fs = await import('node:fs');
|
|
99
|
+
try {
|
|
100
|
+
debugLog('Cleaning up audio file:', filePath);
|
|
101
|
+
fs.unlinkSync(filePath);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Ignore cleanup errors
|
|
105
|
+
debugLog('Failed to cleanup audio file:', getErrorMessage(error));
|
|
106
|
+
console.warn('Failed to cleanup audio file:', error);
|
|
107
|
+
}
|
|
108
|
+
if (onTranscriptionComplete) {
|
|
109
|
+
onTranscriptionComplete(transcription.text);
|
|
110
|
+
}
|
|
111
|
+
debugLog('Voice input completed successfully');
|
|
112
|
+
return transcription.text;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const errorMessage = getErrorMessage(error);
|
|
116
|
+
debugLog('Voice input error:', errorMessage);
|
|
117
|
+
// The error message from ElevenLabsService already contains formatted error info
|
|
118
|
+
// Just wrap it with a prefix for context
|
|
119
|
+
const enhancedMessage = `Voice input failed: ${errorMessage}`;
|
|
120
|
+
const err = new Error(enhancedMessage);
|
|
121
|
+
if (onError) {
|
|
122
|
+
onError(err);
|
|
123
|
+
}
|
|
124
|
+
throw err;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Wait for user to press Enter key
|
|
129
|
+
*/
|
|
130
|
+
async function waitForEnterKey() {
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
const stdin = process.stdin;
|
|
133
|
+
stdin.setRawMode(true);
|
|
134
|
+
stdin.resume();
|
|
135
|
+
stdin.setEncoding('utf8');
|
|
136
|
+
const onData = (key) => {
|
|
137
|
+
// Check for Enter key (carriage return or newline)
|
|
138
|
+
if (key === '\r' || key === '\n') {
|
|
139
|
+
stdin.setRawMode(false);
|
|
140
|
+
stdin.pause();
|
|
141
|
+
stdin.removeListener('data', onData);
|
|
142
|
+
resolve();
|
|
143
|
+
}
|
|
144
|
+
// Check for Ctrl+C to cancel
|
|
145
|
+
if (key === '\u0003') {
|
|
146
|
+
stdin.setRawMode(false);
|
|
147
|
+
stdin.pause();
|
|
148
|
+
stdin.removeListener('data', onData);
|
|
149
|
+
reject(new Error('Recording cancelled'));
|
|
150
|
+
}
|
|
151
|
+
// Check for ESC key to cancel
|
|
152
|
+
if (key === '\u001b') {
|
|
153
|
+
stdin.setRawMode(false);
|
|
154
|
+
stdin.pause();
|
|
155
|
+
stdin.removeListener('data', onData);
|
|
156
|
+
reject(new Error('Recording cancelled'));
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
stdin.on('data', onData);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if voice input is properly configured
|
|
164
|
+
*/
|
|
165
|
+
export async function isVoiceConfigured(settings) {
|
|
166
|
+
debugLog('Checking voice configuration...');
|
|
167
|
+
const errors = [];
|
|
168
|
+
// Check API key
|
|
169
|
+
const apiKey = settings.voice?.elevenLabs?.apiKey || process.env['ELEVENLABS_API_KEY'];
|
|
170
|
+
if (!apiKey) {
|
|
171
|
+
debugLog('No API key found in configuration');
|
|
172
|
+
errors.push('ElevenLabs API key not configured');
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
debugLog('API key found:', sanitizeApiKey(apiKey));
|
|
176
|
+
}
|
|
177
|
+
// Validate API key if available
|
|
178
|
+
if (apiKey) {
|
|
179
|
+
try {
|
|
180
|
+
debugLog('Validating API key...');
|
|
181
|
+
const elevenLabsService = new ElevenLabsService({ apiKey });
|
|
182
|
+
const validation = await elevenLabsService.validateApiKeyDetailed();
|
|
183
|
+
debugLog('API key validation result:', validation.valid ? 'valid' : 'invalid');
|
|
184
|
+
if (!validation.valid) {
|
|
185
|
+
// Use the formatted error message from validation result
|
|
186
|
+
if (validation.error) {
|
|
187
|
+
debugLog('Validation error:', validation.error);
|
|
188
|
+
errors.push(validation.error);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
debugLog('Validation failed with no specific error');
|
|
192
|
+
errors.push('ElevenLabs API key validation failed');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
const errorMsg = `Failed to validate API key: ${getErrorMessage(error)}`;
|
|
198
|
+
debugLog('Validation exception:', errorMsg);
|
|
199
|
+
errors.push(errorMsg);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const configured = errors.length === 0;
|
|
203
|
+
debugLog('Voice configuration check complete. Configured:', configured, 'Errors:', errors.length);
|
|
204
|
+
return {
|
|
205
|
+
configured,
|
|
206
|
+
errors,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=voiceInputHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voiceInputHandler.js","sourceRoot":"","sources":["../../../src/services/voiceInputHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,wDAAwD;AACxD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC;AAEhK,SAAS,QAAQ,CAAC,GAAG,IAAe;IAClC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC;AAYD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA0B;IAE1B,MAAM,EACJ,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,OAAO,GACR,GAAG,OAAO,CAAC;IAEZ,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,2CAA2C;QAC3C,MAAM,MAAM,GACV,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAE1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,QAAQ,CAAC,iBAAiB,EAAE;YAC1B,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU;YACtC,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW;YACxC,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ;SAC/C,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC;YAC7C,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU;YACtC,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,WAA4B;YACzD,gBAAgB,EAAE,QAAQ,CAAC,KAAK,EAAE,gBAAgB;YAClD,eAAe,EAAE,QAAQ,CAAC,KAAK,EAAE,eAAe;SACjD,CAAC,CAAC;QAEH,kBAAkB;QAClB,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAClC,IAAI,gBAAgB,EAAE,CAAC;YACrB,gBAAgB,EAAE,CAAC;QACrB,CAAC;QAED,2CAA2C;QAC3C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,EAAE,CAAC,MAAM,EAAE,EACX,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,CACxE,CAAC;QAEF,gDAAgD;QAChD,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;QAC7C,MAAM,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAEhD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,iDAAiD;YACjD,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YAClD,MAAM,eAAe,EAAE,CAAC;YAExB,iBAAiB;YACjB,QAAQ,CAAC,uBAAuB,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC;YAClD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,0BAA0B,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAE/G,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,QAAQ,CAAC,sBAAsB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;YACrC,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;YACpB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,QAAQ,CAAC,2BAA2B,CAAC,CAAC;QACtC,IAAI,oBAAoB,EAAE,CAAC;YACzB,oBAAoB,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;YAC9C,MAAM;YACN,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO;YAC5C,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK;YACxC,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ;SAC/C,CAAC,CAAC;QAEH,QAAQ,CAAC,6CAA6C,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnE,QAAQ,CAAC,iCAAiC,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvE,QAAQ,CAAC,qBAAqB,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE5F,qBAAqB;QACrB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,QAAQ,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;YAC9C,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wBAAwB;YACxB,QAAQ,CAAC,+BAA+B,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,uBAAuB,EAAE,CAAC;YAC5B,uBAAuB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,QAAQ,CAAC,oCAAoC,CAAC,CAAC;QAC/C,OAAO,aAAa,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAC5C,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;QAE7C,iFAAiF;QACjF,yCAAyC;QACzC,MAAM,eAAe,GAAG,uBAAuB,YAAY,EAAE,CAAC;QAE9D,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;YAC7B,mDAAmD;YACnD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,6BAA6B;YAC7B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,8BAA8B;YAC9B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAkB;IAIxD,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,gBAAgB;IAChB,MAAM,MAAM,GACV,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,QAAQ,CAAC,mCAAmC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,QAAQ,CAAC,uBAAuB,CAAC,CAAC;YAClC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,MAAM,UAAU,GAA2B,MAAM,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;YAE5F,QAAQ,CAAC,4BAA4B,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAE/E,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,yDAAyD;gBACzD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,0CAA0C,CAAC,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,+BAA+B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,QAAQ,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,iDAAiD,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAElG,OAAO;QACL,UAAU;QACV,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export interface VoiceRecordingConfig {
|
|
7
|
+
sampleRate?: number;
|
|
8
|
+
channels?: number;
|
|
9
|
+
audioFormat?: 'wav' | 'mp3';
|
|
10
|
+
silenceThreshold?: number;
|
|
11
|
+
silenceDuration?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface RecordingResult {
|
|
14
|
+
filePath: string;
|
|
15
|
+
duration: number;
|
|
16
|
+
size: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Service for recording audio from microphone
|
|
20
|
+
* Uses ffmpeg directly for cross-platform audio recording
|
|
21
|
+
*/
|
|
22
|
+
export declare class VoiceRecordingService {
|
|
23
|
+
private readonly sampleRate;
|
|
24
|
+
private readonly channels;
|
|
25
|
+
private readonly audioFormat;
|
|
26
|
+
private ffmpegProcess;
|
|
27
|
+
private outputFilePath;
|
|
28
|
+
private fileStream;
|
|
29
|
+
private startTime;
|
|
30
|
+
private audioStream;
|
|
31
|
+
constructor(config?: VoiceRecordingConfig);
|
|
32
|
+
/**
|
|
33
|
+
* List available audio input devices on Windows using DirectShow
|
|
34
|
+
*/
|
|
35
|
+
private listWindowsAudioDevices;
|
|
36
|
+
/**
|
|
37
|
+
* Get the appropriate ffmpeg input device and format based on platform
|
|
38
|
+
*/
|
|
39
|
+
private getInputDeviceConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Start recording audio from microphone
|
|
42
|
+
* Recording continues until stopRecording() is called
|
|
43
|
+
* @param outputPath Optional custom output path. If not provided, audio will only be streamed via callback
|
|
44
|
+
* @param onAudioChunk Optional callback for streaming audio chunks
|
|
45
|
+
* @returns Promise that resolves with the output file path when recording starts (or empty string if no file)
|
|
46
|
+
*/
|
|
47
|
+
startRecording(outputPath?: string, onAudioChunk?: (chunk: Buffer) => void): Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* Parse ffmpeg error messages to provide helpful feedback
|
|
50
|
+
*/
|
|
51
|
+
private parseFFmpegError;
|
|
52
|
+
/**
|
|
53
|
+
* Stop the current recording
|
|
54
|
+
* @returns Recording result with file path and metadata (file path will be empty if no file was created)
|
|
55
|
+
*/
|
|
56
|
+
stopRecording(): Promise<RecordingResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Check if recording is currently in progress
|
|
59
|
+
*/
|
|
60
|
+
isRecording(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Cancel the current recording and delete the file if it exists
|
|
63
|
+
*/
|
|
64
|
+
cancelRecording(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Clean up recording resources
|
|
67
|
+
*/
|
|
68
|
+
private cleanup;
|
|
69
|
+
}
|