@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
@@ -8,19 +8,23 @@ import { useCallback, useEffect, useMemo, useState, useRef } from 'react';
8
8
  import { Box, measureElement, Static, Text, useStdin, useStdout, } from 'ink';
9
9
  import { StreamingState, MessageType, ToolCallStatus, } from './types.js';
10
10
  import { useTerminalSize } from './hooks/useTerminalSize.js';
11
- import { useGeminiStream } from './hooks/useGeminiStream.js';
11
+ import { useAdaptiveStream } from './hooks/useAdaptiveStream.js';
12
12
  import { useLoadingIndicator } from './hooks/useLoadingIndicator.js';
13
+ import { useTodoList } from './hooks/useTodoList.js';
13
14
  import { useThemeCommand } from './hooks/useThemeCommand.js';
14
15
  import { useAuthCommand } from './hooks/useAuthCommand.js';
16
+ import { useReleasesDialog } from './hooks/useReleasesDialog.js';
15
17
  import { useBlackboxAuth } from './hooks/useBlackboxAuth.js';
16
18
  import { useFolderTrust } from './hooks/useFolderTrust.js';
17
19
  import { useEditorSettings } from './hooks/useEditorSettings.js';
18
20
  import { useQuitConfirmation } from './hooks/useQuitConfirmation.js';
19
21
  import { useWelcomeBack } from './hooks/useWelcomeBack.js';
20
22
  import { useDialogClose } from './hooks/useDialogClose.js';
23
+ import { useDialogCloseAnimation } from './hooks/useDialogCloseAnimation.js';
21
24
  import { useSlashCommandProcessor } from './hooks/slashCommandProcessor.js';
22
25
  import { useSubagentCreateDialog } from './hooks/useSubagentCreateDialog.js';
23
26
  import { useAgentsManagerDialog } from './hooks/useAgentsManagerDialog.js';
27
+ import { useMultiAgentConfigCommand } from './hooks/useMultiAgentConfigCommand.js';
24
28
  import { useAutoAcceptIndicator } from './hooks/useAutoAcceptIndicator.js';
25
29
  import { useMessageQueue } from './hooks/useMessageQueue.js';
26
30
  import { useConsoleMessages } from './hooks/useConsoleMessages.js';
@@ -31,6 +35,7 @@ import { ShellModeIndicator } from './components/ShellModeIndicator.js';
31
35
  import { InputPrompt } from './components/InputPrompt.js';
32
36
  import { Footer } from './components/Footer.js';
33
37
  import { ThemeDialog } from './components/ThemeDialog.js';
38
+ import { ReleaseNotesDialog } from './components/ReleaseNotesDialog.js';
34
39
  import { AuthDialog } from './components/AuthDialog.js';
35
40
  import { AuthInProgress } from './components/AuthInProgress.js';
36
41
  import { BlackboxOAuthProgress } from './components/BlackboxOAuthProgress.js';
@@ -42,8 +47,10 @@ import { RadioButtonSelect } from './components/shared/RadioButtonSelect.js';
42
47
  import { ModelSelectionDialog } from './components/ModelSelectionDialog.js';
43
48
  import { ModelSwitchDialog, } from './components/ModelSwitchDialog.js';
44
49
  import { getOpenAIAvailableModelFromEnv, getFilteredBlackboxModels, } from './models/availableModels.js';
50
+ import { HistoryBrowserDialog } from './components/HistoryBrowserDialog.js';
45
51
  import { processVisionSwitchOutcome } from './hooks/useVisionAutoSwitch.js';
46
52
  import { AgentCreationWizard, AgentsManagerDialog, } from './components/subagents/index.js';
53
+ import { MultiAgentConfigDialog } from './components/multiagent/MultiAgentConfigDialog.js';
47
54
  import { Colors } from './colors.js';
48
55
  import { loadHierarchicalGeminiMemory } from '../config/config.js';
49
56
  import { SettingScope } from '../config/settings.js';
@@ -56,7 +63,6 @@ import { ContextSummaryDisplay } from './components/ContextSummaryDisplay.js';
56
63
  import { useHistory } from './hooks/useHistoryManager.js';
57
64
  import process from 'node:process';
58
65
  import { ApprovalMode, getAllGeminiMdFilenames, isEditorAvailable, getErrorMessage, AuthType, logFlashFallback, FlashFallbackEvent, ideContext, isProQuotaExceededError, isGenericQuotaExceededError, UserTierId, } from '@blackbox_ai/blackbox-cli-core';
59
- import { IdeIntegrationNudge } from './IdeIntegrationNudge.js';
60
66
  import { validateAuthMethod } from '../config/auth.js';
61
67
  import { useLogger } from './hooks/useLogger.js';
62
68
  import { StreamingContext } from './contexts/StreamingContext.js';
@@ -79,12 +85,16 @@ import { ShowMoreLines } from './components/ShowMoreLines.js';
79
85
  import { PrivacyNotice } from './privacy/PrivacyNotice.js';
80
86
  import { useSettingsCommand } from './hooks/useSettingsCommand.js';
81
87
  import { SettingsDialog } from './components/SettingsDialog.js';
82
- import { setUpdateHandler } from '../utils/handleAutoUpdate.js';
88
+ import { ExtensionsDialog } from './components/ExtensionsDialog.js';
89
+ import { useExtensionsDialog } from './hooks/useExtensionsDialog.js';
83
90
  import { appEvents, AppEvent } from '../utils/events.js';
84
91
  import { isNarrowWidth } from './utils/isNarrowWidth.js';
85
92
  import { useWorkspaceMigration } from './hooks/useWorkspaceMigration.js';
86
93
  import { WorkspaceMigrationDialog } from './components/WorkspaceMigrationDialog.js';
87
94
  import { WelcomeBackDialog } from './components/WelcomeBackDialog.js';
95
+ import { TodoListDialog } from './components/TodoListDialog.js';
96
+ import { ConfigureUI } from '../commands/configure/ConfigureUI.js';
97
+ import { VoiceConfigDialog } from './components/VoiceConfigDialog.js';
88
98
  // Maximum number of queued messages to display in UI to prevent performance issues
89
99
  const MAX_DISPLAYED_QUEUED_MESSAGES = 3;
