@within-7/minto 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/dist/Tool.js +7 -0
  2. package/dist/Tool.js.map +2 -2
  3. package/dist/commands/agents/AgentsCommand.js +1 -1
  4. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  5. package/dist/commands/agents/constants.js +2 -2
  6. package/dist/commands/agents/constants.js.map +2 -2
  7. package/dist/commands/clear.js +4 -3
  8. package/dist/commands/clear.js.map +2 -2
  9. package/dist/commands/compact.js +2 -2
  10. package/dist/commands/compact.js.map +1 -1
  11. package/dist/commands/context.js +3 -1
  12. package/dist/commands/context.js.map +2 -2
  13. package/dist/commands/login.js +128 -0
  14. package/dist/commands/login.js.map +7 -0
  15. package/dist/commands/memory.js +33 -82
  16. package/dist/commands/memory.js.map +2 -2
  17. package/dist/commands/quit.js +3 -1
  18. package/dist/commands/quit.js.map +2 -2
  19. package/dist/commands/resume.js +39 -239
  20. package/dist/commands/resume.js.map +2 -2
  21. package/dist/commands/tasks.js +1 -1
  22. package/dist/commands/tasks.js.map +2 -2
  23. package/dist/commands/terminalSetup.js +6 -2
  24. package/dist/commands/terminalSetup.js.map +2 -2
  25. package/dist/commands.js +2 -0
  26. package/dist/commands.js.map +2 -2
  27. package/dist/components/AgentDetailView.js +126 -0
  28. package/dist/components/AgentDetailView.js.map +7 -0
  29. package/dist/components/AgentThinkingBlock.js +1 -1
  30. package/dist/components/AgentThinkingBlock.js.map +2 -2
  31. package/dist/components/AgentViewBanner.js +22 -0
  32. package/dist/components/AgentViewBanner.js.map +7 -0
  33. package/dist/components/HeaderBar.js +1 -1
  34. package/dist/components/HeaderBar.js.map +2 -2
  35. package/dist/components/Help.js +8 -1
  36. package/dist/components/Help.js.map +2 -2
  37. package/dist/components/HotkeyHelpPanel.js +26 -8
  38. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  39. package/dist/components/IdleNotificationBar.js +10 -0
  40. package/dist/components/IdleNotificationBar.js.map +7 -0
  41. package/dist/components/ModelSelector/ModelSelector.js +55 -20
  42. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  43. package/dist/components/PromptInput.js +186 -115
  44. package/dist/components/PromptInput.js.map +2 -2
  45. package/dist/components/RewindPanel.js +272 -0
  46. package/dist/components/RewindPanel.js.map +7 -0
  47. package/dist/components/Spinner.js +10 -21
  48. package/dist/components/Spinner.js.map +2 -2
  49. package/dist/components/StreamingTextPreview.js +29 -0
  50. package/dist/components/StreamingTextPreview.js.map +7 -0
  51. package/dist/components/SubagentBlock.js +3 -2
  52. package/dist/components/SubagentBlock.js.map +2 -2
  53. package/dist/components/SubagentProgress.js +4 -4
  54. package/dist/components/SubagentProgress.js.map +2 -2
  55. package/dist/components/TabbedListView/SearchInput.js +1 -1
  56. package/dist/components/TabbedListView/SearchInput.js.map +2 -2
  57. package/dist/components/TabbedListView/TabbedListView.js +87 -41
  58. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  59. package/dist/components/TaskCard.js +4 -4
  60. package/dist/components/TaskCard.js.map +2 -2
  61. package/dist/components/TeamMemberPanel.js +107 -0
  62. package/dist/components/TeamMemberPanel.js.map +7 -0
  63. package/dist/components/ThinkingSelector.js +84 -0
  64. package/dist/components/ThinkingSelector.js.map +7 -0
  65. package/dist/components/TitledDivider.js +26 -0
  66. package/dist/components/TitledDivider.js.map +7 -0
  67. package/dist/components/TodoPanel.js +31 -30
  68. package/dist/components/TodoPanel.js.map +2 -2
  69. package/dist/components/TokenWarning.js +28 -7
  70. package/dist/components/TokenWarning.js.map +2 -2
  71. package/dist/components/messages/AssistantTextMessage.js +5 -2
  72. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  73. package/dist/components/messages/AssistantToolUseMessage.js +9 -1
  74. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  75. package/dist/components/messages/DefaultToolResultFallback.js +11 -0
  76. package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
  77. package/dist/components/messages/ParallelTasksGroupView.js +14 -6
  78. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  79. package/dist/components/messages/TaskInModuleView.js +27 -27
  80. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  81. package/dist/components/messages/UserGuidanceMessage.js +26 -0
  82. package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
  83. package/dist/components/messages/UserPromptMessage.js +2 -1
  84. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  85. package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
  86. package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
  87. package/dist/components/messages/UserTextMessage.js +8 -0
  88. package/dist/components/messages/UserTextMessage.js.map +2 -2
  89. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
  90. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
  91. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
  92. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
  93. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
  94. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  95. package/dist/components/permissions/PermissionRequest.js +4 -0
  96. package/dist/components/permissions/PermissionRequest.js.map +2 -2
  97. package/dist/components/permissions/PlanApprovalRequest.js +164 -0
  98. package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
  99. package/dist/constants/agentTeams.js +17 -0
  100. package/dist/constants/agentTeams.js.map +7 -0
  101. package/dist/constants/macros.js +2 -1
  102. package/dist/constants/macros.js.map +2 -2
  103. package/dist/constants/prompts/agentPrompt.js +1 -0
  104. package/dist/constants/prompts/agentPrompt.js.map +2 -2
  105. package/dist/constants/prompts/autoMemory.js +39 -0
  106. package/dist/constants/prompts/autoMemory.js.map +7 -0
  107. package/dist/constants/prompts/codeConventions.js +1 -13
  108. package/dist/constants/prompts/codeConventions.js.map +2 -2
  109. package/dist/constants/prompts/doingTasks.js +21 -2
  110. package/dist/constants/prompts/doingTasks.js.map +2 -2
  111. package/dist/constants/prompts/envInfo.js +6 -7
  112. package/dist/constants/prompts/envInfo.js.map +2 -2
  113. package/dist/constants/prompts/index.js +27 -5
  114. package/dist/constants/prompts/index.js.map +2 -2
  115. package/dist/constants/prompts/taskManagement.js +2 -43
  116. package/dist/constants/prompts/taskManagement.js.map +2 -2
  117. package/dist/constants/prompts/teamOverlays.js +50 -0
  118. package/dist/constants/prompts/teamOverlays.js.map +7 -0
  119. package/dist/constants/prompts/toneAndStyle.js +4 -29
  120. package/dist/constants/prompts/toneAndStyle.js.map +2 -2
  121. package/dist/constants/prompts/toolUsagePolicy.js +7 -22
  122. package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
  123. package/dist/constants/toolInputExamples.js +2 -2
  124. package/dist/constants/toolInputExamples.js.map +2 -2
  125. package/dist/context.js +39 -6
  126. package/dist/context.js.map +2 -2
  127. package/dist/core/backupManager.js +1 -1
  128. package/dist/core/backupManager.js.map +2 -2
  129. package/dist/core/permissions/rules/planModeRule.js +1 -1
  130. package/dist/core/permissions/rules/planModeRule.js.map +1 -1
  131. package/dist/core/permissions/rules/safeModeRule.js +1 -1
  132. package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
  133. package/dist/engine/AgentEngine.js +902 -0
  134. package/dist/engine/AgentEngine.js.map +7 -0
  135. package/dist/engine/EngineRegistry.js +89 -0
  136. package/dist/engine/EngineRegistry.js.map +7 -0
  137. package/dist/engine/foregroundAdapter.js +191 -0
  138. package/dist/engine/foregroundAdapter.js.map +7 -0
  139. package/dist/engine/index.js +15 -0
  140. package/dist/engine/index.js.map +7 -0
  141. package/dist/engine/types.js +1 -0
  142. package/dist/engine/types.js.map +7 -0
  143. package/dist/entrypoints/cli.js +410 -79
  144. package/dist/entrypoints/cli.js.map +3 -3
  145. package/dist/hooks/useAgentEngine.js +129 -0
  146. package/dist/hooks/useAgentEngine.js.map +7 -0
  147. package/dist/hooks/useAgentTokenStats.js +0 -16
  148. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  149. package/dist/hooks/useCanUseTool.js +47 -2
  150. package/dist/hooks/useCanUseTool.js.map +2 -2
  151. package/dist/hooks/useDeferredLoading.js +4 -1
  152. package/dist/hooks/useDeferredLoading.js.map +2 -2
  153. package/dist/hooks/useIdleNotifications.js +66 -0
  154. package/dist/hooks/useIdleNotifications.js.map +7 -0
  155. package/dist/hooks/useSessionTracking.js +9 -7
  156. package/dist/hooks/useSessionTracking.js.map +2 -2
  157. package/dist/hooks/useTeamMembers.js +51 -0
  158. package/dist/hooks/useTeamMembers.js.map +7 -0
  159. package/dist/i18n/locales/en.js +77 -12
  160. package/dist/i18n/locales/en.js.map +2 -2
  161. package/dist/i18n/locales/zh-CN.js +77 -12
  162. package/dist/i18n/locales/zh-CN.js.map +2 -2
  163. package/dist/i18n/types.js.map +1 -1
  164. package/dist/messages.js.map +2 -2
  165. package/dist/permissions.js +113 -7
  166. package/dist/permissions.js.map +2 -2
  167. package/dist/query.js +135 -37
  168. package/dist/query.js.map +2 -2
  169. package/dist/screens/REPL.js +504 -361
  170. package/dist/screens/REPL.js.map +3 -3
  171. package/dist/screens/ResumeConversation.js +199 -14
  172. package/dist/screens/ResumeConversation.js.map +2 -2
  173. package/dist/services/adapters/base.js.map +1 -1
  174. package/dist/services/agentTeams/backends/headless.js +108 -0
  175. package/dist/services/agentTeams/backends/headless.js.map +7 -0
  176. package/dist/services/agentTeams/backends/inProcess.js +102 -0
  177. package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
  178. package/dist/services/agentTeams/backends/resolver.js +18 -0
  179. package/dist/services/agentTeams/backends/resolver.js.map +7 -0
  180. package/dist/services/agentTeams/backends/tmux.js +168 -0
  181. package/dist/services/agentTeams/backends/tmux.js.map +7 -0
  182. package/dist/services/agentTeams/backends/types.js +1 -0
  183. package/dist/services/agentTeams/backends/types.js.map +7 -0
  184. package/dist/services/agentTeams/heartbeat.js +88 -0
  185. package/dist/services/agentTeams/heartbeat.js.map +7 -0
  186. package/dist/services/agentTeams/index.js +42 -2
  187. package/dist/services/agentTeams/index.js.map +2 -2
  188. package/dist/services/agentTeams/injectionChannel.js +105 -0
  189. package/dist/services/agentTeams/injectionChannel.js.map +7 -0
  190. package/dist/services/agentTeams/mailbox.js +410 -30
  191. package/dist/services/agentTeams/mailbox.js.map +2 -2
  192. package/dist/services/agentTeams/messageFormatter.js +80 -0
  193. package/dist/services/agentTeams/messageFormatter.js.map +7 -0
  194. package/dist/services/agentTeams/permissionDelegation.js +71 -0
  195. package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
  196. package/dist/services/agentTeams/teamEvents.js +45 -0
  197. package/dist/services/agentTeams/teamEvents.js.map +7 -0
  198. package/dist/services/agentTeams/teamManager.js +251 -34
  199. package/dist/services/agentTeams/teamManager.js.map +2 -2
  200. package/dist/services/agentTeams/teamTaskStore.js +290 -61
  201. package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
  202. package/dist/services/agentTeams/teammateSpawner.js +99 -18
  203. package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
  204. package/dist/services/hookExecutor.js +51 -8
  205. package/dist/services/hookExecutor.js.map +2 -2
  206. package/dist/services/llm/anthropicProvider.js +56 -59
  207. package/dist/services/llm/anthropicProvider.js.map +2 -2
  208. package/dist/services/llm/dispatch.js +24 -5
  209. package/dist/services/llm/dispatch.js.map +2 -2
  210. package/dist/services/llm/openaiProvider.js +115 -136
  211. package/dist/services/llm/openaiProvider.js.map +3 -3
  212. package/dist/services/llm/types.js +89 -15
  213. package/dist/services/llm/types.js.map +2 -2
  214. package/dist/services/mcpClient.js +80 -4
  215. package/dist/services/mcpClient.js.map +2 -2
  216. package/dist/services/mintoAuth.js +299 -0
  217. package/dist/services/mintoAuth.js.map +7 -0
  218. package/dist/services/oauth.js +3 -3
  219. package/dist/services/oauth.js.map +2 -2
  220. package/dist/services/openai.js +91 -20
  221. package/dist/services/openai.js.map +2 -2
  222. package/dist/services/plugins/pluginRuntime.js +11 -5
  223. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  224. package/dist/services/plugins/pluginValidation.js +4 -2
  225. package/dist/services/plugins/pluginValidation.js.map +2 -2
  226. package/dist/services/sandbox/sandboxController.js +11 -3
  227. package/dist/services/sandbox/sandboxController.js.map +2 -2
  228. package/dist/services/sessionMemoryInjector.js +77 -0
  229. package/dist/services/sessionMemoryInjector.js.map +7 -0
  230. package/dist/services/systemReminder.js +130 -8
  231. package/dist/services/systemReminder.js.map +2 -2
  232. package/dist/services/taskStore.js +199 -8
  233. package/dist/services/taskStore.js.map +3 -3
  234. package/dist/services/topicDetector.js +169 -0
  235. package/dist/services/topicDetector.js.map +7 -0
  236. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
  237. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  238. package/dist/tools/BashTool/BashTool.js +51 -28
  239. package/dist/tools/BashTool/BashTool.js.map +2 -2
  240. package/dist/tools/BashTool/prompt.js +95 -118
  241. package/dist/tools/BashTool/prompt.js.map +2 -2
  242. package/dist/tools/BashTool/utils.js +39 -1
  243. package/dist/tools/BashTool/utils.js.map +2 -2
  244. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
  245. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
  246. package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
  247. package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
  248. package/dist/tools/FileEditTool/FileEditTool.js +9 -4
  249. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  250. package/dist/tools/FileEditTool/prompt.js +3 -7
  251. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  252. package/dist/tools/FileReadTool/FileReadTool.js +125 -3
  253. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  254. package/dist/tools/FileReadTool/prompt.js +1 -2
  255. package/dist/tools/FileReadTool/prompt.js.map +2 -2
  256. package/dist/tools/FileWriteTool/prompt.js +3 -5
  257. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  258. package/dist/tools/GlobTool/GlobTool.js +3 -2
  259. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  260. package/dist/tools/GrepTool/GrepTool.js +16 -5
  261. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  262. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  263. package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
  264. package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
  265. package/dist/tools/MCPSearchTool/prompt.js +77 -0
  266. package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
  267. package/dist/tools/MultiEditTool/prompt.js +4 -7
  268. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  269. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
  270. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  271. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
  272. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  273. package/dist/tools/PlanModeTool/prompt.js +23 -74
  274. package/dist/tools/PlanModeTool/prompt.js.map +2 -2
  275. package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
  276. package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
  277. package/dist/tools/SendMessageTool/prompt.js +44 -0
  278. package/dist/tools/SendMessageTool/prompt.js.map +7 -0
  279. package/dist/tools/TaskCreateTool/prompt.js +15 -4
  280. package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
  281. package/dist/tools/TaskListTool/prompt.js +18 -3
  282. package/dist/tools/TaskListTool/prompt.js.map +2 -2
  283. package/dist/tools/TaskOutputTool/prompt.js +4 -3
  284. package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
  285. package/dist/tools/TaskTool/TaskTool.js +762 -98
  286. package/dist/tools/TaskTool/TaskTool.js.map +3 -3
  287. package/dist/tools/TaskTool/constants.js +8 -2
  288. package/dist/tools/TaskTool/constants.js.map +2 -2
  289. package/dist/tools/TaskTool/prompt.js +74 -70
  290. package/dist/tools/TaskTool/prompt.js.map +2 -2
  291. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
  292. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
  293. package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
  294. package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
  295. package/dist/tools/TeamCreateTool/prompt.js +58 -0
  296. package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
  297. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
  298. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
  299. package/dist/tools/TeamDeleteTool/prompt.js +16 -0
  300. package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
  301. package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
  302. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  303. package/dist/tools/URLFetcherTool/prompt.js +3 -2
  304. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  305. package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
  306. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  307. package/dist/tools/WebSearchTool/prompt.js +5 -4
  308. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  309. package/dist/tools.js +100 -20
  310. package/dist/tools.js.map +2 -2
  311. package/dist/types/PermissionMode.js +35 -6
  312. package/dist/types/PermissionMode.js.map +2 -2
  313. package/dist/types/hooks.js +2 -0
  314. package/dist/types/hooks.js.map +2 -2
  315. package/dist/types/plugin.js +2 -0
  316. package/dist/types/plugin.js.map +3 -3
  317. package/dist/utils/CircuitBreaker.js +15 -9
  318. package/dist/utils/CircuitBreaker.js.map +2 -2
  319. package/dist/utils/agentLoader.js +249 -112
  320. package/dist/utils/agentLoader.js.map +2 -2
  321. package/dist/utils/animationManager.js +40 -3
  322. package/dist/utils/animationManager.js.map +2 -2
  323. package/dist/utils/ask.js +7 -6
  324. package/dist/utils/ask.js.map +2 -2
  325. package/dist/utils/atomicWrite.js +23 -0
  326. package/dist/utils/atomicWrite.js.map +7 -0
  327. package/dist/utils/autoCompactCore.js +73 -56
  328. package/dist/utils/autoCompactCore.js.map +2 -2
  329. package/dist/utils/autoMemoryPaths.js +89 -0
  330. package/dist/utils/autoMemoryPaths.js.map +7 -0
  331. package/dist/utils/config.js +63 -38
  332. package/dist/utils/config.js.map +2 -2
  333. package/dist/utils/configSchema.js +13 -8
  334. package/dist/utils/configSchema.js.map +2 -2
  335. package/dist/utils/credentials/index.js +14 -0
  336. package/dist/utils/credentials/index.js.map +2 -2
  337. package/dist/utils/dualPath.js +24 -0
  338. package/dist/utils/dualPath.js.map +7 -0
  339. package/dist/utils/exit.js +66 -7
  340. package/dist/utils/exit.js.map +2 -2
  341. package/dist/utils/externalEditor.js +155 -0
  342. package/dist/utils/externalEditor.js.map +7 -0
  343. package/dist/utils/fileLock.js +67 -0
  344. package/dist/utils/fileLock.js.map +7 -0
  345. package/dist/utils/format.js +24 -14
  346. package/dist/utils/format.js.map +2 -2
  347. package/dist/utils/globalErrorHandler.js +5 -96
  348. package/dist/utils/globalErrorHandler.js.map +3 -3
  349. package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
  350. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
  351. package/dist/utils/groupHandlers/taskHandler.js +2 -2
  352. package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
  353. package/dist/utils/hookManager.js +64 -6
  354. package/dist/utils/hookManager.js.map +2 -2
  355. package/dist/utils/log.js +6 -2
  356. package/dist/utils/log.js.map +2 -2
  357. package/dist/utils/markdown.js +237 -19
  358. package/dist/utils/markdown.js.map +2 -2
  359. package/dist/utils/messageContextManager.js +18 -5
  360. package/dist/utils/messageContextManager.js.map +2 -2
  361. package/dist/utils/messageGroupManager.js +1 -1
  362. package/dist/utils/messageGroupManager.js.map +2 -2
  363. package/dist/utils/messages.js +104 -46
  364. package/dist/utils/messages.js.map +2 -2
  365. package/dist/utils/model.js +2 -2
  366. package/dist/utils/model.js.map +2 -2
  367. package/dist/utils/pasteCache.js +8 -4
  368. package/dist/utils/pasteCache.js.map +2 -2
  369. package/dist/utils/pluginLoader.js +18 -0
  370. package/dist/utils/pluginLoader.js.map +2 -2
  371. package/dist/utils/secureKeyStorage.js +36 -7
  372. package/dist/utils/secureKeyStorage.js.map +2 -2
  373. package/dist/utils/simpleMode.js +7 -0
  374. package/dist/utils/simpleMode.js.map +7 -0
  375. package/dist/utils/streamingState.js +11 -1
  376. package/dist/utils/streamingState.js.map +2 -2
  377. package/dist/utils/taskDisplayUtils.js +2 -1
  378. package/dist/utils/taskDisplayUtils.js.map +2 -2
  379. package/dist/utils/teamConfig.js +2 -2
  380. package/dist/utils/teamConfig.js.map +2 -2
  381. package/dist/utils/thinking.js +6 -2
  382. package/dist/utils/thinking.js.map +3 -3
  383. package/dist/utils/tokenProgress.js +55 -0
  384. package/dist/utils/tokenProgress.js.map +7 -0
  385. package/dist/utils/toolRiskClassification.js +26 -17
  386. package/dist/utils/toolRiskClassification.js.map +2 -2
  387. package/dist/utils/tooling/toolError.js +12 -0
  388. package/dist/utils/tooling/toolError.js.map +7 -0
  389. package/dist/version.js +2 -2
  390. package/dist/version.js.map +1 -1
  391. package/package.json +10 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/TaskTool/TaskTool.tsx"],
