@within-7/minto 0.1.6 → 0.2.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 (487) 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 +52 -26
  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 +84 -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 +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -11,7 +11,8 @@ import { formatDuration, formatNumber } from "../../utils/format.js";
11
11
  import {
12
12
  getMessagesPath,
13
13
  getNextAvailableLogSidechainNumber,
14
- overwriteLog
14
+ overwriteLog,
15
+ logError
15
16
  } from "../../utils/log.js";
16
17
  import {
17
18
  createAssistantMessage,
@@ -24,12 +25,25 @@ import { getModelManager } from "../../utils/model.js";
24
25
  import { getMaxThinkingTokens } from "../../utils/thinking.js";
25
26
  import { getTheme } from "../../utils/theme.js";
26
27
  import { generateAgentId } from "../../utils/agentStorage.js";
28
+ import { debug as debugLogger } from "../../utils/debugLogger.js";
27
29
  import { getTaskTools, getPrompt } from "./prompt.js";
28
30
  import { TOOL_NAME } from "./constants.js";
29
31
  import {
30
32
  getAgentByType,
31
33
  getAvailableAgentTypes
32
34
  } from "../../utils/agentLoader.js";
35
+ import {
36
+ createAgentTranscript,
37
+ getResumableTranscript,
38
+ appendMessageToTranscript,
39
+ updateAgentTranscript,
40
+ completeAgentTranscript,
41
+ failAgentTranscript,
42
+ interruptAgentTranscript,
43
+ canResumeTranscript,
44
+ registerToolUseAgent
45
+ } from "../../utils/agentTranscripts.js";
46
+ import { UserFriendlyError } from "../../utils/userFriendlyError.js";
33
47
  const inputSchema = z.object({
34
48
  description: z.string().describe("A short (3-5 word) description of the task"),
35
49
  prompt: z.string().describe("The task for the agent to perform"),
@@ -37,8 +51,12 @@ const inputSchema = z.object({
37
51
  "Optional: Specific model name to use for this task. If not provided, uses the default task model pointer."
38
52
  ),
39
53
  subagent_type: z.string().optional().describe(
40
- 'The specialized agent type (MUST use hyphens, e.g., "strategic-market-analyzer"). For research/analysis use "strategic-market-analyzer" or "business-analyst", for data use "data-scientist", for general use "general-purpose". NEVER use underscores or invent names like "researcher".'
54
+ 'The specialized agent type to use. MUST be an exact name from the available agents list in the tool description. Defaults to "general-purpose" if not specified.'
55
+ ),
56
+ resume: z.string().optional().describe(
57
+ "Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript."
41
58
  )
59
+ // run_in_background parameter removed - concurrent execution is automatic
42
60
  });
43
61
  const TaskTool = {
44
62
  async prompt({ safeMode }) {
@@ -47,17 +65,49 @@ const TaskTool = {
47
65
  name: TOOL_NAME,
48
66
  async description() {
49
67
  const availableTypes = await getAvailableAgentTypes();
50
- const typesList = availableTypes.slice(0, 10).join(", ") + (availableTypes.length > 10 ? "..." : "");
51
- return `Launch a specialized agent to handle tasks autonomously. CRITICAL: Use exact agent type names with hyphens (e.g., "strategic-market-analyzer", NOT "researcher" or "market_analyzer"). Available: ${typesList}`;
68
+ const typesList = availableTypes.join(", ");
69
+ return `Launch a specialized agent to handle tasks autonomously. You MUST use an exact agent type name from this list: ${typesList}. Default to "general-purpose" if unsure.`;
52
70
  },
53
71
  inputSchema,
54
- async *call({ description, prompt, model_name, subagent_type }, {
72
+ async *call({ description, prompt, model_name, subagent_type, resume }, {
55
73
  abortController,
56
74
  options: { safeMode = false, forkNumber, messageLogName, verbose },
57
- readFileTimestamps
75
+ readFileTimestamps,
76
+ toolUseId
58
77
  }) {
59
78
  const startTime = Date.now();
60
79
  const agentType = subagent_type || "general-purpose";
80
+ let resumedTranscript = null;
81
+ let agentId;
82
+ if (resume) {
83
+ resumedTranscript = getResumableTranscript(resume);
84
+ if (!resumedTranscript) {
85
+ yield {
86
+ type: "result",
87
+ data: [
88
+ {
89
+ type: "text",
90
+ text: `Cannot resume agent '${resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`
91
+ }
92
+ ],
93
+ resultForAssistant: `Cannot resume agent '${resume}': transcript not found or not resumable`
94
+ };
95
+ return;
96
+ }
97
+ agentId = resume;
98
+ debugLogger.info("TASK_AGENT_RESUMING", {
99
+ agentId,
100
+ agentType: resumedTranscript.agentType,
101
+ messageCount: resumedTranscript.messages.length,
102
+ previousStatus: resumedTranscript.status
103
+ });
104
+ } else {
105
+ agentId = generateAgentId();
106
+ }
107
+ if (toolUseId) {
108
+ registerToolUseAgent(toolUseId, agentId);
109
+ }
110
+ let hasYieldedResult = false;
61
111
  let effectivePrompt = prompt;
62
112
  let effectiveModel = model_name || "task";
63
113
  let toolFilter = null;
@@ -77,6 +127,7 @@ Use /agents command to manage agent configurations.`;
77
127
  data: [{ type: "text", text: helpMessage }],
78
128
  resultForAssistant: helpMessage
79
129
  };
130
+ hasYieldedResult = true;
80
131
  return;
81
132
  }
82
133
  if (agentConfig.systemPrompt) {
@@ -91,7 +142,7 @@ ${prompt}`;
91
142
  }
92
143
  toolFilter = agentConfig.tools;
93
144
  }
94
- const messages = [createUserMessage(effectivePrompt)];
145
+ const messages = resumedTranscript ? [...resumedTranscript.messages] : [createUserMessage(effectivePrompt)];
95
146
  let tools = await getTaskTools(safeMode);
96
147
  if (toolFilter) {
97
148
  const isAllArray = Array.isArray(toolFilter) && toolFilter.length === 1 && toolFilter[0] === "*";
@@ -101,12 +152,31 @@ ${prompt}`;
101
152
  }
102
153
  }
103
154
  const modelToUse = effectiveModel;
104
- yield {
105
- type: "progress",
106
- content: createAssistantMessage(`Starting agent: ${agentType}`),
107
- normalizedMessages: normalizeMessages(messages),
108
- tools
109
- };
155
+ if (resumedTranscript) {
156
+ yield {
157
+ type: "progress",
158
+ content: createAssistantMessage(
159
+ `Resuming agent: ${agentType} (${agentId})`
160
+ ),
161
+ normalizedMessages: normalizeMessages(messages),
162
+ tools
163
+ };
164
+ yield {
165
+ type: "progress",
166
+ content: createAssistantMessage(
167
+ `Restored ${resumedTranscript.messages.length} messages, ${resumedTranscript.toolUseCount} tool uses`
168
+ ),
169
+ normalizedMessages: normalizeMessages(messages),
170
+ tools
171
+ };
172
+ } else {
173
+ yield {
174
+ type: "progress",
175
+ content: createAssistantMessage(`Starting agent: ${agentType}`),
176
+ normalizedMessages: normalizeMessages(messages),
177
+ tools
178
+ };
179
+ }
110
180
  yield {
111
181
  type: "progress",
112
182
  content: createAssistantMessage(`Using model: ${modelToUse}`),
@@ -136,11 +206,30 @@ ${prompt}`;
136
206
  `
137
207
  IMPORTANT: You are currently running as ${modelToUse}. You do not need to consult ${modelToUse} via AskExpertModel since you ARE ${modelToUse}. Complete tasks directly using your capabilities.`
138
208
  );
139
- let toolUseCount = 0;
209
+ let toolUseCount = resumedTranscript?.toolUseCount || 0;
140
210
  const getSidechainNumber = memoize(
141
211
  () => getNextAvailableLogSidechainNumber(messageLogName, forkNumber)
142
212
  );
143
- const taskId = generateAgentId();
213
+ if (!resumedTranscript) {
214
+ createAgentTranscript({
215
+ agentId,
216
+ agentType,
217
+ toolUseId,
218
+ // Include toolUseId for event-driven UI updates
219
+ description,
220
+ prompt,
221
+ model: modelToUse,
222
+ forkNumber,
223
+ messageLogName,
224
+ messages: [...messages],
225
+ toolUseCount: 0
226
+ });
227
+ } else {
228
+ appendMessageToTranscript(
229
+ agentId,
230
+ createUserMessage(`[Resumed] ${prompt}`)
231
+ );
232
+ }
144
233
  const queryOptions = {
145
234
  safeMode,
146
235
  forkNumber,
@@ -154,103 +243,192 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
154
243
  if (temperature !== void 0) {
155
244
  queryOptions["temperature"] = temperature;
156
245
  }
157
- for await (const message of query(
158
- messages,
159
- taskPrompt,
160
- context,
161
- hasPermissionsToUseTool,
162
- {
163
- abortController,
164
- options: queryOptions,
165
- messageId: getLastAssistantMessageId(messages),
166
- agentId: taskId,
167
- readFileTimestamps,
168
- setToolJSX: () => {
246
+ try {
247
+ for await (const message of query(
248
+ messages,
249
+ taskPrompt,
250
+ context,
251
+ hasPermissionsToUseTool,
252
+ {
253
+ abortController,
254
+ options: queryOptions,
255
+ messageId: getLastAssistantMessageId(messages),
256
+ agentId,
257
+ readFileTimestamps,
258
+ setToolJSX: () => {
259
+ }
260
+ // No-op implementation for TaskTool
169
261
  }
170
- // No-op implementation for TaskTool
171
- }
172
- )) {
173
- messages.push(message);
174
- overwriteLog(
175
- getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),
176
- messages.filter((_) => _.type !== "progress")
177
- );
178
- if (message.type !== "assistant") {
179
- continue;
180
- }
181
- const normalizedMessages2 = normalizeMessages(messages);
182
- for (const content of message.message.content) {
183
- if (content.type === "text" && content.text && content.text !== INTERRUPT_MESSAGE) {
184
- const preview = content.text.length > 200 ? content.text.substring(0, 200) + "..." : content.text;
185
- yield {
186
- type: "progress",
187
- content: createAssistantMessage(`${preview}`),
188
- normalizedMessages: normalizedMessages2,
189
- tools
190
- };
191
- } else if (content.type === "tool_use") {
192
- toolUseCount++;
193
- const toolMessage = normalizedMessages2.find(
194
- (_) => _.type === "assistant" && _.message.content[0]?.type === "tool_use" && _.message.content[0].id === content.id
195
- );
196
- if (toolMessage) {
197
- const modifiedMessage = {
198
- ...toolMessage,
199
- message: {
200
- ...toolMessage.message,
201
- content: toolMessage.message.content.map((c) => {
202
- if (c.type === "tool_use" && c.id === content.id) {
203
- return {
204
- ...c,
205
- name: c.name
206
- // Keep original name, UI will handle display
207
- };
208
- }
209
- return c;
210
- })
211
- }
212
- };
262
+ )) {
263
+ messages.push(message);
264
+ appendMessageToTranscript(agentId, message);
265
+ overwriteLog(
266
+ getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),
267
+ messages.filter((_) => _.type !== "progress")
268
+ );
269
+ if (message.type !== "assistant") {
270
+ continue;
271
+ }
272
+ if (message.message.usage) {
273
+ updateAgentTranscript(agentId, {
274
+ tokenUsage: {
275
+ inputTokens: message.message.usage.input_tokens,
276
+ outputTokens: message.message.usage.output_tokens,
277
+ cacheReadTokens: message.message.usage.cache_read_input_tokens,
278
+ cacheCreationTokens: message.message.usage.cache_creation_input_tokens
279
+ }
280
+ });
281
+ }
282
+ const normalizedMessages2 = normalizeMessages(messages);
283
+ for (const content of message.message.content) {
284
+ if (content.type === "text" && content.text && content.text !== INTERRUPT_MESSAGE) {
285
+ const preview = content.text.length > 200 ? content.text.substring(0, 200) + "..." : content.text;
213
286
  yield {
214
287
  type: "progress",
215
- content: modifiedMessage,
288
+ content: createAssistantMessage(`${preview}`),
216
289
  normalizedMessages: normalizedMessages2,
217
290
  tools
218
291
  };
292
+ } else if (content.type === "tool_use") {
293
+ toolUseCount++;
294
+ const toolMessage = normalizedMessages2.find(
295
+ (_) => _.type === "assistant" && _.message.content[0]?.type === "tool_use" && _.message.content[0].id === content.id
296
+ );
297
+ if (toolMessage) {
298
+ const modifiedMessage = {
299
+ ...toolMessage,
300
+ message: {
301
+ ...toolMessage.message,
302
+ content: toolMessage.message.content.map((c) => {
303
+ if (c.type === "tool_use" && c.id === content.id) {
304
+ return {
305
+ ...c,
306
+ name: c.name
307
+ // Keep original name, UI will handle display
308
+ };
309
+ }
310
+ return c;
311
+ })
312
+ }
313
+ };
314
+ yield {
315
+ type: "progress",
316
+ content: modifiedMessage,
317
+ normalizedMessages: normalizedMessages2,
318
+ tools
319
+ };
320
+ }
219
321
  }
220
322
  }
221
323
  }
222
- }
223
- const normalizedMessages = normalizeMessages(messages);
224
- const lastMessage = last(messages);
225
- if (lastMessage?.type !== "assistant") {
226
- throw new Error("Last message was not an assistant message");
227
- }
228
- if (lastMessage.message.content.some(
229
- (_) => _.type === "text" && _.text === INTERRUPT_MESSAGE
230
- )) {
231
- } else {
232
- const result = [
233
- toolUseCount === 1 ? "1 tool use" : `${toolUseCount} tool uses`,
234
- formatNumber(
235
- (lastMessage.message.usage.cache_creation_input_tokens ?? 0) + (lastMessage.message.usage.cache_read_input_tokens ?? 0) + lastMessage.message.usage.input_tokens + lastMessage.message.usage.output_tokens
236
- ) + " tokens",
237
- formatDuration(Date.now() - startTime)
238
- ];
324
+ const normalizedMessages = normalizeMessages(messages);
325
+ const lastMessage = last(messages);
326
+ if (lastMessage?.type !== "assistant") {
327
+ throw new Error("Last message was not an assistant message");
328
+ }
329
+ const tokenUsage = {
330
+ inputTokens: lastMessage.message.usage.input_tokens,
331
+ outputTokens: lastMessage.message.usage.output_tokens,
332
+ cacheReadTokens: lastMessage.message.usage.cache_read_input_tokens,
333
+ cacheCreationTokens: lastMessage.message.usage.cache_creation_input_tokens
334
+ };
335
+ const isInterrupted = lastMessage.message.content.some(
336
+ (_) => _.type === "text" && _.text === INTERRUPT_MESSAGE
337
+ );
338
+ if (isInterrupted) {
339
+ interruptAgentTranscript(agentId);
340
+ debugLogger.info("TASK_AGENT_INTERRUPTED", { agentId, toolUseCount });
341
+ } else {
342
+ completeAgentTranscript(agentId, tokenUsage);
343
+ debugLogger.info("TASK_AGENT_COMPLETED", { agentId, toolUseCount });
344
+ const result = [
345
+ toolUseCount === 1 ? "1 tool use" : `${toolUseCount} tool uses`,
346
+ formatNumber(
347
+ (lastMessage.message.usage.cache_creation_input_tokens ?? 0) + (lastMessage.message.usage.cache_read_input_tokens ?? 0) + lastMessage.message.usage.input_tokens + lastMessage.message.usage.output_tokens
348
+ ) + " tokens",
349
+ formatDuration(Date.now() - startTime)
350
+ ];
351
+ yield {
352
+ type: "progress",
353
+ content: createAssistantMessage(`Done (${result.join(" \xB7 ")})`),
354
+ normalizedMessages,
355
+ tools
356
+ };
357
+ }
358
+ const data = lastMessage.message.content.filter((_) => _.type === "text");
359
+ const resultWithAgentId = isInterrupted ? `[Interrupted - Agent ID: ${agentId}]
360
+ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
239
361
  yield {
240
- type: "progress",
241
- content: createAssistantMessage(
242
- `Task completed (${result.join(" \xB7 ")})`
243
- ),
244
- normalizedMessages,
245
- tools
362
+ type: "result",
363
+ data,
364
+ resultForAssistant: resultWithAgentId
246
365
  };
366
+ hasYieldedResult = true;
367
+ } catch (error) {
368
+ const errorMessage = error instanceof Error ? error.message : String(error);
369
+ const isAbortError = error instanceof Error && (error.name === "AbortError" || error.message.includes("aborted") || error.message.includes("abort"));
370
+ if (isAbortError) {
371
+ interruptAgentTranscript(agentId);
372
+ debugLogger.info("TASK_AGENT_INTERRUPTED_BY_ABORT", {
373
+ agentId,
374
+ toolUseCount
375
+ });
376
+ yield {
377
+ type: "result",
378
+ data: [
379
+ {
380
+ type: "text",
381
+ text: `Task [${agentType}] interrupted
382
+ [Agent ID: ${agentId}]`
383
+ }
384
+ ],
385
+ resultForAssistant: `Task [${agentType}] interrupted by user
386
+ [Agent ID: ${agentId} - can be resumed]`
387
+ };
388
+ } else {
389
+ const friendlyError = error instanceof UserFriendlyError ? error : new UserFriendlyError(error, {
390
+ operation: "agent task",
391
+ model: agentType
392
+ });
393
+ const friendlyMessage = friendlyError.getUserMessage();
394
+ logError(`TaskTool [${agentType}] error: ${errorMessage}`);
395
+ failAgentTranscript(agentId, friendlyMessage);
396
+ debugLogger.error("TASK_AGENT_FAILED", {
397
+ agentId,
398
+ error: errorMessage,
399
+ errorId: friendlyError.id
400
+ });
401
+ yield {
402
+ type: "result",
403
+ data: [
404
+ {
405
+ type: "text",
406
+ text: `${friendlyMessage}
407
+ [Agent ID: ${agentId}]`
408
+ }
409
+ ],
410
+ resultForAssistant: `Task [${agentType}] failed: ${errorMessage}
411
+ [Agent ID: ${agentId} - can be resumed]`
412
+ };
413
+ }
414
+ hasYieldedResult = true;
415
+ } finally {
416
+ if (!hasYieldedResult) {
417
+ interruptAgentTranscript(agentId);
418
+ yield {
419
+ type: "result",
420
+ data: [
421
+ {
422
+ type: "text",
423
+ text: `Task [${agentType}] terminated unexpectedly
424
+ [Agent ID: ${agentId}]`
425
+ }
426
+ ],
427
+ resultForAssistant: `Task [${agentType}] terminated unexpectedly
428
+ [Agent ID: ${agentId} - can be resumed]`
429
+ };
430
+ }
247
431
  }
248
- const data = lastMessage.message.content.filter((_) => _.type === "text");
249
- yield {
250
- type: "result",
251
- data,
252
- resultForAssistant: this.renderResultForAssistant(data)
253
- };
254
432
  },
255
433
  isReadOnly() {
256
434
  return true;
@@ -298,6 +476,17 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
298
476
  };
299
477
  }
300
478
  }
479
+ if (input.resume) {
480
+ if (!canResumeTranscript(input.resume)) {
481
+ return {
482
+ result: false,
483
+ message: `Cannot resume agent '${input.resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,
484
+ meta: {
485
+ resume: input.resume
486
+ }
487
+ };
488
+ }
489
+ }
301
490
  return { result: true };
302
491
  },
303
492
  async isEnabled() {
@@ -336,53 +525,39 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
336
525
  },
337
526
  renderToolUseRejectedMessage() {
338
527
  return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
528
+ },
529
+ renderToolResultMessage(content, options) {
530
+ const theme = getTheme();
531
+ const verbose = options?.verbose ?? false;
532
+ if (!content) {
533
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Done"));
534
+ }
535
+ if (Array.isArray(content)) {
536
+ const textBlocks = content.filter(
537
+ (block) => block && block.type === "text"
538
+ );
539
+ const totalLength = textBlocks.reduce(
540
+ (sum, block) => sum + (block.text?.length || 0),
541
+ 0
542
+ );
543
+ const isInterrupted = content.some(
544
+ (block) => block && block.type === "text" && block.text === INTERRUPT_MESSAGE
545
+ );
546
+ if (isInterrupted) {
547
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Interrupted by user"));
548
+ }
549
+ const outputText = textBlocks.map((b) => b.text).join("\n");
550
+ const getOutputPreview = () => {
551
+ if (!verbose || !outputText) return null;
552
+ const maxLen = 500;
553
+ if (outputText.length <= maxLen) return outputText;
554
+ return outputText.substring(0, maxLen) + "...";
555
+ };
556
+ const outputPreview = getOutputPreview();
557
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Done"), textBlocks.length > 0 && verbose && /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " (", totalLength, " chars)"))), outputPreview && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, paddingLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, outputPreview)));
558
+ }
559
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Done"));
339
560
  }
340
- // renderToolResultMessage(content) {
341
- // const theme = getTheme()
342
- // if (Array.isArray(content)) {
343
- // const textBlocks = content.filter(block => block.type === 'text')
344
- // const totalLength = textBlocks.reduce(
345
- // (sum, block) => sum + block.text.length,
346
- // 0,
347
- // )
348
- // // 🔧 CRITICAL FIX: Use exact match for interrupt detection, not .includes()
349
- // const isInterrupted = content.some(
350
- // block =>
351
- // block.type === 'text' && block.text === INTERRUPT_MESSAGE,
352
- // )
353
- // if (isInterrupted) {
354
- // // 🔧 CRITICAL FIX: Match original system interrupt rendering exactly
355
- // return (
356
- // <Box flexDirection="row">
357
- // <Text>&nbsp;&nbsp;⎿ &nbsp;</Text>
358
- // <Text color={theme.error}>Interrupted by user</Text>
359
- // </Box>
360
- // )
361
- // }
362
- // return (
363
- // <Box flexDirection="column">
364
- // <Box justifyContent="space-between" width="100%">
365
- // <Box flexDirection="row">
366
- // <Text>&nbsp;&nbsp;⎿ &nbsp;</Text>
367
- // <Text>Task completed</Text>
368
- // {textBlocks.length > 0 && (
369
- // <Text color={theme.secondaryText}>
370
- // {' '}
371
- // ({totalLength} characters)
372
- // </Text>
373
- // )}
374
- // </Box>
375
- // </Box>
376
- // </Box>
377
- // )
378
- // }
379
- // return (
380
- // <Box flexDirection="row">
381
- // <Text>&nbsp;&nbsp;⎿ &nbsp;</Text>
382
- // <Text color={theme.secondaryText}>Task completed</Text>
383
- // </Box>
384
- // )
385
- // },
386
561
  };
387
562
  export {
388
563
  TaskTool