90
100
  function isToolExecuting(pendingHistoryItems) {
@@ -100,26 +110,36 @@ export const AppWrapper = (props) => {
100
110
  const nodeMajorVersion = parseInt(process.versions.node.split('.')[0], 10);
101
111
  return (_jsx(KeypressProvider, { kittyProtocolEnabled: kittyProtocolStatus.enabled, pasteWorkaround: process.platform === 'win32' || nodeMajorVersion < 20, config: props.config, debugKeystrokeLogging: props.settings.merged.general?.debugKeystrokeLogging, children: _jsx(SessionStatsProvider, { children: _jsx(VimModeProvider, { settings: props.settings, children: _jsx(App, { ...props }) }) }) }));
102
112
  };
103
- const App = ({ config, settings, startupWarnings = [], version }) => {
113
+ // Wrapper component to add animation to ShellConfirmationDialog
114
+ const ShellConfirmationDialogWithAnimation = ({ request }) => {
115
+ // Animation hook for shell confirmation dialog
116
+ const shellDialogAnimation = useDialogCloseAnimation(() => {
117
+ // Close handler - will be called after animation
118
+ // The original onConfirm already handles closing via setShellConfirmationRequest(null)
119
+ });
120
+ // Wrap the onConfirm to trigger animation before calling original
121
+ const wrappedRequest = {
122
+ ...request,
123
+ onConfirm: (outcome, approvedCommands) => {
124
+ // Start animation first
125
+ shellDialogAnimation.startClosing();
126
+ // Then call original handler (which closes the dialog)
127
+ request.onConfirm(outcome, approvedCommands);
128
+ },
129
+ };
130
+ return (_jsx(ShellConfirmationDialog, { request: wrappedRequest, isClosing: shellDialogAnimation.isClosing }));
131
+ };
132
+ const App = ({ config, settings, startupWarnings = [], version, initialSlashCommand, }) => {
104
133
  const isFocused = useFocus();
105
134
  useBracketedPaste();
106
- const [updateInfo, setUpdateInfo] = useState(null);
135
+ const [updateInfo, _setUpdateInfo] = useState(null);
107
136
  const { stdout } = useStdout();
108
137
  const nightly = version.includes('nightly');
109
138
  const { history, addItem, clearItems, loadHistory } = useHistory();
110
- const [idePromptAnswered, setIdePromptAnswered] = useState(false);
111
- const currentIDE = config.getIdeClient().getCurrentIde();
112
- useEffect(() => {
113
- registerCleanup(() => config.getIdeClient().disconnect());
114
- }, [config]);
115
- const shouldShowIdePrompt = currentIDE &&
116
- !config.getIdeMode() &&
117
- !settings.merged.ide?.hasSeenNudge &&
118
- !idePromptAnswered;
119
- useEffect(() => {
120
- const cleanup = setUpdateHandler(addItem, setUpdateInfo);
121
- return cleanup;
122
- }, [addItem]);
139
+ // const currentIDE = config.getIdeClient().getCurrentIde();
140
+ // useEffect(() => {
141
+ // registerCleanup(() => config.getIdeClient().disconnect());
142
+ // }, [config]);
123
143
  const { consoleMessages, handleNewMessage, clearConsoleMessages: clearConsoleMessagesState, } = useConsoleMessages();
124
144
  useEffect(() => {
125
145
  const consolePatcher = new ConsolePatcher({
@@ -160,6 +180,10 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
160
180
  const [ideContextState, setIdeContextState] = useState();
161
181
  const [showEscapePrompt, setShowEscapePrompt] = useState(false);
162
182
  const [isProcessing, setIsProcessing] = useState(false);
183
+ const [showTodoListDialog, setShowTodoListDialog] = useState(false);
184
+ const [isVoiceConfigDialogOpen, setIsVoiceConfigDialogOpen] = useState(false);
185
+ // Releases dialog hook
186
+ const { isReleasesDialogOpen, openReleasesDialog, closeReleasesDialog, releasesVersions, isReleasesLoading, } = useReleasesDialog();
163
187
  const { showWorkspaceMigrationDialog, workspaceExtensions, onWorkspaceMigrationDialogOpen, onWorkspaceMigrationDialogClose, } = useWorkspaceMigration(settings);
164
188
  // Model selection dialog states
165
189
  const [isModelSelectionDialogOpen, setIsModelSelectionDialogOpen] = useState(false);
@@ -193,6 +217,74 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
193
217
  const openPrivacyNotice = useCallback(() => {
194
218
  setShowPrivacyNotice(true);
195
219
  }, []);
220
+ const [isDbConfigureDialogOpen, setIsDbConfigureDialogOpen] = useState(false);
221
+ const openDbConfigureDialog = useCallback(() => {
222
+ setIsDbConfigureDialogOpen(true);
223
+ }, []);
224
+ const closeDbConfigureDialog = useCallback(() => {
225
+ setIsDbConfigureDialogOpen(false);
226
+ }, []);
227
+ // Cancel DB configure - closes dialog AND resolves the pending promise with null
228
+ const cancelDbConfigure = useCallback(() => {
229
+ setIsDbConfigureDialogOpen(false);
230
+ // Resolve the pending promise with null to signal cancellation
231
+ dbConfigureRequestRef.current?.resolve(null);
232
+ dbConfigureRequestRef.current = null;
233
+ }, []);
234
+ const inferDbTypeFromUri = useCallback((connectionUri) => {
235
+ const trimmed = connectionUri.trim();
236
+ if (!trimmed)
237
+ return undefined;
238
+ try {
239
+ const url = new URL(trimmed);
240
+ const protocol = url.protocol.replace(':', '').toLowerCase();
241
+ if (protocol === 'postgres' || protocol === 'postgresql')
242
+ return 'postgres';
243
+ if (protocol === 'mysql')
244
+ return 'mysql';
245
+ if (protocol === 'mongodb' || protocol === 'mongodb+srv')
246
+ return 'mongodb';
247
+ if (protocol === 'redis' || protocol === 'rediss')
248
+ return 'redis';
249
+ return undefined;
250
+ }
251
+ catch {
252
+ return undefined;
253
+ }
254
+ }, []);
255
+ const dbConfigureRequestRef = useRef(null);
256
+ const openDbConfigureDialogAsync = useCallback(() => {
257
+ if (dbConfigureRequestRef.current) {
258
+ return dbConfigureRequestRef.current.promise;
259
+ }
260
+ let resolve;
261
+ const promise = new Promise((res) => {
262
+ resolve = res;
263
+ });
264
+ dbConfigureRequestRef.current = { promise, resolve };
265
+ openDbConfigureDialog();
266
+ return promise;
267
+ }, [openDbConfigureDialog]);
268
+ const completeDbConfigure = useCallback(() => {
269
+ closeDbConfigureDialog();
270
+ const connectionUri = (process.env['DB_CONNECTION_URI'] || '').trim();
271
+ const dbType = connectionUri ? inferDbTypeFromUri(connectionUri) : undefined;
272
+ const result = connectionUri && dbType ? { dbType, connectionUri } : null;
273
+ dbConfigureRequestRef.current?.resolve(result);
274
+ dbConfigureRequestRef.current = null;
275
+ addItem({
276
+ type: MessageType.INFO,
277
+ text: '✓ DB connection saved in env variable DB_CONNECTION_URI and not passed to the agent directly.',
278
+ }, Date.now());
279
+ }, [addItem, closeDbConfigureDialog, inferDbTypeFromUri]);
280
+ useEffect(() => {
281
+ config.setInteractiveUiActions({
282
+ sqlDbConfigure: openDbConfigureDialogAsync,
283
+ });
284
+ return () => {
285
+ config.setInteractiveUiActions(undefined);
286
+ };
287
+ }, [config, openDbConfigureDialogAsync]);
196
288
  const handleEscapePromptChange = useCallback((showPrompt) => {
197
289
  setShowEscapePrompt(showPrompt);
198
290
  }, []);
@@ -200,18 +292,87 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
200
292
  const errorCount = useMemo(() => consoleMessages
201
293
  .filter((msg) => msg.type === 'error')
202
294
  .reduce((total, msg) => total + msg.count, 0), [consoleMessages]);
203
- const { isThemeDialogOpen, openThemeDialog, handleThemeSelect, handleThemeHighlight, } = useThemeCommand(settings, setThemeError, addItem);
204
- const { isSettingsDialogOpen, openSettingsDialog, closeSettingsDialog } = useSettingsCommand();
295
+ const { isThemeDialogOpen, openThemeDialog, handleThemeSelect: handleThemeSelectOriginal, handleThemeHighlight, } = useThemeCommand(settings, setThemeError, addItem);
296
+ // Animation hook for theme dialog
297
+ const themeDialogAnimation = useDialogCloseAnimation(() => {
298
+ // Close handler - will be called after animation
299
+ // For ESC, we call the original with undefined
300
+ // For selections, the work is already done, so we just need to ensure dialog closes
301
+ // But the original handler already closes, so this is mainly for ESC case
302
+ });
303
+ // Wrapped handler that triggers animation before closing
304
+ const handleThemeSelect = useCallback((themeName, scope) => {
305
+ // Start animation first
306
+ themeDialogAnimation.startClosing();
307
+ // Then do the work (original handler does work and closes)
308
+ // The close happens immediately, but isClosing state will be true briefly
309
+ // showing the dimmed appearance during the transition
310
+ handleThemeSelectOriginal(themeName, scope);
311
+ }, [handleThemeSelectOriginal, themeDialogAnimation]);
312
+ const { isSettingsDialogOpen, openSettingsDialog, closeSettingsDialog: closeSettingsDialogOriginal } = useSettingsCommand();
313
+ const { isExtensionsDialogOpen, openExtensionsDialog, closeExtensionsDialog: closeExtensionsDialogOriginal } = useExtensionsDialog();
314
+ // Animation hook for settings dialog
315
+ const settingsDialogAnimation = useDialogCloseAnimation(() => {
316
+ closeSettingsDialogOriginal();
317
+ });
318
+ // Animation hook for extensions dialog
319
+ const extensionsDialogAnimation = useDialogCloseAnimation(() => {
320
+ closeExtensionsDialogOriginal();
321
+ });
322
+ // Wrapped handler that triggers animation before closing
323
+ const closeSettingsDialog = useCallback(() => {
324
+ settingsDialogAnimation.startClosing();
325
+ }, [settingsDialogAnimation]);
326
+ const closeExtensionsDialog = useCallback(() => {
327
+ extensionsDialogAnimation.startClosing();
328
+ }, [extensionsDialogAnimation]);
329
+ // Voice config dialog handlers
330
+ const openVoiceConfigDialog = useCallback(() => {
331
+ setIsVoiceConfigDialogOpen(true);
332
+ }, []);
333
+ const closeVoiceConfigDialogOriginal = useCallback(() => {
334
+ setIsVoiceConfigDialogOpen(false);
335
+ }, []);
336
+ // Animation hook for voice config dialog
337
+ const voiceConfigDialogAnimation = useDialogCloseAnimation(() => {
338
+ closeVoiceConfigDialogOriginal();
339
+ });
340
+ const closeVoiceConfigDialog = useCallback(() => {
341
+ voiceConfigDialogAnimation.startClosing();
342
+ }, [voiceConfigDialogAnimation]);
205
343
  const { isSubagentCreateDialogOpen, openSubagentCreateDialog, closeSubagentCreateDialog, } = useSubagentCreateDialog();
206
344
  const { isAgentsManagerDialogOpen, openAgentsManagerDialog, closeAgentsManagerDialog, } = useAgentsManagerDialog();
345
+ const { isMultiAgentConfigDialogOpen, openMultiAgentConfigDialog, closeMultiAgentConfigDialog, } = useMultiAgentConfigCommand();
207
346
  const { isFolderTrustDialogOpen, handleFolderTrustSelect, isRestarting } = useFolderTrust(settings, setIsTrustedFolder);
208
347
  const { showQuitConfirmation, handleQuitConfirmationSelect } = useQuitConfirmation();
209
- const { isAuthDialogOpen, openAuthDialog, handleAuthSelect, isAuthenticating, cancelAuthentication, } = useAuthCommand(settings, setAuthError, config);
348
+ const [isHistoryBrowserOpen, setIsHistoryBrowserOpen] = useState(false);
349
+ const openHistoryBrowser = useCallback(() => {
350
+ setIsHistoryBrowserOpen(true);
351
+ }, []);
352
+ // Create a ref to store reloadCommands that will be set later
353
+ const reloadCommandsRef = useRef(null);
354
+ const { isAuthDialogOpen, openAuthDialog, handleAuthSelect: handleAuthSelectOriginal, isAuthenticating, cancelAuthentication, } = useAuthCommand(settings, setAuthError, config, () => {
355
+ if (reloadCommandsRef.current) {
356
+ reloadCommandsRef.current();
357
+ }
358
+ });
359
+ // Animation hook for auth dialog
360
+ const authDialogAnimation = useDialogCloseAnimation(() => {
361
+ // Close handler - for ESC case
362
+ });
363
+ // Wrapped handler that triggers animation before closing
364
+ const handleAuthSelect = useCallback(async (authMethod, scope, providerName) => {
365
+ // Start animation first
366
+ authDialogAnimation.startClosing();
367
+ // Then do the work (original handler does work and closes)
368
+ void handleAuthSelectOriginal(authMethod, scope, providerName);
369
+ }, [handleAuthSelectOriginal, authDialogAnimation]);
210
370
  const { isBlackboxAuthenticating, deviceAuth, isBlackboxAuth, cancelBlackboxAuth, authStatus, authMessage, } = useBlackboxAuth(settings, isAuthenticating);
211
371
  useEffect(() => {
212
372
  if (settings.merged.security?.auth?.selectedType &&
213
373
  !settings.merged.security?.auth?.useExternal) {
214
- const error = validateAuthMethod(settings.merged.security.auth.selectedType);
374
+ const selectedProvider = settings.merged.security?.auth?.selectedProvider;
375
+ const error = validateAuthMethod(settings.merged.security.auth.selectedType, selectedProvider);
215
376
  if (error) {
216
377
  setAuthError(error);
217
378
  openAuthDialog();
@@ -220,6 +381,7 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
220
381
  }, [
221
382
  settings.merged.security?.auth?.selectedType,
222
383
  settings.merged.security?.auth?.useExternal,
384
+ settings.merged.security?.auth?.selectedProvider,
223
385
  openAuthDialog,
224
386
  setAuthError,
225
387
  ]);
@@ -233,11 +395,10 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
233
395
  // Handle Blackbox OAuth timeout
234
396
  useEffect(() => {
235
397
  if (isBlackboxAuth && authStatus === 'timeout') {
236
- setAuthError(authMessage ||
237
- 'Blackbox OAuth authentication timed out. Please try again or select a different authentication method.');
398
+ // Don't set error or open dialog - just cancel and return to agent
399
+ // The user will see they're back at the agent prompt
238
400
  cancelBlackboxAuth();
239
401
  cancelAuthentication();
240
- openAuthDialog();
241
402
  }
242
403
  }, [
243
404
  isBlackboxAuth,
@@ -245,8 +406,6 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
245
406
  authMessage,
246
407
  cancelBlackboxAuth,
247
408
  cancelAuthentication,
248
- openAuthDialog,
249
- setAuthError,
250
409
  ]);
251
410
  const { isEditorDialogOpen, openEditorDialog, handleEditorSelect, exitEditorDialog, } = useEditorSettings(settings, setEditorError, addItem);
252
411
  const toggleCorgiMode = useCallback(() => {
@@ -417,11 +576,16 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
417
576
  const handleModelSelectionClose = useCallback(() => {
418
577
  setIsModelSelectionDialogOpen(false);
419
578
  }, []);
579
+ // Animation hook for model selection dialog
580
+ const modelDialogAnimation = useDialogCloseAnimation(() => {
581
+ setIsModelSelectionDialogOpen(false);
582
+ });
420
583
  const handleModelSelect = useCallback(async (modelId) => {
421
584
  try {
422
585
  await config.setModel(modelId);
423
586
  setCurrentModel(modelId);
424
- setIsModelSelectionDialogOpen(false);
587
+ // Start animation before closing
588
+ modelDialogAnimation.startClosing();
425
589
  addItem({
426
590
  type: MessageType.INFO,
427
591
  text: `Switched model to \`${modelId}\` for this session.`,
@@ -434,8 +598,9 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
434
598
  text: `Failed to switch to model \`${modelId}\`. Please try again.`,
435
599
  }, Date.now());
436
600
  }
437
- }, [config, setCurrentModel, addItem]);
438
- const getAvailableModelsForCurrentAuth = useCallback(() => {
601
+ }, [config, setCurrentModel, addItem, modelDialogAnimation]);
602
+ const [availableModelsForDialog, setAvailableModelsForDialog] = useState([]);
603
+ const getAvailableModelsForCurrentAuth = useCallback(async () => {
439
604
  const contentGeneratorConfig = config.getContentGeneratorConfig();
440
605
  if (!contentGeneratorConfig)
441
606
  return [];
@@ -443,17 +608,69 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
443
608
  switch (contentGeneratorConfig.authType) {
444
609
  case AuthType.BLACKBOX_OAUTH:
445
610
  return getFilteredBlackboxModels(visionModelPreviewEnabled);
446
- case AuthType.USE_OPENAI: {
447
- const openAIModel = getOpenAIAvailableModelFromEnv();
448
- return openAIModel ? [openAIModel] : [];
611
+ case AuthType.USE_OPENAI:
612
+ case AuthType.USE_BLACKBOX_API: {
613
+ const apiKey = contentGeneratorConfig.apiKey;
614
+ if (!apiKey) {
615
+ if (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API) {
616
+ return [];
617
+ }
618
+ const openAIModel = getOpenAIAvailableModelFromEnv();
619
+ return openAIModel ? [openAIModel] : [];
620
+ }
621
+ try {
622
+ // Import fetchModelsForProvider dynamically
623
+ const { fetchModelsForProvider } = await import('../config/modelFetcher.js');
624
+ // IMPORTANT: Get provider name from settings - this determines which provider's models to show
625
+ // The /model command should ONLY show models from the currently configured provider
626
+ // To switch providers, users must use /configure command
627
+ const providerName = settings.merged.security?.auth?.selectedProvider ||
628
+ (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API ? 'blackbox' : 'openai');
629
+ // Get baseUrl from config
630
+ const baseUrl = contentGeneratorConfig.baseUrl || 'https://api.openai.com';
631
+ // Fetch models using the unified function - this will only return models from the active provider
632
+ const modelIds = await fetchModelsForProvider(providerName, apiKey, baseUrl);
633
+ if (modelIds.length === 0) {
634
+ if (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API) {
635
+ return [];
636
+ }
637
+ const openAIModel = getOpenAIAvailableModelFromEnv();
638
+ return openAIModel ? [openAIModel] : [];
639
+ }
640
+ // Convert model IDs to AvailableModel format
641
+ return modelIds.map((id) => ({
642
+ id,
643
+ label: id,
644
+ }));
645
+ }
646
+ catch (error) {
647
+ console.warn('Failed to fetch models:', error);
648
+ if (contentGeneratorConfig.authType === AuthType.USE_BLACKBOX_API) {
649
+ return [];
650
+ }
651
+ const openAIModel = getOpenAIAvailableModelFromEnv();
652
+ return openAIModel ? [openAIModel] : [];
653
+ }
449
654
  }
450
655
  default:
451
656
  return [];
452
657
  }
453
- }, [config, settings.merged.experimental?.visionModelPreview]);
658
+ }, [config, settings.merged.experimental?.visionModelPreview, settings.merged.security?.auth?.selectedProvider]);
659
+ // Fetch models when dialog opens
660
+ useEffect(() => {
661
+ if (isModelSelectionDialogOpen) {
662
+ getAvailableModelsForCurrentAuth().then(setAvailableModelsForDialog);
663
+ }
664
+ }, [isModelSelectionDialogOpen, getAvailableModelsForCurrentAuth]);
454
665
  // Core hooks and processors
455
666
  const { vimEnabled: vimModeEnabled, vimMode, toggleVimEnabled, } = useVimMode();
456
- const { handleSlashCommand, slashCommands, pendingHistoryItems: pendingSlashCommandHistoryItems, commandContext, shellConfirmationRequest, confirmationRequest, quitConfirmationRequest, } = useSlashCommandProcessor(config, settings, addItem, clearItems, loadHistory, refreshStatic, setDebugMessage, openThemeDialog, openAuthDialog, openEditorDialog, toggleCorgiMode, setQuittingMessages, openPrivacyNotice, openSettingsDialog, handleModelSelectionOpen, openSubagentCreateDialog, openAgentsManagerDialog, toggleVimEnabled, setIsProcessing, setGeminiMdFileCount, showQuitConfirmation);
667
+ const { handleSlashCommand, slashCommands, pendingHistoryItems: pendingSlashCommandHistoryItems, commandContext, shellConfirmationRequest, confirmationRequest, quitConfirmationRequest, } = useSlashCommandProcessor(config, settings, addItem, clearItems, loadHistory, refreshStatic, setDebugMessage, openThemeDialog, openAuthDialog, openEditorDialog, toggleCorgiMode, setQuittingMessages, openPrivacyNotice, openSettingsDialog, openExtensionsDialog, handleModelSelectionOpen, openSubagentCreateDialog, openAgentsManagerDialog, openMultiAgentConfigDialog, openHistoryBrowser, openDbConfigureDialog, toggleVimEnabled, setIsProcessing, setGeminiMdFileCount, showQuitConfirmation, openVoiceConfigDialog, openReleasesDialog);
668
+ // Set the reloadCommands ref when commandContext is available
669
+ useEffect(() => {
670
+ if (commandContext?.ui?.reloadCommands) {
671
+ reloadCommandsRef.current = commandContext.ui.reloadCommands;
672
+ }
673
+ }, [commandContext]);
457
674
  const buffer = useTextBuffer({
458
675
  initialText: '',
459
676
  viewport: { height: 10, width: inputWidth },
@@ -465,11 +682,37 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
465
682
  const [userMessages, setUserMessages] = useState([]);
466
683
  // Stable reference for cancel handler to avoid circular dependency
467
684
  const cancelHandlerRef = useRef(() => { });
468
- const { streamingState, submitQuery, initError, pendingHistoryItems: pendingGeminiHistoryItems, thought, cancelOngoingRequest, } = useGeminiStream(config.getGeminiClient(), history, addItem, config, setDebugMessage, handleSlashCommand, shellModeActive, getPreferredEditor, onAuthError, performMemoryRefresh, modelSwitchedFromQuotaError, setModelSwitchedFromQuotaError, refreshStatic, () => cancelHandlerRef.current(), settings.merged.experimental?.visionModelPreview ?? true, handleVisionSwitchRequired);
685
+ const { streamingState, submitQuery, initError, pendingHistoryItems: pendingGeminiHistoryItems, thought, cancelOngoingRequest, isEncryptedMode: _isEncryptedMode, } = useAdaptiveStream(config, history, addItem, setDebugMessage, () => cancelHandlerRef.current(), {
686
+ handleSlashCommand,
687
+ shellModeActive,
688
+ getPreferredEditor,
689
+ onAuthError,
690
+ performMemoryRefresh,
691
+ modelSwitchedFromQuotaError,
692
+ setModelSwitchedFromQuotaError,
693
+ onEditorClose: refreshStatic,
694
+ visionModelPreviewEnabled: settings.merged.experimental?.visionModelPreview ?? true,
695
+ onVisionSwitchRequired: handleVisionSwitchRequired,
696
+ });
469
697
  const pendingHistoryItems = useMemo(() => [...pendingSlashCommandHistoryItems, ...pendingGeminiHistoryItems].map((item, index) => ({
470
698
  ...item,
471
699
  id: index,
472
700
  })), [pendingSlashCommandHistoryItems, pendingGeminiHistoryItems]);
701
+ // Callback for when voice config is completed successfully
702
+ // Placed here after submitQuery is defined
703
+ const handleVoiceConfigComplete = useCallback(() => {
704
+ // Always auto-start recording after config is saved
705
+ closeVoiceConfigDialog();
706
+ // Start voice recording immediately after dialog closes
707
+ // Small delay only for dialog animation to complete smoothly
708
+ setTimeout(async () => {
709
+ const result = await handleSlashCommand('/voice record');
710
+ // If the voice command returns a prompt to submit, submit it to the model
711
+ if (result && result.type === 'submit_prompt') {
712
+ submitQuery(result.content);
713
+ }
714
+ }, 150); // Minimal delay for smooth animation transition
715
+ }, [closeVoiceConfigDialog, handleSlashCommand, submitQuery]);
473
716
  // Welcome back functionality
474
717
  const { welcomeBackInfo, showWelcomeBackDialog, welcomeBackChoice, handleWelcomeBackSelection, handleWelcomeBackClose, } = useWelcomeBack(config, submitQuery, buffer, settings.merged);
475
718
  // Dialog close functionality
@@ -483,12 +726,22 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
483
726
  exitEditorDialog,
484
727
  isSettingsDialogOpen,
485
728
  closeSettingsDialog,
729
+ isExtensionsDialogOpen,
730
+ closeExtensionsDialog,
731
+ isVoiceConfigDialogOpen,
732
+ closeVoiceConfigDialog,
733
+ isReleasesDialogOpen,
734
+ closeReleasesDialog,
486
735
  isFolderTrustDialogOpen,
487
736
  showPrivacyNotice,
488
737
  setShowPrivacyNotice,
489
738
  showWelcomeBackDialog,
490
739
  handleWelcomeBackClose,
491
740
  quitConfirmationRequest,
741
+ showTodoListDialog,
742
+ setShowTodoListDialog,
743
+ isDbConfigureDialogOpen,
744
+ closeDbConfigureDialog: cancelDbConfigure,
492
745
  });
493
746
  // Message queue for handling input during streaming
494
747
  const { messageQueue, addMessage, clearQueue, getQueuedMessagesText } = useMessageQueue({
@@ -523,23 +776,9 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
523
776
  const handleFinalSubmit = useCallback((submittedValue) => {
524
777
  addMessage(submittedValue);
525
778
  }, [addMessage]);
526
- const handleIdePromptComplete = useCallback((result) => {
527
- if (result.userSelection === 'yes') {
528
- if (result.isExtensionPreInstalled) {
529
- handleSlashCommand('/ide enable');
530
- }
531
- else {
532
- handleSlashCommand('/ide install');
533
- }
534
- settings.setValue(SettingScope.User, 'hasSeenIdeIntegrationNudge', true);
535
- }
536
- else if (result.userSelection === 'dismiss') {
537
- settings.setValue(SettingScope.User, 'hasSeenIdeIntegrationNudge', true);
538
- }
539
- setIdePromptAnswered(true);
540
- }, [handleSlashCommand, settings]);
541
779
  const { handleInput: vimHandleInput } = useVim(buffer, handleFinalSubmit);
542
- const { elapsedTime, currentLoadingPhrase } = useLoadingIndicator(streamingState);
780
+ const { todos, currentTodo, nextTodo } = useTodoList(config.getSessionId());
781
+ const { elapsedTime, currentLoadingPhrase } = useLoadingIndicator(streamingState, currentTodo?.content || null);
543
782
  const showAutoAcceptIndicator = useAutoAcceptIndicator({ config, addItem });
544
783
  const handleExit = useCallback((pressedOnce, setPressedOnce, timerRef) => {
545
784
  // Fast double-press: Direct quit (preserve user habit)
@@ -594,6 +833,9 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
594
833
  if (keyMatchers[Command.SHOW_ERROR_DETAILS](key)) {
595
834
  setShowErrorDetails((prev) => !prev);
596
835
  }
836
+ else if (keyMatchers[Command.SHOW_TODO_LIST](key)) {
837
+ setShowTodoListDialog((prev) => !prev);
838
+ }
597
839
  else if (keyMatchers[Command.TOGGLE_TOOL_DESCRIPTIONS](key)) {
598
840
  const newValue = !showToolDescriptions;
599
841
  setShowToolDescriptions(newValue);
@@ -773,6 +1015,37 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
773
1015
  isModelSelectionDialogOpen,
774
1016
  isVisionSwitchDialogOpen,
775
1017
  ]);
1018
+ const initialSlashCommandSubmitted = useRef(false);
1019
+ useEffect(() => {
1020
+ if (initialSlashCommand &&
1021
+ !initialSlashCommandSubmitted.current &&
1022
+ !isAuthenticating &&
1023
+ !isAuthDialogOpen &&
1024
+ !isThemeDialogOpen &&
1025
+ !isEditorDialogOpen &&
1026
+ !isModelSelectionDialogOpen &&
1027
+ !isVisionSwitchDialogOpen &&
1028
+ !isSubagentCreateDialogOpen &&
1029
+ !showPrivacyNotice &&
1030
+ !showWelcomeBackDialog &&
1031
+ welcomeBackChoice !== 'restart') {
1032
+ handleSlashCommand(initialSlashCommand);
1033
+ initialSlashCommandSubmitted.current = true;
1034
+ }
1035
+ }, [
1036
+ initialSlashCommand,
1037
+ handleSlashCommand,
1038
+ isAuthenticating,
1039
+ isAuthDialogOpen,
1040
+ isThemeDialogOpen,
1041
+ isEditorDialogOpen,
1042
+ isSubagentCreateDialogOpen,
1043
+ showPrivacyNotice,
1044
+ showWelcomeBackDialog,
1045
+ welcomeBackChoice,
1046
+ isModelSelectionDialogOpen,
1047
+ isVisionSwitchDialogOpen,
1048
+ ]);
776
1049
  if (quittingMessages) {
777
1050
  return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: quittingMessages.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: terminalWidth, item: item, isPending: false, config: config }, item.id))) }));
778
1051
  }
@@ -787,7 +1060,7 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
787
1060
  return (_jsx(StreamingContext.Provider, { value: streamingState, children: _jsxs(Box, { flexDirection: "column", width: "90%", children: [_jsx(Static, { items: [
788
1061
  _jsxs(Box, { flexDirection: "column", children: [!(settings.merged.ui?.hideBanner || config.getScreenReader()) && _jsx(Header, { version: version, nightly: nightly }), !(settings.merged.ui?.hideTips || config.getScreenReader()) && (_jsx(Tips, { config: config }))] }, "header"),
789
1062
  ...history.map((h) => (_jsx(HistoryItemDisplay, { terminalWidth: mainAreaWidth, availableTerminalHeight: staticAreaMaxItemHeight, item: h, isPending: false, config: config, commands: slashCommands }, h.id))),
790
- ], children: (item) => item }, staticKey), _jsx(OverflowProvider, { children: _jsxs(Box, { ref: pendingHistoryItemRef, flexDirection: "column", children: [pendingHistoryItems.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: mainAreaWidth, item: item, isPending: true, config: config, isFocused: !isEditorDialogOpen }, item.id))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentYellow, paddingX: 1, marginY: 1, flexDirection: "column", children: startupWarnings.map((warning, index) => (_jsx(Text, { color: Colors.AccentYellow, children: warning }, index))) })), showWelcomeBackDialog && welcomeBackInfo?.hasHistory && (_jsx(WelcomeBackDialog, { welcomeBackInfo: welcomeBackInfo, onSelect: handleWelcomeBackSelection, onClose: handleWelcomeBackClose })), showWorkspaceMigrationDialog ? (_jsx(WorkspaceMigrationDialog, { workspaceExtensions: workspaceExtensions, onOpen: onWorkspaceMigrationDialogOpen, onClose: onWorkspaceMigrationDialogClose })) : shouldShowIdePrompt && currentIDE ? (_jsx(IdeIntegrationNudge, { ide: currentIDE, onComplete: handleIdePromptComplete })) : isFolderTrustDialogOpen ? (_jsx(FolderTrustDialog, { onSelect: handleFolderTrustSelect, isRestarting: isRestarting })) : quitConfirmationRequest ? (_jsx(QuitConfirmationDialog, { onSelect: (choice) => {
1063
+ ], children: (item) => item }, staticKey), _jsx(OverflowProvider, { children: _jsxs(Box, { ref: pendingHistoryItemRef, flexDirection: "column", children: [pendingHistoryItems.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: mainAreaWidth, item: item, isPending: true, config: config, isFocused: !isEditorDialogOpen }, item.id))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.Gray, paddingX: 1, marginY: 1, flexDirection: "column", children: startupWarnings.map((warning, index) => (_jsx(Text, { color: Colors.Gray, children: warning }, index))) })), showWelcomeBackDialog && welcomeBackInfo?.hasHistory && (_jsx(WelcomeBackDialog, { welcomeBackInfo: welcomeBackInfo, onSelect: handleWelcomeBackSelection, onClose: handleWelcomeBackClose })), showWorkspaceMigrationDialog ? (_jsx(WorkspaceMigrationDialog, { workspaceExtensions: workspaceExtensions, onOpen: onWorkspaceMigrationDialogOpen, onClose: onWorkspaceMigrationDialogClose })) : isFolderTrustDialogOpen ? (_jsx(FolderTrustDialog, { onSelect: handleFolderTrustSelect, isRestarting: isRestarting })) : quitConfirmationRequest ? (_jsx(QuitConfirmationDialog, { onSelect: (choice) => {
791
1064
  const result = handleQuitConfirmationSelect(choice);
792
1065
  if (result?.shouldQuit) {
793
1066
  quitConfirmationRequest.onConfirm(true, result.action);
@@ -795,35 +1068,111 @@ const App = ({ config, settings, startupWarnings = [], version }) => {
795
1068
  else {
796
1069
  quitConfirmationRequest.onConfirm(false);
797
1070
  }
798
- } })) : shellConfirmationRequest ? (_jsx(ShellConfirmationDialog, { request: shellConfirmationRequest })) : confirmationRequest ? (_jsxs(Box, { flexDirection: "column", children: [confirmationRequest.prompt, _jsx(Box, { paddingY: 1, children: _jsx(RadioButtonSelect, { isFocused: !!confirmationRequest, items: [
1071
+ } })) : shellConfirmationRequest ? (_jsx(ShellConfirmationDialogWithAnimation, { request: shellConfirmationRequest })) : isDbConfigureDialogOpen ? (_jsx(ConfigureUI, { mode: "db", embedded: true, onComplete: completeDbConfigure, onCancel: cancelDbConfigure })) : confirmationRequest ? (_jsxs(Box, { flexDirection: "column", children: [confirmationRequest.prompt, _jsx(Box, { paddingY: 1, children: _jsx(RadioButtonSelect, { isFocused: !!confirmationRequest, items: [
799
1072
  { label: 'Yes', value: true },
800
1073
  { label: 'No', value: false },
801
1074
  ], onSelect: (value) => {
802
1075
  confirmationRequest.onConfirm(value);
803
1076
  } }) })] })) : isThemeDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [themeError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: themeError }) })), _jsx(ThemeDialog, { onSelect: handleThemeSelect, onHighlight: handleThemeHighlight, settings: settings, availableTerminalHeight: constrainHeight
804
1077
  ? terminalHeight - staticExtraHeight
805
- : undefined, terminalWidth: mainAreaWidth })] })) : isSettingsDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(SettingsDialog, { settings: settings, onSelect: () => closeSettingsDialog(), onRestartRequest: () => process.exit(0) }) })) : isSubagentCreateDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AgentCreationWizard, { onClose: closeSubagentCreateDialog, config: config }) })) : isAgentsManagerDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AgentsManagerDialog, { onClose: closeAgentsManagerDialog, config: config }) })) : isAuthenticating ? (_jsxs(_Fragment, { children: [isBlackboxAuth && isBlackboxAuthenticating ? (_jsx(BlackboxOAuthProgress, { deviceAuth: deviceAuth || undefined, authStatus: authStatus, authMessage: authMessage, onTimeout: () => {
806
- setAuthError('Blackbox OAuth authentication timed out. Please try again.');
1078
+ : undefined, terminalWidth: mainAreaWidth, isClosing: themeDialogAnimation.isClosing })] })) : isReleasesDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(ReleaseNotesDialog, { versions: releasesVersions, onClose: closeReleasesDialog, availableTerminalHeight: constrainHeight
1079
+ ? terminalHeight - staticExtraHeight
1080
+ : undefined, terminalWidth: mainAreaWidth, isLoading: isReleasesLoading }) })) : isSettingsDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(SettingsDialog, { settings: settings, onSelect: () => closeSettingsDialog(), onRestartRequest: () => process.exit(0), isClosing: settingsDialogAnimation.isClosing }) })) : isExtensionsDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(ExtensionsDialog, { onClose: () => closeExtensionsDialog() }) })) : isSubagentCreateDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AgentCreationWizard, { onClose: closeSubagentCreateDialog, config: config }) })) : isAgentsManagerDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AgentsManagerDialog, { onClose: closeAgentsManagerDialog, config: config }) })) : isMultiAgentConfigDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(MultiAgentConfigDialog, { onComplete: (multiAgentConfig) => {
1081
+ // Save configuration to settings
1082
+ settings.setValue(SettingScope.User, 'multiAgent', multiAgentConfig);
1083
+ closeMultiAgentConfigDialog();
1084
+ addItem({
1085
+ type: MessageType.INFO,
1086
+ text: 'Multi-agent configuration saved successfully.',
1087
+ }, Date.now());
1088
+ }, onCancel: closeMultiAgentConfigDialog, initialConfig: {
1089
+ blackbox: {
1090
+ enabled: settings.merged.multiAgent?.blackbox?.enabled ?? true,
1091
+ model: settings.merged.multiAgent?.blackbox?.model || 'blackboxai/anthropic/claude-sonnet-4.5',
1092
+ },
1093
+ claude: {
1094
+ enabled: settings.merged.multiAgent?.claude?.enabled ?? true,
1095
+ model: settings.merged.multiAgent?.claude?.model || 'blackboxai/anthropic/claude-sonnet-4.5',
1096
+ },
1097
+ codex: {
1098
+ enabled: settings.merged.multiAgent?.codex?.enabled ?? true,
1099
+ model: settings.merged.multiAgent?.codex?.model || 'gpt-5-codex',
1100
+ },
1101
+ gemini: {
1102
+ enabled: settings.merged.multiAgent?.gemini?.enabled ?? false,
1103
+ model: settings.merged.multiAgent?.gemini?.model || 'gemini-2.0-flash-exp',
1104
+ },
1105
+ }, hasOpenAIKey: !!process.env['OPENAI_API_KEY']?.startsWith('sk-'), hasGeminiKey: !!process.env['GEMINI_API_KEY'] }) })) : isHistoryBrowserOpen && logger ? (_jsx(Box, { flexDirection: "column", children: _jsx(HistoryBrowserDialog, { logger: logger, onResume: async (tag) => {
1106
+ try {
1107
+ const conversation = await logger.loadCheckpoint(tag);
1108
+ if (conversation) {
1109
+ setIsHistoryBrowserOpen(false);
1110
+ // Set the client history so AI has context
1111
+ config.getGeminiClient()?.setHistory(conversation);
1112
+ // Convert Content[] to HistoryItem[] using the same logic as resumeCommand
1113
+ const rolemap = {
1114
+ user: MessageType.USER,
1115
+ model: MessageType.GEMINI,
1116
+ };
1117
+ const uiHistory = [];
1118
+ let hasSystemPrompt = false;
1119
+ let i = 0;
1120
+ for (const item of conversation) {
1121
+ i += 1;
1122
+ const text = item.parts
1123
+ ?.filter((m) => !!m.text)
1124
+ .map((m) => m.text)
1125
+ .join('') || '';
1126
+ if (!text) {
1127
+ continue;
1128
+ }
1129
+ if (i === 1 && text.match(/context for our chat/)) {
1130
+ hasSystemPrompt = true;
1131
+ }
1132
+ if (i > 2 || !hasSystemPrompt) {
1133
+ uiHistory.push({
1134
+ type: (item.role && rolemap[item.role]) || MessageType.GEMINI,
1135
+ text,
1136
+ });
1137
+ }
1138
+ }
1139
+ // Add IDs to history items
1140
+ const historyWithIds = uiHistory.map((item, index) => ({
1141
+ ...item,
1142
+ id: index,
1143
+ }));
1144
+ loadHistory(historyWithIds);
1145
+ }
1146
+ }
1147
+ catch (error) {
1148
+ console.error('Failed to resume conversation:', error);
1149
+ }
1150
+ }, onDelete: async (tag) => {
1151
+ try {
1152
+ await logger.deleteCheckpoint(tag);
1153
+ }
1154
+ catch (error) {
1155
+ console.error('Failed to delete checkpoint:', error);
1156
+ }
1157
+ }, onClose: () => setIsHistoryBrowserOpen(false) }) })) : isAuthenticating ? (_jsxs(_Fragment, { children: [isBlackboxAuth && isBlackboxAuthenticating ? (_jsx(BlackboxOAuthProgress, { deviceAuth: deviceAuth || undefined, authStatus: authStatus, authMessage: authMessage, onTimeout: () => {
1158
+ // User cancelled - just return to agent without showing dialog
807
1159
  cancelBlackboxAuth();
808
1160
  cancelAuthentication();
809
- openAuthDialog();
810
1161
  }, onCancel: () => {
811
- setAuthError('Blackbox OAuth authentication cancelled.');
1162
+ // User cancelled - just return to agent without showing dialog
812
1163
  cancelBlackboxAuth();
813
1164
  cancelAuthentication();
814
- openAuthDialog();
815
1165
  } })) : (_jsx(AuthInProgress, { onTimeout: () => {
816
- setAuthError('Authentication timed out. Please try again.');
1166
+ // User cancelled - just return to agent without showing dialog
817
1167
  cancelAuthentication();
818
- openAuthDialog();
819
- } })), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }))] })) : isAuthDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AuthDialog, { onSelect: handleAuthSelect, settings: settings, initialErrorMessage: authError, config: config }) })) : isEditorDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [editorError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: editorError }) })), _jsx(EditorSettingsDialog, { onSelect: handleEditorSelect, settings: settings, onExit: exitEditorDialog })] })) : isModelSelectionDialogOpen ? (_jsx(ModelSelectionDialog, { availableModels: getAvailableModelsForCurrentAuth(), currentModel: currentModel, onSelect: handleModelSelect, onCancel: handleModelSelectionClose })) : isVisionSwitchDialogOpen ? (_jsx(ModelSwitchDialog, { onSelect: handleVisionSwitchSelect })) : showPrivacyNotice ? (_jsx(PrivacyNotice, { onExit: () => setShowPrivacyNotice(false), config: config })) : (_jsxs(_Fragment, { children: [_jsx(LoadingIndicator, { thought: streamingState === StreamingState.WaitingForConfirmation ||
1168
+ } })), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }))] })) : isAuthDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AuthDialog, { onSelect: handleAuthSelect, settings: settings, initialErrorMessage: authError, isClosing: authDialogAnimation.isClosing }) })) : isEditorDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [editorError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: editorError }) })), _jsx(EditorSettingsDialog, { onSelect: handleEditorSelect, settings: settings, onExit: exitEditorDialog })] })) : isModelSelectionDialogOpen ? (_jsx(ModelSelectionDialog, { availableModels: availableModelsForDialog, currentModel: currentModel, onSelect: handleModelSelect, onCancel: handleModelSelectionClose, isClosing: modelDialogAnimation.isClosing })) : isVisionSwitchDialogOpen ? (_jsx(ModelSwitchDialog, { onSelect: handleVisionSwitchSelect })) : isVoiceConfigDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(VoiceConfigDialog, { settings: settings, onClose: closeVoiceConfigDialog, isClosing: voiceConfigDialogAnimation.isClosing, onConfigComplete: handleVoiceConfigComplete }) })) : showPrivacyNotice ? (_jsx(PrivacyNotice, { onExit: () => setShowPrivacyNotice(false), config: config })) : (_jsxs(_Fragment, { children: [showTodoListDialog && (_jsx(TodoListDialog, { todos: todos, onClose: () => setShowTodoListDialog(false) })), _jsx(LoadingIndicator, { thought: streamingState === StreamingState.WaitingForConfirmation ||
820
1169
  config.getAccessibility()?.disableLoadingPhrases ||
821
1170
  config.getScreenReader()
822
1171
  ? undefined
823
1172
  : thought, currentLoadingPhrase: config.getAccessibility()?.disableLoadingPhrases ||
824
1173
  config.getScreenReader()
825
1174
  ? undefined
826
- : currentLoadingPhrase, elapsedTime: elapsedTime }), messageQueue.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [messageQueue
1175
+ : currentLoadingPhrase, currentTodo: currentTodo?.content, nextTodo: nextTodo?.content, tokenCount: sessionStats.lastPromptTokenCount, hasTodos: todos.length > 0, elapsedTime: elapsedTime }), messageQueue.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [messageQueue
827
1176
  .slice(0, MAX_DISPLAYED_QUEUED_MESSAGES)
828
1177
  .map((message, index) => {
829
1178
  // Ensure multi-line messages are collapsed for the preview.