@within-7/minto 0.1.7 → 0.3.0

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 (601) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +73 -49
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +85 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +157 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +28 -18
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +9 -7
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +87 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  30. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  31. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  32. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  33. package/dist/commands/plugin/ErrorView.js +2 -1
  34. package/dist/commands/plugin/ErrorView.js.map +2 -2
  35. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  36. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  37. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  38. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  39. package/dist/commands/plugin/MainMenu.js +2 -1
  40. package/dist/commands/plugin/MainMenu.js.map +2 -2
  41. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  42. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  43. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  44. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  45. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  46. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  47. package/dist/commands/plugin/PluginBrowser.js +6 -5
  48. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  49. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  50. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  51. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  52. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  53. package/dist/commands/plugin.js +16 -15
  54. package/dist/commands/plugin.js.map +2 -2
  55. package/dist/commands/quit.js +3 -1
  56. package/dist/commands/quit.js.map +2 -2
  57. package/dist/commands/sandbox.js +105 -0
  58. package/dist/commands/sandbox.js.map +7 -0
  59. package/dist/commands/setup.js +2 -1
  60. package/dist/commands/setup.js.map +2 -2
  61. package/dist/commands/status.js +59 -0
  62. package/dist/commands/status.js.map +7 -0
  63. package/dist/commands/tasks.js +108 -0
  64. package/dist/commands/tasks.js.map +7 -0
  65. package/dist/commands/todos.js +123 -0
  66. package/dist/commands/todos.js.map +7 -0
  67. package/dist/commands/undo.js +245 -0
  68. package/dist/commands/undo.js.map +7 -0
  69. package/dist/commands.js +22 -2
  70. package/dist/commands.js.map +2 -2
  71. package/dist/components/AgentThinkingBlock.js +10 -18
  72. package/dist/components/AgentThinkingBlock.js.map +2 -2
  73. package/dist/components/AsciiLogo.js +7 -8
  74. package/dist/components/AsciiLogo.js.map +2 -2
  75. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  76. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  77. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  78. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  79. package/dist/components/BackgroundTasksPanel.js +78 -29
  80. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  81. package/dist/components/BashStreamingProgress.js +24 -0
  82. package/dist/components/BashStreamingProgress.js.map +7 -0
  83. package/dist/components/CollapsibleHint.js +15 -0
  84. package/dist/components/CollapsibleHint.js.map +7 -0
  85. package/dist/components/Config.js +3 -2
  86. package/dist/components/Config.js.map +2 -2
  87. package/dist/components/ConsoleOAuthFlow.js +2 -1
  88. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  89. package/dist/components/Cost.js +2 -1
  90. package/dist/components/Cost.js.map +2 -2
  91. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  92. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  93. package/dist/components/HeaderBar.js +13 -8
  94. package/dist/components/HeaderBar.js.map +2 -2
  95. package/dist/components/HistorySearchOverlay.js +4 -3
  96. package/dist/components/HistorySearchOverlay.js.map +2 -2
  97. package/dist/components/HotkeyHelpPanel.js +134 -0
  98. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  99. package/dist/components/InvalidConfigDialog.js +2 -1
  100. package/dist/components/InvalidConfigDialog.js.map +2 -2
  101. package/dist/components/Logo.js +24 -68
  102. package/dist/components/Logo.js.map +2 -2
  103. package/dist/components/MCPServerApprovalDialog.js +2 -1
  104. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  105. package/dist/components/MCPServerDialogCopy.js +2 -1
  106. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  107. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  108. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  109. package/dist/components/Message.js +23 -7
  110. package/dist/components/Message.js.map +3 -3
  111. package/dist/components/MessageSelector.js +4 -3
  112. package/dist/components/MessageSelector.js.map +2 -2
  113. package/dist/components/ModeIndicator.js +2 -1
  114. package/dist/components/ModeIndicator.js.map +2 -2
  115. package/dist/components/ModelConfig.js +20 -6
  116. package/dist/components/ModelConfig.js.map +2 -2
  117. package/dist/components/ModelListManager.js +7 -6
  118. package/dist/components/ModelListManager.js.map +2 -2
  119. package/dist/components/ModelSelector/ModelSelector.js +27 -14
  120. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  121. package/dist/components/Onboarding.js +22 -16
  122. package/dist/components/Onboarding.js.map +2 -2
  123. package/dist/components/OperationSummary.js +130 -0
  124. package/dist/components/OperationSummary.js.map +7 -0
  125. package/dist/components/ProgressBar.js +74 -0
  126. package/dist/components/ProgressBar.js.map +7 -0
  127. package/dist/components/PromptInput.js +210 -87
  128. package/dist/components/PromptInput.js.map +2 -2
  129. package/dist/components/RequestStatusIndicator.js +194 -0
  130. package/dist/components/RequestStatusIndicator.js.map +7 -0
  131. package/dist/components/SensitiveFileWarning.js +31 -0
  132. package/dist/components/SensitiveFileWarning.js.map +7 -0
  133. package/dist/components/Spinner.js +141 -27
  134. package/dist/components/Spinner.js.map +2 -2
  135. package/dist/components/SpinnerSymbol.js +21 -27
  136. package/dist/components/SpinnerSymbol.js.map +2 -2
  137. package/dist/components/StreamingBashOutput.js +9 -8
  138. package/dist/components/StreamingBashOutput.js.map +2 -2
  139. package/dist/components/StructuredDiff.js +6 -8
  140. package/dist/components/StructuredDiff.js.map +2 -2
  141. package/dist/components/SubagentBlock.js +5 -3
  142. package/dist/components/SubagentBlock.js.map +2 -2
  143. package/dist/components/SubagentProgress.js +17 -15
  144. package/dist/components/SubagentProgress.js.map +2 -2
  145. package/dist/components/TaskCard.js +30 -24
  146. package/dist/components/TaskCard.js.map +2 -2
  147. package/dist/components/TextInput.js +9 -1
  148. package/dist/components/TextInput.js.map +2 -2
  149. package/dist/components/TodoChangeBlock.js +1 -1
  150. package/dist/components/TodoChangeBlock.js.map +2 -2
  151. package/dist/components/TodoPanel.js +140 -31
  152. package/dist/components/TodoPanel.js.map +3 -3
  153. package/dist/components/TokenCounter.js +74 -0
  154. package/dist/components/TokenCounter.js.map +7 -0
  155. package/dist/components/TokenWarning.js +2 -1
  156. package/dist/components/TokenWarning.js.map +2 -2
  157. package/dist/components/ToolUseLoader.js +2 -2
  158. package/dist/components/ToolUseLoader.js.map +2 -2
  159. package/dist/components/TreeConnector.js +26 -0
  160. package/dist/components/TreeConnector.js.map +7 -0
  161. package/dist/components/TrustDialog.js +2 -1
  162. package/dist/components/TrustDialog.js.map +2 -2
  163. package/dist/components/TurnCompletionIndicator.js +18 -0
  164. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  165. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  166. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  167. package/dist/components/messages/AssistantTextMessage.js +20 -9
  168. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  169. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  170. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  171. package/dist/components/messages/AssistantToolUseMessage.js +17 -10
  172. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  173. package/dist/components/messages/GroupRenderer.js +54 -0
  174. package/dist/components/messages/GroupRenderer.js.map +7 -0
  175. package/dist/components/messages/NestedTasksPreview.js +24 -0
  176. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  177. package/dist/components/messages/ParallelTasksGroupView.js +93 -0
  178. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  179. package/dist/components/messages/TaskInModuleView.js +218 -0
  180. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  181. package/dist/components/messages/TaskOutputContent.js +56 -0
  182. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  183. package/dist/components/messages/UserPromptMessage.js +2 -2
  184. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  185. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  186. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  187. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  188. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  189. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  190. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  191. package/dist/constants/colors.js +120 -54
  192. package/dist/constants/colors.js.map +2 -2
  193. package/dist/constants/formatRules.js +102 -0
  194. package/dist/constants/formatRules.js.map +7 -0
  195. package/dist/constants/prompts.js +12 -34
  196. package/dist/constants/prompts.js.map +2 -2
  197. package/dist/constants/symbols.js +64 -6
  198. package/dist/constants/symbols.js.map +2 -2
  199. package/dist/constants/timing.js +5 -0
  200. package/dist/constants/timing.js.map +2 -2
  201. package/dist/constants/toolInputExamples.js +84 -0
  202. package/dist/constants/toolInputExamples.js.map +7 -0
  203. package/dist/core/backupManager.js +321 -0
  204. package/dist/core/backupManager.js.map +7 -0
  205. package/dist/core/config/defaults.js +84 -0
  206. package/dist/core/config/defaults.js.map +7 -0
  207. package/dist/core/config/index.js +111 -0
  208. package/dist/core/config/index.js.map +7 -0
  209. package/dist/core/config/loader.js +221 -0
  210. package/dist/core/config/loader.js.map +7 -0
  211. package/dist/core/config/migrations.js +128 -0
  212. package/dist/core/config/migrations.js.map +7 -0
  213. package/dist/core/config/schema.js +178 -0
  214. package/dist/core/config/schema.js.map +7 -0
  215. package/dist/core/costTracker.js +129 -0
  216. package/dist/core/costTracker.js.map +7 -0
  217. package/dist/core/gitAutoCommit.js +287 -0
  218. package/dist/core/gitAutoCommit.js.map +7 -0
  219. package/dist/core/index.js +8 -0
  220. package/dist/core/index.js.map +7 -0
  221. package/dist/core/operationTracker.js +212 -0
  222. package/dist/core/operationTracker.js.map +7 -0
  223. package/dist/core/permissions/auditLog.js +204 -0
  224. package/dist/core/permissions/auditLog.js.map +7 -0
  225. package/dist/core/permissions/engine/index.js +3 -0
  226. package/dist/core/permissions/engine/index.js.map +7 -0
  227. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  228. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  229. package/dist/core/permissions/engine/types.js +1 -0
  230. package/dist/core/permissions/engine/types.js.map +7 -0
  231. package/dist/core/permissions/index.js +84 -0
  232. package/dist/core/permissions/index.js.map +7 -0
  233. package/dist/core/permissions/ruleEngine.js +259 -0
  234. package/dist/core/permissions/ruleEngine.js.map +7 -0
  235. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  236. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  237. package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
  238. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  239. package/dist/core/permissions/rules/index.js +46 -0
  240. package/dist/core/permissions/rules/index.js.map +7 -0
  241. package/dist/core/permissions/rules/planModeRule.js +55 -0
  242. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  243. package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
  244. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  245. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  246. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  247. package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
  248. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  249. package/dist/core/permissions/types.js +127 -0
  250. package/dist/core/permissions/types.js.map +7 -0
  251. package/dist/core/tokenStats.js +9 -0
  252. package/dist/core/tokenStats.js.map +7 -0
  253. package/dist/core/tokenStatsManager.js +331 -0
  254. package/dist/core/tokenStatsManager.js.map +7 -0
  255. package/dist/core/tools/executor.js +143 -0
  256. package/dist/core/tools/executor.js.map +7 -0
  257. package/dist/core/tools/index.js +15 -0
  258. package/dist/core/tools/index.js.map +7 -0
  259. package/dist/core/tools/registry.js +183 -0
  260. package/dist/core/tools/registry.js.map +7 -0
  261. package/dist/core/tools/types.js +1 -0
  262. package/dist/core/tools/types.js.map +7 -0
  263. package/dist/cost-tracker.js +23 -15
  264. package/dist/cost-tracker.js.map +2 -2
  265. package/dist/entrypoints/cli.js +158 -130
  266. package/dist/entrypoints/cli.js.map +2 -2
  267. package/dist/entrypoints/mcp.js +12 -4
  268. package/dist/entrypoints/mcp.js.map +2 -2
  269. package/dist/history.js +14 -3
  270. package/dist/history.js.map +2 -2
  271. package/dist/hooks/useAgentTokenStats.js +72 -0
  272. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  273. package/dist/hooks/useAgentTranscripts.js +140 -0
  274. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  275. package/dist/hooks/useAnimationSync.js +53 -0
  276. package/dist/hooks/useAnimationSync.js.map +7 -0
  277. package/dist/hooks/useArrowKeyHistory.js +4 -2
  278. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  279. package/dist/hooks/useCanUseTool.js +3 -1
  280. package/dist/hooks/useCanUseTool.js.map +2 -2
  281. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  282. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  283. package/dist/hooks/useHookStatus.js +40 -0
  284. package/dist/hooks/useHookStatus.js.map +7 -0
  285. package/dist/hooks/useLogMessages.js +29 -2
  286. package/dist/hooks/useLogMessages.js.map +2 -2
  287. package/dist/hooks/useMessageGroups.js +43 -0
  288. package/dist/hooks/useMessageGroups.js.map +7 -0
  289. package/dist/hooks/useTerminalSize.js +62 -6
  290. package/dist/hooks/useTerminalSize.js.map +2 -2
  291. package/dist/hooks/useUnifiedCompletion.js +69 -0
  292. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  293. package/dist/i18n/index.js +109 -0
  294. package/dist/i18n/index.js.map +7 -0
  295. package/dist/i18n/locales/en.js +348 -0
  296. package/dist/i18n/locales/en.js.map +7 -0
  297. package/dist/i18n/locales/index.js +7 -0
  298. package/dist/i18n/locales/index.js.map +7 -0
  299. package/dist/i18n/locales/zh-CN.js +348 -0
  300. package/dist/i18n/locales/zh-CN.js.map +7 -0
  301. package/dist/i18n/types.js +8 -0
  302. package/dist/i18n/types.js.map +7 -0
  303. package/dist/permissions.js +28 -1
  304. package/dist/permissions.js.map +2 -2
  305. package/dist/query.js +253 -21
  306. package/dist/query.js.map +3 -3
  307. package/dist/screens/REPL.js +523 -194
  308. package/dist/screens/REPL.js.map +3 -3
  309. package/dist/services/adapters/chatCompletions.js +3 -1
  310. package/dist/services/adapters/chatCompletions.js.map +2 -2
  311. package/dist/services/adapters/messageNormalizer.js +354 -0
  312. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  313. package/dist/services/adapters/responsesAPI.js +6 -3
  314. package/dist/services/adapters/responsesAPI.js.map +2 -2
  315. package/dist/services/checkpointManager.js +386 -0
  316. package/dist/services/checkpointManager.js.map +7 -0
  317. package/dist/services/claude.js +192 -14
  318. package/dist/services/claude.js.map +3 -3
  319. package/dist/services/compressionService.js +50 -1
  320. package/dist/services/compressionService.js.map +2 -2
  321. package/dist/services/contextMonitor.js +162 -0
  322. package/dist/services/contextMonitor.js.map +7 -0
  323. package/dist/services/customCommands.js +60 -41
  324. package/dist/services/customCommands.js.map +2 -2
  325. package/dist/services/hookExecutor.js +173 -1
  326. package/dist/services/hookExecutor.js.map +2 -2
  327. package/dist/services/intelligentCompactor.js +281 -0
  328. package/dist/services/intelligentCompactor.js.map +7 -0
  329. package/dist/services/lspConfig.js +109 -0
  330. package/dist/services/lspConfig.js.map +7 -0
  331. package/dist/services/mcpClient.js +338 -43
  332. package/dist/services/mcpClient.js.map +2 -2
  333. package/dist/services/modelOrchestrator.js +310 -0
  334. package/dist/services/modelOrchestrator.js.map +7 -0
  335. package/dist/services/openai.js +8 -1
  336. package/dist/services/openai.js.map +2 -2
  337. package/dist/services/outputStyles.js +138 -0
  338. package/dist/services/outputStyles.js.map +7 -0
  339. package/dist/services/plugins/index.js +5 -0
  340. package/dist/services/plugins/index.js.map +7 -0
  341. package/dist/services/plugins/lspServers.js +188 -0
  342. package/dist/services/plugins/lspServers.js.map +7 -0
  343. package/dist/services/plugins/pluginRuntime.js +229 -0
  344. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  345. package/dist/services/plugins/pluginValidation.js +219 -0
  346. package/dist/services/plugins/pluginValidation.js.map +7 -0
  347. package/dist/services/plugins/skillMarketplace.js +556 -0
  348. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  349. package/dist/services/responseStateManager.js +37 -3
  350. package/dist/services/responseStateManager.js.map +2 -2
  351. package/dist/services/sandbox/filesystemBoundary.js +341 -0
  352. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  353. package/dist/services/sandbox/index.js +14 -0
  354. package/dist/services/sandbox/index.js.map +7 -0
  355. package/dist/services/sandbox/networkProxy.js +293 -0
  356. package/dist/services/sandbox/networkProxy.js.map +7 -0
  357. package/dist/services/sandbox/sandboxController.js +574 -0
  358. package/dist/services/sandbox/sandboxController.js.map +7 -0
  359. package/dist/services/sandbox/types.js +50 -0
  360. package/dist/services/sandbox/types.js.map +7 -0
  361. package/dist/services/sessionMemory.js +266 -0
  362. package/dist/services/sessionMemory.js.map +7 -0
  363. package/dist/services/taskRouter.js +324 -0
  364. package/dist/services/taskRouter.js.map +7 -0
  365. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  366. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  367. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
  368. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  369. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  370. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  371. package/dist/tools/BaseTool.js +72 -0
  372. package/dist/tools/BaseTool.js.map +7 -0
  373. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  374. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  375. package/dist/tools/BashTool/BashTool.js +79 -3
  376. package/dist/tools/BashTool/BashTool.js.map +2 -2
  377. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  378. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  379. package/dist/tools/BashTool/OutputLine.js +54 -0
  380. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  381. package/dist/tools/BashTool/prompt.js +336 -3
  382. package/dist/tools/BashTool/prompt.js.map +2 -2
  383. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  384. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  385. package/dist/tools/FileEditTool/prompt.js +6 -3
  386. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  387. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  388. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  389. package/dist/tools/FileWriteTool/prompt.js +4 -2
  390. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  391. package/dist/tools/GlobTool/GlobTool.js +4 -2
  392. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  393. package/dist/tools/GrepTool/GrepTool.js +36 -7
  394. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  395. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  396. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  397. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  398. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  399. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  400. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  401. package/dist/tools/LspTool/LspTool.js +664 -0
  402. package/dist/tools/LspTool/LspTool.js.map +7 -0
  403. package/dist/tools/LspTool/prompt.js +27 -0
  404. package/dist/tools/LspTool/prompt.js.map +7 -0
  405. package/dist/tools/MCPTool/MCPTool.js +9 -1
  406. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  407. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  408. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  409. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  410. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  411. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  412. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  413. package/dist/tools/MultiEditTool/prompt.js +5 -3
  414. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  415. package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
  416. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  417. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  418. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
  419. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  420. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
  421. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  422. package/dist/tools/PlanModeTool/prompt.js +94 -0
  423. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  424. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  425. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  426. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  427. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  428. package/dist/tools/SkillTool/SkillTool.js +10 -4
  429. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  430. package/dist/tools/SkillTool/prompt.js +1 -1
  431. package/dist/tools/SkillTool/prompt.js.map +1 -1
  432. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  433. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  434. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  435. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  436. package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
  437. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  438. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  439. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  440. package/dist/tools/TaskTool/TaskTool.js +310 -104
  441. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  442. package/dist/tools/TaskTool/prompt.js.map +2 -2
  443. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  444. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  445. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  446. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  447. package/dist/tools/URLFetcherTool/cache.js +55 -8
  448. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  449. package/dist/tools.js +31 -2
  450. package/dist/tools.js.map +2 -2
  451. package/dist/types/hooks.js +4 -0
  452. package/dist/types/hooks.js.map +2 -2
  453. package/dist/types/marketplace.js.map +2 -2
  454. package/dist/types/messageGroup.js +36 -0
  455. package/dist/types/messageGroup.js.map +7 -0
  456. package/dist/types/plugin.js.map +2 -2
  457. package/dist/types/thinking.js +1 -0
  458. package/dist/types/thinking.js.map +7 -0
  459. package/dist/utils/BackgroundShellManager.js +136 -39
  460. package/dist/utils/BackgroundShellManager.js.map +2 -2
  461. package/dist/utils/CircuitBreaker.js +242 -0
  462. package/dist/utils/CircuitBreaker.js.map +7 -0
  463. package/dist/utils/MessageBatchBuffer.js +102 -0
  464. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  465. package/dist/utils/PersistentShell.js +151 -1
  466. package/dist/utils/PersistentShell.js.map +2 -2
  467. package/dist/utils/agentLoader.js +1 -23
  468. package/dist/utils/agentLoader.js.map +2 -2
  469. package/dist/utils/agentTranscripts.js +641 -0
  470. package/dist/utils/agentTranscripts.js.map +7 -0
  471. package/dist/utils/animationManager.js +213 -0
  472. package/dist/utils/animationManager.js.map +7 -0
  473. package/dist/utils/animationSync.js +110 -0
  474. package/dist/utils/animationSync.js.map +7 -0
  475. package/dist/utils/ask.js +2 -0
  476. package/dist/utils/ask.js.map +2 -2
  477. package/dist/utils/asyncFile.js +215 -0
  478. package/dist/utils/asyncFile.js.map +7 -0
  479. package/dist/utils/backgroundAgentManager.js +231 -0
  480. package/dist/utils/backgroundAgentManager.js.map +7 -0
  481. package/dist/utils/config.js +108 -10
  482. package/dist/utils/config.js.map +2 -2
  483. package/dist/utils/conversationRecovery.js +19 -0
  484. package/dist/utils/conversationRecovery.js.map +2 -2
  485. package/dist/utils/credentials/CredentialStore.js +1 -0
  486. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  487. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  488. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  489. package/dist/utils/credentials/index.js +37 -0
  490. package/dist/utils/credentials/index.js.map +7 -0
  491. package/dist/utils/credentials/migration.js +82 -0
  492. package/dist/utils/credentials/migration.js.map +7 -0
  493. package/dist/utils/exit.js +73 -0
  494. package/dist/utils/exit.js.map +7 -0
  495. package/dist/utils/format.js +73 -5
  496. package/dist/utils/format.js.map +2 -2
  497. package/dist/utils/generators.js +76 -6
  498. package/dist/utils/generators.js.map +2 -2
  499. package/dist/utils/globalErrorHandler.js +149 -0
  500. package/dist/utils/globalErrorHandler.js.map +7 -0
  501. package/dist/utils/groupHandlers/index.js +8 -0
  502. package/dist/utils/groupHandlers/index.js.map +7 -0
  503. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  504. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  505. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  506. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  507. package/dist/utils/groupHandlers/types.js +1 -0
  508. package/dist/utils/groupHandlers/types.js.map +7 -0
  509. package/dist/utils/logRotation.js +224 -0
  510. package/dist/utils/logRotation.js.map +7 -0
  511. package/dist/utils/markdown.js +13 -1
  512. package/dist/utils/markdown.js.map +2 -2
  513. package/dist/utils/marketplaceManager.js +3 -5
  514. package/dist/utils/marketplaceManager.js.map +2 -2
  515. package/dist/utils/memSafety.js +264 -0
  516. package/dist/utils/memSafety.js.map +7 -0
  517. package/dist/utils/messageGroupManager.js +274 -0
  518. package/dist/utils/messageGroupManager.js.map +7 -0
  519. package/dist/utils/messages.js +13 -4
  520. package/dist/utils/messages.js.map +2 -2
  521. package/dist/utils/model.js +119 -15
  522. package/dist/utils/model.js.map +3 -3
  523. package/dist/utils/permissions/filesystem.js +162 -6
  524. package/dist/utils/permissions/filesystem.js.map +2 -2
  525. package/dist/utils/plan/planMode.js +143 -0
  526. package/dist/utils/plan/planMode.js.map +7 -0
  527. package/dist/utils/pluginLoader.js +17 -21
  528. package/dist/utils/pluginLoader.js.map +2 -2
  529. package/dist/utils/ripgrep.js +55 -2
  530. package/dist/utils/ripgrep.js.map +2 -2
  531. package/dist/utils/safePath.js +132 -0
  532. package/dist/utils/safePath.js.map +7 -0
  533. package/dist/utils/sanitizeInput.js +32 -0
  534. package/dist/utils/sanitizeInput.js.map +7 -0
  535. package/dist/utils/secureKeyStorage.js +312 -0
  536. package/dist/utils/secureKeyStorage.js.map +7 -0
  537. package/dist/utils/sensitiveFiles.js +125 -0
  538. package/dist/utils/sensitiveFiles.js.map +7 -0
  539. package/dist/utils/session/sessionPlugins.js +67 -0
  540. package/dist/utils/session/sessionPlugins.js.map +7 -0
  541. package/dist/utils/taskDisplayUtils.js +257 -0
  542. package/dist/utils/taskDisplayUtils.js.map +7 -0
  543. package/dist/utils/teamConfig.js +2 -1
  544. package/dist/utils/teamConfig.js.map +2 -2
  545. package/dist/utils/theme.js +6 -6
  546. package/dist/utils/theme.js.map +1 -1
  547. package/dist/utils/todoStorage.js +92 -2
  548. package/dist/utils/todoStorage.js.map +2 -2
  549. package/dist/utils/toolRiskClassification.js +207 -0
  550. package/dist/utils/toolRiskClassification.js.map +7 -0
  551. package/dist/utils/toolTimeout.js +136 -0
  552. package/dist/utils/toolTimeout.js.map +7 -0
  553. package/dist/utils/tooling/safeRender.js +116 -0
  554. package/dist/utils/tooling/safeRender.js.map +7 -0
  555. package/dist/utils/userFriendlyError.js +346 -0
  556. package/dist/utils/userFriendlyError.js.map +7 -0
  557. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  558. package/dist/version.js +2 -2
  559. package/dist/version.js.map +1 -1
  560. package/package.json +17 -5
  561. package/scripts/postinstall.js +128 -38
  562. package/dist/commands/agents.js +0 -2086
  563. package/dist/commands/agents.js.map +0 -7
  564. package/dist/commands/build.js +0 -74
  565. package/dist/commands/build.js.map +0 -7
  566. package/dist/commands/compression.js +0 -57
  567. package/dist/commands/compression.js.map +0 -7
  568. package/dist/commands/listen.js +0 -37
  569. package/dist/commands/listen.js.map +0 -7
  570. package/dist/commands/login.js +0 -37
  571. package/dist/commands/login.js.map +0 -7
  572. package/dist/commands/logout.js +0 -33
  573. package/dist/commands/logout.js.map +0 -7
  574. package/dist/commands/mcp.js +0 -40
  575. package/dist/commands/mcp.js.map +0 -7
  576. package/dist/commands/mcp_refresh.js +0 -40
  577. package/dist/commands/mcp_refresh.js.map +0 -7
  578. package/dist/commands/modelstatus.js +0 -21
  579. package/dist/commands/modelstatus.js.map +0 -7
  580. package/dist/commands/onboarding.js +0 -36
  581. package/dist/commands/onboarding.js.map +0 -7
  582. package/dist/commands/plugin-interactive.js +0 -446
  583. package/dist/commands/plugin-interactive.js.map +0 -7
  584. package/dist/commands/pr_comments.js +0 -61
  585. package/dist/commands/pr_comments.js.map +0 -7
  586. package/dist/commands/release-notes.js +0 -30
  587. package/dist/commands/release-notes.js.map +0 -7
  588. package/dist/commands/review.js +0 -51
  589. package/dist/commands/review.js.map +0 -7
  590. package/dist/components/Bug.js +0 -147
  591. package/dist/components/Bug.js.map +0 -7
  592. package/dist/components/ModelSelector.js +0 -2062
  593. package/dist/components/ModelSelector.js.map +0 -7
  594. package/dist/components/ModelStatusDisplay.js +0 -87
  595. package/dist/components/ModelStatusDisplay.js.map +0 -7
  596. package/dist/entrypoints/cli-wrapper.js +0 -61
  597. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  598. package/dist/hooks/useCancelRequest.js +0 -28
  599. package/dist/hooks/useCancelRequest.js.map +0 -7
  600. package/dist/screens/Doctor.js +0 -22
  601. package/dist/screens/Doctor.js.map +0 -7