4
- "sourcesContent": ["import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport chalk from 'chalk'\nimport { last, memoize } from 'lodash-es'\nimport { EOL } from 'os'\nimport { dirname } from 'path'\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getAgentPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { AssistantMessage, Message as MessageType, query } from '@query'\nimport { formatDuration, formatNumber } from '@utils/format'\nimport {\n getMessagesPath,\n getNextAvailableLogSidechainNumber,\n overwriteLog,\n logError,\n} from '@utils/log'\nimport { applyMarkdown } from '@utils/markdown'\nimport {\n createAssistantMessage,\n createUserMessage,\n getLastAssistantMessageId,\n INTERRUPT_MESSAGE,\n normalizeMessages,\n} from '@utils/messages'\nimport { getModelManager } from '@utils/model'\nimport { getMaxThinkingTokens } from '@utils/thinking'\nimport { getTheme } from '@utils/theme'\nimport { generateAgentId } from '@utils/agentStorage'\nimport { debug as debugLogger } from '@utils/debugLogger'\nimport { getTaskTools, getPrompt } from './prompt'\nimport { TOOL_NAME } from './constants'\nimport {\n getActiveAgents,\n getAgentByType,\n getAvailableAgentTypes,\n} from '@utils/agentLoader'\nimport {\n createAgentTranscript,\n getAgentTranscript,\n getResumableTranscript,\n appendMessageToTranscript,\n updateAgentTranscript,\n completeAgentTranscript,\n failAgentTranscript,\n interruptAgentTranscript,\n canResumeTranscript,\n registerToolUseAgent,\n type AgentTranscript,\n} from '@utils/agentTranscripts'\n// Background agent imports removed - run_in_background feature deprecated\nimport { UserFriendlyError, formatErrorForUser } from '@utils/userFriendlyError'\nimport { execSync } from 'child_process'\nimport {\n pushAgentContext,\n popAgentContext,\n cleanupAgentStreamingState,\n} from '@utils/streamingState'\nimport {\n validateAgentPermission,\n MODE_CONFIGS,\n type PermissionMode,\n} from '@minto-types/PermissionMode'\nimport { executeAgentHooks, createHookContext } from '@utils/agentHookExecutor'\nimport {\n loadAgentMemory,\n saveAgentMemory,\n formatMemoryForPrompt,\n} from '@utils/agentMemory'\nimport { getSkill, loadSkillContent } from '@utils/skillLoader'\nimport { getCwd } from '@utils/state'\nimport { getHookManager } from '@utils/hookManager'\nimport { substituteVariables } from '@utils/stringSubstitution'\n\nconst inputSchema = z.object({\n description: z\n .string()\n .describe('A short (3-5 word) description of the task'),\n prompt: z.string().describe('The task for the agent to perform'),\n model_name: z\n .string()\n .optional()\n .describe(\n 'Optional: Specific model name to use for this task. If not provided, uses the default task model pointer.',\n ),\n model: z\n .enum(['sonnet', 'opus', 'haiku'])\n .optional()\n .describe(\n 'Optional model hint for this agent. Maps to configured model pointers: sonnet\u2192main, opus\u2192reasoning, haiku\u2192quick. If not specified, uses the task model pointer. Prefer haiku for quick, straightforward tasks.',\n ),\n subagent_type: z\n .string()\n .optional()\n .describe(\n '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.',\n ),\n resume: z\n .string()\n .optional()\n .describe(\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\n ),\n max_turns: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'Maximum number of agentic turns (API round-trips) before stopping. Used internally for warmup.',\n ),\n // run_in_background parameter removed - concurrent execution is automatic\n})\n\nexport const TaskTool = {\n async prompt({ safeMode }) {\n return await getPrompt(safeMode)\n },\n name: TOOL_NAME,\n async description() {\n // Dynamically load available agent types from plugins\n const availableTypes = await getAvailableAgentTypes()\n const typesList = availableTypes.join(', ')\n 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.`\n },\n inputSchema,\n\n async *call(\n {\n description,\n prompt,\n model_name,\n model,\n subagent_type,\n resume,\n max_turns,\n },\n {\n abortController,\n options: { safeMode = false, forkNumber, messageLogName, verbose },\n readFileTimestamps,\n toolUseId,\n },\n ): AsyncGenerator<\n | { type: 'result'; data: TextBlock[]; resultForAssistant?: string }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n > {\n const startTime = Date.now()\n\n // Default to general-purpose if no subagent_type specified\n const agentType = subagent_type || 'general-purpose'\n\n // Handle resume: check if we're resuming from a previous transcript\n let resumedTranscript: AgentTranscript | null = null\n let agentId: string\n\n if (resume) {\n resumedTranscript = getResumableTranscript(resume)\n if (!resumedTranscript) {\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Cannot resume agent '${resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n },\n ] as TextBlock[],\n resultForAssistant: `Cannot resume agent '${resume}': transcript not found or not resumable`,\n }\n return\n }\n agentId = resume\n debugLogger.info('TASK_AGENT_RESUMING', {\n agentId,\n agentType: resumedTranscript.agentType,\n messageCount: resumedTranscript.messages.length,\n previousStatus: resumedTranscript.status,\n })\n } else {\n agentId = generateAgentId()\n }\n\n // Register toolUseId -> agentId mapping for UI association\n if (toolUseId) {\n registerToolUseAgent(toolUseId, agentId)\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Track whether we've yielded a result to prevent UI stuck state\n let hasYieldedResult = false\n\n // Apply subagent configuration\n let effectivePrompt = prompt\n let effectiveModel = model_name || 'task'\n let toolFilter = null\n let disallowedToolFilter: string[] | null = null // Claude Code spec: disallowedTools denylist\n let temperature = undefined\n let agentMaxThinkingTokens: number | undefined = undefined\n let effectivePermissionMode: PermissionMode = 'default'\n let loadedAgentConfig: Awaited<ReturnType<typeof getAgentByType>> = null\n\n // Load agent configuration dynamically\n if (agentType) {\n const agentConfig = await getAgentByType(agentType)\n\n if (!agentConfig) {\n // If agent type not found, return helpful message instead of throwing\n const availableTypes = await getAvailableAgentTypes()\n const helpMessage = `Agent type '${agentType}' not found.\\n\\nAvailable agents:\\n${availableTypes.map(t => ` \u2022 ${t}`).join('\\n')}\\n\\nUse /agents command to manage agent configurations.`\n\n yield {\n type: 'result',\n data: [{ type: 'text', text: helpMessage }] as TextBlock[],\n resultForAssistant: helpMessage,\n }\n hasYieldedResult = true\n return\n }\n\n // Store config for later use (hooks, memory, etc.)\n loadedAgentConfig = agentConfig\n\n // Apply system prompt if configured\n if (agentConfig.systemPrompt) {\n effectivePrompt = `${agentConfig.systemPrompt}\\n\\n${prompt}`\n }\n\n // Apply model if not overridden by model_name parameter\n if (!model_name && agentConfig.model_name) {\n // Support inherit: keep pointer-based default\n if (agentConfig.model_name !== 'inherit') {\n effectiveModel = agentConfig.model_name as string\n }\n }\n\n // Store tool filter for later application\n toolFilter = agentConfig.tools\n\n // Store disallowed tools filter for later application (Claude Code spec compliance)\n if (agentConfig.disallowedTools?.length) {\n disallowedToolFilter = agentConfig.disallowedTools\n }\n\n // Apply maxThinkingTokens if configured (Claude Code spec)\n if (agentConfig.maxThinkingTokens) {\n agentMaxThinkingTokens = agentConfig.maxThinkingTokens\n }\n\n // Validate and apply permission mode (Claude Code spec)\n // Agent permission cannot exceed session permission level\n if (agentConfig.permissionMode) {\n const sessionMode: PermissionMode = safeMode ? 'plan' : 'default'\n effectivePermissionMode = validateAgentPermission(\n agentConfig.permissionMode,\n sessionMode,\n )\n }\n\n // Load agent memory if configured (Claude Code spec)\n if (agentConfig.memory) {\n try {\n const memoryContent = await loadAgentMemory(\n agentConfig.agentType,\n agentConfig.memory,\n )\n if (memoryContent) {\n // Inject memory into system prompt\n effectivePrompt =\n formatMemoryForPrompt(memoryContent, agentConfig.agentType) +\n '\\n' +\n effectivePrompt\n }\n } catch (error) {\n debugLogger.warn('TASK_AGENT_MEMORY_LOAD_FAILED', {\n agentId,\n agentType,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n // Preload skills if configured (Claude Code spec)\n if (agentConfig.skills?.length) {\n for (const skillName of agentConfig.skills) {\n try {\n const skill = getSkill(skillName)\n if (skill) {\n const skillContent = await loadSkillContent(skill)\n const skillBaseDir = dirname(skill.filePath)\n // Apply {baseDir} resolution and string substitution\n const resolvedContent = skillContent.replace(\n /\\{baseDir\\}/g,\n skillBaseDir,\n )\n const substitutedContent = await substituteVariables(\n resolvedContent,\n '', // No arguments for preloaded skills\n {\n sessionId: agentId,\n cwd: process.cwd(),\n env: { BASE_DIR: skillBaseDir },\n },\n )\n effectivePrompt += `\\n\\n<preloaded-skill name=\"${skillName}\">\\n${substitutedContent}\\n</preloaded-skill>`\n }\n } catch (error) {\n debugLogger.warn('TASK_AGENT_SKILL_PRELOAD_FAILED', {\n agentId,\n skillName,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n }\n\n // Execute onStart hooks if configured (Claude Code spec)\n if (agentConfig.hooks?.onStart?.length) {\n try {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n })\n const hookResult = await executeAgentHooks(\n 'onStart',\n agentConfig,\n hookContext,\n )\n if (!hookResult.continue) {\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Agent ${agentType} blocked by onStart hook: ${hookResult.reason || 'Hook requested stop'}`,\n },\n ] as TextBlock[],\n resultForAssistant: `Agent blocked by onStart hook: ${hookResult.reason}`,\n }\n hasYieldedResult = true\n return\n }\n } catch (error) {\n debugLogger.warn('TASK_AGENT_ONSTART_HOOK_FAILED', {\n agentId,\n agentType,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n // Note: temperature is not currently in our agent configs\n // but could be added in the future\n }\n\n // Apply model resolution with intelligent fallback\n // Priority: model_name (explicit) > model (alias) > agent config > task pointer > main model\n if (model) {\n // Model aliases are semantic hints, not hardcoded model names\n // Map to Minto's model pointer system for proper resolution\n const modelPointerMap: Record<string, string> = {\n sonnet: 'main', // Use main model for standard tasks\n opus: 'reasoning', // Use reasoning model for complex tasks\n haiku: 'quick', // Use quick model for fast tasks\n }\n\n const pointerType = modelPointerMap[model] || 'task'\n const modelManager = getModelManager()\n const resolvedModelName = modelManager.getModelName(pointerType as any)\n\n if (resolvedModelName) {\n effectiveModel = resolvedModelName\n }\n // If resolution fails, keep the previous effectiveModel (from agent config or 'task' default)\n }\n\n // Git worktree isolation: create isolated worktree for parallel edits\n let worktreePath: string | null = null\n if (loadedAgentConfig?.isolation === 'worktree') {\n try {\n const tmpDir = `/tmp/minto-worktree-${agentId}`\n execSync(`git worktree add \"${tmpDir}\" HEAD`, {\n cwd: getCwd(),\n stdio: 'pipe',\n })\n worktreePath = tmpDir\n effectivePrompt = `[Working in isolated git worktree: ${tmpDir}]\\n\\n${effectivePrompt}`\n debugLogger.info('TASK_AGENT_WORKTREE_CREATED', {\n agentId,\n worktreePath,\n })\n } catch (err) {\n debugLogger.warn('TASK_AGENT_WORKTREE_FAILED', {\n agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n // Continue without worktree \u2014 non-git repos or worktree errors\n }\n }\n\n // Initialize messages: either resume from transcript or start fresh\n const messages: MessageType[] = resumedTranscript\n ? [...resumedTranscript.messages]\n : [createUserMessage(effectivePrompt)]\n\n let tools = await getTaskTools(safeMode)\n\n // Apply tool filtering if specified by subagent config\n // Claude Code spec: tools (allowlist) + disallowedTools (denylist) combination\n // Priority: disallowedTools always takes precedence over tools\n // Supports Task(agent_type) syntax to restrict which subagent types can be spawned\n let allowedSubagentTypes: string[] | null = null\n if (toolFilter) {\n // Back-compat: ['*'] means all tools\n const isAllArray =\n Array.isArray(toolFilter) &&\n toolFilter.length === 1 &&\n toolFilter[0] === '*'\n if (toolFilter === '*' || isAllArray) {\n // no-op, keep all tools (allowlist permits all)\n } else if (Array.isArray(toolFilter)) {\n // Extract Task(type) restrictions\n const taskPatterns = toolFilter\n .filter((t: string) => t.startsWith('Task(') && t.endsWith(')'))\n .map((t: string) => t.slice(5, -1))\n if (taskPatterns.length > 0) {\n allowedSubagentTypes = taskPatterns\n }\n\n // Filter tools: include Task tool if any Task() pattern exists\n const baseToolNames = toolFilter\n .map((t: string) => (t.startsWith('Task(') ? 'Task' : t))\n .filter((t: string, i: number, arr: string[]) => arr.indexOf(t) === i)\n tools = tools.filter(tool => baseToolNames.includes(tool.name))\n }\n }\n\n // Apply disallowedTools filter (denylist takes precedence over allowlist)\n if (disallowedToolFilter?.length) {\n tools = tools.filter(tool => !disallowedToolFilter!.includes(tool.name))\n }\n\n // Apply permission mode tool restrictions (Claude Code spec)\n // Some permission modes only allow specific tools\n if (effectivePermissionMode !== 'default') {\n const modeConfig = MODE_CONFIGS[effectivePermissionMode]\n if (modeConfig && modeConfig.allowedTools[0] !== '*') {\n tools = tools.filter(tool =>\n modeConfig.allowedTools.includes(tool.name),\n )\n }\n }\n\n // Model already resolved in effectiveModel variable above\n const modelToUse = effectiveModel\n\n // Display initial task information with separate progress lines\n if (resumedTranscript) {\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Resuming agent: ${agentType} (${agentId})`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Restored ${resumedTranscript.messages.length} messages, ${resumedTranscript.toolUseCount} tool uses`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n } else {\n yield {\n type: 'progress',\n content: createAssistantMessage(`Starting agent: ${agentType}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Using model: ${modelToUse}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Task: ${description}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Prompt: ${prompt.length > 150 ? prompt.substring(0, 150) + '...' : prompt}`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n const [taskPrompt, context, maxThinkingTokens] = await Promise.all([\n getAgentPrompt(),\n getContext(),\n getMaxThinkingTokens(messages),\n ])\n\n // Inject model context to prevent self-referential expert consultations\n taskPrompt.push(\n `\\nIMPORTANT: 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.`,\n )\n\n // Initialize tool use count (restore from transcript if resuming)\n let toolUseCount = resumedTranscript?.toolUseCount || 0\n\n const getSidechainNumber = memoize(() =>\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\n )\n\n // Fire SubagentStart hook (fire-and-forget)\n const hookMgr = getHookManager()\n if (hookMgr) {\n hookMgr\n .executeSubagentStart(agentType, description)\n .catch(err =>\n debugLogger.warn('SubagentStart hook failed', { error: err }),\n )\n }\n\n // Create or update transcript for this agent execution\n if (!resumedTranscript) {\n createAgentTranscript({\n agentId,\n agentType,\n toolUseId, // Include toolUseId for event-driven UI updates\n description,\n prompt,\n model: modelToUse,\n forkNumber,\n messageLogName,\n messages: [...messages],\n toolUseCount: 0,\n })\n } else {\n // Update transcript status to running when resuming\n appendMessageToTranscript(\n agentId,\n createUserMessage(`[Resumed] ${prompt}`),\n )\n }\n\n // Build query options, adding temperature if specified\n // Use agent-configured maxThinkingTokens if available, otherwise use default\n const effectiveMaxThinkingTokens =\n agentMaxThinkingTokens ?? maxThinkingTokens\n const queryOptions = {\n safeMode,\n forkNumber,\n messageLogName,\n tools,\n commands: [],\n verbose,\n maxThinkingTokens: effectiveMaxThinkingTokens,\n model: modelToUse,\n }\n\n // Add temperature if specified by subagent config\n if (temperature !== undefined) {\n queryOptions['temperature'] = temperature\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Wrap entire query execution in try-catch-finally\n // This ensures we ALWAYS yield a result, even if query() throws an error\n\n // Push agent context so streaming state is isolated for this subagent\n pushAgentContext(agentId)\n\n // Track turn count for max_turns limit\n let turnCount = 0\n\n try {\n for await (const message of query(\n messages,\n taskPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(messages),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {}, // No-op implementation for TaskTool\n },\n )) {\n messages.push(message)\n\n // Persist message to transcript for resume capability\n appendMessageToTranscript(agentId, message)\n\n overwriteLog(\n getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),\n messages.filter(_ => _.type !== 'progress'),\n )\n\n if (message.type !== 'assistant') {\n continue\n }\n\n // Increment turn count for each assistant message (API round-trip)\n turnCount++\n\n // Check max_turns limit\n if (max_turns && turnCount >= max_turns) {\n debugLogger.info('TASK_AGENT_MAX_TURNS_REACHED', {\n agentId,\n turnCount,\n max_turns,\n })\n // Break out of the query loop - will proceed to normal completion handling\n break\n }\n\n // Real-time token usage update for running task display\n if (message.message.usage) {\n updateAgentTranscript(agentId, {\n tokenUsage: {\n inputTokens: message.message.usage.input_tokens,\n outputTokens: message.message.usage.output_tokens,\n cacheReadTokens: message.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n message.message.usage.cache_creation_input_tokens,\n },\n })\n }\n\n const normalizedMessages = normalizeMessages(messages)\n\n // Process tool uses and text content for better visibility\n for (const content of message.message.content) {\n if (\n content.type === 'text' &&\n content.text &&\n content.text !== INTERRUPT_MESSAGE\n ) {\n // Show agent's reasoning/responses\n const preview =\n content.text.length > 200\n ? content.text.substring(0, 200) + '...'\n : content.text\n yield {\n type: 'progress',\n content: createAssistantMessage(`${preview}`),\n normalizedMessages,\n tools,\n }\n } else if (content.type === 'tool_use') {\n toolUseCount++\n\n // Show which tool is being used with agent context\n const toolMessage = normalizedMessages.find(\n _ =>\n _.type === 'assistant' &&\n _.message.content[0]?.type === 'tool_use' &&\n _.message.content[0].id === content.id,\n ) as AssistantMessage\n\n if (toolMessage) {\n // Clone and modify the message to show agent context\n const modifiedMessage = {\n ...toolMessage,\n message: {\n ...toolMessage.message,\n content: toolMessage.message.content.map(c => {\n if (c.type === 'tool_use' && c.id === content.id) {\n // Add agent context to tool name display\n return {\n ...c,\n name: c.name, // Keep original name, UI will handle display\n }\n }\n return c\n }),\n },\n }\n\n yield {\n type: 'progress',\n content: modifiedMessage,\n normalizedMessages,\n tools,\n }\n }\n }\n }\n }\n\n const normalizedMessages = normalizeMessages(messages)\n const lastMessage = last(messages)\n if (lastMessage?.type !== 'assistant') {\n throw new Error('Last message was not an assistant message')\n }\n\n // Calculate token usage for transcript\n const tokenUsage = {\n inputTokens: lastMessage.message.usage.input_tokens,\n outputTokens: lastMessage.message.usage.output_tokens,\n cacheReadTokens: lastMessage.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n lastMessage.message.usage.cache_creation_input_tokens,\n }\n\n // Check for interrupt\n const isInterrupted = lastMessage.message.content.some(\n _ => _.type === 'text' && _.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED', { agentId, toolUseCount })\n } else {\n // Mark transcript as completed\n completeAgentTranscript(agentId, tokenUsage)\n debugLogger.info('TASK_AGENT_COMPLETED', { agentId, toolUseCount })\n\n // Fire SubagentStop hook (fire-and-forget)\n if (hookMgr) {\n hookMgr\n .executeSubagentStop(agentType, agentId)\n .catch(err =>\n debugLogger.warn('SubagentStop hook failed', { error: err }),\n )\n }\n\n // Execute onComplete hooks if configured (Claude Code spec)\n if (loadedAgentConfig?.hooks?.onComplete?.length) {\n try {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n result: this.renderResultForAssistant(\n lastMessage.message.content.filter(_ => _.type === 'text'),\n ),\n })\n await executeAgentHooks(\n 'onComplete',\n loadedAgentConfig,\n hookContext,\n )\n } catch (hookError) {\n debugLogger.warn('TASK_AGENT_ONCOMPLETE_HOOK_FAILED', {\n agentId,\n agentType,\n error:\n hookError instanceof Error\n ? hookError.message\n : String(hookError),\n })\n }\n }\n\n // Save agent memory if configured (Claude Code spec)\n if (loadedAgentConfig?.memory) {\n try {\n // Save the agent's final response as memory\n const finalResponse = lastMessage.message.content\n .filter(_ => _.type === 'text')\n .map(_ => (_ as { type: 'text'; text: string }).text)\n .join('\\n')\n if (finalResponse.trim()) {\n await saveAgentMemory(\n agentType,\n loadedAgentConfig.memory,\n finalResponse,\n )\n }\n } catch (memoryError) {\n debugLogger.warn('TASK_AGENT_MEMORY_SAVE_FAILED', {\n agentId,\n agentType,\n error:\n memoryError instanceof Error\n ? memoryError.message\n : String(memoryError),\n })\n }\n }\n\n const result = [\n toolUseCount === 1 ? '1 tool use' : `${toolUseCount} tool uses`,\n formatNumber(\n (lastMessage.message.usage.cache_creation_input_tokens ?? 0) +\n (lastMessage.message.usage.cache_read_input_tokens ?? 0) +\n lastMessage.message.usage.input_tokens +\n lastMessage.message.usage.output_tokens,\n ) + ' tokens',\n formatDuration(Date.now() - startTime),\n ]\n yield {\n type: 'progress',\n content: createAssistantMessage(`Done (${result.join(' \u00B7 ')})`),\n normalizedMessages,\n tools,\n }\n }\n\n // Output is an AssistantMessage, but since TaskTool is a tool, it needs\n // to serialize its response to UserMessage-compatible content.\n const data = lastMessage.message.content.filter(_ => _.type === 'text')\n\n // Include agentId in result for potential resume\n const resultWithAgentId = isInterrupted\n ? `[Interrupted - Agent ID: ${agentId}]\\n${this.renderResultForAssistant(data)}`\n : this.renderResultForAssistant(data)\n\n yield {\n type: 'result',\n data,\n resultForAssistant: resultWithAgentId,\n }\n hasYieldedResult = true\n } catch (error) {\n // \uD83D\uDD27 CRITICAL: On error, we MUST yield a result to clear UI state\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n\n // \uD83D\uDD27 FIX: Check if this is an AbortError (ESC interrupt)\n // AbortError indicates user interrupted, should mark as 'interrupted' not 'failed'\n const isAbortError =\n error instanceof Error &&\n (error.name === 'AbortError' ||\n error.message.includes('aborted') ||\n error.message.includes('abort'))\n\n if (isAbortError) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED_BY_ABORT', {\n agentId,\n toolUseCount,\n })\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] interrupted\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] interrupted by user\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n } else {\n // Convert to user-friendly error for better UX\n const friendlyError =\n error instanceof UserFriendlyError\n ? error\n : new UserFriendlyError(error, {\n operation: 'agent task',\n model: agentType,\n })\n const friendlyMessage = friendlyError.getUserMessage()\n\n logError(`TaskTool [${agentType}] error: ${errorMessage}`)\n\n // Mark transcript as failed with friendly message\n failAgentTranscript(agentId, friendlyMessage)\n debugLogger.error('TASK_AGENT_FAILED', {\n agentId,\n error: errorMessage,\n errorId: friendlyError.id,\n })\n\n // Execute onError hooks if configured (Claude Code spec)\n if (loadedAgentConfig?.hooks?.onError?.length) {\n try {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n error: error instanceof Error ? error : new Error(String(error)),\n })\n await executeAgentHooks('onError', loadedAgentConfig, hookContext)\n } catch (hookError) {\n debugLogger.warn('TASK_AGENT_ONERROR_HOOK_FAILED', {\n agentId,\n agentType,\n error:\n hookError instanceof Error\n ? hookError.message\n : String(hookError),\n })\n }\n }\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `${friendlyMessage}\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] failed: ${errorMessage}\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n hasYieldedResult = true\n } finally {\n // Cleanup git worktree if created\n if (worktreePath) {\n try {\n execSync(`git worktree remove \"${worktreePath}\" --force`, {\n cwd: getCwd(),\n stdio: 'pipe',\n })\n debugLogger.info('TASK_AGENT_WORKTREE_REMOVED', {\n agentId,\n worktreePath,\n })\n } catch {\n debugLogger.warn('TASK_AGENT_WORKTREE_CLEANUP_FAILED', {\n agentId,\n worktreePath,\n })\n }\n }\n\n // Pop agent context and clean up streaming state\n popAgentContext()\n cleanupAgentStreamingState(agentId)\n\n // \uD83D\uDD27 SAFETY NET: Ensure we always yield a result even in unexpected scenarios\n if (!hasYieldedResult) {\n // Mark as interrupted if we haven't yielded a result\n interruptAgentTranscript(agentId)\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n }\n },\n\n isReadOnly() {\n return true // for now...\n },\n isConcurrencySafe() {\n return true // Task tool supports concurrent execution in official implementation\n },\n async validateInput(input, context) {\n if (!input.description || typeof input.description !== 'string') {\n return {\n result: false,\n message: 'Description is required and must be a string',\n }\n }\n if (!input.prompt || typeof input.prompt !== 'string') {\n return {\n result: false,\n message: 'Prompt is required and must be a string',\n }\n }\n\n // Model validation - similar to Edit tool error handling\n if (input.model_name) {\n const modelManager = getModelManager()\n const availableModels = modelManager.getAllAvailableModelNames()\n\n if (!availableModels.includes(input.model_name)) {\n return {\n result: false,\n message: `Model '${input.model_name}' does not exist. Available models: ${availableModels.join(', ')}`,\n meta: {\n model_name: input.model_name,\n availableModels,\n },\n }\n }\n }\n\n // Validate subagent_type if provided\n if (input.subagent_type) {\n const availableTypes = await getAvailableAgentTypes()\n if (!availableTypes.includes(input.subagent_type)) {\n return {\n result: false,\n message: `Agent type '${input.subagent_type}' does not exist. Available types: ${availableTypes.join(', ')}`,\n meta: {\n subagent_type: input.subagent_type,\n availableTypes,\n },\n }\n }\n }\n\n // Validate resume parameter if provided\n if (input.resume) {\n if (!canResumeTranscript(input.resume)) {\n return {\n result: false,\n message: `Cannot resume agent '${input.resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n meta: {\n resume: input.resume,\n },\n }\n }\n }\n\n return { result: true }\n },\n async isEnabled() {\n return true\n },\n userFacingName(input?: any) {\n // Return agent name with proper prefix\n const agentType = input?.subagent_type || 'general-purpose'\n return `agent-${agentType}`\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(data: TextBlock[]) {\n return data\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n },\n renderToolUseMessage(\n { description, prompt, model_name, subagent_type },\n { verbose },\n ) {\n if (!description || !prompt) return null\n\n const modelManager = getModelManager()\n const defaultTaskModel = modelManager.getModelName('task')\n const actualModel = model_name || defaultTaskModel\n const agentType = subagent_type || 'general-purpose'\n const promptPreview =\n prompt.length > 80 ? prompt.substring(0, 80) + '...' : prompt\n\n const theme = getTheme()\n\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text>\n [{agentType}] {actualModel}: {description}\n </Text>\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText}>{promptPreview}</Text>\n </Box>\n </Box>\n )\n }\n\n // Simple display: agent type, model and description\n return `[${agentType}] ${actualModel}: ${description}`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content, options?: { verbose?: boolean }) {\n const theme = getTheme()\n const verbose = options?.verbose ?? false\n\n // Guard against undefined or null content\n if (!content) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n }\n\n if (Array.isArray(content)) {\n const textBlocks = content.filter(\n (block): block is { type: 'text'; text: string } =>\n block && block.type === 'text',\n )\n const totalLength = textBlocks.reduce(\n (sum, block) => sum + (block.text?.length || 0),\n 0,\n )\n // Use exact match for interrupt detection\n const isInterrupted = content.some(\n block =>\n block && block.type === 'text' && block.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.error}>Interrupted by user</Text>\n </Box>\n )\n }\n\n // Extract output content for display based on verbosity\n const outputText = textBlocks.map(b => b.text).join('\\n')\n\n // Determine how much content to show based on displayMode\n // minimal/compact (verbose=false): Just show \"Task completed (X characters)\"\n // detailed (verbose=true): Show preview of the actual output\n const getOutputPreview = () => {\n if (!verbose || !outputText) return null\n const maxLen = 500\n if (outputText.length <= maxLen) return outputText\n return outputText.substring(0, maxLen) + '...'\n }\n\n const outputPreview = getOutputPreview()\n\n return (\n <Box flexDirection=\"column\">\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n {textBlocks.length > 0 && verbose && (\n <Text color={theme.secondaryText}> ({totalLength} chars)</Text>\n )}\n </Box>\n </Box>\n {outputPreview && (\n <Box marginTop={1} paddingLeft={4}>\n <Text color={theme.mutedText}>{outputPreview}</Text>\n </Box>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n },\n} satisfies Tool\n"],
5
- "mappings": "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",
6
- "names": ["normalizedMessages"]
4
+ "sourcesContent": ["import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport chalk from 'chalk'\nimport { last, memoize } from 'lodash-es'\nimport { EOL } from 'os'\nimport { dirname } from 'path'\nimport { execFileSync } from 'child_process'\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getAgentPrompt, getSystemPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { AssistantMessage, Message as MessageType } from '@query'\nimport { formatDuration, formatNumber } from '@utils/format'\nimport {\n getMessagesPath,\n getNextAvailableLogSidechainNumber,\n overwriteLog,\n logError,\n} from '@utils/log'\nimport { applyMarkdown } from '@utils/markdown'\nimport {\n createAssistantMessage,\n createUserMessage,\n INTERRUPT_MESSAGE,\n normalizeMessages,\n} from '@utils/messages'\nimport { getModelManager } from '@utils/model'\nimport { getMaxThinkingTokens } from '@utils/thinking'\nimport { getTheme } from '@utils/theme'\nimport { generateAgentId } from '@utils/agentStorage'\nimport { debug as debugLogger } from '@utils/debugLogger'\nimport { getTools, getReadOnlyTools } from '@tools'\nimport { getTaskTools, getPrompt } from './prompt'\nimport { TOOL_NAME } from './constants'\nimport {\n getActiveAgents,\n getAgentByType,\n getAvailableAgentTypes,\n} from '@utils/agentLoader'\nimport {\n createAgentTranscript,\n getAgentTranscript,\n getResumableTranscript,\n appendMessageToTranscript,\n updateAgentTranscript,\n completeAgentTranscript,\n failAgentTranscript,\n interruptAgentTranscript,\n canResumeTranscript,\n registerToolUseAgent,\n type AgentTranscript,\n} from '@utils/agentTranscripts'\nimport {\n registerBackgroundAgent,\n completeBackgroundAgent,\n failBackgroundAgent,\n} from '@utils/backgroundAgentManager'\nimport { UserFriendlyError, formatErrorForUser } from '@utils/userFriendlyError'\nimport { execSync } from 'child_process'\nimport {\n pushAgentContext,\n popAgentContext,\n cleanupAgentStreamingState,\n} from '@utils/streamingState'\nimport {\n validateAgentPermission,\n MODE_CONFIGS,\n type PermissionMode,\n} from '@minto-types/PermissionMode'\nimport { executeAgentHooks, createHookContext } from '@utils/agentHookExecutor'\nimport {\n loadAgentMemory,\n saveAgentMemory,\n formatMemoryForPrompt,\n} from '@utils/agentMemory'\nimport { getSkill, loadSkillContent } from '@utils/skillLoader'\nimport { getCwd } from '@utils/state'\nimport { getHookManager } from '@utils/hookManager'\nimport { substituteVariables } from '@utils/stringSubstitution'\nimport {\n getTeam,\n addTeammate,\n updateTeammateStatus,\n sanitizeTeamName,\n} from '@services/agentTeams/teamManager'\nimport {\n markTeammateIdle,\n markTeammateCompleted,\n} from '@services/agentTeams/teammateSpawner'\nimport { resolveBackend } from '@services/agentTeams/backends/resolver'\nimport type { DisplayBackend } from '@services/agentTeams/backends/types'\nimport {\n registerInProcessAgent,\n updateInProcessAgentState,\n unregisterInProcessAgent,\n} from '@services/agentTeams/backends/inProcess'\n\n/**\n * Default timeout for headless (tmux) agent processes.\n * Used for both background and foreground headless modes.\n */\nconst DEFAULT_HEADLESS_TIMEOUT_MS = 10 * 60 * 1000 // 10 minutes\n\n/**\n * Save current process.env values, set new ones, and return a restore function.\n * Values set to `undefined` will delete the env var (and restore the original).\n *\n * CONCURRENCY NOTE: This mutates the shared `process.env` object, which is safe\n * for tmux/headless backends (each agent is a separate OS process) but is a\n * concurrency hazard for in-process (AgentEngine) teammates that share the same\n * event loop. For in-process mode, callers should pass `inProcess: true` to skip\n * the mutation and instead rely on the team context injected into the system prompt\n * and the agent's toolUseContext. The env vars are still needed for tmux backends\n * where each agent is a child process that reads process.env at startup.\n */\nfunction scopeEnvVars(\n vars: Record<string, string | undefined>,\n options?: { inProcess?: boolean },\n): () => void {\n // For in-process agents, skip process.env mutation to avoid concurrency bugs.\n // Multiple in-process agents run on the same event loop and would overwrite\n // each other's env vars. The team context is already available via system prompt\n // and AgentEngine's teamName/agentId fields.\n if (options?.inProcess) {\n return () => {} // no-op restore\n }\n\n const saved: Record<string, string | undefined> = {}\n for (const key of Object.keys(vars)) {\n saved[key] = process.env[key]\n if (vars[key] !== undefined) {\n process.env[key] = vars[key]\n } else {\n delete process.env[key]\n }\n }\n return () => {\n for (const key of Object.keys(saved)) {\n if (saved[key] !== undefined) {\n process.env[key] = saved[key]\n } else {\n delete process.env[key]\n }\n }\n }\n}\n\nconst inputSchema = z.object({\n description: z\n .string()\n .describe('A short (3-5 word) description of the task'),\n prompt: z.string().describe('The task for the agent to perform'),\n model_name: z\n .string()\n .optional()\n .describe(\n 'Optional: Specific model name to use for this task. If not provided, uses the default task model pointer.',\n ),\n model: z\n .enum(['sonnet', 'opus', 'haiku'])\n .optional()\n .describe(\n 'Optional model hint for this agent. Maps to configured model pointers: sonnet\u2192main, opus\u2192reasoning, haiku\u2192quick. If not specified, uses the task model pointer. Prefer haiku for quick, straightforward tasks.',\n ),\n subagent_type: z\n .string()\n .optional()\n .describe(\n '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.',\n ),\n resume: z\n .string()\n .optional()\n .describe(\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\n ),\n max_turns: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'Maximum number of agentic turns (API round-trips) before stopping. Used internally for warmup.',\n ),\n team_name: z\n .string()\n .optional()\n .describe(\n 'Optional team name. When provided, the subagent is spawned as a teammate with team context, discovery info, and team tools (SendMessage, TaskCreate, etc.).',\n ),\n name: z\n .string()\n .optional()\n .describe(\n 'Optional human-readable name for this teammate (e.g., \"researcher\", \"tester\"). Used for team communication.',\n ),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\n 'Set to true to run this agent in the background. The tool result will include an output_file path - use Read tool or Bash tail to check on output.',\n ),\n isolation: z\n .enum(['worktree'])\n .optional()\n .describe(\n 'Isolation mode. \"worktree\" creates a temporary git worktree so the agent works on an isolated copy of the repo.',\n ),\n})\n\nexport const TaskTool = {\n async prompt({ safeMode }) {\n return await getPrompt(safeMode)\n },\n name: TOOL_NAME,\n async description() {\n // Dynamically load available agent types from plugins\n const availableTypes = await getAvailableAgentTypes()\n const typesList = availableTypes.join(', ')\n 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.`\n },\n inputSchema,\n\n async *call(\n {\n description,\n prompt,\n model_name,\n model,\n subagent_type,\n resume,\n max_turns,\n team_name,\n name: teammateName,\n run_in_background,\n isolation,\n },\n {\n abortController,\n options: {\n safeMode = false,\n safetyMode,\n forkNumber,\n messageLogName,\n verbose,\n },\n readFileTimestamps,\n toolUseId,\n },\n ): AsyncGenerator<\n | { type: 'result'; data: TextBlock[]; resultForAssistant?: string }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n > {\n const startTime = Date.now()\n\n // Team agents always run in background so the team-lead remains available to coordinate\n const effectiveRunInBackground = team_name ? true : run_in_background\n\n if (team_name) {\n team_name = sanitizeTeamName(team_name)\n }\n\n // Default to general-purpose if no subagent_type specified\n const agentType = subagent_type || 'general-purpose'\n\n // Handle resume: check if we're resuming from a previous transcript\n let resumedTranscript: AgentTranscript | null = null\n let agentId: string\n\n if (resume) {\n resumedTranscript = getResumableTranscript(resume)\n if (!resumedTranscript) {\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Cannot resume agent '${resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n },\n ] as TextBlock[],\n resultForAssistant: `Cannot resume agent '${resume}': transcript not found or not resumable`,\n }\n return\n }\n agentId = resume\n debugLogger.info('TASK_AGENT_RESUMING', {\n agentId,\n agentType: resumedTranscript.agentType,\n messageCount: resumedTranscript.messages.length,\n previousStatus: resumedTranscript.status,\n })\n } else {\n agentId = generateAgentId()\n }\n\n // Register toolUseId -> agentId mapping for UI association\n if (toolUseId) {\n registerToolUseAgent(toolUseId, agentId)\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Track whether we've yielded a result to prevent UI stuck state\n let hasYieldedResult = false\n\n // Apply subagent configuration\n let effectivePrompt = prompt\n let effectiveModel = model_name || 'task'\n let toolFilter = null\n let disallowedToolFilter: string[] | null = null // Claude Code spec: disallowedTools denylist\n let temperature = undefined\n let agentMaxThinkingTokens: number | undefined = undefined\n let effectivePermissionMode: PermissionMode = 'default'\n let loadedAgentConfig: Awaited<ReturnType<typeof getAgentByType>> = null\n\n // Load agent configuration dynamically\n if (agentType) {\n const agentConfig = await getAgentByType(agentType)\n\n if (!agentConfig) {\n // If agent type not found, return helpful message instead of throwing\n const availableTypes = await getAvailableAgentTypes()\n const helpMessage = `Agent type '${agentType}' not found.\\n\\nAvailable agents:\\n${availableTypes.map(t => ` \u2022 ${t}`).join('\\n')}\\n\\nUse /agents command to manage agent configurations.`\n\n yield {\n type: 'result',\n data: [{ type: 'text', text: helpMessage }] as TextBlock[],\n resultForAssistant: helpMessage,\n }\n hasYieldedResult = true\n return\n }\n\n // Store config for later use (hooks, memory, etc.)\n loadedAgentConfig = agentConfig\n\n // Apply system prompt if configured \u2014 wrap in <system-reminder> so\n // AgentDetailView (focus view) filters it from rendered output\n if (agentConfig.systemPrompt) {\n effectivePrompt = `<system-reminder>\\n${agentConfig.systemPrompt}\\n</system-reminder>\\n\\n${prompt}`\n }\n\n // Apply model if not overridden by model_name parameter\n if (!model_name && agentConfig.model_name) {\n // Support inherit: keep pointer-based default\n if (agentConfig.model_name !== 'inherit') {\n effectiveModel = agentConfig.model_name as string\n }\n }\n\n // Store tool filter for later application\n toolFilter = agentConfig.tools\n\n // Store disallowed tools filter for later application (Claude Code spec compliance)\n if (agentConfig.disallowedTools?.length) {\n disallowedToolFilter = agentConfig.disallowedTools\n }\n\n // Apply maxThinkingTokens if configured (Claude Code spec)\n if (agentConfig.maxThinkingTokens) {\n agentMaxThinkingTokens = agentConfig.maxThinkingTokens\n }\n\n // Validate and apply permission mode (Claude Code spec)\n // Agent permission cannot exceed session permission level\n if (agentConfig.permissionMode) {\n const sessionMode: PermissionMode = safeMode ? 'plan' : 'default'\n effectivePermissionMode = validateAgentPermission(\n agentConfig.permissionMode,\n sessionMode,\n )\n }\n\n // Load agent memory if configured (Claude Code spec)\n if (agentConfig.memory) {\n try {\n const memoryContent = await loadAgentMemory(\n agentConfig.agentType,\n agentConfig.memory,\n )\n if (memoryContent) {\n // Inject memory into system prompt\n effectivePrompt =\n formatMemoryForPrompt(memoryContent, agentConfig.agentType) +\n '\\n' +\n effectivePrompt\n }\n } catch (error) {\n debugLogger.warn('TASK_AGENT_MEMORY_LOAD_FAILED', {\n agentId,\n agentType,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n // Preload skills if configured (Claude Code spec)\n if (agentConfig.skills?.length) {\n for (const skillName of agentConfig.skills) {\n try {\n const skill = getSkill(skillName)\n if (skill) {\n const skillContent = await loadSkillContent(skill)\n const skillBaseDir = dirname(skill.filePath)\n // Apply {baseDir} resolution and string substitution\n const resolvedContent = skillContent.replace(\n /\\{baseDir\\}/g,\n skillBaseDir,\n )\n const substitutedContent = await substituteVariables(\n resolvedContent,\n '', // No arguments for preloaded skills\n {\n sessionId: agentId,\n cwd: process.cwd(),\n env: { BASE_DIR: skillBaseDir },\n },\n )\n effectivePrompt += `\\n\\n<preloaded-skill name=\"${skillName}\">\\n${substitutedContent}\\n</preloaded-skill>`\n }\n } catch (error) {\n debugLogger.warn('TASK_AGENT_SKILL_PRELOAD_FAILED', {\n agentId,\n skillName,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n }\n\n // Execute onStart hooks if configured (Claude Code spec)\n if (agentConfig.hooks?.onStart?.length) {\n try {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n })\n const hookResult = await executeAgentHooks(\n 'onStart',\n agentConfig,\n hookContext,\n )\n if (!hookResult.continue) {\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Agent ${agentType} blocked by onStart hook: ${hookResult.reason || 'Hook requested stop'}`,\n },\n ] as TextBlock[],\n resultForAssistant: `Agent blocked by onStart hook: ${hookResult.reason}`,\n }\n hasYieldedResult = true\n return\n }\n } catch (error) {\n debugLogger.warn('TASK_AGENT_ONSTART_HOOK_FAILED', {\n agentId,\n agentType,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n // Note: temperature is not currently in our agent configs\n // but could be added in the future\n }\n\n // Apply model resolution with intelligent fallback\n // Priority: model_name (explicit) > model (alias) > agent config > task pointer > main model\n if (model) {\n // Model aliases are semantic hints, not hardcoded model names\n // Map to Minto's model pointer system for proper resolution\n const modelPointerMap: Record<string, string> = {\n sonnet: 'main', // Use main model for standard tasks\n opus: 'reasoning', // Use reasoning model for complex tasks\n haiku: 'quick', // Use quick model for fast tasks\n }\n\n const pointerType = modelPointerMap[model] || 'task'\n const modelManager = getModelManager()\n const resolvedModelName = modelManager.getModelName(pointerType as any)\n\n if (resolvedModelName) {\n effectiveModel = resolvedModelName\n }\n // If resolution fails, keep the previous effectiveModel (from agent config or 'task' default)\n }\n\n // Git worktree isolation: create isolated worktree for parallel edits\n let worktreePath: string | null = null\n const shouldUseWorktree =\n isolation === 'worktree' || loadedAgentConfig?.isolation === 'worktree'\n if (shouldUseWorktree) {\n try {\n const tmpDir = `/tmp/minto-worktree-${agentId}`\n execFileSync('git', ['worktree', 'add', tmpDir, 'HEAD'], {\n cwd: getCwd(),\n stdio: 'pipe',\n })\n worktreePath = tmpDir\n effectivePrompt = `[Working in isolated git worktree: ${tmpDir}]\\n\\n${effectivePrompt}`\n debugLogger.info('TASK_AGENT_WORKTREE_CREATED', {\n agentId,\n worktreePath,\n })\n // Fire WorktreeCreate hook\n const hookMgrCreate = getHookManager()\n hookMgrCreate\n ?.executeWorktreeCreate(worktreePath, agentId, agentType)\n .catch(err =>\n debugLogger.trace('HOOK_WORKTREE_CREATE', { error: err }),\n )\n } catch (err) {\n debugLogger.warn('TASK_AGENT_WORKTREE_FAILED', {\n agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n // Continue without worktree \u2014 non-git repos or worktree errors\n }\n }\n\n // Scoped env var management: save \u2192 set \u2192 restore in finally\n // Prevents process.env pollution across concurrent agents\n let restoreEnvVars: (() => void) | null = null\n\n if (team_name) {\n const teammateAgentId = teammateName\n ? `${teammateName}@${team_name}`\n : `${agentType}@${team_name}`\n\n // Register this agent as a team member so it appears in the panel\n try {\n const { getTeammateColor } = await import('@constants/agentTeams')\n const teamEntry = getTeam(team_name)\n const colorIndex = teamEntry?.team.members.length ?? 0\n addTeammate(team_name, {\n id: teammateAgentId,\n name: teammateName || agentType,\n agentType,\n status: 'working',\n prompt,\n color: getTeammateColor(colorIndex),\n })\n } catch {\n // Non-fatal: agent can still work without team registration\n }\n\n // Store worktree path in team registry for cleanup on disband\n if (worktreePath && team_name) {\n try {\n const { updateTeammateWorktree } = await import(\n '@services/agentTeams/teamManager'\n )\n updateTeammateWorktree(\n team_name,\n teammateName\n ? `${teammateName}@${team_name}`\n : `${agentType}@${team_name}`,\n worktreePath,\n )\n } catch {\n /* best-effort */\n }\n }\n\n // Set env vars for team discovery (readable by subagent tools)\n // scopeEnvVars saves current values and returns a restore function\n const effectiveAgentName = teammateName || agentType\n\n // Determine planModeRequired value\n let planModeValue: string | undefined\n try {\n const teamEntry = getTeam(team_name)\n const member = teamEntry?.team.members.find(\n m => m.id === teammateAgentId,\n )\n planModeValue = member?.planModeRequired ? '1' : undefined\n } catch {\n // Non-fatal: if team lookup fails, don't set the flag\n }\n\n // Determine backend mode early so we know whether to mutate process.env.\n // In-process agents share the event loop \u2014 env mutation is a concurrency bug.\n const earlyBackend = resolveBackend(\n getTeam(team_name)?.team.config.displayMode,\n )\n const isInProcessBackend = earlyBackend.mode === 'in-process'\n\n // Track agent nesting depth to prevent infinite recursion.\n // Each spawned teammate increments the depth counter.\n const parentDepth =\n parseInt(\n process.env.MINTO_AGENT_DEPTH ??\n process.env.CLAUDE_AGENT_DEPTH ??\n '0',\n 10,\n ) || 0\n const childDepth = String(parentDepth + 1)\n\n restoreEnvVars = scopeEnvVars(\n {\n MINTO_TEAM_NAME: team_name,\n MINTO_AGENT_ID: teammateAgentId,\n MINTO_AGENT_TYPE: agentType,\n MINTO_AGENT_NAME: effectiveAgentName,\n MINTO_PLAN_MODE_REQUIRED: planModeValue,\n MINTO_AGENT_DEPTH: childDepth,\n // CC compat: set CLAUDE_CODE_* so CC ecosystem tools can read them\n CLAUDE_CODE_TEAM_NAME: team_name,\n CLAUDE_CODE_AGENT_ID: teammateAgentId,\n CLAUDE_CODE_AGENT_TYPE: agentType,\n CLAUDE_CODE_AGENT_NAME: effectiveAgentName,\n CLAUDE_CODE_PLAN_MODE_REQUIRED: planModeValue,\n CLAUDE_AGENT_DEPTH: childDepth,\n },\n { inProcess: isInProcessBackend },\n )\n\n // Build team discovery context for the system prompt\n let teamDiscovery = ''\n try {\n const { getTeam: getTeamFn } = await import(\n '@services/agentTeams/teamManager'\n )\n const entry = getTeamFn(team_name)\n if (entry) {\n const otherMembers = entry.team.members\n .filter(m => m.id !== teammateAgentId && m.name !== teammateName)\n .map(m => ` - ${m.name} (${m.agentType}): ${m.status}`)\n .join('\\n')\n if (otherMembers) {\n teamDiscovery = `\\nTeam members:\\n${otherMembers}`\n }\n }\n } catch {\n // Team not found \u2014 non-fatal\n }\n\n const teamContext = `\\n# Agent Teammate Communication\n\nYou are agent \"${teammateName || agentType}\" in team \"${team_name}\".\n\n## CRITICAL: Reporting Results\n\n**You MUST use the SendMessage tool to report your results to the team lead.** Your text output is NOT visible to the team lead or any teammate. The ONLY way to deliver your findings is via SendMessage.\n\nWhen you finish your task:\n1. Use SendMessage with type \"message\", recipient \"team-lead\", and your findings as content\n2. Include a brief summary in the summary field\n3. Do NOT just output text \u2014 it will be lost\n\n## Communication\n\n- Use SendMessage with type \\`message\\` to send messages to specific teammates\n- Use SendMessage with type \\`broadcast\\` sparingly for team-wide announcements\n- Do NOT send acknowledgment messages (\"Got it\", \"\u5DF2\u6536\u5230\") \u2014 only send when you have actionable content\n- ALWAYS respond in the same language as the user's original request\n\n**User guidance**: Sometimes the user may send you direct messages that appear in \\`<user-guidance>\\` tags. When you receive user guidance, respond directly in your text output \u2014 do NOT forward it to the team lead via SendMessage. The user can see your text output in the focus view.\n\nTeam: ${team_name}\nYour agent ID: ${teammateAgentId}\nYour agent type: ${agentType}${teamDiscovery}\n`\n // Wrap teamContext in <system-reminder> so UserPromptMessage filters it out\n effectivePrompt =\n `<system-reminder>\\n${teamContext}\\n</system-reminder>\\n\\n` +\n effectivePrompt\n\n // Override agentId so tool context carries the team-scoped identity\n agentId = teammateAgentId\n // Re-register toolUse mapping with team-scoped ID\n if (toolUseId) {\n registerToolUseAgent(toolUseId, agentId)\n }\n\n // \u2500\u2500 Headless Mode: spawn as independent process \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // When backend is not in-process, fork a child process and wait for\n // it to complete. The child process runs its own query loop and sends\n // results via file-based mailbox. When multiple agents are spawned in\n // parallel (parallel TaskTool calls), each waits independently \u2014\n // achieving true multi-process parallelism with result collection.\n const backend = resolveBackend(\n getTeam(team_name)?.team.config.displayMode,\n )\n\n // Teammates get acceptEdits \u2014 file edits and bash commands are auto-approved\n // within the project directory. BashTool still enforces critical safety\n // checks (directory sandbox, destructive patterns) regardless of permission mode.\n effectivePermissionMode = safeMode ? 'plan' : 'acceptEdits'\n\n if (backend.mode !== 'in-process') {\n try {\n // Check if teammate has planModeRequired in registry\n const spawnTeamEntry = getTeam(team_name)\n const spawnMember = spawnTeamEntry?.team.members.find(\n m => m.id === teammateAgentId,\n )\n\n const handle = await backend.spawn({\n agentId: teammateAgentId,\n agentName: teammateName || agentType,\n teamName: team_name,\n agentType,\n prompt,\n model: effectiveModel !== 'task' ? effectiveModel : undefined,\n cwd: process.cwd(),\n maxTurns: max_turns,\n mode: effectivePermissionMode,\n planModeRequired: spawnMember?.planModeRequired,\n color: spawnMember?.color,\n parentSessionId: spawnTeamEntry?.team.leadSessionId,\n })\n\n // Create a transcript so the UI can track this headless agent's status.\n // The transcript won't have real-time messages (those happen in the child),\n // but it provides status tracking for ParallelTasksGroupView and AgentFocusView.\n createAgentTranscript({\n agentId: teammateAgentId,\n agentType,\n toolUseId,\n description: description || teammateName || agentType,\n prompt,\n model: effectiveModel,\n forkNumber,\n messageLogName,\n messages: [createUserMessage(effectivePrompt)],\n toolUseCount: 0,\n metadata: { isBackground: true },\n })\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Teammate \"${teammateName || agentType}\" spawned as independent process (headless mode, agent ID: ${teammateAgentId})`,\n ),\n }\n\n // Background mode: return immediately, let heartbeat detect completion\n if (effectiveRunInBackground) {\n registerBackgroundAgent(\n teammateAgentId,\n agentType,\n description,\n abortController,\n )\n\n // Fire-and-forget: monitor the child process and update status on exit\n ;(async () => {\n const HEADLESS_TIMEOUT_MS = DEFAULT_HEADLESS_TIMEOUT_MS\n let exitCode: number | null = null\n\n await new Promise<void>(resolve => {\n const timeoutId = setTimeout(() => {\n debugLogger.warn('HEADLESS_AGENT_TIMEOUT', {\n agentId: teammateAgentId,\n timeoutMs: HEADLESS_TIMEOUT_MS,\n })\n backend.kill(handle).then(resolve, resolve)\n }, HEADLESS_TIMEOUT_MS)\n\n backend.onExit(handle, code => {\n exitCode = code\n clearTimeout(timeoutId)\n resolve()\n })\n\n if (!backend.isAlive(handle)) {\n clearTimeout(timeoutId)\n resolve()\n }\n\n if (abortController.signal.aborted) {\n clearTimeout(timeoutId)\n backend.kill(handle).then(resolve, resolve)\n } else {\n abortController.signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId)\n backend.kill(handle).then(resolve, resolve)\n },\n { once: true },\n )\n }\n })\n\n if (exitCode !== null && exitCode !== 0) {\n updateTeammateStatus(team_name, teammateAgentId, 'stopped')\n failBackgroundAgent(teammateAgentId, `exit code ${exitCode}`)\n failAgentTranscript(teammateAgentId, `exit code ${exitCode}`)\n } else {\n markTeammateCompleted(\n team_name,\n teammateAgentId,\n teammateName || agentType,\n {\n summary: `Teammate \"${teammateName || agentType}\" completed.`,\n },\n ).catch(err =>\n debugLogger.trace('MARK_TEAMMATE_COMPLETED', { error: err }),\n )\n completeBackgroundAgent(teammateAgentId, [\n {\n type: 'text',\n text: `Teammate \"${teammateName || agentType}\" completed.`,\n },\n ])\n completeAgentTranscript(teammateAgentId)\n }\n })()\n\n const bgResultText = `Agent \"${teammateName || agentType}\" running in background`\n yield {\n type: 'result',\n data: [{ type: 'text', text: bgResultText }] as TextBlock[],\n resultForAssistant: `Teammate \"${teammateName || agentType}\" is running in the background. You will be notified automatically when they finish \u2014 do NOT check on them.`,\n }\n hasYieldedResult = true\n return\n }\n\n // Foreground mode: wait for the child process to exit.\n // Promise resolves on exit, abort, or timeout (calling resolve multiple times is safe).\n const HEADLESS_TIMEOUT_MS = DEFAULT_HEADLESS_TIMEOUT_MS\n let exitCode: number | null = null\n\n await new Promise<void>(resolve => {\n // Safety timeout to prevent infinite hang\n const timeoutId = setTimeout(() => {\n debugLogger.warn('HEADLESS_AGENT_TIMEOUT', {\n agentId: teammateAgentId,\n timeoutMs: HEADLESS_TIMEOUT_MS,\n })\n backend.kill(handle).then(resolve, resolve)\n }, HEADLESS_TIMEOUT_MS)\n\n backend.onExit(handle, code => {\n exitCode = code\n clearTimeout(timeoutId)\n resolve()\n })\n\n // Guard against race: process may have exited before onExit was registered\n if (!backend.isAlive(handle)) {\n clearTimeout(timeoutId)\n resolve()\n }\n\n // Support abort: kill child process on Ctrl+C\n if (abortController.signal.aborted) {\n clearTimeout(timeoutId)\n backend.kill(handle).then(resolve, resolve)\n } else {\n abortController.signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId)\n backend.kill(handle).then(resolve, resolve)\n },\n { once: true },\n )\n }\n })\n\n // Update teammate status in parent's in-memory team state.\n // The child already wrote its messages to disk before exiting,\n // so we sync the in-memory status and send a completion notification.\n markTeammateCompleted(\n team_name,\n teammateAgentId,\n teammateName || agentType,\n {\n summary: `Teammate \"${teammateName || agentType}\" completed.`,\n },\n ).catch(err =>\n debugLogger.trace('MARK_TEAMMATE_COMPLETED', { error: err }),\n )\n\n // Read agent's messages from the file-based mailbox\n const teamEntry = getTeam(team_name)\n const leadId = `team-lead@${team_name}`\n let agentResultText = `Teammate \"${teammateName || agentType}\" completed.`\n\n // Check for non-zero exit code (child process error)\n if (exitCode !== null && exitCode !== 0) {\n agentResultText = `Teammate \"${teammateName || agentType}\" failed (exit code ${exitCode}). The agent process encountered an error during startup or execution.`\n failAgentTranscript(teammateAgentId, agentResultText)\n } else {\n completeAgentTranscript(teammateAgentId)\n }\n\n if (teamEntry) {\n const unread = teamEntry.mailbox.getUnread(leadId)\n const fromAgent = unread.filter(m => m.from === teammateAgentId)\n if (fromAgent.length > 0) {\n const {\n parseIdleNotification,\n formatIdleNotificationForInjection,\n formatTeamMessage,\n } = require('@services/agentTeams/messageFormatter')\n agentResultText = fromAgent\n .map(m => {\n // Parse idle/task_completed/idle_notification JSON into formatted XML\n const idleData = parseIdleNotification(m.text)\n if (idleData) {\n return formatIdleNotificationForInjection(idleData)\n }\n return formatTeamMessage(m)\n })\n .join('\\n\\n')\n teamEntry.mailbox.markRead(fromAgent.map(m => m.id))\n }\n }\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: agentResultText,\n },\n ] as TextBlock[],\n resultForAssistant: agentResultText,\n }\n hasYieldedResult = true\n return\n } catch (spawnError) {\n // Fallback to in-process on spawn failure\n debugLogger.warn('HEADLESS_SPAWN_FAILED', {\n agentId: teammateAgentId,\n error:\n spawnError instanceof Error\n ? spawnError.message\n : String(spawnError),\n })\n // Continue with in-process execution below\n }\n }\n }\n\n // Register in-process agent state for CC-compatible tracking.\n // Only for team agents \u2014 standalone TaskTool invocations don't need this.\n if (team_name) {\n registerInProcessAgent(agentId, effectivePermissionMode)\n }\n\n // Initialize messages: either resume from transcript or start fresh.\n // For fresh agents, start with an empty array \u2014 submitPrompt() below\n // will add the single initial user message, avoiding the duplicate that\n // caused \"WriteWrite\" tool-name hallucinations.\n let messages: MessageType[] = resumedTranscript\n ? [...resumedTranscript.messages]\n : []\n\n let tools = await getTaskTools(safeMode)\n\n // Apply tool filtering if specified by subagent config\n // Claude Code spec: tools (allowlist) + disallowedTools (denylist) combination\n // Priority: disallowedTools always takes precedence over tools\n // Supports Task(agent_type) syntax to restrict which subagent types can be spawned\n let allowedSubagentTypes: string[] | null = null\n if (toolFilter) {\n // Back-compat: ['*'] means all tools\n const isAllArray =\n Array.isArray(toolFilter) &&\n toolFilter.length === 1 &&\n toolFilter[0] === '*'\n if (toolFilter === '*' || isAllArray) {\n // no-op, keep all tools (allowlist permits all)\n } else if (Array.isArray(toolFilter)) {\n // Extract Task(type) restrictions\n const taskPatterns = toolFilter\n .filter(\n (t: string) =>\n (t.startsWith('Agent(') || t.startsWith('Task(')) &&\n t.endsWith(')'),\n )\n .map((t: string) =>\n t.startsWith('Agent(') ? t.slice(6, -1) : t.slice(5, -1),\n )\n if (taskPatterns.length > 0) {\n allowedSubagentTypes = taskPatterns\n }\n\n // Filter tools: include Agent tool if any Agent()/Task() pattern exists\n const baseToolNames = toolFilter\n .map((t: string) =>\n t.startsWith('Agent(') || t.startsWith('Task(') ? TOOL_NAME : t,\n )\n .filter((t: string, i: number, arr: string[]) => arr.indexOf(t) === i)\n tools = tools.filter(tool => baseToolNames.includes(tool.name))\n }\n }\n\n // Apply disallowedTools filter (denylist takes precedence over allowlist)\n if (disallowedToolFilter?.length) {\n tools = tools.filter(tool => !disallowedToolFilter!.includes(tool.name))\n }\n\n // When spawned as a teammate, ensure team tools are available\n // Minto enhancement: teammates can use Task tool for 1-level subagent nesting\n // TeamCreate/TeamDelete intentionally excluded \u2014 leader-only\n if (team_name) {\n // Depth checking to prevent infinite teammate nesting.\n // MINTO_AGENT_DEPTH tracks how deep we are in the agent spawn tree.\n // At depth >= 2, remove Task tool to guarantee convergence (max 2 levels).\n const currentDepth =\n parseInt(\n process.env.MINTO_AGENT_DEPTH ??\n process.env.CLAUDE_AGENT_DEPTH ??\n '0',\n 10,\n ) || 0\n\n const teamToolNames = new Set([\n 'SendMessage',\n ...(currentDepth < 2\n ? [TOOL_NAME] // Only allow further nesting at depth < 2\n : []),\n 'TaskCreate',\n 'TaskUpdate',\n 'TaskList',\n 'TaskGet',\n ])\n // Source from full tool list (getTaskTools excludes Task via EXCLUDED_AGENT_TOOLS)\n const fullTools = await (!safeMode ? getTools() : getReadOnlyTools())\n for (const tool of fullTools) {\n if (\n teamToolNames.has(tool.name) &&\n !tools.some(t => t.name === tool.name)\n ) {\n tools.push(tool)\n }\n }\n }\n\n // Apply permission mode tool restrictions (Claude Code spec)\n // Some permission modes only allow specific tools\n if (effectivePermissionMode !== 'default') {\n const modeConfig = MODE_CONFIGS[effectivePermissionMode]\n if (modeConfig && modeConfig.allowedTools[0] !== '*') {\n tools = tools.filter(tool =>\n modeConfig.allowedTools.includes(tool.name),\n )\n }\n }\n\n // Model already resolved in effectiveModel variable above\n const modelToUse = effectiveModel\n\n // Display initial task information with separate progress lines\n if (resumedTranscript) {\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Resuming agent: ${agentType} (${agentId})`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Restored ${resumedTranscript.messages.length} messages, ${resumedTranscript.toolUseCount} tool uses`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n } else {\n yield {\n type: 'progress',\n content: createAssistantMessage(`Starting agent: ${agentType}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Using model: ${modelToUse}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Task: ${description}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Prompt: ${prompt.length > 150 ? prompt.substring(0, 150) + '...' : prompt}`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n const [taskPrompt, context, maxThinkingTokens] = await Promise.all([\n team_name ? getSystemPrompt('teammate') : getAgentPrompt(),\n getContext(),\n getMaxThinkingTokens(messages),\n ])\n\n // Inject model context to prevent self-referential expert consultations\n taskPrompt.push(\n `\\nIMPORTANT: 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.`,\n )\n\n // Initialize tool use count (restore from transcript if resuming)\n let toolUseCount = resumedTranscript?.toolUseCount || 0\n\n const getSidechainNumber = memoize(() =>\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\n )\n\n // Fire SubagentStart hook (fire-and-forget)\n const hookMgr = getHookManager()\n if (hookMgr) {\n hookMgr\n .executeSubagentStart(agentType, description)\n .catch(err =>\n debugLogger.warn('SubagentStart hook failed', { error: err }),\n )\n }\n\n // Create or update transcript for this agent execution\n if (!resumedTranscript) {\n createAgentTranscript({\n agentId,\n agentType,\n toolUseId, // Include toolUseId for event-driven UI updates\n description,\n prompt,\n model: modelToUse,\n forkNumber,\n messageLogName,\n messages: [...messages],\n toolUseCount: 0,\n ...(effectiveRunInBackground && team_name\n ? { metadata: { isBackground: true } }\n : {}),\n })\n } else {\n // Update transcript status to running when resuming\n appendMessageToTranscript(\n agentId,\n createUserMessage(`[Resumed] ${prompt}`),\n )\n }\n\n // Build query options, adding temperature if specified\n // Use agent-configured maxThinkingTokens if available, otherwise use default\n const effectiveMaxThinkingTokens =\n agentMaxThinkingTokens ?? maxThinkingTokens\n const queryOptions = {\n safeMode,\n safetyMode,\n forkNumber,\n messageLogName,\n tools,\n commands: [] as any[],\n verbose,\n maxThinkingTokens: effectiveMaxThinkingTokens,\n model: modelToUse,\n ...(effectivePermissionMode\n ? { permissionMode: effectivePermissionMode }\n : {}),\n }\n\n // Add temperature if specified by subagent config\n if (temperature !== undefined) {\n queryOptions['temperature'] = temperature\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Wrap entire agent execution in try-catch-finally\n // This ensures we ALWAYS yield a result, even if the engine throws an error\n\n // For team agents, create an agent-specific AbortController.\n // The parent's abortController is the team lead's \u2014 aborting it would\n // kill the entire conversation. Instead, we create a child controller\n // that forwards parent abort but can be aborted independently by disbandTeam().\n let effectiveAbortController = abortController\n if (team_name) {\n const agentAC = new AbortController()\n // Forward parent abort \u2192 agent abort (user pressed ESC)\n if (abortController.signal.aborted) {\n agentAC.abort()\n } else {\n abortController.signal.addEventListener(\n 'abort',\n () => agentAC.abort(),\n { once: true },\n )\n }\n effectiveAbortController = agentAC\n\n try {\n const { registerAgentAbortController } = await import(\n '@services/agentTeams/teamManager'\n )\n registerAgentAbortController(team_name, agentId, agentAC)\n } catch {\n // Non-fatal: agent can still work without registration\n }\n }\n\n // Background mode for in-process agents: detach the query loop and return immediately\n if (effectiveRunInBackground && team_name) {\n registerBackgroundAgent(\n agentId,\n agentType,\n description,\n effectiveAbortController,\n )\n\n // Fire-and-forget: create an AgentEngine and run it asynchronously\n ;(async () => {\n pushAgentContext(agentId)\n let bgToolUseCount = 0\n\n try {\n const { AgentEngine } = await import('../../engine/AgentEngine')\n const { getGlobalRegistry } = await import(\n '../../engine/EngineRegistry'\n )\n\n const engine = new AgentEngine({\n agentId,\n name: teammateName || agentType,\n role: 'teammate',\n teamName: team_name,\n systemPrompt: team_name\n ? () => getSystemPrompt('teammate')\n : taskPrompt,\n context,\n tools: queryOptions.tools,\n initialMessages: [...messages],\n idleTimeoutMs: 30_000,\n heartbeatIntervalMs: 500,\n maxTurns: max_turns || undefined,\n maxThinkingTokens: queryOptions.maxThinkingTokens,\n model: queryOptions.model as string | undefined,\n forkNumber,\n messageLogName,\n verbose: queryOptions.verbose,\n safeMode: queryOptions.safeMode,\n safetyMode: queryOptions.safetyMode,\n permissionMode: effectivePermissionMode as any,\n readFileTimestamps,\n canUseTool: hasPermissionsToUseTool,\n askUser: () => Promise.resolve([]),\n setToolJSX: () => {},\n onMessage: message => {\n appendMessageToTranscript(agentId, message)\n overwriteLog(\n getMessagesPath(\n messageLogName,\n forkNumber,\n getSidechainNumber(),\n ),\n [...engine.messages].filter(_ => _.type !== 'progress'),\n )\n if (message.type === 'assistant') {\n for (const content of message.message.content) {\n if (content.type === 'tool_use') bgToolUseCount++\n }\n }\n },\n })\n\n // Register in global registry so REPL can switch focus to this agent\n const globalRegistry = getGlobalRegistry()\n globalRegistry.register(agentId, engine)\n\n // Connect agent abort controller \u2192 engine.stop()\n // When disbandTeam() aborts all agent controllers, this ensures the engine\n // stops cleanly and gets unregistered from the global registry.\n if (effectiveAbortController.signal.aborted) {\n engine.stop()\n } else {\n effectiveAbortController.signal.addEventListener(\n 'abort',\n () => engine.stop(),\n { once: true },\n )\n }\n\n // Subscribe to engine lifecycle events\n engine.on(event => {\n if (event.type === 'state_change' && event.to === 'stopped') {\n // Unregister from global registry\n globalRegistry.unregister(agentId)\n\n // SubagentStop hook (mirrors Path C)\n if (hookMgr) {\n hookMgr.executeSubagentStop(agentType, agentId).catch(err =>\n debugLogger.warn('SubagentStop hook failed (Path B)', {\n error: err,\n }),\n )\n }\n\n // Engine stopped \u2014 finalize transcript and notify team\n const engineMessages = engine.messages\n const lastMessage = engineMessages[engineMessages.length - 1]\n if (lastMessage?.type === 'assistant') {\n completeAgentTranscript(agentId)\n completeBackgroundAgent(\n agentId,\n lastMessage.message.content.filter(\n _ => _.type === 'text',\n ) as TextBlock[],\n )\n\n // onComplete hooks (mirrors Path C)\n if (loadedAgentConfig?.hooks?.onComplete?.length) {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n result: lastMessage.message.content\n .filter(_ => _.type === 'text')\n .map(_ => (_ as { type: 'text'; text: string }).text)\n .join('\\n'),\n })\n executeAgentHooks(\n 'onComplete',\n loadedAgentConfig,\n hookContext,\n ).catch(err =>\n debugLogger.warn(\n 'TASK_AGENT_ONCOMPLETE_HOOK_FAILED (Path B)',\n {\n agentId,\n agentType,\n error: err instanceof Error ? err.message : String(err),\n },\n ),\n )\n }\n\n // saveAgentMemory (mirrors Path C)\n if (loadedAgentConfig?.memory) {\n const finalResponse = lastMessage.message.content\n .filter(_ => _.type === 'text')\n .map(_ => (_ as { type: 'text'; text: string }).text)\n .join('\\n')\n if (finalResponse.trim()) {\n saveAgentMemory(\n agentType,\n loadedAgentConfig.memory,\n finalResponse,\n ).catch(err =>\n debugLogger.warn(\n 'TASK_AGENT_MEMORY_SAVE_FAILED (Path B)',\n {\n agentId,\n agentType,\n error:\n err instanceof Error ? err.message : String(err),\n },\n ),\n )\n }\n }\n } else {\n completeBackgroundAgent(agentId, [\n { type: 'text', text: 'Agent completed.' },\n ])\n }\n\n const idleSummary =\n lastMessage?.type === 'assistant'\n ? lastMessage.message.content\n .filter(_ => _.type === 'text')\n .map(_ => (_ as { type: 'text'; text: string }).text)\n .join('\\n')\n .slice(0, 2000) || undefined\n : undefined\n updateInProcessAgentState(agentId, {\n isIdle: true,\n lastReportedToolCount: bgToolUseCount,\n })\n markTeammateCompleted(\n team_name,\n agentId,\n teammateName || agentType,\n {\n summary: idleSummary,\n },\n ).catch(err => {\n debugLogger.error('TEAMMATE_MARK_COMPLETED_FAILED', {\n agentId,\n teamName: team_name,\n error: err instanceof Error ? err.message : String(err),\n })\n })\n }\n })\n\n await engine.start()\n await engine.submitPrompt(effectivePrompt)\n\n // If engine is still idle after submitPrompt (no idle timeout triggered stop),\n // it means the query completed normally but the engine is waiting.\n // For teammates, the idle timeout in AgentEngine handles the stop.\n // We wait for the engine to stop (idle_timeout \u2192 stopped).\n if (engine.isRunning) {\n await new Promise<void>(resolve => {\n engine.on(event => {\n if (event.type === 'state_change' && event.to === 'stopped') {\n resolve()\n }\n })\n })\n }\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error)\n failBackgroundAgent(agentId, errorMsg)\n failAgentTranscript(agentId, errorMsg)\n markTeammateIdle(team_name, agentId, teammateName || agentType, {\n status: 'failed',\n failureReason: errorMsg,\n }).catch(err => {\n debugLogger.error('TEAMMATE_MARK_IDLE_FAILED', {\n agentId,\n teamName: team_name,\n error: err instanceof Error ? err.message : String(err),\n })\n })\n\n // onError hooks (mirrors Path C)\n if (loadedAgentConfig?.hooks?.onError?.length) {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n error: error instanceof Error ? error : new Error(String(error)),\n })\n executeAgentHooks('onError', loadedAgentConfig, hookContext).catch(\n () => {},\n )\n }\n } finally {\n popAgentContext()\n cleanupAgentStreamingState(agentId)\n unregisterInProcessAgent(agentId)\n }\n })()\n\n const bgResultText = `Agent \"${teammateName || agentType}\" running in background`\n yield {\n type: 'result',\n data: [{ type: 'text', text: bgResultText }] as TextBlock[],\n resultForAssistant: `Teammate \"${teammateName || agentType}\" is running in the background. You will be notified automatically when they finish \u2014 do NOT check on them.`,\n }\n hasYieldedResult = true\n return\n }\n\n // Push agent context so streaming state is isolated for this subagent\n pushAgentContext(agentId)\n\n // Mutable ref to capture engine's messages after completion\n const messagesOut: { current: import('@query').Message[] } = {\n current: messages,\n }\n\n try {\n // Foreground mode: use AgentEngine via adapter (unified with Path B)\n const { runForegroundEngine } = await import(\n '../../engine/foregroundAdapter'\n )\n\n for await (const item of runForegroundEngine({\n agentId,\n teamName: team_name,\n teammateName,\n agentType,\n systemPrompt: team_name\n ? () => getSystemPrompt('teammate')\n : taskPrompt,\n context,\n tools: queryOptions.tools,\n initialMessages: [...messages],\n prompt: effectivePrompt,\n maxTurns: max_turns || undefined,\n maxThinkingTokens: queryOptions.maxThinkingTokens,\n model: queryOptions.model as string | undefined,\n forkNumber,\n messageLogName,\n sidechainNumber: getSidechainNumber(),\n verbose: queryOptions.verbose,\n safeMode: queryOptions.safeMode,\n safetyMode: queryOptions.safetyMode,\n permissionMode: effectivePermissionMode,\n readFileTimestamps,\n abortController: effectiveAbortController,\n messagesOut,\n })) {\n yield item\n if (item.type === 'progress' && item.content?.message?.content) {\n // Track tool use count from progress events\n for (const c of item.content.message.content) {\n if (c.type === 'tool_use') toolUseCount++\n }\n }\n }\n\n // Use the engine's messages for post-completion logic\n messages = messagesOut.current\n\n const normalizedMessages = normalizeMessages(messages)\n const lastMessage = last(messages)\n if (lastMessage?.type !== 'assistant') {\n throw new Error('Last message was not an assistant message')\n }\n\n // Calculate token usage for transcript\n const tokenUsage = {\n inputTokens: lastMessage.message.usage.input_tokens,\n outputTokens: lastMessage.message.usage.output_tokens,\n cacheReadTokens: lastMessage.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n lastMessage.message.usage.cache_creation_input_tokens,\n }\n\n // Check for interrupt\n const isInterrupted = lastMessage.message.content.some(\n _ => _.type === 'text' && _.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED', { agentId, toolUseCount })\n } else {\n // Mark transcript as completed\n completeAgentTranscript(agentId, tokenUsage)\n debugLogger.info('TASK_AGENT_COMPLETED', { agentId, toolUseCount })\n\n // Fire SubagentStop hook (fire-and-forget)\n if (hookMgr) {\n hookMgr\n .executeSubagentStop(agentType, agentId)\n .catch(err =>\n debugLogger.warn('SubagentStop hook failed', { error: err }),\n )\n }\n\n // Execute onComplete hooks if configured (Claude Code spec)\n if (loadedAgentConfig?.hooks?.onComplete?.length) {\n try {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n result: this.renderResultForAssistant(\n lastMessage.message.content.filter(_ => _.type === 'text'),\n ),\n })\n await executeAgentHooks(\n 'onComplete',\n loadedAgentConfig,\n hookContext,\n )\n } catch (hookError) {\n debugLogger.warn('TASK_AGENT_ONCOMPLETE_HOOK_FAILED', {\n agentId,\n agentType,\n error:\n hookError instanceof Error\n ? hookError.message\n : String(hookError),\n })\n }\n }\n\n // Save agent memory if configured (Claude Code spec)\n if (loadedAgentConfig?.memory) {\n try {\n // Save the agent's final response as memory\n const finalResponse = lastMessage.message.content\n .filter(_ => _.type === 'text')\n .map(_ => (_ as { type: 'text'; text: string }).text)\n .join('\\n')\n if (finalResponse.trim()) {\n await saveAgentMemory(\n agentType,\n loadedAgentConfig.memory,\n finalResponse,\n )\n }\n } catch (memoryError) {\n debugLogger.warn('TASK_AGENT_MEMORY_SAVE_FAILED', {\n agentId,\n agentType,\n error:\n memoryError instanceof Error\n ? memoryError.message\n : String(memoryError),\n })\n }\n }\n\n const result = [\n toolUseCount === 1 ? '1 tool use' : `${toolUseCount} tool uses`,\n formatNumber(\n (lastMessage.message.usage.cache_creation_input_tokens ?? 0) +\n (lastMessage.message.usage.cache_read_input_tokens ?? 0) +\n lastMessage.message.usage.input_tokens +\n lastMessage.message.usage.output_tokens,\n ) + ' tokens',\n formatDuration(Date.now() - startTime),\n ]\n yield {\n type: 'progress',\n content: createAssistantMessage(`Done (${result.join(' \u00B7 ')})`),\n normalizedMessages,\n tools,\n }\n }\n\n // Fire auto-idle notification when a teammate agent completes\n if (team_name) {\n // Update CC-compatible state: mark agent as idle and record final counts\n updateInProcessAgentState(agentId, {\n isIdle: true,\n lastReportedToolCount: toolUseCount,\n lastReportedTokenCount: lastMessage\n ? (lastMessage.message.usage.cache_creation_input_tokens ?? 0) +\n (lastMessage.message.usage.cache_read_input_tokens ?? 0) +\n lastMessage.message.usage.input_tokens +\n lastMessage.message.usage.output_tokens\n : 0,\n })\n\n // Build completedInfo from available task context\n const idleSummary = isInterrupted\n ? undefined\n : lastMessage.message.content\n .filter(_ => _.type === 'text')\n .map(_ => (_ as { type: 'text'; text: string }).text)\n .join('\\n')\n .slice(0, 2000) || undefined\n markTeammateIdle(team_name, agentId, teammateName || agentType, {\n status: isInterrupted ? 'failed' : 'completed',\n summary: idleSummary,\n ...(isInterrupted && { failureReason: 'interrupted' }),\n }).catch(err => debugLogger.trace('MARK_TEAMMATE_IDLE', { error: err }))\n\n // Clean up in-process state handle\n unregisterInProcessAgent(agentId)\n }\n\n // Output is an AssistantMessage, but since TaskTool is a tool, it needs\n // to serialize its response to UserMessage-compatible content.\n const data = lastMessage.message.content.filter(_ => _.type === 'text')\n\n // Always include agentId in result (CC alignment \u2014 issue #10864)\n // Model needs the real UUID for resume and TaskOutput lookups\n const resultWithAgentId = isInterrupted\n ? `[Interrupted - Agent ID: ${agentId}]\\n${this.renderResultForAssistant(data)}`\n : `${this.renderResultForAssistant(data)}\\n\\nAgent completed successfully.\\nagentId: ${agentId}`\n\n yield {\n type: 'result',\n data,\n resultForAssistant: resultWithAgentId,\n }\n hasYieldedResult = true\n } catch (error) {\n // \uD83D\uDD27 CRITICAL: On error, we MUST yield a result to clear UI state\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n\n // \uD83D\uDD27 FIX: Check if this is an AbortError (ESC interrupt)\n // AbortError indicates user interrupted, should mark as 'interrupted' not 'failed'\n const isAbortError =\n error instanceof Error &&\n (error.name === 'AbortError' ||\n error.message.includes('aborted') ||\n error.message.includes('abort'))\n\n if (isAbortError) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED_BY_ABORT', {\n agentId,\n toolUseCount,\n })\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] interrupted\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] interrupted by user\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n } else {\n // Convert to user-friendly error for better UX\n const friendlyError =\n error instanceof UserFriendlyError\n ? error\n : new UserFriendlyError(error, {\n operation: 'agent task',\n model: agentType,\n })\n const friendlyMessage = friendlyError.getUserMessage()\n\n logError(`TaskTool [${agentType}] error: ${errorMessage}`)\n\n // Mark transcript as failed with friendly message\n failAgentTranscript(agentId, friendlyMessage)\n debugLogger.error('TASK_AGENT_FAILED', {\n agentId,\n error: errorMessage,\n errorId: friendlyError.id,\n })\n\n // Execute onError hooks if configured (Claude Code spec)\n if (loadedAgentConfig?.hooks?.onError?.length) {\n try {\n const hookContext = createHookContext({\n sessionId: agentId,\n agentId,\n agentType,\n error: error instanceof Error ? error : new Error(String(error)),\n })\n await executeAgentHooks('onError', loadedAgentConfig, hookContext)\n } catch (hookError) {\n debugLogger.warn('TASK_AGENT_ONERROR_HOOK_FAILED', {\n agentId,\n agentType,\n error:\n hookError instanceof Error\n ? hookError.message\n : String(hookError),\n })\n }\n }\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `${friendlyMessage}\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] failed: ${errorMessage}\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n hasYieldedResult = true\n } finally {\n // Cleanup git worktree if created\n if (worktreePath) {\n let removeSuccess = false\n try {\n execFileSync('git', ['worktree', 'remove', worktreePath, '--force'], {\n cwd: getCwd(),\n stdio: 'pipe',\n })\n removeSuccess = true\n debugLogger.info('TASK_AGENT_WORKTREE_REMOVED', {\n agentId,\n worktreePath,\n })\n } catch {\n debugLogger.warn('TASK_AGENT_WORKTREE_CLEANUP_FAILED', {\n agentId,\n worktreePath,\n })\n }\n // Fire WorktreeRemove hook\n const hookMgrRemove = getHookManager()\n hookMgrRemove\n ?.executeWorktreeRemove(\n worktreePath,\n agentId,\n agentType,\n removeSuccess,\n )\n .catch(err =>\n debugLogger.trace('HOOK_WORKTREE_REMOVE', { error: err }),\n )\n }\n\n // Pop agent context and clean up streaming state\n popAgentContext()\n cleanupAgentStreamingState(agentId)\n\n // Unregister AbortController from team manager\n if (team_name) {\n try {\n const { unregisterAgentAbortController } = await import(\n '@services/agentTeams/teamManager'\n )\n unregisterAgentAbortController(team_name, agentId)\n } catch {\n // Non-fatal\n }\n }\n\n // Restore previous env vars to prevent pollution across concurrent agents\n if (restoreEnvVars) {\n restoreEnvVars()\n }\n\n // \uD83D\uDD27 SAFETY NET: Ensure we always yield a result even in unexpected scenarios\n if (!hasYieldedResult) {\n // Mark as interrupted if we haven't yielded a result\n interruptAgentTranscript(agentId)\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n }\n },\n\n isReadOnly() {\n return true // for now...\n },\n isConcurrencySafe() {\n return true // Task tool supports concurrent execution in official implementation\n },\n async validateInput(input, context) {\n if (!input.description || typeof input.description !== 'string') {\n return {\n result: false,\n message: 'Description is required and must be a string',\n }\n }\n if (!input.prompt || typeof input.prompt !== 'string') {\n return {\n result: false,\n message: 'Prompt is required and must be a string',\n }\n }\n\n // Model validation - similar to Edit tool error handling\n if (input.model_name) {\n const modelManager = getModelManager()\n const availableModels = modelManager.getAllAvailableModelNames()\n\n if (!availableModels.includes(input.model_name)) {\n return {\n result: false,\n message: `Model '${input.model_name}' does not exist. Available models: ${availableModels.join(', ')}`,\n meta: {\n model_name: input.model_name,\n availableModels,\n },\n }\n }\n }\n\n // Validate subagent_type if provided\n if (input.subagent_type) {\n const availableTypes = await getAvailableAgentTypes()\n if (!availableTypes.includes(input.subagent_type)) {\n return {\n result: false,\n message: `Agent type '${input.subagent_type}' does not exist. Available types: ${availableTypes.join(', ')}`,\n meta: {\n subagent_type: input.subagent_type,\n availableTypes,\n },\n }\n }\n }\n\n // Validate resume parameter if provided\n if (input.resume) {\n if (!canResumeTranscript(input.resume)) {\n return {\n result: false,\n message: `Cannot resume agent '${input.resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n meta: {\n resume: input.resume,\n },\n }\n }\n }\n\n return { result: true }\n },\n async isEnabled() {\n return true\n },\n userFacingName(input?: any) {\n // Return agent name with proper prefix\n const agentType = input?.subagent_type || 'general-purpose'\n return `agent-${agentType}`\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(data: TextBlock[]) {\n return data\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n },\n renderToolUseMessage(\n {\n description,\n prompt,\n model_name,\n subagent_type,\n team_name,\n name: teammateName,\n },\n { verbose },\n ) {\n if (!description || !prompt) return null\n\n const modelManager = getModelManager()\n const defaultTaskModel = modelManager.getModelName('task')\n const actualModel = model_name || defaultTaskModel\n const agentType = subagent_type || 'general-purpose'\n const promptPreview =\n prompt.length > 80 ? prompt.substring(0, 80) + '...' : prompt\n\n const theme = getTheme()\n\n // Team agent rendering: @name (agentType): description\n if (team_name) {\n const displayName = teammateName || agentType\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={theme.info}>@{displayName}</Text>{' '}\n <Text color={theme.secondaryText}>({agentType})</Text>:{' '}\n {description}\n </Text>\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText}>{promptPreview}</Text>\n </Box>\n </Box>\n )\n }\n return `@${displayName} (${agentType}): ${description}`\n }\n\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text>\n [{agentType}] {actualModel}: {description}\n </Text>\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText}>{promptPreview}</Text>\n </Box>\n </Box>\n )\n }\n\n // Simple display: agent type, model and description\n return `[${agentType}] ${actualModel}: ${description}`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content, options?: { verbose?: boolean }) {\n const theme = getTheme()\n const verbose = options?.verbose ?? false\n\n // Guard against undefined or null content\n if (!content) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n }\n\n if (Array.isArray(content)) {\n const textBlocks = content.filter(\n (block): block is { type: 'text'; text: string } =>\n block && block.type === 'text',\n )\n const totalLength = textBlocks.reduce(\n (sum, block) => sum + (block.text?.length || 0),\n 0,\n )\n // Use exact match for interrupt detection\n const isInterrupted = content.some(\n block =>\n block && block.type === 'text' && block.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.error}>Interrupted by user</Text>\n </Box>\n )\n }\n\n // Extract output content for display based on verbosity\n const outputText = textBlocks.map(b => b.text).join('\\n')\n\n // Determine how much content to show based on displayMode\n // minimal/compact (verbose=false): Just show \"Task completed (X characters)\"\n // detailed (verbose=true): Show preview of the actual output\n const getOutputPreview = () => {\n if (!verbose || !outputText) return null\n const maxLen = 500\n if (outputText.length <= maxLen) return outputText\n return outputText.substring(0, maxLen) + '...'\n }\n\n const outputPreview = getOutputPreview()\n\n return (\n <Box flexDirection=\"column\">\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n {textBlocks.length > 0 && verbose && (\n <Text color={theme.secondaryText}> ({totalLength} chars)</Text>\n )}\n </Box>\n </Box>\n {outputPreview && (\n <Box marginTop={1} paddingLeft={4}>\n <Text color={theme.mutedText}>{outputPreview}</Text>\n </Box>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n },\n} satisfies Tool\n"],
5
+ "mappings": "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",
6
+ "names": ["HEADLESS_TIMEOUT_MS", "exitCode"]
7
7
  }
