@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/services/agentTeams/teammateSpawner.ts"],
4
- "sourcesContent": ["/**\n * Teammate Spawner\n *\n * Spawns teammate instances for agent teams.\n * Supports in-process (TaskTool delegation) and tmux (subprocess) modes.\n *\n * Experimental: Enable with MINTO_EXPERIMENTAL_AGENT_TEAMS=1\n */\n\nimport { addTeammate, updateTeammateStatus, getTeam } from './teamManager'\nimport type { Teammate, TeammateStatus } from '../../types/agentTeams'\nimport { getHookManager } from '../../utils/hookManager'\n\nlet teammateCounter = 0\n\n/**\n * Generate a unique teammate ID\n */\nfunction generateTeammateId(): string {\n return `teammate-${Date.now()}-${++teammateCounter}`\n}\n\n/**\n * Teammate colors for UI differentiation\n */\nconst TEAMMATE_COLORS = [\n 'cyan',\n 'magenta',\n 'yellow',\n 'green',\n 'blue',\n 'red',\n 'white',\n]\n\nfunction getTeammateColor(index: number): string {\n return TEAMMATE_COLORS[index % TEAMMATE_COLORS.length]!\n}\n\n/**\n * Spawn a teammate in the given team\n *\n * In-process mode: Creates a teammate record and returns it.\n * The caller is responsible for running the actual agent work\n * (typically via TaskTool delegation).\n *\n * tmux mode: Creates a new tmux pane with a separate CLI process.\n */\nexport async function spawnTeammate(\n teamName: string,\n agentType: string,\n prompt: string,\n options?: {\n name?: string\n mode?: 'in-process' | 'tmux'\n },\n): Promise<Teammate | null> {\n const entry = getTeam(teamName)\n if (!entry) return null\n\n const { team } = entry\n const mode = options?.mode || 'in-process'\n const teammateId = generateTeammateId()\n const teammateName =\n options?.name || `${agentType}-${team.members.length + 1}`\n\n const teammate = addTeammate(teamName, {\n id: teammateId,\n name: teammateName,\n agentType,\n status: 'idle' as TeammateStatus,\n prompt,\n color: getTeammateColor(team.members.length),\n })\n\n if (mode === 'tmux') {\n await spawnTmuxTeammate(teamName, teammate)\n }\n\n return teammate\n}\n\n/**\n * Spawn a teammate in a tmux pane\n */\nasync function spawnTmuxTeammate(\n teamName: string,\n teammate: Teammate,\n): Promise<void> {\n try {\n const { execSync } = await import('child_process')\n const cmd = `minto --resume --prompt \"${teammate.prompt.replace(/\"/g, '\\\\\"')}\" --agent-type \"${teammate.agentType}\"`\n\n // Create new tmux pane\n execSync(`tmux split-window -h -t \"${teamName}\" \"${cmd}\"`, {\n stdio: 'pipe',\n })\n\n updateTeammateStatus(teamName, teammate.id, 'working')\n } catch {\n // tmux not available or command failed\n updateTeammateStatus(teamName, teammate.id, 'stopped')\n }\n}\n\n/**\n * Mark a teammate as idle and fire TeammateIdle hook\n */\nexport async function markTeammateIdle(\n teamName: string,\n teammateId: string,\n teammateName: string,\n): Promise<void> {\n updateTeammateStatus(teamName, teammateId, 'idle')\n\n // Fire TeammateIdle hook\n const hookMgr = getHookManager()\n if (hookMgr) {\n hookMgr.executeTeammateIdle(teammateName, teamName).catch(() => {\n // Hook errors don't break teammate lifecycle\n })\n }\n}\n\n/**\n * Get team summary for display\n */\nexport function getTeamSummary(teamName: string): string | null {\n const entry = getTeam(teamName)\n if (!entry) return null\n\n const { team } = entry\n const statusCounts = { idle: 0, working: 0, planning: 0, stopped: 0 }\n for (const member of team.members) {\n statusCounts[member.status]++\n }\n\n const parts: string[] = [`Team: ${team.name}`]\n parts.push(`Members: ${team.members.length}`)\n if (statusCounts.working > 0) parts.push(`Working: ${statusCounts.working}`)\n if (statusCounts.idle > 0) parts.push(`Idle: ${statusCounts.idle}`)\n if (statusCounts.planning > 0)\n parts.push(`Planning: ${statusCounts.planning}`)\n\n return parts.join(' | ')\n}\n"],
5
- "mappings": "AASA,SAAS,aAAa,sBAAsB,eAAe;AAE3D,SAAS,sBAAsB;AAE/B,IAAI,kBAAkB;AAKtB,SAAS,qBAA6B;AACpC,SAAO,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE,eAAe;AACpD;AAKA,MAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,gBAAgB,QAAQ,gBAAgB,MAAM;AACvD;AAWA,eAAsB,cACpB,UACA,WACA,QACA,SAI0B;AAC1B,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,mBAAmB;AACtC,QAAM,eACJ,SAAS,QAAQ,GAAG,SAAS,IAAI,KAAK,QAAQ,SAAS,CAAC;AAE1D,QAAM,WAAW,YAAY,UAAU;AAAA,IACrC,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,iBAAiB,KAAK,QAAQ,MAAM;AAAA,EAC7C,CAAC;AAED,MAAI,SAAS,QAAQ;AACnB,UAAM,kBAAkB,UAAU,QAAQ;AAAA,EAC5C;AAEA,SAAO;AACT;AAKA,eAAe,kBACb,UACA,UACe;AACf,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAe;AACjD,UAAM,MAAM,4BAA4B,SAAS,OAAO,QAAQ,MAAM,KAAK,CAAC,mBAAmB,SAAS,SAAS;AAGjH,aAAS,4BAA4B,QAAQ,MAAM,GAAG,KAAK;AAAA,MACzD,OAAO;AAAA,IACT,CAAC;AAED,yBAAqB,UAAU,SAAS,IAAI,SAAS;AAAA,EACvD,QAAQ;AAEN,yBAAqB,UAAU,SAAS,IAAI,SAAS;AAAA,EACvD;AACF;AAKA,eAAsB,iBACpB,UACA,YACA,cACe;AACf,uBAAqB,UAAU,YAAY,MAAM;AAGjD,QAAM,UAAU,eAAe;AAC/B,MAAI,SAAS;AACX,YAAQ,oBAAoB,cAAc,QAAQ,EAAE,MAAM,MAAM;AAAA,IAEhE,CAAC;AAAA,EACH;AACF;AAKO,SAAS,eAAe,UAAiC;AAC9D,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,EAAE;AACpE,aAAW,UAAU,KAAK,SAAS;AACjC,iBAAa,OAAO,MAAM;AAAA,EAC5B;AAEA,QAAM,QAAkB,CAAC,SAAS,KAAK,IAAI,EAAE;AAC7C,QAAM,KAAK,YAAY,KAAK,QAAQ,MAAM,EAAE;AAC5C,MAAI,aAAa,UAAU,EAAG,OAAM,KAAK,YAAY,aAAa,OAAO,EAAE;AAC3E,MAAI,aAAa,OAAO,EAAG,OAAM,KAAK,SAAS,aAAa,IAAI,EAAE;AAClE,MAAI,aAAa,WAAW;AAC1B,UAAM,KAAK,aAAa,aAAa,QAAQ,EAAE;AAEjD,SAAO,MAAM,KAAK,KAAK;AACzB;",
4
+ "sourcesContent": ["/**\n * Teammate Spawner\n *\n * Spawns teammate instances for agent teams.\n * Supports in-process (TaskTool delegation) and tmux (subprocess) modes.\n *\n * Experimental: Enable with MINTO_EXPERIMENTAL_AGENT_TEAMS=1\n */\n\nimport { addTeammate, updateTeammateStatus, getTeam } from './teamManager'\nimport type { Teammate, TeammateStatus } from '../../types/agentTeams'\nimport { getHookManager } from '../../utils/hookManager'\n\nlet teammateCounter = 0\n\n/**\n * Generate a unique teammate ID\n */\nfunction generateTeammateId(): string {\n return `teammate-${Date.now()}-${++teammateCounter}`\n}\n\nimport { getTeammateColor } from '../../constants/agentTeams'\n\n/**\n * Spawn a teammate in the given team\n *\n * In-process mode: Creates a teammate record and returns it.\n * The caller is responsible for running the actual agent work\n * (typically via TaskTool delegation).\n *\n * tmux mode: Creates a new tmux pane with a separate CLI process.\n */\nexport async function spawnTeammate(\n teamName: string,\n agentType: string,\n prompt: string,\n options?: {\n name?: string\n mode?: 'in-process' | 'tmux'\n },\n): Promise<Teammate | null> {\n const entry = getTeam(teamName)\n if (!entry) return null\n\n const { team } = entry\n const mode = options?.mode || 'in-process'\n const teammateId = generateTeammateId()\n const teammateName =\n options?.name || `${agentType}-${team.members.length + 1}`\n\n const teammate = addTeammate(teamName, {\n id: teammateId,\n name: teammateName,\n agentType,\n status: 'idle' as TeammateStatus,\n prompt,\n color: getTeammateColor(team.members.length),\n joinedAt: Date.now(),\n backendType: mode,\n isActive: true,\n parentSessionId: team.leadSessionId,\n })\n\n if (mode === 'tmux') {\n await spawnTmuxTeammate(teamName, teammate)\n }\n\n return teammate\n}\n\n/**\n * Spawn a teammate in a tmux pane\n */\nasync function spawnTmuxTeammate(\n teamName: string,\n teammate: Teammate,\n): Promise<void> {\n try {\n const { execFileSync } = await import('child_process')\n // Build the command that tmux will execute in the new pane.\n // Use POSIX single-quote escaping to prevent shell injection.\n const { safeQuote } = await import('./index')\n const safeCmd = [\n 'minto',\n '--resume',\n '--prompt',\n teammate.prompt,\n '--agent-type',\n teammate.agentType,\n ]\n .map(safeQuote)\n .join(' ')\n\n // Using execFileSync avoids shell interpolation entirely\n execFileSync('tmux', ['split-window', '-h', '-t', teamName, safeCmd], {\n stdio: 'pipe',\n })\n\n updateTeammateStatus(teamName, teammate.id, 'working')\n } catch {\n // tmux not available or command failed\n updateTeammateStatus(teamName, teammate.id, 'stopped')\n }\n}\n\n/**\n * Mark a teammate as idle and fire TeammateIdle hook + notify team lead\n */\nexport async function markTeammateIdle(\n teamName: string,\n teammateId: string,\n teammateName: string,\n completedInfo?: {\n taskId?: string\n status?: 'completed' | 'failed'\n summary?: string\n failureReason?: string\n },\n): Promise<boolean> {\n // Guard: skip if already idle or stopped (prevents duplicate notifications)\n const teamEntry = getTeam(teamName)\n if (teamEntry) {\n const member = teamEntry.team.members.find(\n m => m.id === teammateId || m.name === teammateName,\n )\n if (member && (member.status === 'idle' || member.status === 'stopped')) {\n return true\n }\n }\n\n // Execute TeammateIdle hook first (CC behavior: exit code 2 prevents idle)\n const hookMgr = getHookManager()\n if (hookMgr) {\n try {\n const hookResult = await hookMgr.executeTeammateIdle(\n teammateName,\n teamName,\n )\n if (hookResult && !hookResult.shouldContinue) {\n // Hook blocked idle \u2014 teammate should continue working\n return false\n }\n } catch {\n // Hook errors don't prevent idle \u2014 graceful degradation\n }\n }\n\n // Hook passed (or no hook) \u2014 proceed with idle transition\n updateTeammateStatus(teamName, teammateId, 'idle')\n\n // Send idle notification to team lead via mailbox\n // Re-fetch entry since updateTeammateStatus may have mutated state\n const entry = getTeam(teamName)\n if (entry) {\n const { mailbox } = entry\n const leadId = `team-lead@${teamName}`\n\n const idleNotification = JSON.stringify({\n type: 'idle_notification',\n from: teammateName,\n timestamp: new Date().toISOString(),\n idleReason: 'available',\n ...(completedInfo?.taskId && {\n completedTaskId: completedInfo.taskId,\n completedStatus: completedInfo.status || 'completed',\n }),\n ...(completedInfo?.summary && {\n summary: completedInfo.summary,\n }),\n ...(completedInfo?.failureReason && {\n failureReason: completedInfo.failureReason,\n }),\n })\n mailbox.send(teammateId, leadId, idleNotification)\n }\n\n return true\n}\n\n/**\n * Mark a teammate as completed and fire lifecycle hook + notify team lead.\n *\n * Unlike markTeammateIdle (which keeps agents 'idle' / available for more work),\n * this sets the agent to 'stopped' and sends a completion notification so the\n * team lead sees \"completed\" instead of \"idle\" \u2014 avoiding the CC-trained\n * compulsion to send redundant shutdown_request messages.\n */\nexport async function markTeammateCompleted(\n teamName: string,\n teammateId: string,\n teammateName: string,\n completedInfo?: {\n taskId?: string\n summary?: string\n },\n): Promise<void> {\n // Guard: skip if already stopped (prevents duplicate notifications)\n const teamEntry = getTeam(teamName)\n if (teamEntry) {\n const member = teamEntry.team.members.find(\n m => m.id === teammateId || m.name === teammateName,\n )\n if (member && member.status === 'stopped') {\n return\n }\n }\n\n // Set status to 'stopped' \u2014 agent is done, no further work expected\n updateTeammateStatus(teamName, teammateId, 'stopped')\n\n // Fire TeammateIdle hook (reuse existing hook for lifecycle events)\n // Await to ensure hook executes before continuing, but don't block completion\n const hookMgr = getHookManager()\n if (hookMgr) {\n try {\n await hookMgr.executeTeammateIdle(teammateName, teamName)\n } catch {\n // Hook errors don't break completion lifecycle\n }\n }\n\n // Send completion notification to team lead via mailbox\n const entry = getTeam(teamName)\n if (entry) {\n const { mailbox } = entry\n const leadId = `team-lead@${teamName}`\n\n // Check if all non-lead teammates have completed\n const allDone = entry.team.members\n .filter(\n m =>\n !m.name.startsWith('team-lead') && m.id !== `team-lead@${teamName}`,\n )\n .every(m => m.status === 'stopped')\n\n const completionNotification = JSON.stringify({\n type: 'task_completed',\n from: teammateName,\n timestamp: new Date().toISOString(),\n status: 'completed',\n ...(completedInfo?.taskId && { taskId: completedInfo.taskId }),\n ...(completedInfo?.summary && { summary: completedInfo.summary }),\n ...(allDone && {\n message: `All teammates have completed. You MUST now compose your final answer and call TeamDelete to clean up.`,\n }),\n })\n mailbox.send(teammateId, leadId, completionNotification)\n }\n}\n\n/**\n * Get team summary for display\n */\nexport function getTeamSummary(teamName: string): string | null {\n const entry = getTeam(teamName)\n if (!entry) return null\n\n const { team } = entry\n const statusCounts = { idle: 0, working: 0, planning: 0, stopped: 0 }\n for (const member of team.members) {\n statusCounts[member.status]++\n }\n\n const parts: string[] = [`Team: ${team.name}`]\n parts.push(`Members: ${team.members.length}`)\n if (statusCounts.working > 0) parts.push(`Working: ${statusCounts.working}`)\n if (statusCounts.idle > 0) parts.push(`Idle: ${statusCounts.idle}`)\n if (statusCounts.planning > 0)\n parts.push(`Planning: ${statusCounts.planning}`)\n\n return parts.join(' | ')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -199,14 +199,22 @@ async function executePromptHook(hook, input, options, toolName) {
199
199
  } catch {
200
200
  clearTimeout(timer);
201
201
  }