@@ -8,25 +8,28 @@ import { useEffect, useMemo, useRef, useState, useCallback } from "react";
8
8
  import { Logo } from "../components/Logo.js";
9
9
  import { Message } from "../components/Message.js";
10
10
  import { MessageResponse } from "../components/MessageResponse.js";
11
+ import { BashStreamingProgress } from "../components/BashStreamingProgress.js";
11
12
  import { MessageSelector } from "../components/MessageSelector.js";
13
+ import { MessageBatchBuffer } from "../utils/MessageBatchBuffer.js";
12
14
  import {
13
15
  PermissionRequest
14
16
  } from "../components/permissions/PermissionRequest.js";
15
17
  import PromptInput from "../components/PromptInput.js";
16
- import { Spinner } from "../components/Spinner.js";
17
18
  import { getSystemPrompt } from "../constants/prompts.js";
18
19
  import { getContext } from "../context.js";
19
20
  import { getTotalCost, useCostSummary } from "../cost-tracker.js";
20
21
  import { useLogStartupTime } from "../hooks/useLogStartupTime.js";
21
22
  import { addToHistory } from "../history.js";
22
23
  import { useApiKeyVerification } from "../hooks/useApiKeyVerification.js";
23
- import { useCancelRequest } from "../hooks/useCancelRequest.js";
24
24
  import useCanUseTool from "../hooks/useCanUseTool.js";