@@ -1,5 +1,11 @@
1
- const TOOL_NAME = "Task";
1
+ const TOOL_NAME = "Agent";
2
+ const TOOL_NAME_LEGACY = "Task";
3
+ function isAgentToolName(name) {
4
+ return name === TOOL_NAME || name === TOOL_NAME_LEGACY;
5
+ }
2
6
  export {
3
- TOOL_NAME
7
+ TOOL_NAME,
8
+ TOOL_NAME_LEGACY,
9
+ isAgentToolName
4
10
  };
5
11
  //# sourceMappingURL=constants.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/TaskTool/constants.ts"],
4
- "sourcesContent": ["export const TOOL_NAME = 'Task'\n"],
5
- "mappings": "AAAO,MAAM,YAAY;",
4
+ "sourcesContent": ["export const TOOL_NAME = 'Agent'\nexport const TOOL_NAME_LEGACY = 'Task'\n\n/** Check if a name matches the Agent tool (handles legacy 'Task' name) */\nexport function isAgentToolName(name: string): boolean {\n return name === TOOL_NAME || name === TOOL_NAME_LEGACY\n}\n"],
5
+ "mappings": "AAAO,MAAM,YAAY;AAClB,MAAM,mBAAmB;AAGzB,SAAS,gBAAgB,MAAuB;AACrD,SAAO,SAAS,aAAa,SAAS;AACxC;",
6
6
  "names": []
7
7
  }