202
- logDebug(`Prompt hook ${hook.name}: parse failed, defaulting to allow`);
203
- emitStatusEvent(hook.event, toolName, hook.name, true);
204
- return { success: true, decision: "approve" };
202
+ logDebug(
203
+ `Prompt hook ${hook.name}: parse failed, defaulting to ask (fail-safe)`
204
+ );
205
+ emitStatusEvent(
206
+ hook.event,
207
+ toolName,
208
+ hook.name,
209
+ false,
210
+ "Failed to parse hook response"
211
+ );
212
+ return { success: true, decision: "ask" };
205
213
  } catch (error) {
206
214
  const errorMsg = error instanceof Error ? error.message : String(error);
207
215
  logError(`Prompt hook ${hook.name} error: ${errorMsg}`);
208
216
  emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg);
209
- return { success: true, decision: "approve" };
217
+ return { success: true, decision: "ask" };
210
218
  }
211
219
  }
212
220
  async function executeAgentHook(hook, input, options, toolName) {
@@ -247,14 +255,22 @@ async function executeAgentHook(hook, input, options, toolName) {
247
255
  } catch {
248
256
  clearTimeout(timer);
249
257
  }
250
- logDebug(`Agent hook ${hook.name}: parse failed, defaulting to allow`);
251
- emitStatusEvent(hook.event, toolName, hook.name, true);
252
- return { success: true, decision: "approve" };
258
+ logDebug(
259
+ `Agent hook ${hook.name}: parse failed, defaulting to ask (fail-safe)`
260
+ );
261
+ emitStatusEvent(
262
+ hook.event,
263
+ toolName,
264
+ hook.name,
265
+ false,
266
+ "Failed to parse hook response"
267
+ );
268
+ return { success: true, decision: "ask" };
253
269
  } catch (error) {
254
270
  const errorMsg = error instanceof Error ? error.message : String(error);
255
271
  logError(`Agent hook ${hook.name} error: ${errorMsg}`);
256
272
  emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg);
257
- return { success: true, decision: "approve" };
273
+ return { success: true, decision: "ask" };
258
274
  }
259
275
  }
260
276
  function resolveDecision(output) {
@@ -702,6 +718,31 @@ function createTeammateIdleInput(sessionId, transcriptPath, teammateName, teamNa
702
718
  team_name: teamName
703
719
  };
704
720
  }
