@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.
Files changed (416) hide show
  1. package/README.md +11 -183
  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,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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAgB/B;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACpB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,mBAAmB,CAA0B;IAC7C,iBAAiB,CAA0B;IAC3C,OAAO,CAA0B;IAE1C,EAAE,GAAqB,IAAI,CAAC;IAC5B,cAAc,GAAW,EAAE,CAAC;IAC5B,kBAAkB,GAAa,EAAE,CAAC;IAClC,WAAW,GAAY,KAAK,CAAC;IAErC,YAAY,MAAoC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,mEAAmE;gBACnE,0CAA0C;gBAC1C,MAAM,KAAK,GAAG,gDAAgD,CAAC;gBAE/D,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE;oBAC7B,OAAO,EAAE;wBACP,YAAY,EAAE,IAAI,CAAC,MAAM;qBAC1B;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,qDAAqD;oBACrD,MAAM,MAAM,GAAG;wBACb,IAAI,EAAE,qCAAqC;wBAC3C,4BAA4B,EAAE;4BAC5B,KAAK,EAAE;gCACL,MAAM,EAAE;oCACN,MAAM,EAAE,wFAAwF;iCACjG;6BACF;4BACD,GAAG,EAAE;gCACH,QAAQ,EAAE,IAAI,CAAC,KAAK;6BACrB;yBACF;qBACF,CAAC;oBAEF,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;wBACZ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;wBACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;wBACxB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;oBACrC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAE5C,iEAAiE;wBACjE,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;4BACxE,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;4BACjF,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,mCAAmC;4BAE/E,IAAI,IAAI,EAAE,CAAC;gCACT,IAAI,OAAO,EAAE,CAAC;oCACZ,uCAAuC;oCACvC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oCACnC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;oCAC/D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wCAC3B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oCAC/B,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,0CAA0C;oCAC1C,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;wCAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oCACjC,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;4BAC3C,gEAAgE;4BAChE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gCAC7B,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;4BAC/B,CAAC;wBACH,CAAC;6BAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;4BACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,+BAA+B,CAAC;4BACrF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;4BAClC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gCACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;4BACtB,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;oBACzB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACpB,CAAC;oBACD,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;oBACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;oBACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAClB,mBAAmB;wBACnB,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,UAAkB;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC;YACH,sEAAsE;YACtE,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;aACrC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,CAAC;oBACN,QAAQ,EAAE,IAAI,CAAC,cAAc;oBAC7B,YAAY,EAAE,IAAI,CAAC,kBAAkB;iBACtC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,4DAA4D;YAC5D,IAAI,CAAC;gBACH,6DAA6D;gBAC7D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACrD,wCAAwC;YAC1C,CAAC;YAED,sCAAsC;YACtC,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACZ,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;oBACtC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;gBACjB,CAAC;gBAED,OAAO,CAAC;oBACN,QAAQ,EAAE,IAAI,CAAC,cAAc;oBAC7B,YAAY,EAAE,IAAI,CAAC,kBAAkB;iBACtC,CAAC,CAAC;YACL,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,mDAAmD;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;IAC/B,CAAC;CACF"}
@@ -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":"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"}
@@ -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
+ }