@blackbox_ai/blackbox-cli 0.0.9 → 0.8.2

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.
Files changed (416) hide show
  1. package/README.md +22 -196
  2. package/dist/index.js +8 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +11 -2
  5. package/dist/src/built-in-extensions/conductor/README.md +242 -0
  6. package/dist/src/built-in-extensions/conductor/blackbox-extension.json +5 -0
  7. package/dist/src/built-in-extensions/conductor/commands/conductor/implement.toml +170 -0
  8. package/dist/src/built-in-extensions/conductor/commands/conductor/newTrack.toml +142 -0
  9. package/dist/src/built-in-extensions/conductor/commands/conductor/revert.toml +122 -0
  10. package/dist/src/built-in-extensions/conductor/commands/conductor/setup.toml +424 -0
  11. package/dist/src/built-in-extensions/conductor/commands/conductor/status.toml +57 -0
  12. package/dist/src/built-in-extensions/conductor/templates/code_styleguides/general.md +23 -0
  13. package/dist/src/built-in-extensions/conductor/templates/code_styleguides/go.md +48 -0
  14. package/dist/src/built-in-extensions/conductor/templates/code_styleguides/html-css.md +49 -0
  15. package/dist/src/built-in-extensions/conductor/templates/code_styleguides/javascript.md +51 -0
  16. package/dist/src/built-in-extensions/conductor/templates/code_styleguides/python.md +37 -0
  17. package/dist/src/built-in-extensions/conductor/templates/code_styleguides/typescript.md +43 -0
  18. package/dist/src/built-in-extensions/conductor/templates/workflow.md +333 -0
  19. package/dist/src/built-in-extensions-data.d.ts +15 -0
  20. package/dist/src/built-in-extensions-data.js +61 -0
  21. package/dist/src/built-in-extensions-data.js.map +1 -0
  22. package/dist/src/commands/configure/ConfigureUI.d.ts +5 -2
  23. package/dist/src/commands/configure/ConfigureUI.js +181 -41
  24. package/dist/src/commands/configure/ConfigureUI.js.map +1 -1
  25. package/dist/src/commands/configure/index.js +35 -3
  26. package/dist/src/commands/configure/index.js.map +1 -1
  27. package/dist/src/commands/configure.js +20 -3
  28. package/dist/src/commands/configure.js.map +1 -1
  29. package/dist/src/commands/extensions/enable.js +1 -1
  30. package/dist/src/commands/extensions/enable.js.map +1 -1
  31. package/dist/src/commands/extensions/examples/context/CONTEXT.md +16 -0
  32. package/dist/src/commands/extensions/examples/context/blackbox-extension.json +5 -0
  33. package/dist/src/commands/extensions/examples/custom-commands/blackbox-extension.json +4 -0
  34. package/dist/src/commands/extensions/examples/custom-commands/commands/deploy.toml +12 -0
  35. package/dist/src/commands/extensions/examples/exclude-tools/README.md +28 -0
  36. package/dist/src/commands/extensions/examples/exclude-tools/blackbox-extension.json +5 -0
  37. package/dist/src/commands/extensions/install.d.ts +6 -2
  38. package/dist/src/commands/extensions/install.js +109 -15
  39. package/dist/src/commands/extensions/install.js.map +1 -1
  40. package/dist/src/commands/extensions/link.d.ts +12 -0
  41. package/dist/src/commands/extensions/link.js +53 -0
  42. package/dist/src/commands/extensions/link.js.map +1 -0
  43. package/dist/src/commands/extensions/list.js +2 -2
  44. package/dist/src/commands/extensions/list.js.map +1 -1
  45. package/dist/src/commands/extensions/new.d.ts +13 -0
  46. package/dist/src/commands/extensions/new.js +145 -0
  47. package/dist/src/commands/extensions/new.js.map +1 -0
  48. package/dist/src/commands/extensions/settings.d.ts +18 -0
  49. package/dist/src/commands/extensions/settings.js +98 -0
  50. package/dist/src/commands/extensions/settings.js.map +1 -0
  51. package/dist/src/commands/extensions/update.d.ts +2 -1
  52. package/dist/src/commands/extensions/update.js +59 -10
  53. package/dist/src/commands/extensions/update.js.map +1 -1
  54. package/dist/src/commands/extensions/validate.d.ts +12 -0
  55. package/dist/src/commands/extensions/validate.js +72 -0
  56. package/dist/src/commands/extensions/validate.js.map +1 -0
  57. package/dist/src/commands/extensions.js +10 -1
  58. package/dist/src/commands/extensions.js.map +1 -1
  59. package/dist/src/commands/mcp/add.d.ts +11 -0
  60. package/dist/src/commands/mcp/add.js +61 -7
  61. package/dist/src/commands/mcp/add.js.map +1 -1
  62. package/dist/src/commands/update.d.ts +7 -0
  63. package/dist/src/commands/update.js +103 -0
  64. package/dist/src/commands/update.js.map +1 -0
  65. package/dist/src/commands/voice.d.ts +7 -0
  66. package/dist/src/commands/voice.js +510 -0
  67. package/dist/src/commands/voice.js.map +1 -0
  68. package/dist/src/config/auth.d.ts +4 -2
  69. package/dist/src/config/auth.js +36 -1
  70. package/dist/src/config/auth.js.map +1 -1
  71. package/dist/src/config/config.d.ts +7 -1
  72. package/dist/src/config/config.js +68 -9
  73. package/dist/src/config/config.js.map +1 -1
  74. package/dist/src/config/extension.d.ts +6 -1
  75. package/dist/src/config/extension.js +137 -11
  76. package/dist/src/config/extension.js.map +1 -1
  77. package/dist/src/config/extensions/github.d.ts +48 -0
  78. package/dist/src/config/extensions/github.js +308 -0
  79. package/dist/src/config/extensions/github.js.map +1 -0
  80. package/dist/src/config/keyBindings.d.ts +1 -0
  81. package/dist/src/config/keyBindings.js +3 -0
  82. package/dist/src/config/keyBindings.js.map +1 -1
  83. package/dist/src/config/modelFetcher.js +14 -39
  84. package/dist/src/config/modelFetcher.js.map +1 -1
  85. package/dist/src/config/settings.js +64 -0
  86. package/dist/src/config/settings.js.map +1 -1
  87. package/dist/src/config/settingsSchema.d.ts +351 -0
  88. package/dist/src/config/settingsSchema.js +351 -0
  89. package/dist/src/config/settingsSchema.js.map +1 -1
  90. package/dist/src/config/voice.d.ts +31 -0
  91. package/dist/src/config/voice.js +82 -0
  92. package/dist/src/config/voice.js.map +1 -0
  93. package/dist/src/encrypt/attestation.d.ts +5 -0
  94. package/dist/src/encrypt/attestation.js +100 -0
  95. package/dist/src/encrypt/attestation.js.map +1 -0
  96. package/dist/src/encrypt/bridge.d.ts +30 -0
  97. package/dist/src/encrypt/bridge.js +32 -0
  98. package/dist/src/encrypt/bridge.js.map +1 -0
  99. package/dist/src/encrypt/client.d.ts +14 -0
  100. package/dist/src/encrypt/client.js +133 -0
  101. package/dist/src/encrypt/client.js.map +1 -0
  102. package/dist/src/encrypt/config.d.ts +26 -0
  103. package/dist/src/encrypt/config.js +51 -0
  104. package/dist/src/encrypt/config.js.map +1 -0
  105. package/dist/src/encrypt/crypto-utils.d.ts +57 -0
  106. package/dist/src/encrypt/crypto-utils.js +257 -0
  107. package/dist/src/encrypt/crypto-utils.js.map +1 -0
  108. package/dist/src/encrypt/index.d.ts +12 -0
  109. package/dist/src/encrypt/index.js +13 -0
  110. package/dist/src/encrypt/index.js.map +1 -0
  111. package/dist/src/encrypt/retry-utils.d.ts +20 -0
  112. package/dist/src/encrypt/retry-utils.js +60 -0
  113. package/dist/src/encrypt/retry-utils.js.map +1 -0
  114. package/dist/src/encrypt/sessions.d.ts +17 -0
  115. package/dist/src/encrypt/sessions.js +221 -0
  116. package/dist/src/encrypt/sessions.js.map +1 -0
  117. package/dist/src/encrypt/streaming-client.d.ts +29 -0
  118. package/dist/src/encrypt/streaming-client.js +226 -0
  119. package/dist/src/encrypt/streaming-client.js.map +1 -0
  120. package/dist/src/encrypt/types.d.ts +81 -0
  121. package/dist/src/encrypt/types.js +2 -0
  122. package/dist/src/encrypt/types.js.map +1 -0
  123. package/dist/src/gemini.d.ts +1 -1
  124. package/dist/src/gemini.js +57 -27
  125. package/dist/src/gemini.js.map +1 -1
  126. package/dist/src/generated/git-commit.d.ts +3 -3
  127. package/dist/src/generated/git-commit.js +3 -3
  128. package/dist/src/nonInteractiveCli.d.ts +4 -0
  129. package/dist/src/nonInteractiveCli.js +418 -5
  130. package/dist/src/nonInteractiveCli.js.map +1 -1
  131. package/dist/src/on-demand-extensions/README.md +266 -0
  132. package/dist/src/on-demand-extensions/git-helper/README.md +16 -0
  133. package/dist/src/on-demand-extensions/git-helper/blackbox-extension.json +5 -0
  134. package/dist/src/on-demand-extensions/git-helper/commands/git/branch-cleanup.toml +18 -0
  135. package/dist/src/on-demand-extensions/git-helper/commands/git/smart-commit.toml +22 -0
  136. package/dist/src/on-demand-extensions/greet/README.md +76 -0
  137. package/dist/src/on-demand-extensions/greet/blackbox-extension.json +5 -0
  138. package/dist/src/on-demand-extensions/greet/commands/greet/hello.toml +9 -0
  139. package/dist/src/on-demand-extensions/registry.json +251 -0
  140. package/dist/src/services/BuiltinCommandLoader.js +20 -2
  141. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  142. package/dist/src/services/EncryptedContentGenerator.d.ts +63 -0
  143. package/dist/src/services/EncryptedContentGenerator.js +426 -0
  144. package/dist/src/services/EncryptedContentGenerator.js.map +1 -0
  145. package/dist/src/services/McpCommandLoader.d.ts +24 -0
  146. package/dist/src/services/McpCommandLoader.js +50 -0
  147. package/dist/src/services/McpCommandLoader.js.map +1 -0
  148. package/dist/src/services/McpPromptLoader.js +17 -2
  149. package/dist/src/services/McpPromptLoader.js.map +1 -1
  150. package/dist/src/services/ReleaseNotesCache.d.ts +57 -0
  151. package/dist/src/services/ReleaseNotesCache.js +186 -0
  152. package/dist/src/services/ReleaseNotesCache.js.map +1 -0
  153. package/dist/src/services/elevenLabsErrors.d.ts +65 -0
  154. package/dist/src/services/elevenLabsErrors.js +233 -0
  155. package/dist/src/services/elevenLabsErrors.js.map +1 -0
  156. package/dist/src/services/elevenLabsService.d.ts +62 -0
  157. package/dist/src/services/elevenLabsService.js +186 -0
  158. package/dist/src/services/elevenLabsService.js.map +1 -0
  159. package/dist/src/services/elevenLabsStreamingService.d.ts +59 -0
  160. package/dist/src/services/elevenLabsStreamingService.js +202 -0
  161. package/dist/src/services/elevenLabsStreamingService.js.map +1 -0
  162. package/dist/src/services/elevenLabsTokenService.d.ts +21 -0
  163. package/dist/src/services/elevenLabsTokenService.js +42 -0
  164. package/dist/src/services/elevenLabsTokenService.js.map +1 -0
  165. package/dist/src/services/voiceInputHandler.d.ts +26 -0
  166. package/dist/src/services/voiceInputHandler.js +209 -0
  167. package/dist/src/services/voiceInputHandler.js.map +1 -0
  168. package/dist/src/services/voiceRecordingService.d.ts +69 -0
  169. package/dist/src/services/voiceRecordingService.js +397 -0
  170. package/dist/src/services/voiceRecordingService.js.map +1 -0
  171. package/dist/src/ui/App.d.ts +1 -0
  172. package/dist/src/ui/App.js +412 -63
  173. package/dist/src/ui/App.js.map +1 -1
  174. package/dist/src/ui/commands/browseExtensionsCommand.d.ts +7 -0
  175. package/dist/src/ui/commands/browseExtensionsCommand.js +16 -0
  176. package/dist/src/ui/commands/browseExtensionsCommand.js.map +1 -0
  177. package/dist/src/ui/commands/chatCommand.js +356 -16
  178. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  179. package/dist/src/ui/commands/dbCommand.d.ts +7 -0
  180. package/dist/src/ui/commands/dbCommand.js +37 -0
  181. package/dist/src/ui/commands/dbCommand.js.map +1 -0
  182. package/dist/src/ui/commands/docsCommand.js +1 -1
  183. package/dist/src/ui/commands/docsCommand.js.map +1 -1
  184. package/dist/src/ui/commands/mcpCommand.js +3 -2
  185. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  186. package/dist/src/ui/commands/mcpInvokeCommand.d.ts +16 -0
  187. package/dist/src/ui/commands/mcpInvokeCommand.js +263 -0
  188. package/dist/src/ui/commands/mcpInvokeCommand.js.map +1 -0
  189. package/dist/src/ui/commands/modelCommand.js +79 -5
  190. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  191. package/dist/src/ui/commands/multiAgentCommand.d.ts +7 -0
  192. package/dist/src/ui/commands/multiAgentCommand.js +833 -0
  193. package/dist/src/ui/commands/multiAgentCommand.js.map +1 -0
  194. package/dist/src/ui/commands/multiAgentConfigureCommand.d.ts +7 -0
  195. package/dist/src/ui/commands/multiAgentConfigureCommand.js +17 -0
  196. package/dist/src/ui/commands/multiAgentConfigureCommand.js.map +1 -0
  197. package/dist/src/ui/commands/quitCommand.js +71 -2
  198. package/dist/src/ui/commands/quitCommand.js.map +1 -1
  199. package/dist/src/ui/commands/releasesCommand.d.ts +7 -0
  200. package/dist/src/ui/commands/releasesCommand.js +16 -0
  201. package/dist/src/ui/commands/releasesCommand.js.map +1 -0
  202. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  203. package/dist/src/ui/commands/shellPermissionsCommand.d.ts +7 -0
  204. package/dist/src/ui/commands/shellPermissionsCommand.js +109 -0
  205. package/dist/src/ui/commands/shellPermissionsCommand.js.map +1 -0
  206. package/dist/src/ui/commands/skillCommand.d.ts +7 -0
  207. package/dist/src/ui/commands/skillCommand.js +240 -0
  208. package/dist/src/ui/commands/skillCommand.js.map +1 -0
  209. package/dist/src/ui/commands/statsCommand.js +243 -1
  210. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  211. package/dist/src/ui/commands/tasksCommand.d.ts +7 -0
  212. package/dist/src/ui/commands/tasksCommand.js +535 -0
  213. package/dist/src/ui/commands/tasksCommand.js.map +1 -0
  214. package/dist/src/ui/commands/toolPermissionsCommand.d.ts +7 -0
  215. package/dist/src/ui/commands/toolPermissionsCommand.js +408 -0
  216. package/dist/src/ui/commands/toolPermissionsCommand.js.map +1 -0
  217. package/dist/src/ui/commands/types.d.ts +10 -2
  218. package/dist/src/ui/commands/types.js.map +1 -1
  219. package/dist/src/ui/commands/voiceCommand.d.ts +7 -0
  220. package/dist/src/ui/commands/voiceCommand.js +525 -0
  221. package/dist/src/ui/commands/voiceCommand.js.map +1 -0
  222. package/dist/src/ui/components/AuthDialog.d.ts +5 -4
  223. package/dist/src/ui/components/AuthDialog.js +89 -52
  224. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  225. package/dist/src/ui/components/AuthInProgress.js +3 -1
  226. package/dist/src/ui/components/AuthInProgress.js.map +1 -1
  227. package/dist/src/ui/components/ExtensionsDialog.d.ts +11 -0
  228. package/dist/src/ui/components/ExtensionsDialog.js +303 -0
  229. package/dist/src/ui/components/ExtensionsDialog.js.map +1 -0
  230. package/dist/src/ui/components/GenericProviderKeyPrompt.d.ts +3 -1
  231. package/dist/src/ui/components/GenericProviderKeyPrompt.js +17 -4
  232. package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -1
  233. package/dist/src/ui/components/Header.js +10 -1
  234. package/dist/src/ui/components/Header.js.map +1 -1
  235. package/dist/src/ui/components/HistoryBrowserDialog.d.ts +15 -0
  236. package/dist/src/ui/components/HistoryBrowserDialog.js +166 -0
  237. package/dist/src/ui/components/HistoryBrowserDialog.js.map +1 -0
  238. package/dist/src/ui/components/HistoryItemDisplay.js +13 -1
  239. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  240. package/dist/src/ui/components/InputPrompt.js +22 -8
  241. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  242. package/dist/src/ui/components/LoadingIndicator.d.ts +4 -0
  243. package/dist/src/ui/components/LoadingIndicator.js +16 -4
  244. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  245. package/dist/src/ui/components/LoadingIndicator.test.js +108 -16
  246. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
  247. package/dist/src/ui/components/ModelSelectionDialog.d.ts +2 -0
  248. package/dist/src/ui/components/ModelSelectionDialog.js +33 -4
  249. package/dist/src/ui/components/ModelSelectionDialog.js.map +1 -1
  250. package/dist/src/ui/components/ModelSelectionDialog.test.js +41 -4
  251. package/dist/src/ui/components/ModelSelectionDialog.test.js.map +1 -1
  252. package/dist/src/ui/components/ReleaseNotesDialog.d.ts +23 -0
  253. package/dist/src/ui/components/ReleaseNotesDialog.js +150 -0
  254. package/dist/src/ui/components/ReleaseNotesDialog.js.map +1 -0
  255. package/dist/src/ui/components/ReleaseNotesDisplay.d.ts +18 -0
  256. package/dist/src/ui/components/ReleaseNotesDisplay.js +14 -0
  257. package/dist/src/ui/components/ReleaseNotesDisplay.js.map +1 -0
  258. package/dist/src/ui/components/SessionSummaryDisplay.d.ts +2 -0
  259. package/dist/src/ui/components/SessionSummaryDisplay.js +1 -1
  260. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
  261. package/dist/src/ui/components/SettingsDialog.d.ts +3 -1
  262. package/dist/src/ui/components/SettingsDialog.js +17 -7
  263. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  264. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +2 -0
  265. package/dist/src/ui/components/ShellConfirmationDialog.js +7 -3
  266. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  267. package/dist/src/ui/components/StatsDisplay.d.ts +2 -0
  268. package/dist/src/ui/components/StatsDisplay.js +92 -7
  269. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  270. package/dist/src/ui/components/SuggestionsDisplay.js +6 -1
  271. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  272. package/dist/src/ui/components/ThemeDialog.d.ts +3 -1
  273. package/dist/src/ui/components/ThemeDialog.js +5 -2
  274. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  275. package/dist/src/ui/components/Tips.js +1 -4
  276. package/dist/src/ui/components/Tips.js.map +1 -1
  277. package/dist/src/ui/components/TodoListDialog.d.ts +13 -0
  278. package/dist/src/ui/components/TodoListDialog.js +29 -0
  279. package/dist/src/ui/components/TodoListDialog.js.map +1 -0
  280. package/dist/src/ui/components/TodoListDialog.test.d.ts +6 -0
  281. package/dist/src/ui/components/TodoListDialog.test.js +60 -0
  282. package/dist/src/ui/components/TodoListDialog.test.js.map +1 -0
  283. package/dist/src/ui/components/VoiceConfigDialog.d.ts +17 -0
  284. package/dist/src/ui/components/VoiceConfigDialog.js +47 -0
  285. package/dist/src/ui/components/VoiceConfigDialog.js.map +1 -0
  286. package/dist/src/ui/components/messages/GeminiMessage.js +4 -0
  287. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  288. package/dist/src/ui/components/messages/GeminiMessageContent.js +4 -0
  289. package/dist/src/ui/components/messages/GeminiMessageContent.js.map +1 -1
  290. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +2 -0
  291. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +96 -9
  292. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  293. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +3 -3
  294. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  295. package/dist/src/ui/components/messages/ToolMessage.js +1 -1
  296. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  297. package/dist/src/ui/components/messages/ToolMessage.test.js +9 -12
  298. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  299. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.d.ts +25 -0
  300. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js +179 -0
  301. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js.map +1 -0
  302. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
  303. package/dist/src/ui/components/shared/RadioButtonSelect.js +57 -18
  304. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  305. package/dist/src/ui/components/shared/TextInput.d.ts +2 -1
  306. package/dist/src/ui/components/shared/TextInput.js +5 -2
  307. package/dist/src/ui/components/shared/TextInput.js.map +1 -1
  308. package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js +3 -3
  309. package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js.map +1 -1
  310. package/dist/src/ui/constants.d.ts +3 -3
  311. package/dist/src/ui/constants.js +3 -3
  312. package/dist/src/ui/constants.js.map +1 -1
  313. package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
  314. package/dist/src/ui/contexts/SessionContext.js +24 -2
  315. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  316. package/dist/src/ui/hooks/atCommandProcessor.js +139 -57
  317. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  318. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -1
  319. package/dist/src/ui/hooks/slashCommandProcessor.js +189 -17
  320. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  321. package/dist/src/ui/hooks/useAdaptiveStream.d.ts +42 -0
  322. package/dist/src/ui/hooks/useAdaptiveStream.js +31 -0
  323. package/dist/src/ui/hooks/useAdaptiveStream.js.map +1 -0
  324. package/dist/src/ui/hooks/useAtCompletion.js +20 -4
  325. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  326. package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -2
  327. package/dist/src/ui/hooks/useAuthCommand.js +99 -5
  328. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  329. package/dist/src/ui/hooks/useCommandCompletion.js +14 -10
  330. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  331. package/dist/src/ui/hooks/useDialogClose.d.ts +10 -0
  332. package/dist/src/ui/hooks/useDialogClose.js +25 -0
  333. package/dist/src/ui/hooks/useDialogClose.js.map +1 -1
  334. package/dist/src/ui/hooks/useDialogCloseAnimation.d.ts +22 -0
  335. package/dist/src/ui/hooks/useDialogCloseAnimation.js +68 -0
  336. package/dist/src/ui/hooks/useDialogCloseAnimation.js.map +1 -0
  337. package/dist/src/ui/hooks/useEncryptedStream.d.ts +22 -0
  338. package/dist/src/ui/hooks/useEncryptedStream.js +378 -0
  339. package/dist/src/ui/hooks/useEncryptedStream.js.map +1 -0
  340. package/dist/src/ui/hooks/useExtensionsDialog.d.ts +10 -0
  341. package/dist/src/ui/hooks/useExtensionsDialog.js +21 -0
  342. package/dist/src/ui/hooks/useExtensionsDialog.js.map +1 -0
  343. package/dist/src/ui/hooks/useGeminiStream.js +4 -2
  344. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  345. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  346. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  347. package/dist/src/ui/hooks/useLoadingIndicator.js +3 -2
  348. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  349. package/dist/src/ui/hooks/useLoadingIndicator.test.js +27 -5
  350. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  351. package/dist/src/ui/hooks/useMultiAgentConfigCommand.d.ts +10 -0
  352. package/dist/src/ui/hooks/useMultiAgentConfigCommand.js +21 -0
  353. package/dist/src/ui/hooks/useMultiAgentConfigCommand.js.map +1 -0
  354. package/dist/src/ui/hooks/useReleasesDialog.d.ts +20 -0
  355. package/dist/src/ui/hooks/useReleasesDialog.js +214 -0
  356. package/dist/src/ui/hooks/useReleasesDialog.js.map +1 -0
  357. package/dist/src/ui/hooks/useSlashCompletion.js +10 -8
  358. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  359. package/dist/src/ui/hooks/useTodoList.d.ts +17 -0
  360. package/dist/src/ui/hooks/useTodoList.js +51 -0
  361. package/dist/src/ui/hooks/useTodoList.js.map +1 -0
  362. package/dist/src/ui/keyMatchers.test.js +6 -0
  363. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  364. package/dist/src/ui/themes/blackbox-dark.js +1 -1
  365. package/dist/src/ui/themes/blackbox-dark.js.map +1 -1
  366. package/dist/src/ui/themes/blackbox-light.js +1 -1
  367. package/dist/src/ui/themes/blackbox-light.js.map +1 -1
  368. package/dist/src/ui/types.d.ts +15 -2
  369. package/dist/src/ui/types.js +1 -0
  370. package/dist/src/ui/types.js.map +1 -1
  371. package/dist/src/ui/utils/computeStats.d.ts +25 -1
  372. package/dist/src/ui/utils/computeStats.js +58 -1
  373. package/dist/src/ui/utils/computeStats.js.map +1 -1
  374. package/dist/src/ui/utils/updateCheck.js +37 -54
  375. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  376. package/dist/src/utils/backgroundUpdateCheck.d.ts +15 -0
  377. package/dist/src/utils/backgroundUpdateCheck.js +48 -0
  378. package/dist/src/utils/backgroundUpdateCheck.js.map +1 -0
  379. package/dist/src/utils/gitAutoDetect.d.ts +16 -0
  380. package/dist/src/utils/gitAutoDetect.js +45 -0
  381. package/dist/src/utils/gitAutoDetect.js.map +1 -0
  382. package/dist/src/utils/installationInfo.d.ts +1 -0
  383. package/dist/src/utils/installationInfo.js +24 -4
  384. package/dist/src/utils/installationInfo.js.map +1 -1
  385. package/dist/src/utils/preLaunchUpdateCheck.d.ts +17 -0
  386. package/dist/src/utils/preLaunchUpdateCheck.js +75 -0
  387. package/dist/src/utils/preLaunchUpdateCheck.js.map +1 -0
  388. package/dist/src/utils/version.js +12 -1
  389. package/dist/src/utils/version.js.map +1 -1
  390. package/dist/src/utils/versionStorage.d.ts +50 -0
  391. package/dist/src/utils/versionStorage.js +224 -0
  392. package/dist/src/utils/versionStorage.js.map +1 -0
  393. package/dist/src/validateNonInterActiveAuth.js +10 -3
  394. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  395. package/dist/src/virtual-extensions.d.ts +14 -0
  396. package/dist/src/virtual-extensions.js +56 -0
  397. package/dist/src/virtual-extensions.js.map +1 -0
  398. package/dist/src/zed-integration/fileSystemService.d.ts +3 -3
  399. package/dist/src/zed-integration/fileSystemService.js +5 -7
  400. package/dist/src/zed-integration/fileSystemService.js.map +1 -1
  401. package/dist/src/zed-integration/zedIntegration.js +62 -17
  402. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  403. package/dist/tsconfig.tsbuildinfo +1 -1
  404. package/package.json +11 -2
  405. package/dist/src/utils/handleAutoUpdate.d.ts +0 -11
  406. package/dist/src/utils/handleAutoUpdate.js +0 -102
  407. package/dist/src/utils/handleAutoUpdate.js.map +0 -1
  408. package/dist/src/utils/updateEventEmitter.d.ts +0 -11
  409. package/dist/src/utils/updateEventEmitter.js +0 -12
  410. package/dist/src/utils/updateEventEmitter.js.map +0 -1
  411. package/dist/src/zed-integration/acp.d.ts +0 -63
  412. package/dist/src/zed-integration/acp.js +0 -226
  413. package/dist/src/zed-integration/acp.js.map +0 -1
  414. package/dist/src/zed-integration/schema.d.ts +0 -11782
  415. package/dist/src/zed-integration/schema.js +0 -311
  416. 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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"}
@@ -4,13 +4,15 @@
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) => string | null;
7
+ export declare const validateAuthMethod: (authMethod: string, providerName?: string) => string | null;
8
8
  export declare const setOpenAIApiKey: (apiKey: string) => void;
9
9
  export declare const setOpenAIBaseUrl: (baseUrl: string) => void;
10
10
  export declare const setOpenAIModel: (model: string) => void;
11
11
  export declare const setBlackboxApiKey: (apiKey: string) => void;
12
12
  export declare const setBlackboxApiBaseUrl: (baseUrl: string) => void;
13
13
  export declare const setBlackboxApiModel: (model: string) => void;
14
+ export declare const setBlackboxEncryptionBaseUrl: (baseUrl: string) => void;
15
+ export declare const setBlackboxEncryptedModel: (model: string) => void;
14
16
  export declare const setOpenRouterApiKey: (apiKey: string) => void;
15
17
  export declare const setOpenRouterBaseUrl: (baseUrl: string) => void;
16
18
  export declare const setOpenRouterModel: (model: string) => void;
@@ -29,7 +31,7 @@ export declare const setXaiModel: (model: string) => void;
29
31
  /**
30
32
  * Save provider credentials to settings file for persistence across sessions
31
33
  */
32
- export declare const saveProviderCredentials: (settings: LoadedSettings, provider: "openai" | "blackbox" | "openrouter" | "custom" | "anthropic" | "google" | "xai", credentials: {
34
+ export declare const saveProviderCredentials: (settings: LoadedSettings, provider: "openai" | "blackbox" | "blackbox-encrypted" | "openrouter" | "custom" | "anthropic" | "google" | "xai", credentials: {
33
35
  apiKey?: string;
34
36
  baseUrl?: string;
35
37
  model?: string;
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { AuthType } from '@blackbox_ai/blackbox-cli-core';
7
7
  import { loadEnvironment, SettingScope } from './settings.js';
8
- export const validateAuthMethod = (authMethod) => {
8
+ export const validateAuthMethod = (authMethod, providerName) => {
9
9
  loadEnvironment();
10
10
  if (authMethod === AuthType.LOGIN_WITH_GOOGLE ||
11
11
  authMethod === AuthType.CLOUD_SHELL) {
@@ -41,6 +41,10 @@ export const validateAuthMethod = (authMethod) => {
41
41
  return null;
42
42
  }
43
43
  if (authMethod === AuthType.USE_BLACKBOX_API) {
44
+ // Special case: BlackboxAI Encrypted provider doesn't require an API key
45
+ if (providerName === 'blackbox-encrypted') {
46
+ return null;
47
+ }
44
48
  if (!process.env['BLACKBOX_API_KEY']) {
45
49
  return 'BLACKBOX_API_KEY environment variable not found. You can enter it interactively or add it to your .env file.';
46
50
  }
@@ -66,6 +70,12 @@ export const setBlackboxApiBaseUrl = (baseUrl) => {
66
70
  export const setBlackboxApiModel = (model) => {
67
71
  process.env['BLACKBOX_API_MODEL'] = model;
68
72
  };
73
+ export const setBlackboxEncryptionBaseUrl = (baseUrl) => {
74
+ process.env['BLACKBOX_ENCRYPTION_BASE_URL'] = baseUrl;
75
+ };
76
+ export const setBlackboxEncryptedModel = (model) => {
77
+ process.env['BLACKBOX_ENCRYPTED_MODEL'] = model;
78
+ };
69
79
  export const setOpenRouterApiKey = (apiKey) => {
70
80
  process.env['OPENROUTER_API_KEY'] = apiKey;
71
81
  };
@@ -138,6 +148,17 @@ export const saveProviderCredentials = (settings, provider, credentials) => {
138
148
  settings.setValue(SettingScope.User, 'security.auth.blackbox.model', model);
139
149
  }
140
150
  }
151
+ else if (provider === 'blackbox-encrypted') {
152
+ if (apiKey) {
153
+ settings.setValue(SettingScope.User, 'security.auth.blackbox-encrypted.apiKey', apiKey);
154
+ }
155
+ if (baseUrl) {
156
+ settings.setValue(SettingScope.User, 'security.auth.blackbox-encrypted.baseUrl', baseUrl);
157
+ }
158
+ if (model) {
159
+ settings.setValue(SettingScope.User, 'security.auth.blackbox-encrypted.model', model);
160
+ }
161
+ }
141
162
  else if (provider === 'openrouter') {
142
163
  if (apiKey) {
143
164
  settings.setValue(SettingScope.User, 'security.auth.openrouter.apiKey', apiKey);
@@ -247,6 +268,20 @@ export const loadProviderCredentialsFromSettings = (settings) => {
247
268
  process.env['BLACKBOX_API_MODEL'] = blackboxModel;
248
269
  }
249
270
  }
271
+ else if (selectedProvider === 'blackbox-encrypted') {
272
+ const blackboxEncryptedApiKey = merged.security?.auth?.['blackbox-encrypted']?.apiKey;
273
+ const blackboxEncryptedBaseUrl = merged.security?.auth?.['blackbox-encrypted']?.baseUrl;
274
+ const blackboxEncryptedModel = merged.security?.auth?.['blackbox-encrypted']?.model;
275
+ if (blackboxEncryptedApiKey && !process.env['BLACKBOX_API_KEY']) {
276
+ process.env['BLACKBOX_API_KEY'] = blackboxEncryptedApiKey;
277
+ }
278
+ if (blackboxEncryptedBaseUrl && !process.env['BLACKBOX_ENCRYPTION_BASE_URL']) {
279
+ process.env['BLACKBOX_ENCRYPTION_BASE_URL'] = blackboxEncryptedBaseUrl;
280
+ }
281
+ if (blackboxEncryptedModel && !process.env['BLACKBOX_ENCRYPTED_MODEL']) {
282
+ process.env['BLACKBOX_ENCRYPTED_MODEL'] = blackboxEncryptedModel;
283
+ }
284
+ }
250
285
  else if (selectedProvider === 'custom') {
251
286
  const customApiKey = merged.security?.auth?.custom?.apiKey;
252
287
  const customBaseUrl = merged.security?.auth?.custom?.baseUrl;