721
+ function createWorktreeCreateInput(sessionId, transcriptPath, worktreePath, agentId, agentType) {
722
+ return {
723
+ hook_event_name: HookEvent.WorktreeCreate,
724
+ session_id: sessionId,
725
+ transcript_path: transcriptPath,
726
+ cwd: getCwd(),
727
+ permission_mode: "default",
728
+ worktree_path: worktreePath,
729
+ agent_id: agentId,
730
+ agent_type: agentType
731
+ };
732
+ }
733
+ function createWorktreeRemoveInput(sessionId, transcriptPath, worktreePath, agentId, agentType, success) {
734
+ return {
735
+ hook_event_name: HookEvent.WorktreeRemove,
736
+ session_id: sessionId,
737
+ transcript_path: transcriptPath,
738
+ cwd: getCwd(),
739
+ permission_mode: "default",
740
+ worktree_path: worktreePath,
741
+ agent_id: agentId,
742
+ agent_type: agentType,
743
+ success
744
+ };
745
+ }
705
746
  export {
706
747
  createConfigChangeInput,
707
748
  createNotificationInput,
@@ -719,6 +760,8 @@ export {
719
760
  createTaskCompletedInput,
720
761
  createTeammateIdleInput,
721
762
  createUserPromptSubmitInput,
763
+ createWorktreeCreateInput,
764
+ createWorktreeRemoveInput,
722
765
  executeHook,
723
766
  executeHooksForEvent,
724
767
  hookStatusEmitter,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/hookExecutor.ts"],
4
- "sourcesContent": ["/**\n * Hook Execution Engine\n *\n * Executes plugin hooks with bash command execution, JSON I/O,\n * and decision processing (approve/block/ask).\n *\n * Supports hook types: command, prompt, agent.\n * Fully compatible with Claude Code CLI hooks specification.\n */\n\nimport { spawn } from 'child_process'\nimport { existsSync, readFileSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport {\n HookEvent,\n HookInput,\n HookOutput,\n PreToolUseInput,\n PostToolUseInput,\n PostToolUseFailureInput,\n PermissionRequestInput,\n UserPromptSubmitInput,\n SessionStartInput,\n SessionEndInput,\n StopInput,\n SubagentStartInput,\n SubagentStopInput,\n NotificationInput,\n PreCompactInput,\n PostCompactInput,\n ConfigChangeInput,\n TaskCompletedInput,\n TeammateIdleInput,\n} from '../types/hooks'\nimport { LoadedHook, HookEvent as PluginHookEvent } from '../types/plugin'\nimport { getCwd } from '../utils/state'\nimport { logError } from '../utils/log'\nimport { emitReminderEvent } from './systemReminder'\n\n// Simple logging helpers\nconst logInfo = (msg: string) => {\n if (process.env.DEBUG) console.log(`[INFO] ${msg}`)\n}\nconst logDebug = (msg: string, ...args: any[]) => {\n if (process.env.DEBUG) console.log(`[DEBUG] ${msg}`, ...args)\n}\n\n/**\n * Hook status event for verbose mode display\n */\nexport interface HookStatusEvent {\n event: PluginHookEvent\n toolName?: string\n success: boolean\n message: string\n timestamp: number\n hookName: string\n}\n\n/**\n * Event emitter for hook status updates\n */\nexport const hookStatusEmitter = new EventEmitter()\n\n/**\n * Session-level set tracking once-per-session hooks\n */\nconst executedOnceHooks = new Set<string>()\n\n/**\n * Reset once-hook tracking (call on session start)\n */\nexport function resetOnceHooks(): void {\n executedOnceHooks.clear()\n}\n\nfunction formatHookStatusMessage(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): string {\n const eventPart = toolName ? `${event}:${toolName}` : event\n const statusPart = success ? 'succeeded' : 'failed'\n const detailPart = success ? 'Success' : errorMessage || 'Error'\n return `${eventPart} hook ${statusPart}: ${detailPart}`\n}\n\nfunction emitStatusEvent(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): void {\n hookStatusEmitter.emit('status', {\n event,\n toolName,\n success,\n message: formatHookStatusMessage(\n event,\n toolName,\n hookName,\n success,\n errorMessage,\n ),\n timestamp: Date.now(),\n hookName,\n } as HookStatusEvent)\n}\n\n/**\n * Hook execution result\n */\nexport interface HookExecutionResult {\n success: boolean\n decision?: 'approve' | 'block' | 'ask'\n output?: HookOutput\n error?: string\n timedOut?: boolean\n /** Blocked by exit code 2 with stderr as feedback */\n blockedByExitCode2?: boolean\n blockReason?: string\n}\n\n/**\n * Hook execution options\n */\nexport interface HookExecutionOptions {\n timeout?: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n}\n\n/**\n * Substitute $ARGUMENTS in a command string with the hook input JSON\n */\nfunction substituteArguments(command: string, input: HookInput): string {\n if (!command.includes('$ARGUMENTS')) {\n return command\n }\n // Replace $ARGUMENTS with the JSON-encoded input\n // Shell-safe: single-quote the JSON and escape internal single quotes\n const inputJson = JSON.stringify(input)\n const escaped = inputJson.replace(/'/g, \"'\\\\''\")\n return command.replace(/\\$ARGUMENTS/g, `'${escaped}'`)\n}\n\n/**\n * Execute a hook (command, prompt, or agent type)\n */\nexport async function executeHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult> {\n const hookType = hook.config.type || 'command'\n\n // Once-per-session check\n if (hook.config.once) {\n const hookKey = `${hook.pluginName}:${hook.name}:${hook.event}`\n if (executedOnceHooks.has(hookKey)) {\n logDebug(`Skipping once-hook (already executed): ${hookKey}`)\n return { success: true }\n }\n executedOnceHooks.add(hookKey)\n }\n\n const toolName =\n 'tool_name' in input ? (input.tool_name as string) : undefined\n\n // Async hooks: fire-and-forget\n if (hook.config.async) {\n executeHookAsync(hook, input, options, hookType, toolName).catch(err => {\n logDebug(`Async hook ${hook.name} error: ${err}`)\n })\n return { success: true }\n }\n\n switch (hookType) {\n case 'command':\n return executeCommandHook(hook, input, options, toolName)\n case 'prompt':\n return executePromptHook(hook, input, options, toolName)\n case 'agent':\n return executeAgentHook(hook, input, options, toolName)\n default:\n return {\n success: false,\n error: `Unknown hook type: ${hookType}`,\n }\n }\n}\n\n/**\n * Execute async hook in background (fire-and-forget)\n */\nasync function executeHookAsync(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n hookType: string,\n toolName: string | undefined,\n): Promise<void> {\n try {\n let result: HookExecutionResult\n switch (hookType) {\n case 'command':\n result = await executeCommandHook(hook, input, options, toolName)\n break\n case 'prompt':\n result = await executePromptHook(hook, input, options, toolName)\n break\n case 'agent':\n result = await executeAgentHook(hook, input, options, toolName)\n break\n default:\n return\n }\n\n // Async hooks deliver results via systemMessage on next turn\n if (result.output?.systemMessage) {\n hookStatusEmitter.emit('asyncResult', {\n hookName: hook.name,\n systemMessage: result.output.systemMessage,\n })\n }\n } catch {\n // Async hooks silently fail\n }\n}\n\n/**\n * Execute a command-type hook\n */\nasync function executeCommandHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.command) {\n return { success: false, error: 'Command hook missing command field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) ||\n options.timeout ||\n 30000\n\n try {\n logDebug(`Executing hook: ${hook.name}`)\n\n // Substitute $ARGUMENTS in command\n const command = substituteArguments(hook.config.command, input)\n logDebug(`Command: ${command}`)\n\n const result = await executeBashCommand(command, input, {\n ...options,\n timeout,\n pluginRoot: options.pluginRoot,\n })\n\n if (result.timedOut) {\n const errorMsg = `Hook execution timed out after ${timeout}ms`\n logError(`Hook ${hook.name} timed out after ${timeout}ms`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, timedOut: true, error: errorMsg }\n }\n\n // Exit code 2: block with stderr as feedback (CC spec)\n if (result.exitCode === 2) {\n const reason = result.stderr.trim() || 'Blocked by hook'\n logDebug(`Hook ${hook.name} exit code 2 (block): ${reason}`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision: 'block',\n blockedByExitCode2: true,\n blockReason: reason,\n output: {\n decision: 'block',\n reason,\n systemMessage: reason,\n },\n }\n }\n\n // Exit code 1 or other non-zero: error\n if (result.exitCode !== 0 && result.exitCode !== null) {\n const errorMsg = `Command exited with code ${result.exitCode}: ${result.stderr}`\n logError(`Hook ${hook.name} failed: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, error: errorMsg }\n }\n\n // Parse JSON output\n const output = parseHookOutput(result.stdout, input.hook_event_name)\n if (!output) {\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true }\n }\n\n logDebug(`Hook ${hook.name} output:`, output)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n\n // Resolve decision from both hookSpecificOutput and top-level fields\n const decision = resolveDecision(output)\n\n return { success: true, decision, output }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Hook ${hook.name} execution error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, error: errorMsg }\n }\n}\n\n/**\n * Execute a prompt-type hook using fast model (single-turn evaluation)\n */\nasync function executePromptHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.prompt) {\n return { success: false, error: 'Prompt hook missing prompt field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) || 30000\n\n try {\n const inputJson = JSON.stringify(input)\n const prompt = hook.config.prompt.replace(/\\$ARGUMENTS/g, inputJson)\n\n logDebug(`Executing prompt hook: ${hook.name}`)\n\n const { queryQuick } = await import('./claude')\n const abortController = new AbortController()\n const timer = setTimeout(() => abortController.abort(), timeout)\n\n try {\n const result = await queryQuick({\n systemPrompt: [\n 'You are a hook evaluator. Respond ONLY with JSON: { \"ok\": boolean, \"reason\": string }.',\n 'ok=true means allow the action, ok=false means block it.',\n ],\n userPrompt: prompt,\n signal: abortController.signal,\n })\n clearTimeout(timer)\n\n // Extract text from assistant message\n const text = result.message.content\n .filter(b => b.type === 'text')\n .map(b => (b as any).text)\n .join('')\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n ok: boolean\n reason?: string\n }\n const decision = parsed.ok ? 'approve' : 'block'\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision,\n output: { decision, reason: parsed.reason },\n }\n }\n } catch {\n clearTimeout(timer)\n }\n\n logDebug(`Prompt hook ${hook.name}: parse failed, defaulting to allow`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true, decision: 'approve' }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Prompt hook ${hook.name} error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: true, decision: 'approve' }\n }\n}\n\n/**\n * Execute an agent-type hook using a subagent with read-only tools\n * Agent hooks get extended reasoning and can use Read, Grep, Glob\n */\nasync function executeAgentHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.prompt) {\n return { success: false, error: 'Agent hook missing prompt field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) || 60000\n\n try {\n const inputJson = JSON.stringify(input)\n const prompt = hook.config.prompt.replace(/\\$ARGUMENTS/g, inputJson)\n\n logDebug(`Executing agent hook: ${hook.name}`)\n\n const { queryQuick } = await import('./claude')\n const abortController = new AbortController()\n const timer = setTimeout(() => abortController.abort(), timeout)\n\n try {\n const result = await queryQuick({\n systemPrompt: [\n 'You are a hook agent evaluator. You have read-only access to the codebase.',\n 'Evaluate the request and respond ONLY with JSON: { \"ok\": boolean, \"reason\": string }.',\n 'ok=true means allow the action, ok=false means block it.',\n ],\n userPrompt: prompt,\n signal: abortController.signal,\n })\n clearTimeout(timer)\n\n const text = result.message.content\n .filter(b => b.type === 'text')\n .map(b => (b as any).text)\n .join('')\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n ok: boolean\n reason?: string\n }\n const decision = parsed.ok ? 'approve' : 'block'\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision,\n output: { decision, reason: parsed.reason },\n }\n }\n } catch {\n clearTimeout(timer)\n }\n\n logDebug(`Agent hook ${hook.name}: parse failed, defaulting to allow`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true, decision: 'approve' }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Agent hook ${hook.name} error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: true, decision: 'approve' }\n }\n}\n\n/**\n * Resolve decision from hook output, supporting both CC formats:\n * - hookSpecificOutput.permissionDecision (new)\n * - top-level decision (old, CC community compat)\n */\nfunction resolveDecision(\n output: HookOutput,\n): 'approve' | 'block' | 'ask' | undefined {\n // Check hookSpecificOutput first (new format)\n if (output.hookSpecificOutput) {\n const specific = output.hookSpecificOutput as any\n if (specific.permissionDecision) {\n const mapping: Record<string, 'approve' | 'block' | 'ask'> = {\n allow: 'approve',\n deny: 'block',\n ask: 'ask',\n approve: 'approve',\n block: 'block',\n }\n return mapping[specific.permissionDecision] ?? output.decision\n }\n }\n\n // Fall back to top-level decision (old CC format)\n return output.decision\n}\n\n/**\n * Path to the env file set by a SessionStart hook via $CLAUDE_ENV_FILE.\n * Once set, all subsequent hooks load env vars from this file.\n */\nlet claudeEnvFilePath: string | undefined\n\n/**\n * Load environment variables from $CLAUDE_ENV_FILE if set.\n * File format: one KEY=VALUE per line, # comments, empty lines ignored.\n */\nfunction loadEnvFile(): Record<string, string> {\n const envFile = claudeEnvFilePath || process.env.CLAUDE_ENV_FILE\n if (!envFile || !existsSync(envFile)) return {}\n\n try {\n const content = readFileSync(envFile, 'utf-8')\n const vars: Record<string, string> = {}\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx <= 0) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n vars[key] = value\n }\n return vars\n } catch {\n return {}\n }\n}\n\n/**\n * Extract file paths from tool input for CLAUDE_FILE_PATHS env var\n */\nfunction extractFilePathsFromInput(\n toolInput: Record<string, unknown> | undefined,\n): string {\n if (!toolInput) return ''\n const paths: string[] = []\n if (typeof toolInput.file_path === 'string') paths.push(toolInput.file_path)\n if (typeof toolInput.path === 'string') paths.push(toolInput.path)\n if (typeof toolInput.notebook_path === 'string')\n paths.push(toolInput.notebook_path)\n return paths.join(':')\n}\n\n/**\n * Execute bash command with JSON stdin/stdout\n * Returns exit code for proper exit code 2 handling\n */\nasync function executeBashCommand(\n command: string,\n input: HookInput,\n options: {\n timeout: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n },\n): Promise<{\n stdout: string\n stderr: string\n exitCode: number | null\n timedOut?: boolean\n}> {\n return new Promise(resolve => {\n // Load persistent env vars from $CLAUDE_ENV_FILE\n const envFileVars = loadEnvFile()\n\n // Extract tool-specific env vars from input\n const toolName = 'tool_name' in input ? (input as any).tool_name : undefined\n const toolInput =\n 'tool_input' in input ? (input as any).tool_input : undefined\n const toolInputJson = toolInput ? JSON.stringify(toolInput) : ''\n const filePaths = extractFilePathsFromInput(toolInput)\n const shellCommand =\n toolName === 'Bash' && toolInput?.command ? String(toolInput.command) : ''\n\n const projectDir = getCwd()\n\n const env = {\n ...process.env,\n ...envFileVars,\n // CC-compatible env vars\n CLAUDE_PLUGIN_ROOT: options.pluginRoot,\n CLAUDE_SESSION_ID: options.sessionId,\n CLAUDE_CWD: projectDir,\n CLAUDE_TRANSCRIPT_PATH: options.transcriptPath || '',\n CLAUDE_PROJECT_DIR: projectDir,\n CLAUDE_WORKSPACE_DIR: projectDir,\n CLAUDE_TOOL_INPUT: toolInputJson,\n CLAUDE_FILE_PATHS: filePaths,\n CLAUDE_SHELL_COMMAND: shellCommand,\n // Minto-prefixed duplicates\n MINTO_PROJECT_DIR: projectDir,\n MINTO_WORKSPACE_DIR: projectDir,\n MINTO_TOOL_INPUT: toolInputJson,\n MINTO_FILE_PATHS: filePaths,\n MINTO_SHELL_COMMAND: shellCommand,\n }\n\n const child = spawn('bash', ['-c', command], {\n env,\n cwd: getCwd(),\n })\n\n let stdout = ''\n let stderr = ''\n let timedOut = false\n\n const timer = setTimeout(() => {\n timedOut = true\n child.kill('SIGTERM')\n setTimeout(() => {\n if (!child.killed) {\n child.kill('SIGKILL')\n }\n }, 1000)\n }, options.timeout)\n\n child.stdout?.on('data', data => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', data => {\n stderr += data.toString()\n })\n\n child.on('close', code => {\n clearTimeout(timer)\n\n if (timedOut) {\n resolve({ stdout: '', stderr: '', exitCode: null, timedOut: true })\n return\n }\n\n resolve({ stdout, stderr, exitCode: code })\n })\n\n child.on('error', error => {\n clearTimeout(timer)\n resolve({\n stdout: '',\n stderr: error.message,\n exitCode: 1,\n })\n })\n\n try {\n if (child.stdin) {\n child.stdin.write(JSON.stringify(input, null, 2))\n child.stdin.end()\n }\n } catch (error) {\n clearTimeout(timer)\n child.kill()\n resolve({\n stdout: '',\n stderr: `Failed to write to stdin: ${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n })\n }\n })\n}\n\n/**\n * Parse hook output JSON with event-specific field extraction\n */\nfunction parseHookOutput(\n stdout: string,\n eventName?: HookEvent,\n): HookOutput | null {\n if (!stdout.trim()) {\n return null\n }\n\n try {\n const jsonMatch = stdout.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) {\n logDebug('No JSON found in hook output')\n return null\n }\n\n const raw = JSON.parse(jsonMatch[0])\n const output: HookOutput = {}\n\n // Extract standard fields\n if (raw.continue !== undefined) output.continue = raw.continue\n if (raw.stopReason) output.stopReason = raw.stopReason\n if (raw.suppressOutput !== undefined)\n output.suppressOutput = raw.suppressOutput\n if (raw.systemMessage) output.systemMessage = raw.systemMessage\n\n // Extract top-level decision (CC community compat)\n if (raw.decision) {\n if (['approve', 'block', 'ask'].includes(raw.decision)) {\n output.decision = raw.decision\n }\n }\n if (raw.reason) output.reason = raw.reason\n\n // Extract event-specific output based on hookSpecificOutput or flat fields\n const specific = raw.hookSpecificOutput || raw\n\n if (eventName === HookEvent.PreToolUse) {\n if (\n specific.permissionDecision ||\n specific.updatedInput ||\n specific.permissionDecisionReason\n ) {\n output.hookSpecificOutput = {\n hookEventName: HookEvent.PreToolUse,\n permissionDecision: specific.permissionDecision,\n permissionDecisionReason: specific.permissionDecisionReason,\n updatedInput: specific.updatedInput,\n }\n }\n } else if (\n eventName === HookEvent.PostToolUse ||\n eventName === HookEvent.UserPromptSubmit ||\n eventName === HookEvent.SessionStart\n ) {\n if (specific.additionalContext) {\n output.hookSpecificOutput = {\n hookEventName: eventName,\n additionalContext: specific.additionalContext,\n } as any\n }\n\n // SessionStart: capture $CLAUDE_ENV_FILE for persistent env vars\n if (eventName === HookEvent.SessionStart && specific.envFile) {\n claudeEnvFilePath = specific.envFile\n process.env.CLAUDE_ENV_FILE = specific.envFile\n }\n }\n\n // Extract suppressNotification for Notification event\n if (eventName === HookEvent.Notification) {\n if (raw.suppressNotification !== undefined) {\n ;(output as any).suppressNotification = raw.suppressNotification\n }\n }\n\n return output\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Failed to parse hook output JSON: ${errorMsg}`)\n logDebug('Raw output:', stdout)\n return null\n }\n}\n\n/**\n * Execute all matching hooks for an event\n */\nexport async function executeHooksForEvent(\n event: HookEvent,\n hooks: LoadedHook[],\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult[]> {\n const matchingHooks = hooks.filter(hook => hook.event === event)\n\n if (matchingHooks.length === 0) {\n return []\n }\n\n logInfo(`Executing ${matchingHooks.length} hook(s) for event: ${event}`)\n\n // Execute all matching hooks in parallel (CC behavior)\n const results = await Promise.allSettled(\n matchingHooks.map(hook => executeHook(hook, input, options)),\n )\n\n return results.map(r =>\n r.status === 'fulfilled'\n ? r.value\n : { success: false, error: String(r.reason) },\n )\n}\n\n/**\n * Process hook decisions to determine final action\n */\nexport function processHookDecisions(results: HookExecutionResult[]): {\n shouldContinue: boolean\n shouldAskUser: boolean\n reason?: string\n updatedInput?: Record<string, unknown>\n additionalContext?: string\n} {\n // Collect additional context and updated input from all results\n let additionalContext: string | undefined\n let updatedInput: Record<string, unknown> | undefined\n\n for (const r of results) {\n if (!r.success || !r.output) continue\n const specific = r.output.hookSpecificOutput as any\n if (specific?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${specific.additionalContext}`\n : specific.additionalContext\n }\n if (specific?.updatedInput) {\n updatedInput = { ...(updatedInput || {}), ...specific.updatedInput }\n }\n }\n\n // If any hook says \"block\" (including exit code 2), we block\n const blockedResult = results.find(\n r => (r.success && r.decision === 'block') || r.blockedByExitCode2,\n )\n if (blockedResult) {\n const reason =\n blockedResult.blockReason ||\n blockedResult.output?.reason ||\n 'Blocked by hook'\n emitReminderEvent('hook:blocking_error', { hookName: 'hook', reason })\n return {\n shouldContinue: false,\n shouldAskUser: false,\n reason,\n }\n }\n\n // If any hook says \"ask\", we ask the user\n const askResult = results.find(r => r.success && r.decision === 'ask')\n if (askResult) {\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason: askResult.output?.reason || 'Hook requested user approval',\n }\n }\n\n // If any hook failed, we ask the user (fail-safe)\n const failedResult = results.find(r => !r.success)\n if (failedResult) {\n const reason = `Hook execution failed: ${failedResult.error}`\n emitReminderEvent('hook:stopped_continuation', { hookName: 'hook', reason })\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason,\n }\n }\n\n // Emit additional context reminder if hooks provided extra info\n if (additionalContext) {\n emitReminderEvent('hook:additional_context', {\n hookName: 'hook',\n content: additionalContext,\n })\n }\n\n // All hooks approved or had no decision\n return {\n shouldContinue: true,\n shouldAskUser: false,\n updatedInput,\n additionalContext,\n }\n}\n\n// ============================================================================\n// Hook Input Factories\n// ============================================================================\n\nexport function createPreToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n): PreToolUseInput {\n return {\n hook_event_name: HookEvent.PreToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n }\n}\n\nexport function createPostToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n toolOutput: Record<string, unknown>,\n): PostToolUseInput {\n return {\n hook_event_name: HookEvent.PostToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n }\n}\n\nexport function createUserPromptSubmitInput(\n sessionId: string,\n transcriptPath: string,\n userPrompt: string,\n): UserPromptSubmitInput {\n return {\n hook_event_name: HookEvent.UserPromptSubmit,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n user_prompt: userPrompt,\n }\n}\n\nexport function createSessionStartInput(\n sessionId: string,\n transcriptPath: string,\n): SessionStartInput {\n return {\n hook_event_name: HookEvent.SessionStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n source: 'startup' as const,\n permission_mode: 'default',\n }\n}\n\nexport function createSessionEndInput(\n sessionId: string,\n transcriptPath: string,\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other',\n): SessionEndInput {\n return {\n hook_event_name: HookEvent.SessionEnd,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n reason,\n }\n}\n\nexport function createPostToolUseFailureInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n error: string,\n errorType?: string,\n): PostToolUseFailureInput {\n return {\n hook_event_name: HookEvent.PostToolUseFailure,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n error,\n error_type: errorType,\n }\n}\n\nexport function createPermissionRequestInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n permissionType: 'read' | 'write' | 'execute' | 'network' | 'other',\n description?: string,\n): PermissionRequestInput {\n return {\n hook_event_name: HookEvent.PermissionRequest,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n permission_type: permissionType,\n description,\n }\n}\n\nexport function createStopInput(\n sessionId: string,\n transcriptPath: string,\n stopHookActive: boolean,\n): StopInput {\n return {\n hook_event_name: HookEvent.Stop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n stop_hook_active: stopHookActive,\n }\n}\n\nexport function createSubagentStartInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentDescription?: string,\n runInBackground?: boolean,\n): SubagentStartInput {\n return {\n hook_event_name: HookEvent.SubagentStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_description: agentDescription,\n run_in_background: runInBackground,\n }\n}\n\nexport function createSubagentStopInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentId?: string,\n stopHookActive?: boolean,\n): SubagentStopInput {\n return {\n hook_event_name: HookEvent.SubagentStop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_id: agentId,\n stop_hook_active: stopHookActive ?? false,\n }\n}\n\nexport function createNotificationInput(\n sessionId: string,\n transcriptPath: string,\n message: string,\n title?: string,\n type?: string,\n): NotificationInput {\n return {\n hook_event_name: HookEvent.Notification,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n message,\n ...(title ? { title } : {}),\n ...(type ? { notification_type: type } : {}),\n }\n}\n\nexport function createPreCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n customInstructions: string,\n): PreCompactInput {\n return {\n hook_event_name: HookEvent.PreCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n custom_instructions: customInstructions,\n }\n}\n\nexport function createPostCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n summary: string,\n compressionRatio: number,\n originalTokens: number,\n compressedTokens: number,\n): PostCompactInput {\n return {\n hook_event_name: HookEvent.PostCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n summary,\n compression_ratio: compressionRatio,\n original_tokens: originalTokens,\n compressed_tokens: compressedTokens,\n }\n}\n\nexport function createConfigChangeInput(\n sessionId: string,\n transcriptPath: string,\n source: 'settings' | 'project' | 'global' | 'env' | 'cli',\n filePath?: string,\n): ConfigChangeInput {\n return {\n hook_event_name: HookEvent.ConfigChange,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n source,\n file_path: filePath,\n }\n}\n\nexport function createTaskCompletedInput(\n sessionId: string,\n transcriptPath: string,\n taskId: string,\n subject: string,\n description?: string,\n): TaskCompletedInput {\n return {\n hook_event_name: HookEvent.TaskCompleted,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n task_id: taskId,\n subject,\n description,\n }\n}\n\nexport function createTeammateIdleInput(\n sessionId: string,\n transcriptPath: string,\n teammateName: string,\n teamName: string,\n): TeammateIdleInput {\n return {\n hook_event_name: HookEvent.TeammateIdle,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n teammate_name: teammateName,\n team_name: teamName,\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Hook Execution Engine\n *\n * Executes plugin hooks with bash command execution, JSON I/O,\n * and decision processing (approve/block/ask).\n *\n * Supports hook types: command, prompt, agent.\n * Fully compatible with Claude Code CLI hooks specification.\n */\n\nimport { spawn } from 'child_process'\nimport { existsSync, readFileSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport {\n HookEvent,\n HookInput,\n HookOutput,\n PreToolUseInput,\n PostToolUseInput,\n PostToolUseFailureInput,\n PermissionRequestInput,\n UserPromptSubmitInput,\n SessionStartInput,\n SessionEndInput,\n StopInput,\n SubagentStartInput,\n SubagentStopInput,\n NotificationInput,\n PreCompactInput,\n PostCompactInput,\n ConfigChangeInput,\n TaskCompletedInput,\n TeammateIdleInput,\n WorktreeCreateInput,\n WorktreeRemoveInput,\n} from '../types/hooks'\nimport { LoadedHook, HookEvent as PluginHookEvent } from '../types/plugin'\nimport { getCwd } from '../utils/state'\nimport { logError } from '../utils/log'\nimport { emitReminderEvent } from './systemReminder'\n\n// Simple logging helpers\nconst logInfo = (msg: string) => {\n if (process.env.DEBUG) console.log(`[INFO] ${msg}`)\n}\nconst logDebug = (msg: string, ...args: any[]) => {\n if (process.env.DEBUG) console.log(`[DEBUG] ${msg}`, ...args)\n}\n\n/**\n * Hook status event for verbose mode display\n */\nexport interface HookStatusEvent {\n event: PluginHookEvent\n toolName?: string\n success: boolean\n message: string\n timestamp: number\n hookName: string\n}\n\n/**\n * Event emitter for hook status updates\n */\nexport const hookStatusEmitter = new EventEmitter()\n\n/**\n * Session-level set tracking once-per-session hooks\n */\nconst executedOnceHooks = new Set<string>()\n\n/**\n * Reset once-hook tracking (call on session start)\n */\nexport function resetOnceHooks(): void {\n executedOnceHooks.clear()\n}\n\nfunction formatHookStatusMessage(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): string {\n const eventPart = toolName ? `${event}:${toolName}` : event\n const statusPart = success ? 'succeeded' : 'failed'\n const detailPart = success ? 'Success' : errorMessage || 'Error'\n return `${eventPart} hook ${statusPart}: ${detailPart}`\n}\n\nfunction emitStatusEvent(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): void {\n hookStatusEmitter.emit('status', {\n event,\n toolName,\n success,\n message: formatHookStatusMessage(\n event,\n toolName,\n hookName,\n success,\n errorMessage,\n ),\n timestamp: Date.now(),\n hookName,\n } as HookStatusEvent)\n}\n\n/**\n * Hook execution result\n */\nexport interface HookExecutionResult {\n success: boolean\n decision?: 'approve' | 'block' | 'ask'\n output?: HookOutput\n error?: string\n timedOut?: boolean\n /** Blocked by exit code 2 with stderr as feedback */\n blockedByExitCode2?: boolean\n blockReason?: string\n}\n\n/**\n * Hook execution options\n */\nexport interface HookExecutionOptions {\n timeout?: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n}\n\n/**\n * Substitute $ARGUMENTS in a command string with the hook input JSON\n */\nfunction substituteArguments(command: string, input: HookInput): string {\n if (!command.includes('$ARGUMENTS')) {\n return command\n }\n // Replace $ARGUMENTS with the JSON-encoded input\n // Shell-safe: single-quote the JSON and escape internal single quotes\n const inputJson = JSON.stringify(input)\n const escaped = inputJson.replace(/'/g, \"'\\\\''\")\n return command.replace(/\\$ARGUMENTS/g, `'${escaped}'`)\n}\n\n/**\n * Execute a hook (command, prompt, or agent type)\n */\nexport async function executeHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult> {\n const hookType = hook.config.type || 'command'\n\n // Once-per-session check\n if (hook.config.once) {\n const hookKey = `${hook.pluginName}:${hook.name}:${hook.event}`\n if (executedOnceHooks.has(hookKey)) {\n logDebug(`Skipping once-hook (already executed): ${hookKey}`)\n return { success: true }\n }\n executedOnceHooks.add(hookKey)\n }\n\n const toolName =\n 'tool_name' in input ? (input.tool_name as string) : undefined\n\n // Async hooks: fire-and-forget\n if (hook.config.async) {\n executeHookAsync(hook, input, options, hookType, toolName).catch(err => {\n logDebug(`Async hook ${hook.name} error: ${err}`)\n })\n return { success: true }\n }\n\n switch (hookType) {\n case 'command':\n return executeCommandHook(hook, input, options, toolName)\n case 'prompt':\n return executePromptHook(hook, input, options, toolName)\n case 'agent':\n return executeAgentHook(hook, input, options, toolName)\n default:\n return {\n success: false,\n error: `Unknown hook type: ${hookType}`,\n }\n }\n}\n\n/**\n * Execute async hook in background (fire-and-forget)\n */\nasync function executeHookAsync(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n hookType: string,\n toolName: string | undefined,\n): Promise<void> {\n try {\n let result: HookExecutionResult\n switch (hookType) {\n case 'command':\n result = await executeCommandHook(hook, input, options, toolName)\n break\n case 'prompt':\n result = await executePromptHook(hook, input, options, toolName)\n break\n case 'agent':\n result = await executeAgentHook(hook, input, options, toolName)\n break\n default:\n return\n }\n\n // Async hooks deliver results via systemMessage on next turn\n if (result.output?.systemMessage) {\n hookStatusEmitter.emit('asyncResult', {\n hookName: hook.name,\n systemMessage: result.output.systemMessage,\n })\n }\n } catch {\n // Async hooks silently fail\n }\n}\n\n/**\n * Execute a command-type hook\n */\nasync function executeCommandHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.command) {\n return { success: false, error: 'Command hook missing command field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) ||\n options.timeout ||\n 30000\n\n try {\n logDebug(`Executing hook: ${hook.name}`)\n\n // Substitute $ARGUMENTS in command\n const command = substituteArguments(hook.config.command, input)\n logDebug(`Command: ${command}`)\n\n const result = await executeBashCommand(command, input, {\n ...options,\n timeout,\n pluginRoot: options.pluginRoot,\n })\n\n if (result.timedOut) {\n const errorMsg = `Hook execution timed out after ${timeout}ms`\n logError(`Hook ${hook.name} timed out after ${timeout}ms`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, timedOut: true, error: errorMsg }\n }\n\n // Exit code 2: block with stderr as feedback (CC spec)\n if (result.exitCode === 2) {\n const reason = result.stderr.trim() || 'Blocked by hook'\n logDebug(`Hook ${hook.name} exit code 2 (block): ${reason}`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision: 'block',\n blockedByExitCode2: true,\n blockReason: reason,\n output: {\n decision: 'block',\n reason,\n systemMessage: reason,\n },\n }\n }\n\n // Exit code 1 or other non-zero: error\n if (result.exitCode !== 0 && result.exitCode !== null) {\n const errorMsg = `Command exited with code ${result.exitCode}: ${result.stderr}`\n logError(`Hook ${hook.name} failed: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, error: errorMsg }\n }\n\n // Parse JSON output\n const output = parseHookOutput(result.stdout, input.hook_event_name)\n if (!output) {\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true }\n }\n\n logDebug(`Hook ${hook.name} output:`, output)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n\n // Resolve decision from both hookSpecificOutput and top-level fields\n const decision = resolveDecision(output)\n\n return { success: true, decision, output }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Hook ${hook.name} execution error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, error: errorMsg }\n }\n}\n\n/**\n * Execute a prompt-type hook using fast model (single-turn evaluation)\n */\nasync function executePromptHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.prompt) {\n return { success: false, error: 'Prompt hook missing prompt field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) || 30000\n\n try {\n const inputJson = JSON.stringify(input)\n const prompt = hook.config.prompt.replace(/\\$ARGUMENTS/g, inputJson)\n\n logDebug(`Executing prompt hook: ${hook.name}`)\n\n const { queryQuick } = await import('./claude')\n const abortController = new AbortController()\n const timer = setTimeout(() => abortController.abort(), timeout)\n\n try {\n const result = await queryQuick({\n systemPrompt: [\n 'You are a hook evaluator. Respond ONLY with JSON: { \"ok\": boolean, \"reason\": string }.',\n 'ok=true means allow the action, ok=false means block it.',\n ],\n userPrompt: prompt,\n signal: abortController.signal,\n })\n clearTimeout(timer)\n\n // Extract text from assistant message\n const text = result.message.content\n .filter(b => b.type === 'text')\n .map(b => (b as any).text)\n .join('')\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n ok: boolean\n reason?: string\n }\n const decision = parsed.ok ? 'approve' : 'block'\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision,\n output: { decision, reason: parsed.reason },\n }\n }\n } catch {\n clearTimeout(timer)\n }\n\n logDebug(\n `Prompt hook ${hook.name}: parse failed, defaulting to ask (fail-safe)`,\n )\n emitStatusEvent(\n hook.event,\n toolName,\n hook.name,\n false,\n 'Failed to parse hook response',\n )\n return { success: true, decision: 'ask' }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Prompt hook ${hook.name} error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: true, decision: 'ask' }\n }\n}\n\n/**\n * Execute an agent-type hook using a subagent with read-only tools\n * Agent hooks get extended reasoning and can use Read, Grep, Glob\n */\nasync function executeAgentHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.prompt) {\n return { success: false, error: 'Agent hook missing prompt field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) || 60000\n\n try {\n const inputJson = JSON.stringify(input)\n const prompt = hook.config.prompt.replace(/\\$ARGUMENTS/g, inputJson)\n\n logDebug(`Executing agent hook: ${hook.name}`)\n\n const { queryQuick } = await import('./claude')\n const abortController = new AbortController()\n const timer = setTimeout(() => abortController.abort(), timeout)\n\n try {\n const result = await queryQuick({\n systemPrompt: [\n 'You are a hook agent evaluator. You have read-only access to the codebase.',\n 'Evaluate the request and respond ONLY with JSON: { \"ok\": boolean, \"reason\": string }.',\n 'ok=true means allow the action, ok=false means block it.',\n ],\n userPrompt: prompt,\n signal: abortController.signal,\n })\n clearTimeout(timer)\n\n const text = result.message.content\n .filter(b => b.type === 'text')\n .map(b => (b as any).text)\n .join('')\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n ok: boolean\n reason?: string\n }\n const decision = parsed.ok ? 'approve' : 'block'\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision,\n output: { decision, reason: parsed.reason },\n }\n }\n } catch {\n clearTimeout(timer)\n }\n\n logDebug(\n `Agent hook ${hook.name}: parse failed, defaulting to ask (fail-safe)`,\n )\n emitStatusEvent(\n hook.event,\n toolName,\n hook.name,\n false,\n 'Failed to parse hook response',\n )\n return { success: true, decision: 'ask' }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Agent hook ${hook.name} error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: true, decision: 'ask' }\n }\n}\n\n/**\n * Resolve decision from hook output, supporting both CC formats:\n * - hookSpecificOutput.permissionDecision (new)\n * - top-level decision (old, CC community compat)\n */\nfunction resolveDecision(\n output: HookOutput,\n): 'approve' | 'block' | 'ask' | undefined {\n // Check hookSpecificOutput first (new format)\n if (output.hookSpecificOutput) {\n const specific = output.hookSpecificOutput as any\n if (specific.permissionDecision) {\n const mapping: Record<string, 'approve' | 'block' | 'ask'> = {\n allow: 'approve',\n deny: 'block',\n ask: 'ask',\n approve: 'approve',\n block: 'block',\n }\n return mapping[specific.permissionDecision] ?? output.decision\n }\n }\n\n // Fall back to top-level decision (old CC format)\n return output.decision\n}\n\n/**\n * Path to the env file set by a SessionStart hook via $CLAUDE_ENV_FILE.\n * Once set, all subsequent hooks load env vars from this file.\n */\nlet claudeEnvFilePath: string | undefined\n\n/**\n * Load environment variables from $CLAUDE_ENV_FILE if set.\n * File format: one KEY=VALUE per line, # comments, empty lines ignored.\n */\nfunction loadEnvFile(): Record<string, string> {\n const envFile = claudeEnvFilePath || process.env.CLAUDE_ENV_FILE\n if (!envFile || !existsSync(envFile)) return {}\n\n try {\n const content = readFileSync(envFile, 'utf-8')\n const vars: Record<string, string> = {}\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx <= 0) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n vars[key] = value\n }\n return vars\n } catch {\n return {}\n }\n}\n\n/**\n * Extract file paths from tool input for CLAUDE_FILE_PATHS env var\n */\nfunction extractFilePathsFromInput(\n toolInput: Record<string, unknown> | undefined,\n): string {\n if (!toolInput) return ''\n const paths: string[] = []\n if (typeof toolInput.file_path === 'string') paths.push(toolInput.file_path)\n if (typeof toolInput.path === 'string') paths.push(toolInput.path)\n if (typeof toolInput.notebook_path === 'string')\n paths.push(toolInput.notebook_path)\n return paths.join(':')\n}\n\n/**\n * Execute bash command with JSON stdin/stdout\n * Returns exit code for proper exit code 2 handling\n */\nasync function executeBashCommand(\n command: string,\n input: HookInput,\n options: {\n timeout: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n },\n): Promise<{\n stdout: string\n stderr: string\n exitCode: number | null\n timedOut?: boolean\n}> {\n return new Promise(resolve => {\n // Load persistent env vars from $CLAUDE_ENV_FILE\n const envFileVars = loadEnvFile()\n\n // Extract tool-specific env vars from input\n const toolName = 'tool_name' in input ? (input as any).tool_name : undefined\n const toolInput =\n 'tool_input' in input ? (input as any).tool_input : undefined\n const toolInputJson = toolInput ? JSON.stringify(toolInput) : ''\n const filePaths = extractFilePathsFromInput(toolInput)\n const shellCommand =\n toolName === 'Bash' && toolInput?.command ? String(toolInput.command) : ''\n\n const projectDir = getCwd()\n\n const env = {\n ...process.env,\n ...envFileVars,\n // CC-compatible env vars\n CLAUDE_PLUGIN_ROOT: options.pluginRoot,\n CLAUDE_SESSION_ID: options.sessionId,\n CLAUDE_CWD: projectDir,\n CLAUDE_TRANSCRIPT_PATH: options.transcriptPath || '',\n CLAUDE_PROJECT_DIR: projectDir,\n CLAUDE_WORKSPACE_DIR: projectDir,\n CLAUDE_TOOL_INPUT: toolInputJson,\n CLAUDE_FILE_PATHS: filePaths,\n CLAUDE_SHELL_COMMAND: shellCommand,\n // Minto-prefixed duplicates\n MINTO_PROJECT_DIR: projectDir,\n MINTO_WORKSPACE_DIR: projectDir,\n MINTO_TOOL_INPUT: toolInputJson,\n MINTO_FILE_PATHS: filePaths,\n MINTO_SHELL_COMMAND: shellCommand,\n }\n\n const child = spawn('bash', ['-c', command], {\n env,\n cwd: getCwd(),\n })\n\n let stdout = ''\n let stderr = ''\n let timedOut = false\n\n const timer = setTimeout(() => {\n timedOut = true\n child.kill('SIGTERM')\n setTimeout(() => {\n if (!child.killed) {\n child.kill('SIGKILL')\n }\n }, 1000)\n }, options.timeout)\n\n child.stdout?.on('data', data => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', data => {\n stderr += data.toString()\n })\n\n child.on('close', code => {\n clearTimeout(timer)\n\n if (timedOut) {\n resolve({ stdout: '', stderr: '', exitCode: null, timedOut: true })\n return\n }\n\n resolve({ stdout, stderr, exitCode: code })\n })\n\n child.on('error', error => {\n clearTimeout(timer)\n resolve({\n stdout: '',\n stderr: error.message,\n exitCode: 1,\n })\n })\n\n try {\n if (child.stdin) {\n child.stdin.write(JSON.stringify(input, null, 2))\n child.stdin.end()\n }\n } catch (error) {\n clearTimeout(timer)\n child.kill()\n resolve({\n stdout: '',\n stderr: `Failed to write to stdin: ${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n })\n }\n })\n}\n\n/**\n * Parse hook output JSON with event-specific field extraction\n */\nfunction parseHookOutput(\n stdout: string,\n eventName?: HookEvent,\n): HookOutput | null {\n if (!stdout.trim()) {\n return null\n }\n\n try {\n const jsonMatch = stdout.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) {\n logDebug('No JSON found in hook output')\n return null\n }\n\n const raw = JSON.parse(jsonMatch[0])\n const output: HookOutput = {}\n\n // Extract standard fields\n if (raw.continue !== undefined) output.continue = raw.continue\n if (raw.stopReason) output.stopReason = raw.stopReason\n if (raw.suppressOutput !== undefined)\n output.suppressOutput = raw.suppressOutput\n if (raw.systemMessage) output.systemMessage = raw.systemMessage\n\n // Extract top-level decision (CC community compat)\n if (raw.decision) {\n if (['approve', 'block', 'ask'].includes(raw.decision)) {\n output.decision = raw.decision\n }\n }\n if (raw.reason) output.reason = raw.reason\n\n // Extract event-specific output based on hookSpecificOutput or flat fields\n const specific = raw.hookSpecificOutput || raw\n\n if (eventName === HookEvent.PreToolUse) {\n if (\n specific.permissionDecision ||\n specific.updatedInput ||\n specific.permissionDecisionReason\n ) {\n output.hookSpecificOutput = {\n hookEventName: HookEvent.PreToolUse,\n permissionDecision: specific.permissionDecision,\n permissionDecisionReason: specific.permissionDecisionReason,\n updatedInput: specific.updatedInput,\n }\n }\n } else if (\n eventName === HookEvent.PostToolUse ||\n eventName === HookEvent.UserPromptSubmit ||\n eventName === HookEvent.SessionStart\n ) {\n if (specific.additionalContext) {\n output.hookSpecificOutput = {\n hookEventName: eventName,\n additionalContext: specific.additionalContext,\n } as any\n }\n\n // SessionStart: capture $CLAUDE_ENV_FILE for persistent env vars\n if (eventName === HookEvent.SessionStart && specific.envFile) {\n claudeEnvFilePath = specific.envFile\n process.env.CLAUDE_ENV_FILE = specific.envFile\n }\n }\n\n // Extract suppressNotification for Notification event\n if (eventName === HookEvent.Notification) {\n if (raw.suppressNotification !== undefined) {\n ;(output as any).suppressNotification = raw.suppressNotification\n }\n }\n\n return output\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Failed to parse hook output JSON: ${errorMsg}`)\n logDebug('Raw output:', stdout)\n return null\n }\n}\n\n/**\n * Execute all matching hooks for an event\n */\nexport async function executeHooksForEvent(\n event: HookEvent,\n hooks: LoadedHook[],\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult[]> {\n const matchingHooks = hooks.filter(hook => hook.event === event)\n\n if (matchingHooks.length === 0) {\n return []\n }\n\n logInfo(`Executing ${matchingHooks.length} hook(s) for event: ${event}`)\n\n // Execute all matching hooks in parallel (CC behavior)\n const results = await Promise.allSettled(\n matchingHooks.map(hook => executeHook(hook, input, options)),\n )\n\n return results.map(r =>\n r.status === 'fulfilled'\n ? r.value\n : { success: false, error: String(r.reason) },\n )\n}\n\n/**\n * Process hook decisions to determine final action\n */\nexport function processHookDecisions(results: HookExecutionResult[]): {\n shouldContinue: boolean\n shouldAskUser: boolean\n reason?: string\n updatedInput?: Record<string, unknown>\n additionalContext?: string\n} {\n // Collect additional context and updated input from all results\n let additionalContext: string | undefined\n let updatedInput: Record<string, unknown> | undefined\n\n for (const r of results) {\n if (!r.success || !r.output) continue\n const specific = r.output.hookSpecificOutput as any\n if (specific?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${specific.additionalContext}`\n : specific.additionalContext\n }\n if (specific?.updatedInput) {\n updatedInput = { ...(updatedInput || {}), ...specific.updatedInput }\n }\n }\n\n // If any hook says \"block\" (including exit code 2), we block\n const blockedResult = results.find(\n r => (r.success && r.decision === 'block') || r.blockedByExitCode2,\n )\n if (blockedResult) {\n const reason =\n blockedResult.blockReason ||\n blockedResult.output?.reason ||\n 'Blocked by hook'\n emitReminderEvent('hook:blocking_error', { hookName: 'hook', reason })\n return {\n shouldContinue: false,\n shouldAskUser: false,\n reason,\n }\n }\n\n // If any hook says \"ask\", we ask the user\n const askResult = results.find(r => r.success && r.decision === 'ask')\n if (askResult) {\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason: askResult.output?.reason || 'Hook requested user approval',\n }\n }\n\n // If any hook failed, we ask the user (fail-safe)\n const failedResult = results.find(r => !r.success)\n if (failedResult) {\n const reason = `Hook execution failed: ${failedResult.error}`\n emitReminderEvent('hook:stopped_continuation', { hookName: 'hook', reason })\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason,\n }\n }\n\n // Emit additional context reminder if hooks provided extra info\n if (additionalContext) {\n emitReminderEvent('hook:additional_context', {\n hookName: 'hook',\n content: additionalContext,\n })\n }\n\n // All hooks approved or had no decision\n return {\n shouldContinue: true,\n shouldAskUser: false,\n updatedInput,\n additionalContext,\n }\n}\n\n// ============================================================================\n// Hook Input Factories\n// ============================================================================\n\nexport function createPreToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n): PreToolUseInput {\n return {\n hook_event_name: HookEvent.PreToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n }\n}\n\nexport function createPostToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n toolOutput: Record<string, unknown>,\n): PostToolUseInput {\n return {\n hook_event_name: HookEvent.PostToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n }\n}\n\nexport function createUserPromptSubmitInput(\n sessionId: string,\n transcriptPath: string,\n userPrompt: string,\n): UserPromptSubmitInput {\n return {\n hook_event_name: HookEvent.UserPromptSubmit,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n user_prompt: userPrompt,\n }\n}\n\nexport function createSessionStartInput(\n sessionId: string,\n transcriptPath: string,\n): SessionStartInput {\n return {\n hook_event_name: HookEvent.SessionStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n source: 'startup' as const,\n permission_mode: 'default',\n }\n}\n\nexport function createSessionEndInput(\n sessionId: string,\n transcriptPath: string,\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other',\n): SessionEndInput {\n return {\n hook_event_name: HookEvent.SessionEnd,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n reason,\n }\n}\n\nexport function createPostToolUseFailureInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n error: string,\n errorType?: string,\n): PostToolUseFailureInput {\n return {\n hook_event_name: HookEvent.PostToolUseFailure,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n error,\n error_type: errorType,\n }\n}\n\nexport function createPermissionRequestInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n permissionType: 'read' | 'write' | 'execute' | 'network' | 'other',\n description?: string,\n): PermissionRequestInput {\n return {\n hook_event_name: HookEvent.PermissionRequest,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n permission_type: permissionType,\n description,\n }\n}\n\nexport function createStopInput(\n sessionId: string,\n transcriptPath: string,\n stopHookActive: boolean,\n): StopInput {\n return {\n hook_event_name: HookEvent.Stop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n stop_hook_active: stopHookActive,\n }\n}\n\nexport function createSubagentStartInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentDescription?: string,\n runInBackground?: boolean,\n): SubagentStartInput {\n return {\n hook_event_name: HookEvent.SubagentStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_description: agentDescription,\n run_in_background: runInBackground,\n }\n}\n\nexport function createSubagentStopInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentId?: string,\n stopHookActive?: boolean,\n): SubagentStopInput {\n return {\n hook_event_name: HookEvent.SubagentStop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_id: agentId,\n stop_hook_active: stopHookActive ?? false,\n }\n}\n\nexport function createNotificationInput(\n sessionId: string,\n transcriptPath: string,\n message: string,\n title?: string,\n type?: string,\n): NotificationInput {\n return {\n hook_event_name: HookEvent.Notification,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n message,\n ...(title ? { title } : {}),\n ...(type ? { notification_type: type } : {}),\n }\n}\n\nexport function createPreCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n customInstructions: string,\n): PreCompactInput {\n return {\n hook_event_name: HookEvent.PreCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n custom_instructions: customInstructions,\n }\n}\n\nexport function createPostCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n summary: string,\n compressionRatio: number,\n originalTokens: number,\n compressedTokens: number,\n): PostCompactInput {\n return {\n hook_event_name: HookEvent.PostCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n summary,\n compression_ratio: compressionRatio,\n original_tokens: originalTokens,\n compressed_tokens: compressedTokens,\n }\n}\n\nexport function createConfigChangeInput(\n sessionId: string,\n transcriptPath: string,\n source: 'settings' | 'project' | 'global' | 'env' | 'cli',\n filePath?: string,\n): ConfigChangeInput {\n return {\n hook_event_name: HookEvent.ConfigChange,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n source,\n file_path: filePath,\n }\n}\n\nexport function createTaskCompletedInput(\n sessionId: string,\n transcriptPath: string,\n taskId: string,\n subject: string,\n description?: string,\n): TaskCompletedInput {\n return {\n hook_event_name: HookEvent.TaskCompleted,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n task_id: taskId,\n subject,\n description,\n }\n}\n\nexport function createTeammateIdleInput(\n sessionId: string,\n transcriptPath: string,\n teammateName: string,\n teamName: string,\n): TeammateIdleInput {\n return {\n hook_event_name: HookEvent.TeammateIdle,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n teammate_name: teammateName,\n team_name: teamName,\n }\n}\n\nexport function createWorktreeCreateInput(\n sessionId: string,\n transcriptPath: string,\n worktreePath: string,\n agentId: string,\n agentType: string,\n): WorktreeCreateInput {\n return {\n hook_event_name: HookEvent.WorktreeCreate,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n worktree_path: worktreePath,\n agent_id: agentId,\n agent_type: agentType,\n }\n}\n\nexport function createWorktreeRemoveInput(\n sessionId: string,\n transcriptPath: string,\n worktreePath: string,\n agentId: string,\n agentType: string,\n success: boolean,\n): WorktreeRemoveInput {\n return {\n hook_event_name: HookEvent.WorktreeRemove,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n worktree_path: worktreePath,\n agent_id: agentId,\n agent_type: agentType,\n success,\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }