@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,13 +1,13 @@
1
1
  import { last, memoize } from "lodash-es";
2
2
  import { dirname } from "path";
3
+ import { execFileSync } from "child_process";
3
4
  import React from "react";
4
5
  import { Box, Text } from "ink";
5
6
  import { z } from "zod";
6
7
  import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
7
- import { getAgentPrompt } from "../../constants/prompts/index.js";
8
+ import { getAgentPrompt, getSystemPrompt } from "../../constants/prompts/index.js";
8
9
  import { getContext } from "../../context.js";
9
10
  import { hasPermissionsToUseTool } from "../../permissions.js";
10
- import { query } from "../../query.js";
11
11
  import { formatDuration, formatNumber } from "../../utils/format.js";
12
12
  import {
13
13
  getMessagesPath,
@@ -18,7 +18,6 @@ import {
18
18
  import {
19
19
  createAssistantMessage,
20
20
  createUserMessage,
21
- getLastAssistantMessageId,
22
21
  INTERRUPT_MESSAGE,
23
22
  normalizeMessages
24
23
  } from "../../utils/messages.js";
@@ -27,6 +26,7 @@ import { getMaxThinkingTokens } from "../../utils/thinking.js";
27
26
  import { getTheme } from "../../utils/theme.js";
28
27
  import { generateAgentId } from "../../utils/agentStorage.js";
29
28
  import { debug as debugLogger } from "../../utils/debugLogger.js";
29
+ import { getTools, getReadOnlyTools } from "../../tools.js";
30
30
  import { getTaskTools, getPrompt } from "./prompt.js";
31
31
  import { TOOL_NAME } from "./constants.js";
32
32
  import {
@@ -37,15 +37,18 @@ import {
37
37
  createAgentTranscript,
38
38
  getResumableTranscript,
39
39
  appendMessageToTranscript,
40
- updateAgentTranscript,
41
40
  completeAgentTranscript,
42
41
  failAgentTranscript,
43
42
  interruptAgentTranscript,
44
43
  canResumeTranscript,
45
44
  registerToolUseAgent
46
45
  } from "../../utils/agentTranscripts.js";
46
+ import {
47
+ registerBackgroundAgent,
48
+ completeBackgroundAgent,
49
+ failBackgroundAgent
50
+ } from "../../utils/backgroundAgentManager.js";
47
51
  import { UserFriendlyError } from "../../utils/userFriendlyError.js";
48
- import { execSync } from "child_process";
49
52
  import {
50
53
  pushAgentContext,
51
54
  popAgentContext,
@@ -65,6 +68,47 @@ import { getSkill, loadSkillContent } from "../../utils/skillLoader.js";
65
68
  import { getCwd } from "../../utils/state.js";
66
69
  import { getHookManager } from "../../utils/hookManager.js";
67
70
  import { substituteVariables } from "../../utils/stringSubstitution.js";
71
+ import {
72
+ getTeam,
73
+ addTeammate,
74
+ updateTeammateStatus,
75
+ sanitizeTeamName
76
+ } from "../../services/agentTeams/teamManager.js";
77
+ import {
78
+ markTeammateIdle,
79
+ markTeammateCompleted
80
+ } from "../../services/agentTeams/teammateSpawner.js";
81
+ import { resolveBackend } from "../../services/agentTeams/backends/resolver.js";
82
+ import {
83
+ registerInProcessAgent,
84
+ updateInProcessAgentState,
85
+ unregisterInProcessAgent
86
+ } from "../../services/agentTeams/backends/inProcess.js";
87
+ const DEFAULT_HEADLESS_TIMEOUT_MS = 10 * 60 * 1e3;
88
+ function scopeEnvVars(vars, options) {
89
+ if (options?.inProcess) {
90
+ return () => {
91
+ };
92
+ }
93
+ const saved = {};
94
+ for (const key of Object.keys(vars)) {
95
+ saved[key] = process.env[key];
96
+ if (vars[key] !== void 0) {
97
+ process.env[key] = vars[key];
98
+ } else {
99
+ delete process.env[key];
100
+ }
101
+ }
102
+ return () => {
103
+ for (const key of Object.keys(saved)) {
104
+ if (saved[key] !== void 0) {
105
+ process.env[key] = saved[key];
106
+ } else {
107
+ delete process.env[key];
108
+ }
109
+ }
110
+ };
111
+ }
68
112
  const inputSchema = z.object({
69
113
  description: z.string().describe("A short (3-5 word) description of the task"),
70
114
  prompt: z.string().describe("The task for the agent to perform"),
@@ -82,8 +126,19 @@ const inputSchema = z.object({
82
126
  ),
83
127
  max_turns: z.number().int().positive().optional().describe(
84
128
  "Maximum number of agentic turns (API round-trips) before stopping. Used internally for warmup."
129
+ ),
130
+ team_name: z.string().optional().describe(
131
+ "Optional team name. When provided, the subagent is spawned as a teammate with team context, discovery info, and team tools (SendMessage, TaskCreate, etc.)."
132
+ ),
133
+ name: z.string().optional().describe(
134
+ 'Optional human-readable name for this teammate (e.g., "researcher", "tester"). Used for team communication.'
135
+ ),
136
+ run_in_background: z.boolean().optional().describe(
137
+ "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."
138
+ ),
139
+ isolation: z.enum(["worktree"]).optional().describe(
140
+ 'Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo.'
85
141
  )
86
- // run_in_background parameter removed - concurrent execution is automatic
87
142
  });
88
143
  const TaskTool = {
89
144
  async prompt({ safeMode }) {
@@ -103,14 +158,28 @@ const TaskTool = {
103
158
  model,
104
159
  subagent_type,
105
160
  resume,
106
- max_turns
161
+ max_turns,
162
+ team_name,
163
+ name: teammateName,
164
+ run_in_background,
165
+ isolation
107
166
  }, {
108
167
  abortController,
109
- options: { safeMode = false, forkNumber, messageLogName, verbose },
168
+ options: {
169
+ safeMode = false,
170
+ safetyMode,
171
+ forkNumber,
172
+ messageLogName,
173
+ verbose
174
+ },
110
175
  readFileTimestamps,
111
176
  toolUseId
112
177
  }) {
113
178
  const startTime = Date.now();
179
+ const effectiveRunInBackground = team_name ? true : run_in_background;
180
+ if (team_name) {
181
+ team_name = sanitizeTeamName(team_name);
182
+ }
114
183
  const agentType = subagent_type || "general-purpose";
115
184
  let resumedTranscript = null;
116
185
  let agentId;
@@ -171,7 +240,9 @@ Use /agents command to manage agent configurations.`;
171
240
  }
172
241
  loadedAgentConfig = agentConfig;
173
242
  if (agentConfig.systemPrompt) {
174
- effectivePrompt = `${agentConfig.systemPrompt}
243
+ effectivePrompt = `<system-reminder>
244
+ ${agentConfig.systemPrompt}
245
+ </system-reminder>
175
246
 
176
247
  ${prompt}`;
177
248
  }
@@ -299,10 +370,11 @@ ${substitutedContent}
299
370
  }
300
371
  }
301
372
  let worktreePath = null;
302
- if (loadedAgentConfig?.isolation === "worktree") {
373
+ const shouldUseWorktree = isolation === "worktree" || loadedAgentConfig?.isolation === "worktree";
374
+ if (shouldUseWorktree) {
303
375
  try {
304
376
  const tmpDir = `/tmp/minto-worktree-${agentId}`;
305
- execSync(`git worktree add "${tmpDir}" HEAD`, {
377
+ execFileSync("git", ["worktree", "add", tmpDir, "HEAD"], {
306
378
  cwd: getCwd(),
307
379
  stdio: "pipe"
308
380
  });
@@ -314,6 +386,10 @@ ${effectivePrompt}`;
314
386
  agentId,
315
387
  worktreePath
316
388
  });
389
+ const hookMgrCreate = getHookManager();
390
+ hookMgrCreate?.executeWorktreeCreate(worktreePath, agentId, agentType).catch(
391
+ (err) => debugLogger.trace("HOOK_WORKTREE_CREATE", { error: err })
392
+ );
317
393
  } catch (err) {
318
394
  debugLogger.warn("TASK_AGENT_WORKTREE_FAILED", {
319
395
  agentId,
@@ -321,24 +397,376 @@ ${effectivePrompt}`;
321
397
  });
322
398
  }
323
399
  }
324
- const messages = resumedTranscript ? [...resumedTranscript.messages] : [createUserMessage(effectivePrompt)];
400
+ let restoreEnvVars = null;
401
+ if (team_name) {
402
+ const teammateAgentId = teammateName ? `${teammateName}@${team_name}` : `${agentType}@${team_name}`;
403
+ try {
404
+ const { getTeammateColor } = await import("../../constants/agentTeams.js");
405
+ const teamEntry = getTeam(team_name);
406
+ const colorIndex = teamEntry?.team.members.length ?? 0;
407
+ addTeammate(team_name, {
408
+ id: teammateAgentId,
409
+ name: teammateName || agentType,
410
+ agentType,
411
+ status: "working",
412
+ prompt,
413
+ color: getTeammateColor(colorIndex)
414
+ });
415
+ } catch {
416
+ }
417
+ if (worktreePath && team_name) {
418
+ try {
419
+ const { updateTeammateWorktree } = await import("../../services/agentTeams/teamManager.js");
420
+ updateTeammateWorktree(
421
+ team_name,
422
+ teammateName ? `${teammateName}@${team_name}` : `${agentType}@${team_name}`,
423
+ worktreePath
424
+ );
425
+ } catch {
426
+ }
427
+ }
428
+ const effectiveAgentName = teammateName || agentType;
429
+ let planModeValue;
430
+ try {
431
+ const teamEntry = getTeam(team_name);
432
+ const member = teamEntry?.team.members.find(
433
+ (m) => m.id === teammateAgentId
434
+ );
435
+ planModeValue = member?.planModeRequired ? "1" : void 0;
436
+ } catch {
437
+ }
438
+ const earlyBackend = resolveBackend(
439
+ getTeam(team_name)?.team.config.displayMode
440
+ );
441
+ const isInProcessBackend = earlyBackend.mode === "in-process";
442
+ const parentDepth = parseInt(
443
+ process.env.MINTO_AGENT_DEPTH ?? process.env.CLAUDE_AGENT_DEPTH ?? "0",
444
+ 10
445
+ ) || 0;
446
+ const childDepth = String(parentDepth + 1);
447
+ restoreEnvVars = scopeEnvVars(
448
+ {
449
+ MINTO_TEAM_NAME: team_name,
450
+ MINTO_AGENT_ID: teammateAgentId,
451
+ MINTO_AGENT_TYPE: agentType,
452
+ MINTO_AGENT_NAME: effectiveAgentName,
453
+ MINTO_PLAN_MODE_REQUIRED: planModeValue,
454
+ MINTO_AGENT_DEPTH: childDepth,
455
+ // CC compat: set CLAUDE_CODE_* so CC ecosystem tools can read them
456
+ CLAUDE_CODE_TEAM_NAME: team_name,
457
+ CLAUDE_CODE_AGENT_ID: teammateAgentId,
458
+ CLAUDE_CODE_AGENT_TYPE: agentType,
459
+ CLAUDE_CODE_AGENT_NAME: effectiveAgentName,
460
+ CLAUDE_CODE_PLAN_MODE_REQUIRED: planModeValue,
461
+ CLAUDE_AGENT_DEPTH: childDepth
462
+ },
463
+ { inProcess: isInProcessBackend }
464
+ );
465
+ let teamDiscovery = "";
466
+ try {
467
+ const { getTeam: getTeamFn } = await import("../../services/agentTeams/teamManager.js");
468
+ const entry = getTeamFn(team_name);
469
+ if (entry) {
470
+ const otherMembers = entry.team.members.filter((m) => m.id !== teammateAgentId && m.name !== teammateName).map((m) => ` - ${m.name} (${m.agentType}): ${m.status}`).join("\n");
471
+ if (otherMembers) {
472
+ teamDiscovery = `
473
+ Team members:
474
+ ${otherMembers}`;
475
+ }
476
+ }
477
+ } catch {
478
+ }
479
+ const teamContext = `
480
+ # Agent Teammate Communication
481
+
482
+ You are agent "${teammateName || agentType}" in team "${team_name}".
483
+
484
+ ## CRITICAL: Reporting Results
485
+
486
+ **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.
487
+
488
+ When you finish your task:
489
+ 1. Use SendMessage with type "message", recipient "team-lead", and your findings as content
490
+ 2. Include a brief summary in the summary field
491
+ 3. Do NOT just output text \u2014 it will be lost
492
+
493
+ ## Communication
494
+
495
+ - Use SendMessage with type \`message\` to send messages to specific teammates
496
+ - Use SendMessage with type \`broadcast\` sparingly for team-wide announcements
497
+ - Do NOT send acknowledgment messages ("Got it", "\u5DF2\u6536\u5230") \u2014 only send when you have actionable content
498
+ - ALWAYS respond in the same language as the user's original request
499
+
500
+ **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.
501
+
502
+ Team: ${team_name}
503
+ Your agent ID: ${teammateAgentId}
504
+ Your agent type: ${agentType}${teamDiscovery}
505
+ `;
506
+ effectivePrompt = `<system-reminder>
507
+ ${teamContext}
508
+ </system-reminder>
509
+
510
+ ` + effectivePrompt;
511
+ agentId = teammateAgentId;
512
+ if (toolUseId) {
513
+ registerToolUseAgent(toolUseId, agentId);
514
+ }
515
+ const backend = resolveBackend(
516
+ getTeam(team_name)?.team.config.displayMode
517
+ );
518
+ effectivePermissionMode = safeMode ? "plan" : "acceptEdits";
519
+ if (backend.mode !== "in-process") {
520
+ try {
521
+ const spawnTeamEntry = getTeam(team_name);
522
+ const spawnMember = spawnTeamEntry?.team.members.find(
523
+ (m) => m.id === teammateAgentId
524
+ );
525
+ const handle = await backend.spawn({
526
+ agentId: teammateAgentId,
527
+ agentName: teammateName || agentType,
528
+ teamName: team_name,
529
+ agentType,
530
+ prompt,
531
+ model: effectiveModel !== "task" ? effectiveModel : void 0,
532
+ cwd: process.cwd(),
533
+ maxTurns: max_turns,
534
+ mode: effectivePermissionMode,
535
+ planModeRequired: spawnMember?.planModeRequired,
536
+ color: spawnMember?.color,
537
+ parentSessionId: spawnTeamEntry?.team.leadSessionId
538
+ });
539
+ createAgentTranscript({
540
+ agentId: teammateAgentId,
541
+ agentType,
542
+ toolUseId,
543
+ description: description || teammateName || agentType,
544
+ prompt,
545
+ model: effectiveModel,
546
+ forkNumber,
547
+ messageLogName,
548
+ messages: [createUserMessage(effectivePrompt)],
549
+ toolUseCount: 0,
550
+ metadata: { isBackground: true }
551
+ });
552
+ yield {
553
+ type: "progress",
554
+ content: createAssistantMessage(
555
+ `Teammate "${teammateName || agentType}" spawned as independent process (headless mode, agent ID: ${teammateAgentId})`
556
+ )
557
+ };
558
+ if (effectiveRunInBackground) {
559
+ registerBackgroundAgent(
560
+ teammateAgentId,
561
+ agentType,
562
+ description,
563
+ abortController
564
+ );
565
+ (async () => {
566
+ const HEADLESS_TIMEOUT_MS2 = DEFAULT_HEADLESS_TIMEOUT_MS;
567
+ let exitCode2 = null;
568
+ await new Promise((resolve) => {
569
+ const timeoutId = setTimeout(() => {
570
+ debugLogger.warn("HEADLESS_AGENT_TIMEOUT", {
571
+ agentId: teammateAgentId,
572
+ timeoutMs: HEADLESS_TIMEOUT_MS2
573
+ });
574
+ backend.kill(handle).then(resolve, resolve);
575
+ }, HEADLESS_TIMEOUT_MS2);
576
+ backend.onExit(handle, (code) => {
577
+ exitCode2 = code;
578
+ clearTimeout(timeoutId);
579
+ resolve();
580
+ });
581
+ if (!backend.isAlive(handle)) {
582
+ clearTimeout(timeoutId);
583
+ resolve();
584
+ }
585
+ if (abortController.signal.aborted) {
586
+ clearTimeout(timeoutId);
587
+ backend.kill(handle).then(resolve, resolve);
588
+ } else {
589
+ abortController.signal.addEventListener(
590
+ "abort",
591
+ () => {
592
+ clearTimeout(timeoutId);
593
+ backend.kill(handle).then(resolve, resolve);
594
+ },
595
+ { once: true }
596
+ );
597
+ }
598
+ });
599
+ if (exitCode2 !== null && exitCode2 !== 0) {
600
+ updateTeammateStatus(team_name, teammateAgentId, "stopped");
601
+ failBackgroundAgent(teammateAgentId, `exit code ${exitCode2}`);
602
+ failAgentTranscript(teammateAgentId, `exit code ${exitCode2}`);
603
+ } else {
604
+ markTeammateCompleted(
605
+ team_name,
606
+ teammateAgentId,
607
+ teammateName || agentType,
608
+ {
609
+ summary: `Teammate "${teammateName || agentType}" completed.`
610
+ }
611
+ ).catch(
612
+ (err) => debugLogger.trace("MARK_TEAMMATE_COMPLETED", { error: err })
613
+ );
614
+ completeBackgroundAgent(teammateAgentId, [
615
+ {
616
+ type: "text",
617
+ text: `Teammate "${teammateName || agentType}" completed.`
618
+ }
619
+ ]);
620
+ completeAgentTranscript(teammateAgentId);
621
+ }
622
+ })();
623
+ const bgResultText = `Agent "${teammateName || agentType}" running in background`;
624
+ yield {
625
+ type: "result",
626
+ data: [{ type: "text", text: bgResultText }],
627
+ resultForAssistant: `Teammate "${teammateName || agentType}" is running in the background. You will be notified automatically when they finish \u2014 do NOT check on them.`
628
+ };
629
+ hasYieldedResult = true;
630
+ return;
631
+ }
632
+ const HEADLESS_TIMEOUT_MS = DEFAULT_HEADLESS_TIMEOUT_MS;
633
+ let exitCode = null;
634
+ await new Promise((resolve) => {
635
+ const timeoutId = setTimeout(() => {
636
+ debugLogger.warn("HEADLESS_AGENT_TIMEOUT", {
637
+ agentId: teammateAgentId,
638
+ timeoutMs: HEADLESS_TIMEOUT_MS
639
+ });
640
+ backend.kill(handle).then(resolve, resolve);
641
+ }, HEADLESS_TIMEOUT_MS);
642
+ backend.onExit(handle, (code) => {
643
+ exitCode = code;
644
+ clearTimeout(timeoutId);
645
+ resolve();
646
+ });
647
+ if (!backend.isAlive(handle)) {
648
+ clearTimeout(timeoutId);
649
+ resolve();
650
+ }
651
+ if (abortController.signal.aborted) {
652
+ clearTimeout(timeoutId);
653
+ backend.kill(handle).then(resolve, resolve);
654
+ } else {
655
+ abortController.signal.addEventListener(
656
+ "abort",
657
+ () => {
658
+ clearTimeout(timeoutId);
659
+ backend.kill(handle).then(resolve, resolve);
660
+ },
661
+ { once: true }
662
+ );
663
+ }
664
+ });
665
+ markTeammateCompleted(
666
+ team_name,
667
+ teammateAgentId,
668
+ teammateName || agentType,
669
+ {
670
+ summary: `Teammate "${teammateName || agentType}" completed.`
671
+ }
672
+ ).catch(
673
+ (err) => debugLogger.trace("MARK_TEAMMATE_COMPLETED", { error: err })
674
+ );
675
+ const teamEntry = getTeam(team_name);
676
+ const leadId = `team-lead@${team_name}`;
677
+ let agentResultText = `Teammate "${teammateName || agentType}" completed.`;
678
+ if (exitCode !== null && exitCode !== 0) {
679
+ agentResultText = `Teammate "${teammateName || agentType}" failed (exit code ${exitCode}). The agent process encountered an error during startup or execution.`;
680
+ failAgentTranscript(teammateAgentId, agentResultText);
681
+ } else {
682
+ completeAgentTranscript(teammateAgentId);
683
+ }
684
+ if (teamEntry) {
685
+ const unread = teamEntry.mailbox.getUnread(leadId);
686
+ const fromAgent = unread.filter((m) => m.from === teammateAgentId);
687
+ if (fromAgent.length > 0) {
688
+ const {
689
+ parseIdleNotification,
690
+ formatIdleNotificationForInjection,
691
+ formatTeamMessage
692
+ } = require("../../services/agentTeams/messageFormatter");
693
+ agentResultText = fromAgent.map((m) => {
694
+ const idleData = parseIdleNotification(m.text);
695
+ if (idleData) {
696
+ return formatIdleNotificationForInjection(idleData);
697
+ }
698
+ return formatTeamMessage(m);
699
+ }).join("\n\n");
700
+ teamEntry.mailbox.markRead(fromAgent.map((m) => m.id));
701
+ }
702
+ }
703
+ yield {
704
+ type: "result",
705
+ data: [
706
+ {
707
+ type: "text",
708
+ text: agentResultText
709
+ }
710
+ ],
711
+ resultForAssistant: agentResultText
712
+ };
713
+ hasYieldedResult = true;
714
+ return;
715
+ } catch (spawnError) {
716
+ debugLogger.warn("HEADLESS_SPAWN_FAILED", {
717
+ agentId: teammateAgentId,
718
+ error: spawnError instanceof Error ? spawnError.message : String(spawnError)
719
+ });
720
+ }
721
+ }
722
+ }
723
+ if (team_name) {
724
+ registerInProcessAgent(agentId, effectivePermissionMode);
725
+ }
726
+ let messages = resumedTranscript ? [...resumedTranscript.messages] : [];
325
727
  let tools = await getTaskTools(safeMode);
326
728
  let allowedSubagentTypes = null;
327
729
  if (toolFilter) {
328
730
  const isAllArray = Array.isArray(toolFilter) && toolFilter.length === 1 && toolFilter[0] === "*";
329
731
  if (toolFilter === "*" || isAllArray) {
330
732
  } else if (Array.isArray(toolFilter)) {
331
- const taskPatterns = toolFilter.filter((t) => t.startsWith("Task(") && t.endsWith(")")).map((t) => t.slice(5, -1));
733
+ const taskPatterns = toolFilter.filter(
734
+ (t) => (t.startsWith("Agent(") || t.startsWith("Task(")) && t.endsWith(")")
735
+ ).map(
736
+ (t) => t.startsWith("Agent(") ? t.slice(6, -1) : t.slice(5, -1)
737
+ );
332
738
  if (taskPatterns.length > 0) {
333
739
  allowedSubagentTypes = taskPatterns;
334
740
  }
335
- const baseToolNames = toolFilter.map((t) => t.startsWith("Task(") ? "Task" : t).filter((t, i, arr) => arr.indexOf(t) === i);
741
+ const baseToolNames = toolFilter.map(
742
+ (t) => t.startsWith("Agent(") || t.startsWith("Task(") ? TOOL_NAME : t
743
+ ).filter((t, i, arr) => arr.indexOf(t) === i);
336
744
  tools = tools.filter((tool) => baseToolNames.includes(tool.name));
337
745
  }
338
746
  }
339
747
  if (disallowedToolFilter?.length) {
340
748
  tools = tools.filter((tool) => !disallowedToolFilter.includes(tool.name));
341
749
  }
750
+ if (team_name) {
751
+ const currentDepth = parseInt(
752
+ process.env.MINTO_AGENT_DEPTH ?? process.env.CLAUDE_AGENT_DEPTH ?? "0",
753
+ 10
754
+ ) || 0;
755
+ const teamToolNames = /* @__PURE__ */ new Set([
756
+ "SendMessage",
757
+ ...currentDepth < 2 ? [TOOL_NAME] : [],
758
+ "TaskCreate",
759
+ "TaskUpdate",
760
+ "TaskList",
761
+ "TaskGet"
762
+ ]);
763
+ const fullTools = await (!safeMode ? getTools() : getReadOnlyTools());
764
+ for (const tool of fullTools) {
765
+ if (teamToolNames.has(tool.name) && !tools.some((t) => t.name === tool.name)) {
766
+ tools.push(tool);
767
+ }
768
+ }
769
+ }
342
770
  if (effectivePermissionMode !== "default") {
343
771
  const modeConfig = MODE_CONFIGS[effectivePermissionMode];
344
772
  if (modeConfig && modeConfig.allowedTools[0] !== "*") {
@@ -394,7 +822,7 @@ ${effectivePrompt}`;
394
822
  tools
395
823
  };
396
824
  const [taskPrompt, context, maxThinkingTokens] = await Promise.all([
397
- getAgentPrompt(),
825
+ team_name ? getSystemPrompt("teammate") : getAgentPrompt(),
398
826
  getContext(),
399
827
  getMaxThinkingTokens(messages)
400
828
  ]);
@@ -424,7 +852,8 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
424
852
  forkNumber,
425
853
  messageLogName,
426
854
  messages: [...messages],
427
- toolUseCount: 0
855
+ toolUseCount: 0,
856
+ ...effectiveRunInBackground && team_name ? { metadata: { isBackground: true } } : {}
428
857
  });
429
858
  } else {
430
859
  appendMessageToTranscript(
@@ -435,106 +864,281 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
435
864
  const effectiveMaxThinkingTokens = agentMaxThinkingTokens ?? maxThinkingTokens;
436
865
  const queryOptions = {
437
866
  safeMode,
867
+ safetyMode,
438
868
  forkNumber,
439
869
  messageLogName,
440
870
  tools,
441
871
  commands: [],
442
872
  verbose,
443
873
  maxThinkingTokens: effectiveMaxThinkingTokens,
444
- model: modelToUse
874
+ model: modelToUse,
875
+ ...effectivePermissionMode ? { permissionMode: effectivePermissionMode } : {}
445
876
  };
446
877
  if (temperature !== void 0) {
447
878
  queryOptions["temperature"] = temperature;
448
879
  }
449
- pushAgentContext(agentId);
450
- let turnCount = 0;
451
- try {
452
- for await (const message of query(
453
- messages,
454
- taskPrompt,
455
- context,
456
- hasPermissionsToUseTool,
457
- {
458
- abortController,
459
- options: queryOptions,
460
- messageId: getLastAssistantMessageId(messages),
461
- agentId,
462
- readFileTimestamps,
463
- setToolJSX: () => {
464
- }
465
- // No-op implementation for TaskTool
466
- }
467
- )) {
468
- messages.push(message);
469
- appendMessageToTranscript(agentId, message);
470
- overwriteLog(
471
- getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),
472
- messages.filter((_) => _.type !== "progress")
880
+ let effectiveAbortController = abortController;
881
+ if (team_name) {
882
+ const agentAC = new AbortController();
883
+ if (abortController.signal.aborted) {
884
+ agentAC.abort();
885
+ } else {
886
+ abortController.signal.addEventListener(
887
+ "abort",
888
+ () => agentAC.abort(),
889
+ { once: true }
473
890
  );
474
- if (message.type !== "assistant") {
475
- continue;
476
- }
477
- turnCount++;
478
- if (max_turns && turnCount >= max_turns) {
479
- debugLogger.info("TASK_AGENT_MAX_TURNS_REACHED", {
891
+ }
892
+ effectiveAbortController = agentAC;
893
+ try {
894
+ const { registerAgentAbortController } = await import("../../services/agentTeams/teamManager.js");
895
+ registerAgentAbortController(team_name, agentId, agentAC);
896
+ } catch {
897
+ }
898
+ }
899
+ if (effectiveRunInBackground && team_name) {
900
+ registerBackgroundAgent(
901
+ agentId,
902
+ agentType,
903
+ description,
904
+ effectiveAbortController
905
+ );
906
+ (async () => {
907
+ pushAgentContext(agentId);
908
+ let bgToolUseCount = 0;
909
+ try {
910
+ const { AgentEngine } = await import("../../engine/AgentEngine.js");
911
+ const { getGlobalRegistry } = await import("../../engine/EngineRegistry.js");
912
+ const engine = new AgentEngine({
480
913
  agentId,
481
- turnCount,
482
- max_turns
483
- });
484
- break;
485
- }
486
- if (message.message.usage) {
487
- updateAgentTranscript(agentId, {
488
- tokenUsage: {
489
- inputTokens: message.message.usage.input_tokens,
490
- outputTokens: message.message.usage.output_tokens,
491
- cacheReadTokens: message.message.usage.cache_read_input_tokens,
492
- cacheCreationTokens: message.message.usage.cache_creation_input_tokens
914
+ name: teammateName || agentType,
915
+ role: "teammate",
916
+ teamName: team_name,
917
+ systemPrompt: team_name ? () => getSystemPrompt("teammate") : taskPrompt,
918
+ context,
919
+ tools: queryOptions.tools,
920
+ initialMessages: [...messages],
921
+ idleTimeoutMs: 3e4,
922
+ heartbeatIntervalMs: 500,
923
+ maxTurns: max_turns || void 0,
924
+ maxThinkingTokens: queryOptions.maxThinkingTokens,
925
+ model: queryOptions.model,
926
+ forkNumber,
927
+ messageLogName,
928
+ verbose: queryOptions.verbose,
929
+ safeMode: queryOptions.safeMode,
930
+ safetyMode: queryOptions.safetyMode,
931
+ permissionMode: effectivePermissionMode,
932
+ readFileTimestamps,
933
+ canUseTool: hasPermissionsToUseTool,
934
+ askUser: () => Promise.resolve([]),
935
+ setToolJSX: () => {
936
+ },
937
+ onMessage: (message) => {
938
+ appendMessageToTranscript(agentId, message);
939
+ overwriteLog(
940
+ getMessagesPath(
941
+ messageLogName,
942
+ forkNumber,
943
+ getSidechainNumber()
944
+ ),
945
+ [...engine.messages].filter((_) => _.type !== "progress")
946
+ );
947
+ if (message.type === "assistant") {
948
+ for (const content of message.message.content) {
949
+ if (content.type === "tool_use") bgToolUseCount++;
950
+ }
951
+ }
493
952
  }
494
953
  });
495
- }
496
- const normalizedMessages2 = normalizeMessages(messages);
497
- for (const content of message.message.content) {
498
- if (content.type === "text" && content.text && content.text !== INTERRUPT_MESSAGE) {
499
- const preview = content.text.length > 200 ? content.text.substring(0, 200) + "..." : content.text;
500
- yield {
501
- type: "progress",
502
- content: createAssistantMessage(`${preview}`),
503
- normalizedMessages: normalizedMessages2,
504
- tools
505
- };
506
- } else if (content.type === "tool_use") {
507
- toolUseCount++;
508
- const toolMessage = normalizedMessages2.find(
509
- (_) => _.type === "assistant" && _.message.content[0]?.type === "tool_use" && _.message.content[0].id === content.id
954
+ const globalRegistry = getGlobalRegistry();
955
+ globalRegistry.register(agentId, engine);
956
+ if (effectiveAbortController.signal.aborted) {
957
+ engine.stop();
958
+ } else {
959
+ effectiveAbortController.signal.addEventListener(
960
+ "abort",
961
+ () => engine.stop(),
962
+ { once: true }
510
963
  );
511
- if (toolMessage) {
512
- const modifiedMessage = {
513
- ...toolMessage,
514
- message: {
515
- ...toolMessage.message,
516
- content: toolMessage.message.content.map((c) => {
517
- if (c.type === "tool_use" && c.id === content.id) {
518
- return {
519
- ...c,
520
- name: c.name
521
- // Keep original name, UI will handle display
522
- };
523
- }
524
- return c;
964
+ }
965
+ engine.on((event) => {
966
+ if (event.type === "state_change" && event.to === "stopped") {
967
+ globalRegistry.unregister(agentId);
968
+ if (hookMgr) {
969
+ hookMgr.executeSubagentStop(agentType, agentId).catch(
970
+ (err) => debugLogger.warn("SubagentStop hook failed (Path B)", {
971
+ error: err
525
972
  })
973
+ );
974
+ }
975
+ const engineMessages = engine.messages;
976
+ const lastMessage = engineMessages[engineMessages.length - 1];
977
+ if (lastMessage?.type === "assistant") {
978
+ completeAgentTranscript(agentId);
979
+ completeBackgroundAgent(
980
+ agentId,
981
+ lastMessage.message.content.filter(
982
+ (_) => _.type === "text"
983
+ )
984
+ );
985
+ if (loadedAgentConfig?.hooks?.onComplete?.length) {
986
+ const hookContext = createHookContext({
987
+ sessionId: agentId,
988
+ agentId,
989
+ agentType,
990
+ result: lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n")
991
+ });
992
+ executeAgentHooks(
993
+ "onComplete",
994
+ loadedAgentConfig,
995
+ hookContext
996
+ ).catch(
997
+ (err) => debugLogger.warn(
998
+ "TASK_AGENT_ONCOMPLETE_HOOK_FAILED (Path B)",
999
+ {
1000
+ agentId,
1001
+ agentType,
1002
+ error: err instanceof Error ? err.message : String(err)
1003
+ }
1004
+ )
1005
+ );
1006
+ }
1007
+ if (loadedAgentConfig?.memory) {
1008
+ const finalResponse = lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n");
1009
+ if (finalResponse.trim()) {
1010
+ saveAgentMemory(
1011
+ agentType,
1012
+ loadedAgentConfig.memory,
1013
+ finalResponse
1014
+ ).catch(
1015
+ (err) => debugLogger.warn(
1016
+ "TASK_AGENT_MEMORY_SAVE_FAILED (Path B)",
1017
+ {
1018
+ agentId,
1019
+ agentType,
1020
+ error: err instanceof Error ? err.message : String(err)
1021
+ }
1022
+ )
1023
+ );
1024
+ }
526
1025
  }
527
- };
528
- yield {
529
- type: "progress",
530
- content: modifiedMessage,
531
- normalizedMessages: normalizedMessages2,
532
- tools
533
- };
1026
+ } else {
1027
+ completeBackgroundAgent(agentId, [
1028
+ { type: "text", text: "Agent completed." }
1029
+ ]);
1030
+ }
1031
+ const idleSummary = lastMessage?.type === "assistant" ? lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n").slice(0, 2e3) || void 0 : void 0;
1032
+ updateInProcessAgentState(agentId, {
1033
+ isIdle: true,
1034
+ lastReportedToolCount: bgToolUseCount
1035
+ });
1036
+ markTeammateCompleted(
1037
+ team_name,
1038
+ agentId,
1039
+ teammateName || agentType,
1040
+ {
1041
+ summary: idleSummary
1042
+ }
1043
+ ).catch((err) => {
1044
+ debugLogger.error("TEAMMATE_MARK_COMPLETED_FAILED", {
1045
+ agentId,
1046
+ teamName: team_name,
1047
+ error: err instanceof Error ? err.message : String(err)
1048
+ });
1049
+ });
534
1050
  }
1051
+ });
1052
+ await engine.start();
1053
+ await engine.submitPrompt(effectivePrompt);
1054
+ if (engine.isRunning) {
1055
+ await new Promise((resolve) => {
1056
+ engine.on((event) => {
1057
+ if (event.type === "state_change" && event.to === "stopped") {
1058
+ resolve();
1059
+ }
1060
+ });
1061
+ });
1062
+ }
1063
+ } catch (error) {
1064
+ const errorMsg = error instanceof Error ? error.message : String(error);
1065
+ failBackgroundAgent(agentId, errorMsg);
1066
+ failAgentTranscript(agentId, errorMsg);
1067
+ markTeammateIdle(team_name, agentId, teammateName || agentType, {
1068
+ status: "failed",
1069
+ failureReason: errorMsg
1070
+ }).catch((err) => {
1071
+ debugLogger.error("TEAMMATE_MARK_IDLE_FAILED", {
1072
+ agentId,
1073
+ teamName: team_name,
1074
+ error: err instanceof Error ? err.message : String(err)
1075
+ });
1076
+ });
1077
+ if (loadedAgentConfig?.hooks?.onError?.length) {
1078
+ const hookContext = createHookContext({
1079
+ sessionId: agentId,
1080
+ agentId,
1081
+ agentType,
1082
+ error: error instanceof Error ? error : new Error(String(error))
1083
+ });
1084
+ executeAgentHooks("onError", loadedAgentConfig, hookContext).catch(
1085
+ () => {
1086
+ }
1087
+ );
1088
+ }
1089
+ } finally {
1090
+ popAgentContext();
1091
+ cleanupAgentStreamingState(agentId);
1092
+ unregisterInProcessAgent(agentId);
1093
+ }
1094
+ })();
1095
+ const bgResultText = `Agent "${teammateName || agentType}" running in background`;
1096
+ yield {
1097
+ type: "result",
1098
+ data: [{ type: "text", text: bgResultText }],
1099
+ resultForAssistant: `Teammate "${teammateName || agentType}" is running in the background. You will be notified automatically when they finish \u2014 do NOT check on them.`
1100
+ };
1101
+ hasYieldedResult = true;
1102
+ return;
1103
+ }
1104
+ pushAgentContext(agentId);
1105
+ const messagesOut = {
1106
+ current: messages
1107
+ };
1108
+ try {
1109
+ const { runForegroundEngine } = await import("../../engine/foregroundAdapter.js");
1110
+ for await (const item of runForegroundEngine({
1111
+ agentId,
1112
+ teamName: team_name,
1113
+ teammateName,
1114
+ agentType,
1115
+ systemPrompt: team_name ? () => getSystemPrompt("teammate") : taskPrompt,
1116
+ context,
1117
+ tools: queryOptions.tools,
1118
+ initialMessages: [...messages],
1119
+ prompt: effectivePrompt,
1120
+ maxTurns: max_turns || void 0,
1121
+ maxThinkingTokens: queryOptions.maxThinkingTokens,
1122
+ model: queryOptions.model,
1123
+ forkNumber,
1124
+ messageLogName,
1125
+ sidechainNumber: getSidechainNumber(),
1126
+ verbose: queryOptions.verbose,
1127
+ safeMode: queryOptions.safeMode,
1128
+ safetyMode: queryOptions.safetyMode,
1129
+ permissionMode: effectivePermissionMode,
1130
+ readFileTimestamps,
1131
+ abortController: effectiveAbortController,
1132
+ messagesOut
1133
+ })) {
1134
+ yield item;
1135
+ if (item.type === "progress" && item.content?.message?.content) {
1136
+ for (const c of item.content.message.content) {
1137
+ if (c.type === "tool_use") toolUseCount++;
535
1138
  }
536
1139
  }
537
1140
  }
1141
+ messages = messagesOut.current;
538
1142
  const normalizedMessages = normalizeMessages(messages);
539
1143
  const lastMessage = last(messages);
540
1144
  if (lastMessage?.type !== "assistant") {
@@ -615,9 +1219,26 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
615
1219
  tools
616
1220
  };
617
1221
  }
1222
+ if (team_name) {
1223
+ updateInProcessAgentState(agentId, {
1224
+ isIdle: true,
1225
+ lastReportedToolCount: toolUseCount,
1226
+ lastReportedTokenCount: lastMessage ? (lastMessage.message.usage.cache_creation_input_tokens ?? 0) + (lastMessage.message.usage.cache_read_input_tokens ?? 0) + lastMessage.message.usage.input_tokens + lastMessage.message.usage.output_tokens : 0
1227
+ });
1228
+ const idleSummary = isInterrupted ? void 0 : lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n").slice(0, 2e3) || void 0;
1229
+ markTeammateIdle(team_name, agentId, teammateName || agentType, {
1230
+ status: isInterrupted ? "failed" : "completed",
1231
+ summary: idleSummary,
1232
+ ...isInterrupted && { failureReason: "interrupted" }
1233
+ }).catch((err) => debugLogger.trace("MARK_TEAMMATE_IDLE", { error: err }));
1234
+ unregisterInProcessAgent(agentId);
1235
+ }
618
1236
  const data = lastMessage.message.content.filter((_) => _.type === "text");
619
1237
  const resultWithAgentId = isInterrupted ? `[Interrupted - Agent ID: ${agentId}]
620
- ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
1238
+ ${this.renderResultForAssistant(data)}` : `${this.renderResultForAssistant(data)}
1239
+
1240
+ Agent completed successfully.
1241
+ agentId: ${agentId}`;
621
1242
  yield {
622
1243
  type: "result",
623
1244
  data,
@@ -691,11 +1312,13 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
691
1312
  hasYieldedResult = true;
692
1313
  } finally {
693
1314
  if (worktreePath) {
1315
+ let removeSuccess = false;
694
1316
  try {
695
- execSync(`git worktree remove "${worktreePath}" --force`, {
1317
+ execFileSync("git", ["worktree", "remove", worktreePath, "--force"], {
696
1318
  cwd: getCwd(),
697
1319
  stdio: "pipe"
698
1320
  });
1321
+ removeSuccess = true;
699
1322
  debugLogger.info("TASK_AGENT_WORKTREE_REMOVED", {
700
1323
  agentId,
701
1324
  worktreePath
@@ -706,9 +1329,28 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
706
1329
  worktreePath
707
1330
  });
708
1331
  }
1332
+ const hookMgrRemove = getHookManager();
1333
+ hookMgrRemove?.executeWorktreeRemove(
1334
+ worktreePath,
1335
+ agentId,
1336
+ agentType,
1337
+ removeSuccess
1338
+ ).catch(
1339
+ (err) => debugLogger.trace("HOOK_WORKTREE_REMOVE", { error: err })
1340
+ );
709
1341
  }
710
1342
  popAgentContext();
711
1343
  cleanupAgentStreamingState(agentId);
1344
+ if (team_name) {
1345
+ try {
1346
+ const { unregisterAgentAbortController } = await import("../../services/agentTeams/teamManager.js");
1347
+ unregisterAgentAbortController(team_name, agentId);
1348
+ } catch {
1349
+ }
1350
+ }
1351
+ if (restoreEnvVars) {
1352
+ restoreEnvVars();
1353
+ }
712
1354
  if (!hasYieldedResult) {
713
1355
  interruptAgentTranscript(agentId);
714
1356
  yield {
@@ -798,7 +1440,14 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
798
1440
  renderResultForAssistant(data) {
799
1441
  return data.map((block) => block.type === "text" ? block.text : "").join("\n");
800
1442
  },
801
- renderToolUseMessage({ description, prompt, model_name, subagent_type }, { verbose }) {
1443
+ renderToolUseMessage({
1444
+ description,
1445
+ prompt,
1446
+ model_name,
1447
+ subagent_type,
1448
+ team_name,
1449
+ name: teammateName
1450
+ }, { verbose }) {
802
1451
  if (!description || !prompt) return null;
803
1452
  const modelManager = getModelManager();
804
1453
  const defaultTaskModel = modelManager.getModelName("task");
@@ -806,6 +1455,21 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
806
1455
  const agentType = subagent_type || "general-purpose";
807
1456
  const promptPreview = prompt.length > 80 ? prompt.substring(0, 80) + "..." : prompt;
808
1457
  const theme = getTheme();
1458
+ if (team_name) {
1459
+ const displayName = teammateName || agentType;
1460
+ if (verbose) {
1461
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "@", displayName), " ", /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "(", agentType, ")"), ":", " ", description), /* @__PURE__ */ React.createElement(
1462
+ Box,
1463
+ {
1464
+ paddingLeft: 2,
1465
+ borderLeftStyle: "single",
1466
+ borderLeftColor: theme.secondaryBorder
1467
+ },
1468
+ /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, promptPreview)
1469
+ ));
1470
+ }
1471
+ return `@${displayName} (${agentType}): ${description}`;
1472
+ }
809
1473
  if (verbose) {
810
1474
  return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "[", agentType, "] ", actualModel, ": ", description), /* @__PURE__ */ React.createElement(
811
1475
  Box,