25
- import { useLogMessages } from "../hooks/useLogMessages.js";
25
+ import { useLogMessages, serializeMessageForLog } from "../hooks/useLogMessages.js";
26
+ import { overwriteLog } from "../utils/log.js";
26
27
  import { PermissionProvider } from "../context/PermissionContext.js";
28
+ import { useFullscreenExitCallback } from "../hooks/useTerminalSize.js";
27
29
  import { ModeIndicator } from "../components/ModeIndicator.js";
28
30
  import { TodoPanel } from "../components/TodoPanel.js";
29
- import { getTodos } from "../utils/todoStorage.js";
31
+ import { TurnCompletionIndicator } from "../components/TurnCompletionIndicator.js";
32
+ import { getTodos, initTodoSession } from "../utils/todoStorage.js";
30
33
  import {
31
34
  setMessagesGetter,
32
35
  setMessagesSetter,
@@ -35,7 +38,11 @@ import {
35
38
  import {
36
39
  query
37
40
  } from "../query.js";
38
- import { getGlobalConfig, saveGlobalConfig } from "../utils/config.js";
41
+ import {
42
+ getGlobalConfig,
43
+ saveGlobalConfig,
44
+ getVerboseLabel
45
+ } from "../utils/config.js";
39
46
  import { getNextAvailableLogForkNumber } from "../utils/log.js";
40
47
  import {
41
48
  getErroredToolUseMessages,
@@ -48,8 +55,10 @@ import {
48
55
  normalizeMessages,
49
56
  normalizeMessagesForAPI,
50
57
  processUserInput,
51
- reorderMessages
58
+ reorderMessages,
59
+ createAssistantAPIErrorMessage
52
60
  } from "../utils/messages.js";
61
+ import { logError } from "../utils/log.js";
53
62
  import { ModelManager } from "../utils/model.js";
54
63
  import { clearTerminal } from "../utils/terminal.js";
55
64
  import { BinaryFeedback } from "../components/binary-feedback/BinaryFeedback.js";
@@ -68,11 +77,20 @@ import {
68
77
  } from "../utils/BackgroundShellManager.js";
69
78
  import { BackgroundTasksPanel } from "../components/BackgroundTasksPanel.js";
70
79
  import { AskUserQuestionDialog } from "../components/AskUserQuestionDialog/AskUserQuestionDialog.js";
80
+ import {
81
+ getToolUseIdByAgentId,
82
+ restoreToolUseAgentMappings
83
+ } from "../utils/agentTranscripts.js";
71
84
  import useAskUser from "../hooks/useAskUser.js";
85
+ import { useMessageGroups } from "../hooks/useMessageGroups.js";
86
+ import { useAgentTranscripts } from "../hooks/useAgentTranscripts.js";
87
+ import { GroupRenderer } from "../components/messages/GroupRenderer.js";
88
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
72
89
  const RESUME_VISIBLE_MESSAGE_COUNT = 10;
73
90
  function REPL({
74
91
  commands,
75
92
  safeMode,
93
+ safetyMode = "yolo",
76
94
  debug = false,
77
95
  initialForkNumber = 0,
78
96
  initialPrompt,
@@ -89,11 +107,19 @@ function REPL({
89
107
  isResumedConversation = false
90
108
  }) {
91
109
  const [verbose, setVerbose] = useState(
92
- () => verboseFromCLI ?? getGlobalConfig().verbose
110
+ verboseFromCLI === true ? true : false
93
111
  );
94
112
  const [forkNumber, setForkNumber] = useState(
95
113
  getNextAvailableLogForkNumber(messageLogName, initialForkNumber, 0)
96
114
  );
115
+ const [isResizeClearing, setIsResizeClearing] = useState(false);
116
+ useFullscreenExitCallback(async () => {
117
+ setIsResizeClearing(true);
118
+ await new Promise((resolve) => setTimeout(resolve, 50));
119
+ await clearTerminal();
120
+ setForkNumber((prev) => prev + 1);
121
+ setIsResizeClearing(false);
122
+ });
97
123
  const [
98
124
  forkConvoWithMessagesOnTheNextRender,
99
125
  setForkConvoWithMessagesOnTheNextRender
@@ -105,6 +131,7 @@ function REPL({
105
131
  null
106
132
  );
107
133
  const [messages, setMessages] = useState(initialMessages ?? []);
134
+ const messagesRef = useRef(initialMessages ?? []);
108
135
  const [messageHistory, setMessageHistory] = useState([]);
109
136
  const [inputValue, setInputValue] = useState("");
110
137
  const [inputMode, setInputMode] = useState(
@@ -121,11 +148,52 @@ function REPL({
121
148
  const updateAvailableVersion = initialUpdateVersion ?? null;
122
149
  const updateCommands = initialUpdateCommands ?? null;
123
150
  const [isTodoPanelVisible, setIsTodoPanelVisible] = useState(true);
124
- const [startTime] = useState(Date.now());
151
+ const [verboseToggleMessage, setVerboseToggleMessage] = useState(null);
152
+ const turnStartTimeRef = useRef(null);
153
+ const [lastTurnDurationMs, setLastTurnDurationMs] = useState(
154
+ null
155
+ );
156
+ const [queuedPrompts, setQueuedPrompts] = useState([]);
157
+ const queuedPromptsRef = useRef([]);
158
+ useEffect(() => {
159
+ queuedPromptsRef.current = queuedPrompts;
160
+ }, [queuedPrompts]);
161
+ useEffect(() => {
162
+ if (isLoading) {
163
+ turnStartTimeRef.current = Date.now();
164
+ setLastTurnDurationMs(null);
165
+ } else if (turnStartTimeRef.current !== null) {
166
+ const duration = Date.now() - turnStartTimeRef.current;
167
+ setLastTurnDurationMs(duration);
168
+ turnStartTimeRef.current = null;
169
+ }
170
+ }, [isLoading]);
125
171
  const [backgroundShells, setBackgroundShells] = useState(
126
172
  []
127
173
  );
128
174
  const [showBackgroundPanel, setShowBackgroundPanel] = useState(false);
175
+ const prevUnresolvedRef = useRef(/* @__PURE__ */ new Set());
176
+ const messageBatchBufferRef = useRef(null);
177
+ if (messageBatchBufferRef.current === null) {
178
+ messageBatchBufferRef.current = new MessageBatchBuffer(
179
+ (batchedMessages) => {
180
+ setMessages((prev) => [...prev, ...batchedMessages]);
181
+ },
182
+ {
183
+ flushInterval: 100,
184
+ // Batch messages for 100ms
185
+ maxBatchSize: 50,
186
+ // Force flush if 50+ messages buffered
187
+ debug: false
188
+ // Set to true for debugging
189
+ }
190
+ );
191
+ }
192
+ useEffect(() => {
193
+ return () => {
194
+ messageBatchBufferRef.current?.dispose();
195
+ };
196
+ }, []);
129
197
  const getBinaryFeedbackResponse = useCallback(
130
198
  (m1, m2) => {
131
199
  return new Promise((resolvePromise) => {
@@ -141,10 +209,21 @@ function REPL({
141
209
  const readFileTimestamps = useRef({});
142
210
  const hookManagerRef = useRef(null);
143
211
  const { status: apiKeyStatus, reverify } = useApiKeyVerification();
144
- function onCancel() {
212
+ function onInterrupt() {
145
213
  if (!isLoading) {
146
214
  return;
147
215
  }
216
+ const currentMessages = messagesRef.current;
217
+ if (currentMessages.length > 0) {
218
+ const serializedMessages = currentMessages.map(serializeMessageForLog);
219
+ overwriteLog(
220
+ getMessagesPath(messageLogName, forkNumber, 0),
221
+ serializedMessages
222
+ );
223
+ }
224
+ setToolJSX(null);
225
+ setToolUseConfirm(null);
226
+ setBinaryFeedbackContext(null);
148
227
  setIsLoading(false);
149
228
  if (toolUseConfirm) {
150
229
  toolUseConfirm.onAbort();
@@ -152,15 +231,9 @@ function REPL({
152
231
  abortController.abort();
153
232
  }
154
233
  }
155
- useCancelRequest(
156
- setToolJSX,
157
- setToolUseConfirm,
158
- setBinaryFeedbackContext,
159
- onCancel,
160
- isLoading,
161
- isMessageSelectorVisible,
162
- abortController?.signal
163
- );
234
+ function onCancel() {
235
+ onInterrupt();
236
+ }
164
237
  useEffect(() => {
165
238
  if (forkConvoWithMessagesOnTheNextRender) {
166
239
  setForkNumber((_) => _ + 1);
@@ -184,79 +257,90 @@ function REPL({
184
257
  setIsLoading(true);
185
258
  const newAbortController = new AbortController();
186
259
  setAbortController(newAbortController);
187
- const model = new ModelManager(getGlobalConfig()).getModelName("main");
188
- const newMessages = await processUserInput(
189
- initialPrompt,
190
- "prompt",
191
- setToolJSX,
192
- {
193
- abortController: newAbortController,
194
- options: {
195
- commands,
196
- forkNumber,
197
- messageLogName,
198
- tools,
199
- verbose,
200
- maxThinkingTokens: 0
201
- },
202
- messageId: getLastAssistantMessageId(messages),
203
- setForkConvoWithMessagesOnTheNextRender,
204
- readFileTimestamps: readFileTimestamps.current
205
- },
206
- null
207
- );
208
- if (newMessages.length) {
209
- for (const message of newMessages) {
210
- if (message.type === "user") {
211
- addToHistory(initialPrompt);
212
- }
213
- }
214
- setMessages((_) => [..._, ...newMessages]);
215
- const lastMessage = newMessages[newMessages.length - 1];
216
- if (lastMessage.type === "assistant") {
217
- setAbortController(null);
218
- setIsLoading(false);
219
- return;
220
- }
221
- const [systemPrompt, context, model2, maxThinkingTokens] = await Promise.all([
222
- getSystemPrompt(),
223
- getContext(),
224
- new ModelManager(getGlobalConfig()).getModelName("main"),
225
- getMaxThinkingTokens([...messages, ...newMessages])
226
- ]);
227
- for await (const message of query(
228
- [...messages, ...newMessages],
229
- systemPrompt,
230
- context,
231
- canUseTool,
260
+ try {
261
+ const model = new ModelManager(getGlobalConfig()).getModelName("main");
262
+ const newMessages = await processUserInput(
263
+ initialPrompt,
264
+ "prompt",
265
+ setToolJSX,
232
266
  {
267
+ abortController: newAbortController,
233
268
  options: {
234
269
  commands,
235
270
  forkNumber,
236
271
  messageLogName,
237
272
  tools,
238
273
  verbose,
239
- safeMode,
240
- maxThinkingTokens
274
+ maxThinkingTokens: 0
241
275
  },
242
- messageId: getLastAssistantMessageId([...messages, ...newMessages]),
243
- readFileTimestamps: readFileTimestamps.current,
244
- abortController: newAbortController,
245
- setToolJSX,
246
- askUser
276
+ messageId: getLastAssistantMessageId(messages),
277
+ setForkConvoWithMessagesOnTheNextRender,
278
+ readFileTimestamps: readFileTimestamps.current
247
279
  },
248
- getBinaryFeedbackResponse
249
- )) {
250
- setMessages((oldMessages) => [...oldMessages, message]);
280
+ null
281
+ );
282
+ if (newMessages.length) {
283
+ for (const message of newMessages) {
284
+ if (message.type === "user") {
285
+ addToHistory(initialPrompt);
286
+ }
287
+ }
288
+ setMessages((_) => [..._, ...newMessages]);
289
+ const lastMessage = newMessages[newMessages.length - 1];
290
+ if (lastMessage.type === "assistant") {
291
+ return;
292
+ }
293
+ const [systemPrompt, context, model2, maxThinkingTokens] = await Promise.all([
294
+ getSystemPrompt(),
295
+ getContext(),
296
+ new ModelManager(getGlobalConfig()).getModelName("main"),
297
+ getMaxThinkingTokens([...messages, ...newMessages])
298
+ ]);
299
+ for await (const message of query(
300
+ [...messages, ...newMessages],
301
+ systemPrompt,
302
+ context,
303
+ canUseTool,
304
+ {
305
+ options: {
306
+ commands,
307
+ forkNumber,
308
+ messageLogName,
309
+ tools,
310
+ verbose,
311
+ safeMode,
312
+ safetyMode,
313
+ maxThinkingTokens
314
+ },
315
+ messageId: getLastAssistantMessageId([...messages, ...newMessages]),
316
+ readFileTimestamps: readFileTimestamps.current,
317
+ abortController: newAbortController,
318
+ setToolJSX,
319
+ askUser
320
+ },
321
+ getBinaryFeedbackResponse
322
+ )) {
323
+ messageBatchBufferRef.current?.add(message);
324
+ }
325
+ messageBatchBufferRef.current?.flush();
326
+ } else {
327
+ addToHistory(initialPrompt);
251
328
  }
252
- } else {
253
- addToHistory(initialPrompt);
329
+ setHaveShownCostDialog(
330
+ getGlobalConfig().hasAcknowledgedCostThreshold || false
331
+ );
332
+ } catch (error) {
333
+ logError(error);
334
+ setMessages((oldMessages) => [
335
+ ...oldMessages,
336
+ createAssistantAPIErrorMessage(
337
+ `Request failed: ${error instanceof Error ? error.message : String(error)}`
338
+ )
339
+ ]);
340
+ } finally {
341
+ setIsLoading(false);
342
+ setAbortController(null);
254
343
  }
255
- setHaveShownCostDialog(
256
- getGlobalConfig().hasAcknowledgedCostThreshold || false
257
- );
258
- setIsLoading(false);
259
- setAbortController(null);
260
344
  }
261
345
  function rollbackConversation() {
262
346
  if (messageHistory.length === 0) {
@@ -267,11 +351,14 @@ function REPL({
267
351
  setMessageHistory((history) => history.slice(0, -1));
268
352
  return true;
269
353
  }
354
+ const processNextQueuedPromptRef = useRef(null);
270
355
  async function onQuery(newMessages, passedAbortController) {
271
356
  const controllerToUse = passedAbortController || new AbortController();
272
357
  if (!passedAbortController) {
273
358
  setAbortController(controllerToUse);
274
359
  }
360
+ setIsLoading(true);
361
+ setVerbose(false);
275
362
  const isKodingRequest = newMessages.length > 0 && newMessages[0].type === "user" && "options" in newMessages[0] && newMessages[0].options?.isKodingRequest === true;
276
363
  setMessages((oldMessages) => {
277
364
  setMessageHistory((history) => [...history, oldMessages].slice(-10));
@@ -286,56 +373,76 @@ function REPL({
286
373
  setIsLoading(false);
287
374
  return;
288
375
  }
289
- const [systemPrompt, context, model, maxThinkingTokens] = await Promise.all(
290
- [
376
+ try {
377
+ const [systemPrompt, context, model, maxThinkingTokens] = await Promise.all([
291
378
  getSystemPrompt(),
292
379
  getContext(),
293
380
  new ModelManager(getGlobalConfig()).getModelName("main"),
294
381
  getMaxThinkingTokens([...messages, lastMessage])
295
- ]
296
- );
297
- let lastAssistantMessage = null;
298
- for await (const message of query(
299
- [...messages, lastMessage],
300
- systemPrompt,
301
- context,
302
- canUseTool,
303
- {
304
- options: {
305
- commands,
306
- forkNumber,
307
- messageLogName,
308
- tools,
309
- verbose,
310
- safeMode,
311
- maxThinkingTokens,
312
- // If this came from Koding mode, pass that along
313
- isKodingRequest: isKodingRequest || void 0
382
+ ]);
383
+ let lastAssistantMessage = null;
384
+ for await (const message of query(
385
+ [...messages, lastMessage],
386
+ systemPrompt,
387
+ context,
388
+ canUseTool,
389
+ {
390
+ options: {
391
+ commands,
392
+ forkNumber,
393
+ messageLogName,
394
+ tools,
395
+ verbose,
396
+ safeMode,
397
+ safetyMode,
398
+ maxThinkingTokens,
399
+ // If this came from Koding mode, pass that along
400
+ isKodingRequest: isKodingRequest || void 0
401
+ },
402
+ messageId: getLastAssistantMessageId([...messages, lastMessage]),
403
+ readFileTimestamps: readFileTimestamps.current,
404
+ abortController: controllerToUse,
405
+ setToolJSX,
406
+ askUser
314
407
  },
315
- messageId: getLastAssistantMessageId([...messages, lastMessage]),
316
- readFileTimestamps: readFileTimestamps.current,
317
- abortController: controllerToUse,
318
- setToolJSX,
319
- askUser
320
- },
321
- getBinaryFeedbackResponse
322
- )) {
323
- setMessages((oldMessages) => [...oldMessages, message]);
324
- if (message.type === "assistant") {
325
- lastAssistantMessage = message;
408
+ getBinaryFeedbackResponse
409
+ )) {
410
+ messageBatchBufferRef.current?.add(message);
411
+ if (message.type === "assistant") {
412
+ lastAssistantMessage = message;
413
+ }
326
414
  }
327
- }
328
- if (isKodingRequest && lastAssistantMessage && lastAssistantMessage.type === "assistant") {
329
- try {
330
- const content = typeof lastAssistantMessage.message.content === "string" ? lastAssistantMessage.message.content : lastAssistantMessage.message.content.filter((block) => block.type === "text").map((block) => block.type === "text" ? block.text : "").join("\n");
331
- if (content && content.trim().length > 0) {
332
- handleHashCommand(content);
415
+ if (isKodingRequest && lastAssistantMessage && lastAssistantMessage.type === "assistant") {
416
+ try {
417
+ const content = typeof lastAssistantMessage.message.content === "string" ? lastAssistantMessage.message.content : lastAssistantMessage.message.content.filter((block) => block.type === "text").map((block) => block.type === "text" ? block.text : "").join("\n");
418
+ if (content && content.trim().length > 0) {
419
+ handleHashCommand(content);
420
+ }
421
+ } catch (error) {
422
+ console.error("Error saving response to project docs:", error);
333
423
  }
334
- } catch (error) {
335
- console.error("Error saving response to project docs:", error);
424
+ }
425
+ messageBatchBufferRef.current?.flush();
426
+ } catch (error) {
427
+ logError(error);
428
+ messageBatchBufferRef.current?.flush();
429
+ setMessages((oldMessages) => [
430
+ ...oldMessages,
431
+ createAssistantAPIErrorMessage(
432
+ `Request failed: ${error instanceof Error ? error.message : String(error)}`
433
+ )
434
+ ]);
435
+ } finally {
436
+ setIsLoading(false);
437
+ setAbortController(null);
438
+ if (queuedPromptsRef.current.length > 0) {
439
+ setTimeout(() => {
440
+ if (processNextQueuedPromptRef.current) {
441
+ processNextQueuedPromptRef.current();
442
+ }
443
+ }, 100);
336
444
  }
337
445
  }
338
- setIsLoading(false);
339
446
  }
340
447
  useCostSummary();
341
448
  useEffect(() => {
@@ -343,11 +450,21 @@ function REPL({
343
450
  setMessagesGetter(getMessages);
344
451
  setMessagesSetter(setMessages);
345
452
  }, [messages]);
453
+ useEffect(() => {
454
+ const todoSessionId = `${messageLogName}-${forkNumber}`;
455
+ initTodoSession(todoSessionId);
456
+ if (initialMessages && initialMessages.length > 0) {
457
+ restoreToolUseAgentMappings();
458
+ }
459
+ }, [messageLogName, forkNumber, initialMessages]);
346
460
  useEffect(() => {
347
461
  setModelConfigChangeHandler(() => {
348
462
  setForkNumber((prev) => prev + 1);
349
463
  });
350
464
  }, []);
465
+ useEffect(() => {
466
+ messagesRef.current = messages;
467
+ }, [messages]);
351
468
  useLogMessages(messages, messageLogName, forkNumber);
352
469
  useLogStartupTime();
353
470
  useEffect(() => {
@@ -395,6 +512,9 @@ function REPL({
395
512
  () => getUnresolvedToolUseIDs(normalizedMessages),
396
513
  [normalizedMessages]
397
514
  );
515
+ useEffect(() => {
516
+ prevUnresolvedRef.current = new Set(unresolvedToolUseIDs);
517
+ }, [unresolvedToolUseIDs]);
398
518
  const inProgressToolUseIDs = useMemo(
399
519
  () => getInProgressToolUseIDs(normalizedMessages),
400
520
  [normalizedMessages]
@@ -407,14 +527,40 @@ function REPL({
407
527
  ),
408
528
  [normalizedMessages]
409
529
  );
530
+ const {
531
+ groups: messageGroups,
532
+ getGroupForMessage,
533
+ getGroupForToolUse,
534
+ shouldGroupBeStatic,
535
+ displayConfig
536
+ } = useMessageGroups(
537
+ normalizedMessages,
538
+ unresolvedToolUseIDs,
539
+ inProgressToolUseIDs,
540
+ verbose
541
+ );
542
+ const { transcripts: agentTranscripts, getTranscript } = useAgentTranscripts();
543
+ const toolOutputs = useMemo(() => {
544
+ const outputs = /* @__PURE__ */ new Map();
545
+ for (const msg of normalizedMessages) {
546
+ if (msg.type === "user" && msg.message.role === "user") {
547
+ for (const block of msg.message.content) {
548
+ if (typeof block === "object" && block.type === "tool_result") {
549
+ outputs.set(block.tool_use_id, block);
550
+ }
551
+ }
552
+ }
553
+ }
554
+ return outputs;
555
+ }, [normalizedMessages]);
410
556
  const messagesJSX = useMemo(() => {
411
557
  const reorderedMessages = reorderMessages(normalizedMessages);
412
558
  const hiddenMessageCount = isResumedConversation && reorderedMessages.length > RESUME_VISIBLE_MESSAGE_COUNT ? reorderedMessages.length - RESUME_VISIBLE_MESSAGE_COUNT : 0;
413
559
  const visibleMessages = hiddenMessageCount > 0 ? reorderedMessages.slice(-RESUME_VISIBLE_MESSAGE_COUNT) : reorderedMessages;
414
- return [
560
+ const result = [
415
561
  {
416
562
  type: "static",
417
- jsx: /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", key: `logo${forkNumber}` }, /* @__PURE__ */ React.createElement(
563
+ jsx: /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%", key: `logo${forkNumber}` }, /* @__PURE__ */ React.createElement(
418
564
  Logo,
419
565
  {
420
566
  mcpClients,
@@ -423,17 +569,102 @@ function REPL({
423
569
  updateBannerCommands: updateCommands
424
570
  }
425
571
  ), /* @__PURE__ */ React.createElement(ProjectOnboarding, { workspaceDir: getOriginalCwd() }))
426
- },
427
- // Show collapsed history indicator when resuming with hidden messages
428
- ...hiddenMessageCount > 0 ? [
429
- {
430
- type: "static",
431
- jsx: /* @__PURE__ */ React.createElement(Box, { key: "collapsed-history", paddingLeft: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\xB7\xB7\xB7 ", hiddenMessageCount, " earlier messages hidden \xB7\xB7\xB7"))
572
+ }
573
+ ];
574
+ if (hiddenMessageCount > 0) {
575
+ result.push({
576
+ type: "static",
577
+ jsx: /* @__PURE__ */ React.createElement(Box, { key: "collapsed-history", paddingLeft: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\xB7\xB7\xB7 ", hiddenMessageCount, " earlier messages hidden \xB7\xB7\xB7"))
578
+ });
579
+ }
580
+ const renderedGroupIds = /* @__PURE__ */ new Set();
581
+ const groupToolUseIds = /* @__PURE__ */ new Set();
582
+ const taskOutputToolUseIdsToSkip = /* @__PURE__ */ new Set();
583
+ for (const _ of visibleMessages) {
584
+ const toolUseID = getToolUseID(_);
585
+ let group = getGroupForMessage(_.uuid);
586
+ if (!group && _.type === "progress") {
587
+ group = getGroupForToolUse(_.toolUseID);
588
+ }
589
+ if (group && (group.type === "parallel-tasks" || group.type === "task")) {
590
+ if (renderedGroupIds.has(group.id)) {
591
+ continue;
592
+ }
593
+ renderedGroupIds.add(group.id);
594
+ if (group.metadata.siblingToolUseIds) {
595
+ for (const id of group.metadata.siblingToolUseIds) {
596
+ groupToolUseIds.add(id);
597
+ }
432
598
  }
433
- ] : [],
434
- ...visibleMessages.map((_) => {
435
- const toolUseID = getToolUseID(_);
436
- const message = _.type === "progress" ? _.content.message.content[0]?.type === "text" && // TaskTool interrupts use Progress messages without extra ⎿
599
+ if (group.metadata.toolUseId) {
600
+ groupToolUseIds.add(group.metadata.toolUseId);
601
+ }
602
+ const isGroupStatic = shouldGroupBeStatic(group);
603
+ const groupType = isGroupStatic ? "static" : "transient";
604
+ const shouldAnimate = !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !isGroupStatic;
605
+ result.push({
606
+ type: groupType,
607
+ jsx: /* @__PURE__ */ React.createElement(Box, { key: `group-${group.id}`, width: "100%" }, /* @__PURE__ */ React.createElement(
608
+ GroupRenderer,
609
+ {
610
+ group,
611
+ context: {
612
+ depth: 0,
613
+ isLastChild: true,
614
+ displayConfig,
615
+ shouldAnimate,
616
+ getTranscript
617
+ },
618
+ messages: normalizedMessages,
619
+ transcripts: agentTranscripts,
620
+ outputs: toolOutputs
621
+ }
622
+ ))
623
+ });
624
+ continue;
625
+ }
626
+ if (_.type === "user" && _.message.role === "user") {
627
+ const content = _.message.content;
628
+ if (Array.isArray(content)) {
629
+ const toolResult = content.find(
630
+ (block) => typeof block === "object" && block.type === "tool_result"
631
+ );
632
+ if (toolResult && (groupToolUseIds.has(toolResult.tool_use_id) || taskOutputToolUseIdsToSkip.has(toolResult.tool_use_id))) {
633
+ continue;
634
+ }
635
+ }
636
+ }
637
+ if (_.type === "assistant") {
638
+ const content = _.message.content;
639
+ if (Array.isArray(content)) {
640
+ const taskOutputCall = content.find(
641
+ (block) => typeof block === "object" && block.type === "tool_use" && block.name === "TaskOutput"
642
+ );
643
+ if (taskOutputCall) {
644
+ const taskId = taskOutputCall.input?.task_id;
645
+ if (taskId) {
646
+ const correspondingToolUseId = getToolUseIdByAgentId(taskId);
647
+ if (correspondingToolUseId && groupToolUseIds.has(correspondingToolUseId)) {
648
+ taskOutputToolUseIdsToSkip.add(taskOutputCall.id);
649
+ continue;
650
+ }
651
+ }
652
+ }
653
+ }
654
+ }
655
+ if (_.type === "progress" && "type" in _.content && _.content.type === "streaming" && !unresolvedToolUseIDs.has(_.toolUseID)) {
656
+ continue;
657
+ }
658
+ const message = _.type === "progress" ? (
659
+ // Check if this is a streaming progress content (e.g., from BashTool)
660
+ "type" in _.content && _.content.type === "streaming" ? /* @__PURE__ */ React.createElement(
661
+ BashStreamingProgress,
662
+ {
663
+ stdout: _.content.stdout,
664
+ stderr: _.content.stderr,
665
+ isStreaming: _.content.isStreaming
666
+ }
667
+ ) : _.content.message.content[0]?.type === "text" && // TaskTool interrupts use Progress messages without extra ⎿
437
668
  // since <Message /> component already adds the margin
438
669
  _.content.message.content[0].text === INTERRUPT_MESSAGE ? /* @__PURE__ */ React.createElement(
439
670
  Message,
@@ -472,48 +703,50 @@ function REPL({
472
703
  }
473
704
  )
474
705
  }
475
- ) : /* @__PURE__ */ React.createElement(
476
- Message,
477
- {
478
- message: _,
479
- messages: normalizedMessages,
480
- addMargin: true,
481
- tools,
482
- verbose,
483
- debug,
484
- erroredToolUseIDs,
485
- inProgressToolUseIDs,
486
- shouldAnimate: !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && (!toolUseID || inProgressToolUseIDs.has(toolUseID)),
487
- shouldShowDot: true,
488
- unresolvedToolUseIDs
489
- }
490
- );
491
- const type = shouldRenderStatically(
492
- _,
493
- normalizedMessages,
706
+ )
707
+ ) : /* @__PURE__ */ React.createElement(
708
+ Message,
709
+ {
710
+ message: _,
711
+ messages: normalizedMessages,
712
+ addMargin: true,
713
+ tools,
714
+ verbose,
715
+ debug,
716
+ erroredToolUseIDs,
717
+ inProgressToolUseIDs,
718
+ shouldAnimate: !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && (!toolUseID || inProgressToolUseIDs.has(toolUseID)),
719
+ shouldShowDot: true,
494
720
  unresolvedToolUseIDs
495
- ) ? "static" : "transient";
496
- if (debug) {
497
- return {
498
- type,
499
- jsx: /* @__PURE__ */ React.createElement(
500
- Box,
501
- {
502
- borderStyle: "single",
503
- borderColor: type === "static" ? "green" : "red",
504
- key: _.uuid,
505
- width: "100%"
506
- },
507
- message
508
- )
509
- };
510
721
  }
511
- return {
722
+ );
723
+ const type = shouldRenderStatically(
724
+ _,
725
+ normalizedMessages,
726
+ unresolvedToolUseIDs
727
+ ) ? "static" : "transient";
728
+ if (debug) {
729
+ result.push({
730
+ type,
731
+ jsx: /* @__PURE__ */ React.createElement(
732
+ Box,
733
+ {
734
+ borderStyle: "single",
735
+ borderColor: type === "static" ? "green" : "red",
736
+ key: _.uuid,
737
+ width: "100%"
738
+ },
739
+ message
740
+ )
741
+ });
742
+ } else {
743
+ result.push({
512
744
  type,
513
745
  jsx: /* @__PURE__ */ React.createElement(Box, { key: _.uuid, width: "100%" }, message)
514
- };
515
- })
516
- ];
746
+ });
747
+ }
748
+ }
749
+ return result;
517
750
  }, [
518
751
  forkNumber,
519
752
  normalizedMessages,
@@ -528,28 +761,123 @@ function REPL({
528
761
  unresolvedToolUseIDs,
529
762
  mcpClients,
530
763
  isDefaultModel,
531
- isResumedConversation
764
+ isResumedConversation,
765
+ // V1+ dependencies
766
+ messageGroups,
767
+ getGroupForMessage,
768
+ getGroupForToolUse,
769
+ shouldGroupBeStatic,
770
+ displayConfig,
771
+ agentTranscripts,
772
+ toolOutputs
532
773
  ]);
533
774
  const showingCostDialog = !isLoading && showCostDialog;
775
+ const { staticItems, dynamicItems } = useMemo(() => {
776
+ const staticItems2 = [];
777
+ const dynamicItems2 = [];
778
+ for (const item of messagesJSX) {
779
+ if (item.type === "static") {
780
+ const key = item.jsx.key?.toString() || `static-${staticItems2.length}`;
781
+ staticItems2.push({ id: key, jsx: item.jsx });
782
+ } else if (item.type === "transient") {
783
+ dynamicItems2.push(item);
784
+ }
785
+ }
786
+ return { staticItems: staticItems2, dynamicItems: dynamicItems2 };
787
+ }, [messagesJSX]);
788
+ const handleShowMessageSelector = useCallback(() => {
789
+ setIsMessageSelectorVisible((prev) => !prev);
790
+ }, []);
791
+ const handleToggleTodoPanel = useCallback(() => {
792
+ setIsTodoPanelVisible((prev) => !prev);
793
+ }, []);
794
+ const handleToggleBackgroundPanel = useCallback(() => {
795
+ setShowBackgroundPanel((prev) => !prev);
796
+ }, []);
797
+ const handleModelChange = useCallback(() => {
798
+ setForkNumber((prev) => prev + 1);
799
+ }, []);
800
+ const handleToggleVerbose = useCallback(async (newVerbose) => {
801
+ const message = `${getVerboseLabel(newVerbose)} (Ctrl+O)`;
802
+ setVerboseToggleMessage(message);
803
+ setTimeout(() => setVerboseToggleMessage(null), 2e3);
804
+ setIsResizeClearing(true);
805
+ await new Promise((resolve) => setTimeout(resolve, 50));
806
+ await clearTerminal();
807
+ setVerbose(newVerbose);
808
+ setForkNumber((prev) => prev + 1);
809
+ setIsResizeClearing(false);
810
+ }, []);
811
+ const handleQueueAwareQuery = useCallback(
812
+ async (newMessages, abortController2) => {
813
+ if (!isLoading) {
814
+ return onQuery(newMessages, abortController2);
815
+ }
816
+ const userMessage = newMessages.find((m) => m.type === "user");
817
+ if (userMessage && userMessage.type === "user") {
818
+ const promptText = typeof userMessage.message.content === "string" ? userMessage.message.content : "";
819
+ if (promptText) {
820
+ setQueuedPrompts((prev) => [...prev, promptText]);
821
+ }
822
+ }
823
+ },
824
+ [isLoading]
825
+ );
826
+ useEffect(() => {
827
+ processNextQueuedPromptRef.current = async () => {
828
+ if (queuedPrompts.length === 0) return;
829
+ const nextPrompt = queuedPrompts[0];
830
+ setQueuedPrompts((prev) => prev.slice(1));
831
+ if (!nextPrompt) return;
832
+ const userMessage = {
833
+ type: "user",
834
+ uuid: randomUUID(),
835
+ message: {
836
+ role: "user",
837
+ content: nextPrompt
838
+ }
839
+ };
840
+ setIsLoading(true);
841
+ const newAbortController = new AbortController();
842
+ setAbortController(newAbortController);
843
+ await onQuery([userMessage], newAbortController);
844
+ };
845
+ }, [queuedPrompts]);
534
846
  return /* @__PURE__ */ React.createElement(
535
847
  PermissionProvider,
536
848
  {
537
849
  isBypassPermissionsModeAvailable: !safeMode,
538
- children: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ModeIndicator, null), /* @__PURE__ */ React.createElement(React.Fragment, { key: `static-messages-${forkNumber}` }, /* @__PURE__ */ React.createElement(
850
+ children: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(React.Fragment, { key: `mode-indicator-${forkNumber}` }, /* @__PURE__ */ React.createElement(ModeIndicator, null)), /* @__PURE__ */ React.createElement(React.Fragment, { key: `static-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
539
851
  Static,
540
852
  {
541
- items: messagesJSX.filter((_) => _.type === "static"),
542
- children: (item) => item.jsx
853
+ items: staticItems,
854
+ children: (item) => /* @__PURE__ */ React.createElement(React.Fragment, { key: item.id }, item.jsx)
543
855
  }
544
- )), messagesJSX.filter((_) => _.type === "transient").map((_) => _.jsx), /* @__PURE__ */ React.createElement(
856
+ )), /* @__PURE__ */ React.createElement(React.Fragment, { key: `dynamic-messages-${forkNumber}` }, dynamicItems.map((item) => item.jsx)), /* @__PURE__ */ React.createElement(
545
857
  Box,
546
858
  {
859
+ key: `transient-ui-${forkNumber}`,
547
860
  borderColor: "red",
548
861
  borderStyle: debug ? "single" : void 0,
549
862
  flexDirection: "column",
550
863
  width: "100%"
551
864
  },
552
- !toolJSX && !toolUseConfirm && !binaryFeedbackContext && isLoading && /* @__PURE__ */ React.createElement(Spinner, null),
865
+ !isResizeClearing && !toolJSX && !toolUseConfirm && !binaryFeedbackContext && /* @__PURE__ */ React.createElement(
866
+ TodoPanel,
867
+ {
868
+ todos: getTodos(),
869
+ isVisible: isTodoPanelVisible,
870
+ isLoading,
871
+ showTodoList: isTodoPanelVisible
872
+ }
873
+ ),
874
+ !isResizeClearing && !isLoading && !toolJSX && !toolUseConfirm && !binaryFeedbackContext && /* @__PURE__ */ React.createElement(
875
+ TurnCompletionIndicator,
876
+ {
877
+ durationMs: lastTurnDurationMs,
878
+ isVisible: lastTurnDurationMs !== null
879
+ }
880
+ ),
553
881
  toolJSX ? toolJSX.jsx : null,
554
882
  !toolJSX && binaryFeedbackContext && !isMessageSelectorVisible && /* @__PURE__ */ React.createElement(
555
883
  BinaryFeedback,
@@ -599,15 +927,6 @@ function REPL({
599
927
  }
600
928
  ),
601
929
  !toolUseConfirm && !toolJSX?.shouldHidePromptInput && shouldShowPromptInput && !isMessageSelectorVisible && !binaryFeedbackContext && !askUserQuestionContext && !showingCostDialog && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
602
- TodoPanel,
603
- {
604
- todos: getTodos(),
605
- isVisible: isTodoPanelVisible,
606
- elapsedTime: Math.floor((Date.now() - startTime) / 1e3),
607
- tokenCount: 0,
608
- isLoading
609
- }
610
- ), /* @__PURE__ */ React.createElement(
611
930
  BackgroundTasksPanel,
612
931
  {
613
932
  shells: backgroundShells,
@@ -632,6 +951,7 @@ function REPL({
632
951
  onQuery,
633
952
  debug,
634
953
  verbose,
954
+ verboseToggleMessage,
635
955
  messages,
636
956
  setToolJSX,
637
957
  input: inputValue,
@@ -642,21 +962,30 @@ function REPL({
642
962
  onSubmitCountChange: setSubmitCount,
643
963
  setIsLoading,
644
964
  setAbortController,
645
- onShowMessageSelector: () => setIsMessageSelectorVisible((prev) => !prev),
965
+ onShowMessageSelector: handleShowMessageSelector,
646
966
  setForkConvoWithMessagesOnTheNextRender,
647
967
  readFileTimestamps: readFileTimestamps.current,
648
968
  abortController,
649
- onModelChange: () => setForkNumber((prev) => prev + 1),
969
+ onModelChange: handleModelChange,
650
970
  onRollbackConversation: rollbackConversation,
651
- onToggleTodoPanel: () => setIsTodoPanelVisible((prev) => !prev),
652
- onToggleVerbose: () => setVerbose((prev) => !prev),
653
- onToggleBackgroundPanel: () => setShowBackgroundPanel((prev) => !prev),
971
+ onToggleTodoPanel: handleToggleTodoPanel,
972
+ onToggleVerbose: handleToggleVerbose,
973
+ onToggleBackgroundPanel: handleToggleBackgroundPanel,
654
974
  backgroundShellCount: backgroundShells.filter((s) => s.status === "running").length,
655
975
  isBackgroundPanelOpen: showBackgroundPanel,
656
- fallbackMode
976
+ fallbackMode,
977
+ queuedPrompts,
978
+ onQueuePrompt: (prompt) => setQueuedPrompts((prev) => [...prev, prompt]),
979
+ onPopQueuedPrompt: () => {
980
+ if (queuedPrompts.length === 0) return void 0;
981
+ const lastPrompt = queuedPrompts[queuedPrompts.length - 1];
982
+ setQueuedPrompts((prev) => prev.slice(0, -1));
983
+ return lastPrompt;
984
+ },
985
+ onInterrupt
657
986
  }
658
987
  ))
659
- ), isMessageSelectorVisible && /* @__PURE__ */ React.createElement(
988
+ ), isMessageSelectorVisible && /* @__PURE__ */ React.createElement(React.Fragment, { key: `message-selector-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
660
989
  MessageSelector,
661
990
  {
662
991
  erroredToolUseIDs,
@@ -682,7 +1011,7 @@ function REPL({
682
1011
  onEscape: () => setIsMessageSelectorVisible(false),
683
1012
  tools
684
1013
  }
685
- ), /* @__PURE__ */ React.createElement(Newline, null))
1014
+ )), /* @__PURE__ */ React.createElement(Newline, null))
686
1015
  }
687
1016
  );
688
1017
  }