@within-7/minto 0.4.0 → 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
package/dist/tools.js CHANGED
@@ -1,9 +1,7 @@
1
- import { cacheToolDescriptions } from "./Tool.js";
1
+ import { cacheToolDescriptions, getToolDescriptionAsync } from "./Tool.js";
2
2
  import { TaskTool } from "./tools/TaskTool/TaskTool.js";
3
3
  import { ArchitectTool } from "./tools/ArchitectTool/ArchitectTool.js";
4
4
  import { BashTool } from "./tools/BashTool/BashTool.js";
5
- import { BashOutputTool } from "./tools/BashOutputTool/BashOutputTool.js";
6
- import { KillShellTool } from "./tools/KillShellTool/KillShellTool.js";
7
5
  import { AskExpertModelTool } from "./tools/AskExpertModelTool/AskExpertModelTool.js";
8
6
  import { AskUserQuestionTool } from "./tools/AskUserQuestionTool/AskUserQuestionTool.js";
9
7
  import { FileEditTool } from "./tools/FileEditTool/FileEditTool.js";
@@ -33,20 +31,32 @@ import { TaskStopTool } from "./tools/TaskStopTool/TaskStopTool.js";
33
31
  import { SlashCommandTool } from "./tools/SlashCommandTool/SlashCommandTool.js";
34
32
  import { ListMcpResourcesTool } from "./tools/ListMcpResourcesTool/ListMcpResourcesTool.js";
35
33
  import { ReadMcpResourceTool } from "./tools/ReadMcpResourceTool/ReadMcpResourceTool.js";
36
- import { getMCPTools } from "./services/mcpClient.js";
34
+ import { MCPSearchTool } from "./tools/MCPSearchTool/MCPSearchTool.js";
35
+ import { EnterWorktreeTool } from "./tools/EnterWorktreeTool/EnterWorktreeTool.js";
36
+ import { TeamCreateTool } from "./tools/TeamCreateTool/TeamCreateTool.js";
37
+ import { SendMessageTool } from "./tools/SendMessageTool/SendMessageTool.js";
38
+ import { TeamDeleteTool } from "./tools/TeamDeleteTool/TeamDeleteTool.js";
39
+ import {
40
+ getMCPTools,
41
+ isMCPToolActivated
42
+ } from "./services/mcpClient.js";
43
+ import { getModelContextLength } from "./utils/model.js";
37
44
  import { memoize } from "lodash-es";
38
- const ANT_ONLY_TOOLS = [
39
- MemoryReadTool,
40
- MemoryWriteTool
41
- ];
45
+ const ANT_ONLY_TOOLS = [MemoryReadTool, MemoryWriteTool];
46
+ function getToolSearchMode() {
47
+ const envVal = (process.env.MINTO_ENABLE_TOOL_SEARCH || process.env.ENABLE_TOOL_SEARCH || "auto").toLowerCase();
48
+ if (envVal === "always" || envVal === "1" || envVal === "true")
49
+ return "always";
50
+ if (envVal === "never" || envVal === "0" || envVal === "false") return "never";
51
+ return "auto";
52
+ }
53
+ function estimateTokens(text) {
54
+ return Math.ceil(text.length / 4);
55
+ }
42
56
  const getAllTools = () => {
43
57
  return [
44
- TaskTool,
45
- AskExpertModelTool,
46
- AskUserQuestionTool,
58
+ // Static description tools (high cache hit rate)
47
59
  BashTool,
48
- BashOutputTool,
49
- KillShellTool,
50
60
  GlobTool,
51
61
  GrepTool,
52
62
  LSTool,
@@ -57,25 +67,35 @@ const getAllTools = () => {
57
67
  NotebookReadTool,
58
68
  NotebookEditTool,
59
69
  ThinkTool,
60
- // Claude Code compatible task management tools
70
+ AskUserQuestionTool,
71
+ AskExpertModelTool,
72
+ // Task management tools
61
73
  TaskCreateTool,
62
74
  TaskUpdateTool,
63
75
  TaskGetTool,
64
76
  TaskListTool,
65
- // Legacy TodoWrite (kept for backward compatibility, may be deprecated)
66
77
  TodoWriteTool,
67
78
  WebSearchTool,
68
79
  URLFetcherTool,
69
- // Phase 4: Code intelligence and plan mode tools
80
+ // Plan mode and utility tools
70
81
  LspTool,
71
82
  EnterPlanModeTool,
72
83
  ExitPlanModeTool,
73
84
  TaskOutputTool,
74
85
  TaskStopTool,
75
86
  SlashCommandTool,
76
- // Phase 3: MCP Resource tools
87
+ // MCP Resource tools
77
88
  ListMcpResourcesTool,
78
89
  ReadMcpResourceTool,
90
+ MCPSearchTool,
91
+ // Worktree isolation
92
+ EnterWorktreeTool,
93
+ // Agent Teams tools (conditionally enabled via isEnabled())
94
+ TeamCreateTool,
95
+ SendMessageTool,
96
+ TeamDeleteTool,
97
+ // Dynamic description tools last (description changes per-request, breaks cache after this point)
98
+ TaskTool,
79
99
  ...ANT_ONLY_TOOLS
80
100
  ];
81
101
  };
@@ -91,14 +111,74 @@ async function getBuiltInTools(enableArchitect, options) {
91
111
  }
92
112
  return enabledTools;
93
113
  }
114
+ async function shouldDeferMCPTools(mcpTools) {
115
+ const mode = getToolSearchMode();
116
+ if (mode === "never") return false;
117
+ if (mode === "always") return mcpTools.length > 0;
118
+ if (mcpTools.length === 0) return false;
119
+ const contextLength = getModelContextLength("main");
120
+ const threshold = contextLength * 0.1;
121
+ let totalTokens = 0;
122
+ for (const tool of mcpTools) {
123
+ const desc = await getToolDescriptionAsync(tool);
124
+ totalTokens += estimateTokens(desc);
125
+ totalTokens += estimateTokens(tool.name);
126
+ if (tool.inputJSONSchema) {
127
+ totalTokens += estimateTokens(JSON.stringify(tool.inputJSONSchema));
128
+ }
129
+ }
130
+ return totalTokens > threshold;
131
+ }
132
+ async function partitionMCPTools(mcpTools) {
133
+ const { getDeferredMCPTools: getDeferred } = await import("./services/mcpClient.js");
134
+ const activeTools = [];
135
+ let deferredCount = 0;
136
+ for (const tool of mcpTools) {
137
+ if (isMCPToolActivated(tool.name)) {
138
+ activeTools.push(tool);
139
+ } else {
140
+ const desc = await getToolDescriptionAsync(tool);
141
+ const parts = tool.name.split("__");
142
+ const serverName = parts.length >= 2 ? parts[1] : "unknown";
143
+ const deferred = getDeferred();
144
+ if (!deferred.has(tool.name)) {
145
+ deferred.set(tool.name, {
146
+ name: tool.name,
147
+ description: desc,
148
+ serverName
149
+ });
150
+ }
151
+ deferredCount++;
152
+ }
153
+ }
154
+ return { activeTools, deferredCount };
155
+ }
94
156
  const getTools = memoize(
95
157
  async (enableArchitect) => {
96
- const tools = [...getAllTools(), ...await getMCPTools()];
158
+ const { isSimpleMode } = await import("./utils/simpleMode.js");
159
+ const mcpTools = isSimpleMode() ? [] : await getMCPTools();
160
+ const shouldDefer = await shouldDeferMCPTools(mcpTools);
161
+ let effectiveMCPTools;
162
+ if (shouldDefer) {
163
+ const { activeTools } = await partitionMCPTools(mcpTools);
164
+ effectiveMCPTools = activeTools;
165
+ } else {
166
+ effectiveMCPTools = mcpTools;
167
+ }
168
+ const tools = [...getAllTools(), ...effectiveMCPTools];
97
169
  if (enableArchitect) {
98
170
  tools.push(ArchitectTool);
99
171
  }
100
- const isEnabled = await Promise.all(tools.map((tool) => tool.isEnabled()));
101
- const enabledTools = tools.filter((_, i) => isEnabled[i]);
172
+ const seen = /* @__PURE__ */ new Set();
173
+ const uniqueTools = tools.filter((tool) => {
174
+ if (seen.has(tool.name)) return false;
175
+ seen.add(tool.name);
176
+ return true;
177
+ });
178
+ const isEnabled = await Promise.all(
179
+ uniqueTools.map((tool) => tool.isEnabled())
180
+ );
181
+ const enabledTools = uniqueTools.filter((_, i) => isEnabled[i]);
102
182
  await cacheToolDescriptions(enabledTools);
103
183
  return enabledTools;
104
184
  }
package/dist/tools.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/tools.ts"],
4
- "sourcesContent": ["import { Tool, cacheToolDescriptions } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\nimport { BashOutputTool } from './tools/BashOutputTool/BashOutputTool'\nimport { KillShellTool } from './tools/KillShellTool/KillShellTool'\nimport { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool'\nimport { FileEditTool } from './tools/FileEditTool/FileEditTool'\nimport { FileReadTool } from './tools/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'\nimport { GlobTool } from './tools/GlobTool/GlobTool'\nimport { GrepTool } from './tools/GrepTool/GrepTool'\nimport { LSTool } from './tools/LSTool/LSTool'\nimport { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool'\nimport { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool'\nimport { MultiEditTool } from './tools/MultiEditTool/MultiEditTool'\nimport { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool'\nimport { ThinkTool } from './tools/ThinkTool/ThinkTool'\nimport { TodoWriteTool } from './tools/TodoWriteTool/TodoWriteTool'\n// Claude Code compatible task management tools\nimport { TaskCreateTool } from './tools/TaskCreateTool/TaskCreateTool'\nimport { TaskUpdateTool } from './tools/TaskUpdateTool/TaskUpdateTool'\nimport { TaskGetTool } from './tools/TaskGetTool/TaskGetTool'\nimport { TaskListTool } from './tools/TaskListTool/TaskListTool'\nimport { WebSearchTool } from './tools/WebSearchTool/WebSearchTool'\nimport { URLFetcherTool } from './tools/URLFetcherTool/URLFetcherTool'\n// Phase 4: New tools for Claude Code CLI compatibility\nimport { LspTool } from './tools/LspTool/LspTool'\nimport { EnterPlanModeTool } from './tools/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './tools/PlanModeTool/ExitPlanModeTool'\nimport { TaskOutputTool } from './tools/TaskOutputTool/TaskOutputTool'\nimport { TaskStopTool } from './tools/TaskStopTool/TaskStopTool'\nimport { SlashCommandTool } from './tools/SlashCommandTool/SlashCommandTool'\n// Phase 3: MCP Resource tools\nimport { ListMcpResourcesTool } from './tools/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { ReadMcpResourceTool } from './tools/ReadMcpResourceTool/ReadMcpResourceTool'\nimport { getMCPTools } from './services/mcpClient'\nimport { memoize } from 'lodash-es'\n\nconst ANT_ONLY_TOOLS = [\n MemoryReadTool,\n MemoryWriteTool,\n]\n\n// Function to avoid circular dependencies that break bun\nexport const getAllTools = (): Tool[] => {\n return [\n TaskTool,\n AskExpertModelTool,\n AskUserQuestionTool,\n BashTool,\n BashOutputTool,\n KillShellTool,\n GlobTool,\n GrepTool,\n LSTool,\n FileReadTool,\n FileEditTool,\n MultiEditTool,\n FileWriteTool,\n NotebookReadTool,\n NotebookEditTool,\n ThinkTool,\n // Claude Code compatible task management tools\n TaskCreateTool,\n TaskUpdateTool,\n TaskGetTool,\n TaskListTool,\n // Legacy TodoWrite (kept for backward compatibility, may be deprecated)\n TodoWriteTool,\n WebSearchTool,\n URLFetcherTool,\n // Phase 4: Code intelligence and plan mode tools\n LspTool,\n EnterPlanModeTool,\n ExitPlanModeTool,\n TaskOutputTool,\n TaskStopTool,\n SlashCommandTool,\n // Phase 3: MCP Resource tools\n ListMcpResourcesTool,\n ReadMcpResourceTool,\n ...ANT_ONLY_TOOLS,\n ]\n}\n\n/**\n * Get built-in tools only (no MCP tools, no network I/O).\n * Returns in <100ms - suitable for instant REPL startup.\n */\nexport async function getBuiltInTools(\n enableArchitect?: boolean,\n options?: { skipDescriptionCache?: boolean },\n): Promise<Tool[]> {\n const tools = [...getAllTools()]\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n const isEnabled = await Promise.all(tools.map(t => t.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n if (!options?.skipDescriptionCache) {\n await cacheToolDescriptions(enabledTools)\n }\n return enabledTools\n}\n\nexport const getTools = memoize(\n async (enableArchitect?: boolean): Promise<Tool[]> => {\n const tools = [...getAllTools(), ...(await getMCPTools())]\n\n // Only include Architect tool if enabled via config or CLI flag\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n\n // Cache tool descriptions for synchronous access in adapters\n await cacheToolDescriptions(enabledTools)\n\n return enabledTools\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n\n/**\n * Invalidate the tools cache to force refresh\n * This should be called when:\n * - MCP servers are connected/disconnected\n * - Tool configuration changes\n * - Plugin tools are added/removed\n */\nexport function invalidateToolsCache(): void {\n getTools.cache.clear?.()\n getReadOnlyTools.cache.clear?.()\n}\n\n/**\n * Reload tools with fresh data\n * Convenience function that invalidates cache and returns new tools\n */\nexport async function reloadTools(enableArchitect?: boolean): Promise<Tool[]> {\n invalidateToolsCache()\n return getTools(enableArchitect)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Tool, cacheToolDescriptions, getToolDescriptionAsync } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\n// BashOutputTool and KillShellTool removed \u2014 unified into TaskOutputTool and TaskStopTool (CC v2.0.62)\nimport { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool'\nimport { FileEditTool } from './tools/FileEditTool/FileEditTool'\nimport { FileReadTool } from './tools/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'\nimport { GlobTool } from './tools/GlobTool/GlobTool'\nimport { GrepTool } from './tools/GrepTool/GrepTool'\nimport { LSTool } from './tools/LSTool/LSTool'\nimport { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool'\nimport { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool'\nimport { MultiEditTool } from './tools/MultiEditTool/MultiEditTool'\nimport { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool'\nimport { ThinkTool } from './tools/ThinkTool/ThinkTool'\nimport { TodoWriteTool } from './tools/TodoWriteTool/TodoWriteTool'\n// Claude Code compatible task management tools\nimport { TaskCreateTool } from './tools/TaskCreateTool/TaskCreateTool'\nimport { TaskUpdateTool } from './tools/TaskUpdateTool/TaskUpdateTool'\nimport { TaskGetTool } from './tools/TaskGetTool/TaskGetTool'\nimport { TaskListTool } from './tools/TaskListTool/TaskListTool'\nimport { WebSearchTool } from './tools/WebSearchTool/WebSearchTool'\nimport { URLFetcherTool } from './tools/URLFetcherTool/URLFetcherTool'\n// Phase 4: New tools for Claude Code CLI compatibility\nimport { LspTool } from './tools/LspTool/LspTool'\nimport { EnterPlanModeTool } from './tools/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './tools/PlanModeTool/ExitPlanModeTool'\nimport { TaskOutputTool } from './tools/TaskOutputTool/TaskOutputTool'\nimport { TaskStopTool } from './tools/TaskStopTool/TaskStopTool'\nimport { SlashCommandTool } from './tools/SlashCommandTool/SlashCommandTool'\n// Phase 3: MCP Resource tools\nimport { ListMcpResourcesTool } from './tools/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { ReadMcpResourceTool } from './tools/ReadMcpResourceTool/ReadMcpResourceTool'\n// Tool Search (CC-aligned: ToolSearch, was MCPSearch)\nimport { MCPSearchTool } from './tools/MCPSearchTool/MCPSearchTool'\n// Worktree isolation\nimport { EnterWorktreeTool } from './tools/EnterWorktreeTool/EnterWorktreeTool'\n// Agent Teams tools\nimport { TeamCreateTool } from './tools/TeamCreateTool/TeamCreateTool'\nimport { SendMessageTool } from './tools/SendMessageTool/SendMessageTool'\nimport { TeamDeleteTool } from './tools/TeamDeleteTool/TeamDeleteTool'\nimport {\n getMCPTools,\n getDeferredMCPTools,\n isMCPToolActivated,\n} from './services/mcpClient'\nimport { getModelContextLength } from './utils/model'\nimport { memoize } from 'lodash-es'\n\nconst ANT_ONLY_TOOLS = [MemoryReadTool, MemoryWriteTool]\n\n/**\n * Get the ENABLE_TOOL_SEARCH mode: \"auto\" | \"always\" | \"never\"\n */\nfunction getToolSearchMode(): 'auto' | 'always' | 'never' {\n const envVal = (\n process.env.MINTO_ENABLE_TOOL_SEARCH ||\n process.env.ENABLE_TOOL_SEARCH ||\n 'auto'\n ).toLowerCase()\n if (envVal === 'always' || envVal === '1' || envVal === 'true')\n return 'always'\n if (envVal === 'never' || envVal === '0' || envVal === 'false') return 'never'\n return 'auto'\n}\n\n/**\n * Estimate token count from a string (rough: chars / 4).\n */\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\n// Function to avoid circular dependencies that break bun\nexport const getAllTools = (): Tool[] => {\n // Tool ordering optimized for prompt caching:\n // Static descriptions first (stable cache prefix), dynamic descriptions last\n return [\n // Static description tools (high cache hit rate)\n BashTool,\n GlobTool,\n GrepTool,\n LSTool,\n FileReadTool,\n FileEditTool,\n MultiEditTool,\n FileWriteTool,\n NotebookReadTool,\n NotebookEditTool,\n ThinkTool,\n AskUserQuestionTool,\n AskExpertModelTool,\n // Task management tools\n TaskCreateTool,\n TaskUpdateTool,\n TaskGetTool,\n TaskListTool,\n TodoWriteTool,\n WebSearchTool,\n URLFetcherTool,\n // Plan mode and utility tools\n LspTool,\n EnterPlanModeTool,\n ExitPlanModeTool,\n TaskOutputTool,\n TaskStopTool,\n SlashCommandTool,\n // MCP Resource tools\n ListMcpResourcesTool,\n ReadMcpResourceTool,\n MCPSearchTool,\n // Worktree isolation\n EnterWorktreeTool,\n // Agent Teams tools (conditionally enabled via isEnabled())\n TeamCreateTool,\n SendMessageTool,\n TeamDeleteTool,\n // Dynamic description tools last (description changes per-request, breaks cache after this point)\n TaskTool,\n ...ANT_ONLY_TOOLS,\n ]\n}\n\n/**\n * Get built-in tools only (no MCP tools, no network I/O).\n * Returns in <100ms - suitable for instant REPL startup.\n */\nexport async function getBuiltInTools(\n enableArchitect?: boolean,\n options?: { skipDescriptionCache?: boolean },\n): Promise<Tool[]> {\n const tools = [...getAllTools()]\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n const isEnabled = await Promise.all(tools.map(t => t.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n if (!options?.skipDescriptionCache) {\n await cacheToolDescriptions(enabledTools)\n }\n return enabledTools\n}\n\n/**\n * Determine whether MCP tools should use deferred/search mode.\n * In deferred mode, only ToolSearch + already-activated tools are included.\n * The rest are stored in the deferred registry for on-demand activation.\n */\nasync function shouldDeferMCPTools(mcpTools: Tool[]): Promise<boolean> {\n const mode = getToolSearchMode()\n if (mode === 'never') return false\n if (mode === 'always') return mcpTools.length > 0\n\n // \"auto\" mode: defer if MCP descriptions exceed 10% of context\n if (mcpTools.length === 0) return false\n\n const contextLength = getModelContextLength('main')\n const threshold = contextLength * 0.1\n\n // Estimate total MCP tool description token count\n let totalTokens = 0\n for (const tool of mcpTools) {\n const desc = await getToolDescriptionAsync(tool)\n totalTokens += estimateTokens(desc)\n // Also account for the tool name and schema overhead\n totalTokens += estimateTokens(tool.name)\n if (tool.inputJSONSchema) {\n totalTokens += estimateTokens(JSON.stringify(tool.inputJSONSchema))\n }\n }\n\n return totalTokens > threshold\n}\n\n/**\n * Split MCP tools into active and deferred sets.\n * Active tools: already activated via ToolSearch.\n * Deferred tools: stored in the deferred registry with minimal metadata.\n */\nasync function partitionMCPTools(\n mcpTools: Tool[],\n): Promise<{ activeTools: Tool[]; deferredCount: number }> {\n const { getDeferredMCPTools: getDeferred } = await import(\n './services/mcpClient'\n )\n const activeTools: Tool[] = []\n let deferredCount = 0\n\n for (const tool of mcpTools) {\n if (isMCPToolActivated(tool.name)) {\n activeTools.push(tool)\n } else {\n // Store in deferred registry\n const desc = await getToolDescriptionAsync(tool)\n // Extract server name from full tool name: mcp__serverName__toolName\n const parts = tool.name.split('__')\n const serverName = parts.length >= 2 ? parts[1] : 'unknown'\n\n const deferred = getDeferred()\n if (!deferred.has(tool.name)) {\n deferred.set(tool.name, {\n name: tool.name,\n description: desc,\n serverName,\n })\n }\n deferredCount++\n }\n }\n\n return { activeTools, deferredCount }\n}\n\nexport const getTools = memoize(\n async (enableArchitect?: boolean): Promise<Tool[]> => {\n // Skip MCP tools entirely in simple mode for faster startup\n const { isSimpleMode } = await import('./utils/simpleMode')\n const mcpTools = isSimpleMode() ? [] : await getMCPTools()\n const shouldDefer = await shouldDeferMCPTools(mcpTools)\n\n let effectiveMCPTools: Tool[]\n if (shouldDefer) {\n const { activeTools } = await partitionMCPTools(mcpTools)\n effectiveMCPTools = activeTools\n } else {\n effectiveMCPTools = mcpTools\n }\n\n const tools = [...getAllTools(), ...effectiveMCPTools]\n\n // Only include Architect tool if enabled via config or CLI flag\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n\n // Deduplicate by tool name (built-in tools take priority over MCP duplicates)\n const seen = new Set<string>()\n const uniqueTools = tools.filter(tool => {\n if (seen.has(tool.name)) return false\n seen.add(tool.name)\n return true\n })\n\n const isEnabled = await Promise.all(\n uniqueTools.map(tool => tool.isEnabled()),\n )\n const enabledTools = uniqueTools.filter((_, i) => isEnabled[i])\n\n // Cache tool descriptions for synchronous access in adapters\n await cacheToolDescriptions(enabledTools)\n\n return enabledTools\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n\n/**\n * Invalidate the tools cache to force refresh\n * This should be called when:\n * - MCP servers are connected/disconnected\n * - Tool configuration changes\n * - Plugin tools are added/removed\n * - MCP tools are activated via ToolSearch\n */\nexport function invalidateToolsCache(): void {\n getTools.cache.clear?.()\n getReadOnlyTools.cache.clear?.()\n}\n\n/**\n * Reload tools with fresh data\n * Convenience function that invalidates cache and returns new tools\n */\nexport async function reloadTools(enableArchitect?: boolean): Promise<Tool[]> {\n invalidateToolsCache()\n return getTools(enableArchitect)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,7 @@
1
1
  const PERMISSION_LEVELS = {
2
2
  plan: 0,
3
+ delegate: 0,
4
+ // Restricted like plan
3
5
  default: 1,
4
6
  acceptEdits: 2,
5
7
  dontAsk: 3,
@@ -33,9 +35,9 @@ const MODE_CONFIGS = {
33
35
  label: "ACCEPT EDITS",
34
36
  icon: "\u2705",
35
37
  color: "green",
36
- description: "Auto-approve edit operations",
38
+ description: "Auto-approve file edits within working directory; other tools still follow normal permission flow",
37
39
  inlineIcon: "\u23F5\u23F5",
38
- inlineLabel: "accept edits on",
40
+ inlineLabel: "auto-accept edits on",
39
41
  inlineColor: "green",
40
42
  compactLabel: "edits",
41
43
  allowedTools: ["*"],
@@ -50,7 +52,7 @@ const MODE_CONFIGS = {
50
52
  label: "DONT ASK",
51
53
  icon: "\u{1F92B}",
52
54
  color: "cyan",
53
- description: "Trust agent - no permission prompts",
55
+ description: "Auto-deny tools not in permissions.allow; safe/read-only tools still allowed",
54
56
  inlineIcon: "\u23F5\u23F5",
55
57
  inlineLabel: "don't ask on",
56
58
  inlineColor: "cyan",
@@ -88,6 +90,31 @@ const MODE_CONFIGS = {
88
90
  bypassValidation: false
89
91
  }
90
92
  },
93
+ delegate: {
94
+ name: "delegate",
95
+ label: "DELEGATE",
96
+ icon: "\u{1F465}",
97
+ color: "magenta",
98
+ description: "Delegate mode - team/task tools only",
99
+ inlineIcon: "\u{1F465}",
100
+ inlineLabel: "delegate mode on",
101
+ inlineColor: "magenta",
102
+ compactLabel: "delegate",
103
+ allowedTools: [
104
+ "TeamCreate",
105
+ "TeamDelete",
106
+ "SendMessage",
107
+ "TaskCreate",
108
+ "TaskGet",
109
+ "TaskUpdate",
110
+ "TaskList"
111
+ ],
112
+ restrictions: {
113
+ readOnly: false,
114
+ requireConfirmation: true,
115
+ bypassValidation: false
116
+ }
117
+ },
91
118
  bypassPermissions: {
92
119
  name: "bypassPermissions",
93
120
  label: "BYPASS PERMISSIONS",
@@ -106,18 +133,20 @@ const MODE_CONFIGS = {
106
133
  }
107
134
  }
108
135
  };
109
- function getNextPermissionMode(currentMode, isBypassAvailable = true) {
136
+ function getNextPermissionMode(currentMode, isBypassAvailable = false) {
110
137
  switch (currentMode) {
111
138
  case "default":
112
139
  return "acceptEdits";
113
140
  case "acceptEdits":
114
- return "dontAsk";
115
- case "dontAsk":
116
141
  return "plan";
117
142
  case "plan":
118
143
  return isBypassAvailable ? "bypassPermissions" : "default";
119
144
  case "bypassPermissions":
120
145
  return "default";
146
+ // System-managed modes: cycle back to default
147
+ case "dontAsk":
148
+ case "delegate":
149
+ return "default";
121
150
  default:
122
151
  return "default";
123
152
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/PermissionMode.ts"],
4
- "sourcesContent": ["// Permission mode types retained for compatibility with earlier agent implementations\n// Extended for Claude Code specification compliance\nexport type PermissionMode =\n | 'default' // Normal permission checking\n | 'acceptEdits' // Auto-approve file edit operations\n | 'dontAsk' // Trust agent, no permission prompts (Claude Code spec)\n | 'plan' // Read-only research and planning mode\n | 'bypassPermissions' // All permissions bypassed (dangerous)\n\n// Permission level hierarchy for validation\n// Lower number = more restrictive\nexport const PERMISSION_LEVELS: Record<PermissionMode, number> = {\n plan: 0,\n default: 1,\n acceptEdits: 2,\n dontAsk: 3,\n bypassPermissions: 4,\n}\n\n/**\n * Validate that agent permission mode does not exceed session permission level\n * Returns the effective permission mode (capped at session level)\n */\nexport function validateAgentPermission(\n agentMode: PermissionMode,\n sessionMode: PermissionMode,\n): PermissionMode {\n const agentLevel = PERMISSION_LEVELS[agentMode] ?? 1\n const sessionLevel = PERMISSION_LEVELS[sessionMode] ?? 1\n return agentLevel <= sessionLevel ? agentMode : sessionMode\n}\n\nexport interface PermissionContext {\n mode: PermissionMode\n allowedTools: string[]\n allowedPaths: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n metadata: {\n activatedAt?: string\n previousMode?: PermissionMode\n transitionCount: number\n }\n}\n\nexport interface ModeConfig {\n name: PermissionMode\n label: string\n icon: string\n color: string\n description: string\n /** Claude Code-style inline icon for footer display (e.g. '\u23F5\u23F5', '\u23F8') */\n inlineIcon: string\n /** Claude Code-style short label for footer display (e.g. 'accept edits on') */\n inlineLabel: string\n /** Terminal color name for the inline footer indicator */\n inlineColor: string\n /** Short compact label for persistent right-side badge (e.g. 'edits', 'plan') */\n compactLabel: string\n allowedTools: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n}\n\n// Mode configuration preserved for Claude Code parity\nexport const MODE_CONFIGS: Record<PermissionMode, ModeConfig> = {\n default: {\n name: 'default',\n label: 'DEFAULT',\n icon: '\uD83D\uDD12',\n color: 'blue',\n description: 'Standard permission checking',\n inlineIcon: '',\n inlineLabel: '',\n inlineColor: '',\n compactLabel: '',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n acceptEdits: {\n name: 'acceptEdits',\n label: 'ACCEPT EDITS',\n icon: '\u2705',\n color: 'green',\n description: 'Auto-approve edit operations',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'accept edits on',\n inlineColor: 'green',\n compactLabel: 'edits',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n dontAsk: {\n name: 'dontAsk',\n label: 'DONT ASK',\n icon: '\uD83E\uDD2B',\n color: 'cyan',\n description: 'Trust agent - no permission prompts',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: \"don't ask on\",\n inlineColor: 'cyan',\n compactLabel: 'auto',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n plan: {\n name: 'plan',\n label: 'PLAN MODE',\n icon: '\uD83D\uDCDD',\n color: 'yellow',\n description: 'Research and planning - read-only tools only',\n inlineIcon: '\u23F8',\n inlineLabel: 'plan mode on',\n inlineColor: 'yellow',\n compactLabel: 'plan',\n allowedTools: [\n 'Read',\n 'Grep',\n 'Glob',\n 'LS',\n 'WebSearch',\n 'WebFetch',\n 'NotebookRead',\n 'exit_plan_mode',\n ],\n restrictions: {\n readOnly: true,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n bypassPermissions: {\n name: 'bypassPermissions',\n label: 'BYPASS PERMISSIONS',\n icon: '\uD83D\uDD13',\n color: 'red',\n description: 'All permissions bypassed',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'bypass permissions on',\n inlineColor: 'red',\n compactLabel: 'bypass',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: true,\n },\n },\n}\n\n// Mode cycling function preserved from the Claude Code workflow\nexport function getNextPermissionMode(\n currentMode: PermissionMode,\n isBypassAvailable: boolean = true,\n): PermissionMode {\n switch (currentMode) {\n case 'default':\n return 'acceptEdits'\n case 'acceptEdits':\n return 'dontAsk'\n case 'dontAsk':\n return 'plan'\n case 'plan':\n return isBypassAvailable ? 'bypassPermissions' : 'default'\n case 'bypassPermissions':\n return 'default'\n default:\n return 'default'\n }\n}\n"],
5
- "mappings": "AAWO,MAAM,oBAAoD;AAAA,EAC/D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,mBAAmB;AACrB;AAMO,SAAS,wBACd,WACA,aACgB;AAChB,QAAM,aAAa,kBAAkB,SAAS,KAAK;AACnD,QAAM,eAAe,kBAAkB,WAAW,KAAK;AACvD,SAAO,cAAc,eAAe,YAAY;AAClD;AAyCO,MAAM,eAAmD;AAAA,EAC9D,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AACF;AAGO,SAAS,sBACd,aACA,oBAA6B,MACb;AAChB,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,oBAAoB,sBAAsB;AAAA,IACnD,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;",
4
+ "sourcesContent": ["// Permission mode types retained for compatibility with earlier agent implementations\n// Extended for Claude Code specification compliance\nexport type PermissionMode =\n | 'default' // Normal permission checking \u2014 prompts for each tool\n | 'acceptEdits' // Auto-approve file edits within working directory; Bash still asks\n | 'dontAsk' // Auto-deny tools not in permissions.allow; safe tools still allowed\n | 'plan' // Read-only research and planning mode\n | 'delegate' // Team/task tools only (Minto Shift+Tab delegate mode)\n | 'bypassPermissions' // All permissions bypassed (dangerous)\n\n// Permission level hierarchy for validation\n// Lower number = more restrictive\nexport const PERMISSION_LEVELS: Record<PermissionMode, number> = {\n plan: 0,\n delegate: 0, // Restricted like plan\n default: 1,\n acceptEdits: 2,\n dontAsk: 3,\n bypassPermissions: 4,\n}\n\n/**\n * Validate that agent permission mode does not exceed session permission level\n * Returns the effective permission mode (capped at session level)\n */\nexport function validateAgentPermission(\n agentMode: PermissionMode,\n sessionMode: PermissionMode,\n): PermissionMode {\n const agentLevel = PERMISSION_LEVELS[agentMode] ?? 1\n const sessionLevel = PERMISSION_LEVELS[sessionMode] ?? 1\n return agentLevel <= sessionLevel ? agentMode : sessionMode\n}\n\nexport interface PermissionContext {\n mode: PermissionMode\n allowedTools: string[]\n allowedPaths: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n metadata: {\n activatedAt?: string\n previousMode?: PermissionMode\n transitionCount: number\n }\n}\n\nexport interface ModeConfig {\n name: PermissionMode\n label: string\n icon: string\n color: string\n description: string\n /** Claude Code-style inline icon for footer display (e.g. '\u23F5\u23F5', '\u23F8') */\n inlineIcon: string\n /** Claude Code-style short label for footer display (e.g. 'accept edits on') */\n inlineLabel: string\n /** Terminal color name for the inline footer indicator */\n inlineColor: string\n /** Short compact label for persistent right-side badge (e.g. 'edits', 'plan') */\n compactLabel: string\n allowedTools: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n}\n\n// Mode configuration preserved for Claude Code parity\nexport const MODE_CONFIGS: Record<PermissionMode, ModeConfig> = {\n default: {\n name: 'default',\n label: 'DEFAULT',\n icon: '\uD83D\uDD12',\n color: 'blue',\n description: 'Standard permission checking',\n inlineIcon: '',\n inlineLabel: '',\n inlineColor: '',\n compactLabel: '',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n acceptEdits: {\n name: 'acceptEdits',\n label: 'ACCEPT EDITS',\n icon: '\u2705',\n color: 'green',\n description:\n 'Auto-approve file edits within working directory; other tools still follow normal permission flow',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'auto-accept edits on',\n inlineColor: 'green',\n compactLabel: 'edits',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n dontAsk: {\n name: 'dontAsk',\n label: 'DONT ASK',\n icon: '\uD83E\uDD2B',\n color: 'cyan',\n description:\n 'Auto-deny tools not in permissions.allow; safe/read-only tools still allowed',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: \"don't ask on\",\n inlineColor: 'cyan',\n compactLabel: 'auto',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n plan: {\n name: 'plan',\n label: 'PLAN MODE',\n icon: '\uD83D\uDCDD',\n color: 'yellow',\n description: 'Research and planning - read-only tools only',\n inlineIcon: '\u23F8',\n inlineLabel: 'plan mode on',\n inlineColor: 'yellow',\n compactLabel: 'plan',\n allowedTools: [\n 'Read',\n 'Grep',\n 'Glob',\n 'LS',\n 'WebSearch',\n 'WebFetch',\n 'NotebookRead',\n 'exit_plan_mode',\n ],\n restrictions: {\n readOnly: true,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n delegate: {\n name: 'delegate',\n label: 'DELEGATE',\n icon: '\uD83D\uDC65',\n color: 'magenta',\n description: 'Delegate mode - team/task tools only',\n inlineIcon: '\uD83D\uDC65',\n inlineLabel: 'delegate mode on',\n inlineColor: 'magenta',\n compactLabel: 'delegate',\n allowedTools: [\n 'TeamCreate',\n 'TeamDelete',\n 'SendMessage',\n 'TaskCreate',\n 'TaskGet',\n 'TaskUpdate',\n 'TaskList',\n ],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n bypassPermissions: {\n name: 'bypassPermissions',\n label: 'BYPASS PERMISSIONS',\n icon: '\uD83D\uDD13',\n color: 'red',\n description: 'All permissions bypassed',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'bypass permissions on',\n inlineColor: 'red',\n compactLabel: 'bypass',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: true,\n },\n },\n}\n\n/**\n * User-facing Shift+Tab cycle for permission modes.\n *\n * Only modes safe for interactive use are included:\n * default \u2192 acceptEdits \u2192 plan \u2192 [bypassPermissions] \u2192 default\n *\n * Excluded from manual cycling (system-managed only):\n * - `dontAsk`: Designed for CI/CD \u2014 auto-denies tools not in permissions.allow.\n * Switching to this interactively would break the AI's ability to work.\n * Activate via CLI flag or programmatic setMode().\n * - `delegate`: Only meaningful when a team is active \u2014 restricts to coordination\n * tools only. Without an active team, the AI becomes completely inoperable.\n * Activate programmatically when spawning team workflows.\n */\nexport function getNextPermissionMode(\n currentMode: PermissionMode,\n isBypassAvailable: boolean = false,\n): PermissionMode {\n switch (currentMode) {\n case 'default':\n return 'acceptEdits'\n case 'acceptEdits':\n return 'plan'\n case 'plan':\n return isBypassAvailable ? 'bypassPermissions' : 'default'\n case 'bypassPermissions':\n return 'default'\n // System-managed modes: cycle back to default\n case 'dontAsk':\n case 'delegate':\n return 'default'\n default:\n return 'default'\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -16,6 +16,8 @@ var HookEvent = /* @__PURE__ */ ((HookEvent2) => {
16
16
  HookEvent2["ConfigChange"] = "ConfigChange";
17
17
  HookEvent2["TaskCompleted"] = "TaskCompleted";
18
18
  HookEvent2["TeammateIdle"] = "TeammateIdle";
19
+ HookEvent2["WorktreeCreate"] = "WorktreeCreate";
20
+ HookEvent2["WorktreeRemove"] = "WorktreeRemove";
19
21
  return HookEvent2;
20
22
  })(HookEvent || {});
21
23
  const HookDefinitionSchema = z.object({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/hooks.ts"],
4
- "sourcesContent": ["/**\n * Hooks System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Hook lifecycle events\n * Full Claude Code CLI compatible set\n */\nexport enum HookEvent {\n // Tool lifecycle\n PreToolUse = 'PreToolUse',\n PostToolUse = 'PostToolUse',\n PostToolUseFailure = 'PostToolUseFailure',\n\n // Permission events\n PermissionRequest = 'PermissionRequest',\n\n // User interaction\n UserPromptSubmit = 'UserPromptSubmit',\n\n // Session lifecycle\n SessionStart = 'SessionStart',\n SessionEnd = 'SessionEnd',\n\n // Execution control\n Stop = 'Stop',\n\n // Subagent lifecycle\n SubagentStart = 'SubagentStart',\n SubagentStop = 'SubagentStop',\n\n // Notifications\n Notification = 'Notification',\n\n // Context management\n PreCompact = 'PreCompact',\n PostCompact = 'PostCompact',\n\n // Configuration\n ConfigChange = 'ConfigChange',\n\n // Task lifecycle\n TaskCompleted = 'TaskCompleted',\n\n // Team collaboration\n TeammateIdle = 'TeammateIdle',\n}\n\n/**\n * Hook execution types\n */\nexport type HookType = 'command' | 'prompt' | 'agent'\n\n/**\n * Hook matcher configuration\n */\nexport interface HookMatcher {\n /** Pattern to match tool names (regex supported). Use \"*\" or \"\" to match all. */\n matcher?: string\n\n /** Pattern to match tool input fields (regex values). CC community compatible. */\n toolInput?: Record<string, string>\n\n /** Array of hooks to execute when matcher matches */\n hooks: HookDefinition[]\n}\n\n/**\n * Individual hook definition\n */\nexport interface HookDefinition {\n /** Hook execution type */\n type: HookType\n\n /** Bash command to execute (for type=\"command\") */\n command?: string\n\n /** Prompt to send to LLM (for type=\"prompt\" or type=\"agent\") */\n prompt?: string\n\n /** Optional timeout in seconds (default: 30 for command, 30 for prompt, 60 for agent) */\n timeout?: number\n\n /** Optional description of what this hook does */\n description?: string\n\n /** Run hook asynchronously (fire-and-forget, result via systemMessage next turn) */\n async?: boolean\n\n /** Only execute once per session */\n once?: boolean\n}\n\n/**\n * hooks.json file schema\n */\nexport interface HooksConfig {\n /** Optional description for plugin hooks */\n description?: string\n\n /** Hook configurations by event type */\n hooks: Partial<Record<HookEvent, HookMatcher[]>>\n}\n\n/**\n * Hook execution input (passed to hook as JSON stdin)\n */\nexport interface HookInput {\n /** Session identifier */\n session_id: string\n\n /** Path to conversation transcript */\n transcript_path: string\n\n /** Current working directory */\n cwd: string\n\n /** Permission mode (default, plan, acceptEdits, bypassPermissions) */\n permission_mode: string\n\n /** Hook event name */\n hook_event_name: HookEvent\n\n /** Event-specific additional fields */\n [key: string]: any\n}\n\n/**\n * PreToolUse hook input\n */\nexport interface PreToolUseInput extends HookInput {\n hook_event_name: HookEvent.PreToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook input\n */\nexport interface PostToolUseInput extends HookInput {\n hook_event_name: HookEvent.PostToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n tool_output: Record<string, unknown>\n}\n\n/**\n * PostToolUseFailure hook input (new)\n */\nexport interface PostToolUseFailureInput extends HookInput {\n hook_event_name: HookEvent.PostToolUseFailure\n tool_name: string\n tool_input: Record<string, unknown>\n error: string\n error_type?: string\n}\n\n/**\n * PermissionRequest hook input (new)\n */\nexport interface PermissionRequestInput extends HookInput {\n hook_event_name: HookEvent.PermissionRequest\n tool_name: string\n tool_input: Record<string, unknown>\n permission_type: 'read' | 'write' | 'execute' | 'network' | 'other'\n description?: string\n}\n\n/**\n * UserPromptSubmit hook input\n */\nexport interface UserPromptSubmitInput extends HookInput {\n hook_event_name: HookEvent.UserPromptSubmit\n user_prompt: string\n}\n\n/**\n * SessionStart hook input\n */\nexport interface SessionStartInput extends HookInput {\n hook_event_name: HookEvent.SessionStart\n source: 'startup' | 'resume' | 'clear' | 'compact'\n}\n\n/**\n * SessionEnd hook input\n */\nexport interface SessionEndInput extends HookInput {\n hook_event_name: HookEvent.SessionEnd\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other'\n}\n\n/**\n * Stop hook input\n */\nexport interface StopInput extends HookInput {\n hook_event_name: HookEvent.Stop\n stop_hook_active: boolean\n}\n\n/**\n * SubagentStart hook input (new)\n */\nexport interface SubagentStartInput extends HookInput {\n hook_event_name: HookEvent.SubagentStart\n agent_type: string\n agent_description?: string\n run_in_background?: boolean\n}\n\n/**\n * SubagentStop hook input\n */\nexport interface SubagentStopInput extends HookInput {\n hook_event_name: HookEvent.SubagentStop\n agent_type: string\n agent_id?: string\n stop_hook_active: boolean\n}\n\n/**\n * Notification hook input\n */\nexport interface NotificationInput extends HookInput {\n hook_event_name: HookEvent.Notification\n message: string\n}\n\n/**\n * PreCompact hook input\n */\nexport interface PreCompactInput extends HookInput {\n hook_event_name: HookEvent.PreCompact\n trigger: 'manual' | 'auto'\n custom_instructions: string\n}\n\n/**\n * PostCompact hook input\n */\nexport interface PostCompactInput extends HookInput {\n hook_event_name: HookEvent.PostCompact\n trigger: 'manual' | 'auto'\n summary: string\n compression_ratio: number\n original_tokens: number\n compressed_tokens: number\n}\n\n/**\n * ConfigChange hook input\n */\nexport interface ConfigChangeInput extends HookInput {\n hook_event_name: HookEvent.ConfigChange\n source: 'settings' | 'project' | 'global' | 'env' | 'cli'\n file_path?: string\n}\n\n/**\n * TaskCompleted hook input\n */\nexport interface TaskCompletedInput extends HookInput {\n hook_event_name: HookEvent.TaskCompleted\n task_id: string\n subject: string\n description?: string\n}\n\n/**\n * TeammateIdle hook input\n */\nexport interface TeammateIdleInput extends HookInput {\n hook_event_name: HookEvent.TeammateIdle\n teammate_name: string\n team_name: string\n}\n\n/**\n * Hook execution output (from hook stdout as JSON)\n */\nexport interface HookOutput {\n /** Whether Claude should continue after hook execution */\n continue?: boolean\n\n /** Message shown when continue is false */\n stopReason?: string\n\n /** Hide stdout from transcript mode */\n suppressOutput?: boolean\n\n /** Optional warning message shown to user */\n systemMessage?: string\n\n /** Hook-specific output fields */\n hookSpecificOutput?: HookSpecificOutput\n\n /** Deprecated: Use hookSpecificOutput.permissionDecision instead */\n decision?: 'approve' | 'block'\n\n /** Deprecated: Use hookSpecificOutput.permissionDecisionReason instead */\n reason?: string\n}\n\n/**\n * Hook-specific output for different events\n */\nexport type HookSpecificOutput =\n | PreToolUseOutput\n | PostToolUseOutput\n | UserPromptSubmitOutput\n | SessionStartOutput\n\n/**\n * PreToolUse hook-specific output\n */\nexport interface PreToolUseOutput {\n hookEventName: HookEvent.PreToolUse\n\n /** Permission decision: allow (bypass), deny (block), ask (prompt user) */\n permissionDecision: 'allow' | 'deny' | 'ask'\n\n /** Reason shown to user (allow/ask) or Claude (deny) */\n permissionDecisionReason?: string\n\n /** Modified tool input parameters */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook-specific output\n */\nexport interface PostToolUseOutput {\n hookEventName: HookEvent.PostToolUse\n\n /** Additional context for Claude to consider */\n additionalContext?: string\n}\n\n/**\n * UserPromptSubmit hook-specific output\n */\nexport interface UserPromptSubmitOutput {\n hookEventName: HookEvent.UserPromptSubmit\n\n /** Additional context to add to conversation */\n additionalContext?: string\n}\n\n/**\n * SessionStart hook-specific output\n */\nexport interface SessionStartOutput {\n hookEventName: HookEvent.SessionStart\n\n /** Additional context to load at session start */\n additionalContext?: string\n}\n\n/**\n * Hook execution result (internal)\n */\nexport interface HookExecutionResult {\n /** Whether hook execution succeeded */\n success: boolean\n\n /** Exit code from hook command */\n exitCode: number\n\n /** Standard output */\n stdout: string\n\n /** Standard error */\n stderr: string\n\n /** Parsed JSON output (if valid) */\n output?: HookOutput\n\n /** Error if execution failed */\n error?: Error\n\n /** Execution time in milliseconds */\n executionTime: number\n}\n\n/**\n * Zod schema for hooks.json validation\n */\nexport const HookDefinitionSchema = z.object({\n type: z.enum(['command', 'prompt', 'agent']),\n command: z.string().optional(),\n prompt: z.string().optional(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n async: z.boolean().optional(),\n once: z.boolean().optional(),\n})\n\nexport const HookMatcherSchema = z.object({\n matcher: z.string().optional(),\n toolInput: z.record(z.string()).optional(),\n hooks: z.array(HookDefinitionSchema),\n})\n\nexport const HooksConfigSchema = z.object({\n description: z.string().optional(),\n hooks: z\n .record(z.nativeEnum(HookEvent), z.array(HookMatcherSchema))\n .optional(),\n})\n\n/**\n * Hook execution context (passed to executor)\n */\nexport interface HookExecutionContext {\n /** Hook definition to execute */\n hook: HookDefinition\n\n /** Hook input data */\n input: HookInput\n\n /** Environment variables to pass to hook */\n env?: Record<string, string>\n\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal\n}\n\n/**\n * Hook decision result (processed from hook output)\n */\nexport interface HookDecision {\n /** Allow the action */\n allow: boolean\n\n /** Block the action */\n block: boolean\n\n /** Ask user for confirmation */\n ask: boolean\n\n /** Reason for decision */\n reason?: string\n\n /** Message to show to user */\n systemMessage?: string\n\n /** Stop execution entirely */\n stop: boolean\n\n /** Stop reason */\n stopReason?: string\n\n /** Additional context to inject */\n additionalContext?: string\n\n /** Modified tool input (for PreToolUse) */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * Loaded hook (runtime representation)\n */\nexport interface LoadedHook {\n /** Hook name/identifier */\n name: string\n\n /** File path to hook definition */\n filePath: string\n\n /** Hook configuration */\n config: HookDefinition\n\n /** Source plugin name */\n pluginName: string\n\n /** Hook event this hook responds to */\n event: HookEvent\n\n /** Matcher pattern (if applicable) */\n matcher?: string\n}\n"],
5
- "mappings": "AAIA,SAAS,SAAS;AAMX,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,wBAAqB;AAGrB,EAAAA,WAAA,uBAAoB;AAGpB,EAAAA,WAAA,sBAAmB;AAGnB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,gBAAa;AAGb,EAAAA,WAAA,UAAO;AAGP,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AAGd,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,mBAAgB;AAGhB,EAAAA,WAAA,kBAAe;AArCL,SAAAA;AAAA,GAAA;AA2XL,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,KAAK,CAAC,WAAW,UAAU,OAAO,CAAC;AAAA,EAC3C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,MAAM,EAAE,QAAQ,EAAE,SAAS;AAC7B,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,OAAO,EAAE,MAAM,oBAAoB;AACrC,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EACJ,OAAO,EAAE,WAAW,SAAS,GAAG,EAAE,MAAM,iBAAiB,CAAC,EAC1D,SAAS;AACd,CAAC;",
4
+ "sourcesContent": ["/**\n * Hooks System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Hook lifecycle events\n * Full Claude Code CLI compatible set\n */\nexport enum HookEvent {\n // Tool lifecycle\n PreToolUse = 'PreToolUse',\n PostToolUse = 'PostToolUse',\n PostToolUseFailure = 'PostToolUseFailure',\n\n // Permission events\n PermissionRequest = 'PermissionRequest',\n\n // User interaction\n UserPromptSubmit = 'UserPromptSubmit',\n\n // Session lifecycle\n SessionStart = 'SessionStart',\n SessionEnd = 'SessionEnd',\n\n // Execution control\n Stop = 'Stop',\n\n // Subagent lifecycle\n SubagentStart = 'SubagentStart',\n SubagentStop = 'SubagentStop',\n\n // Notifications\n Notification = 'Notification',\n\n // Context management\n PreCompact = 'PreCompact',\n PostCompact = 'PostCompact',\n\n // Configuration\n ConfigChange = 'ConfigChange',\n\n // Task lifecycle\n TaskCompleted = 'TaskCompleted',\n\n // Team collaboration\n TeammateIdle = 'TeammateIdle',\n\n // Worktree lifecycle\n WorktreeCreate = 'WorktreeCreate',\n WorktreeRemove = 'WorktreeRemove',\n}\n\n/**\n * Hook execution types\n */\nexport type HookType = 'command' | 'prompt' | 'agent'\n\n/**\n * Hook matcher configuration\n */\nexport interface HookMatcher {\n /** Pattern to match tool names (regex supported). Use \"*\" or \"\" to match all. */\n matcher?: string\n\n /** Pattern to match tool input fields (regex values). CC community compatible. */\n toolInput?: Record<string, string>\n\n /** Array of hooks to execute when matcher matches */\n hooks: HookDefinition[]\n}\n\n/**\n * Individual hook definition\n */\nexport interface HookDefinition {\n /** Hook execution type */\n type: HookType\n\n /** Bash command to execute (for type=\"command\") */\n command?: string\n\n /** Prompt to send to LLM (for type=\"prompt\" or type=\"agent\") */\n prompt?: string\n\n /** Optional timeout in seconds (default: 30 for command, 30 for prompt, 60 for agent) */\n timeout?: number\n\n /** Optional description of what this hook does */\n description?: string\n\n /** Run hook asynchronously (fire-and-forget, result via systemMessage next turn) */\n async?: boolean\n\n /** Only execute once per session */\n once?: boolean\n}\n\n/**\n * hooks.json file schema\n */\nexport interface HooksConfig {\n /** Optional description for plugin hooks */\n description?: string\n\n /** Hook configurations by event type */\n hooks: Partial<Record<HookEvent, HookMatcher[]>>\n}\n\n/**\n * Hook execution input (passed to hook as JSON stdin)\n */\nexport interface HookInput {\n /** Session identifier */\n session_id: string\n\n /** Path to conversation transcript */\n transcript_path: string\n\n /** Current working directory */\n cwd: string\n\n /** Permission mode (default, plan, acceptEdits, bypassPermissions) */\n permission_mode: string\n\n /** Hook event name */\n hook_event_name: HookEvent\n\n /** Event-specific additional fields */\n [key: string]: any\n}\n\n/**\n * PreToolUse hook input\n */\nexport interface PreToolUseInput extends HookInput {\n hook_event_name: HookEvent.PreToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook input\n */\nexport interface PostToolUseInput extends HookInput {\n hook_event_name: HookEvent.PostToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n tool_output: Record<string, unknown>\n}\n\n/**\n * PostToolUseFailure hook input (new)\n */\nexport interface PostToolUseFailureInput extends HookInput {\n hook_event_name: HookEvent.PostToolUseFailure\n tool_name: string\n tool_input: Record<string, unknown>\n error: string\n error_type?: string\n}\n\n/**\n * PermissionRequest hook input (new)\n */\nexport interface PermissionRequestInput extends HookInput {\n hook_event_name: HookEvent.PermissionRequest\n tool_name: string\n tool_input: Record<string, unknown>\n permission_type: 'read' | 'write' | 'execute' | 'network' | 'other'\n description?: string\n}\n\n/**\n * UserPromptSubmit hook input\n */\nexport interface UserPromptSubmitInput extends HookInput {\n hook_event_name: HookEvent.UserPromptSubmit\n user_prompt: string\n}\n\n/**\n * SessionStart hook input\n */\nexport interface SessionStartInput extends HookInput {\n hook_event_name: HookEvent.SessionStart\n source: 'startup' | 'resume' | 'clear' | 'compact'\n}\n\n/**\n * SessionEnd hook input\n */\nexport interface SessionEndInput extends HookInput {\n hook_event_name: HookEvent.SessionEnd\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other'\n}\n\n/**\n * Stop hook input\n */\nexport interface StopInput extends HookInput {\n hook_event_name: HookEvent.Stop\n stop_hook_active: boolean\n}\n\n/**\n * SubagentStart hook input (new)\n */\nexport interface SubagentStartInput extends HookInput {\n hook_event_name: HookEvent.SubagentStart\n agent_type: string\n agent_description?: string\n run_in_background?: boolean\n}\n\n/**\n * SubagentStop hook input\n */\nexport interface SubagentStopInput extends HookInput {\n hook_event_name: HookEvent.SubagentStop\n agent_type: string\n agent_id?: string\n stop_hook_active: boolean\n}\n\n/**\n * Notification hook input\n */\nexport interface NotificationInput extends HookInput {\n hook_event_name: HookEvent.Notification\n message: string\n}\n\n/**\n * PreCompact hook input\n */\nexport interface PreCompactInput extends HookInput {\n hook_event_name: HookEvent.PreCompact\n trigger: 'manual' | 'auto'\n custom_instructions: string\n}\n\n/**\n * PostCompact hook input\n */\nexport interface PostCompactInput extends HookInput {\n hook_event_name: HookEvent.PostCompact\n trigger: 'manual' | 'auto'\n summary: string\n compression_ratio: number\n original_tokens: number\n compressed_tokens: number\n}\n\n/**\n * ConfigChange hook input\n */\nexport interface ConfigChangeInput extends HookInput {\n hook_event_name: HookEvent.ConfigChange\n source: 'settings' | 'project' | 'global' | 'env' | 'cli'\n file_path?: string\n}\n\n/**\n * TaskCompleted hook input\n */\nexport interface TaskCompletedInput extends HookInput {\n hook_event_name: HookEvent.TaskCompleted\n task_id: string\n subject: string\n description?: string\n}\n\n/**\n * TeammateIdle hook input\n */\nexport interface TeammateIdleInput extends HookInput {\n hook_event_name: HookEvent.TeammateIdle\n teammate_name: string\n team_name: string\n}\n\n/**\n * WorktreeCreate hook input\n */\nexport interface WorktreeCreateInput extends HookInput {\n hook_event_name: HookEvent.WorktreeCreate\n worktree_path: string\n agent_id: string\n agent_type: string\n}\n\n/**\n * WorktreeRemove hook input\n */\nexport interface WorktreeRemoveInput extends HookInput {\n hook_event_name: HookEvent.WorktreeRemove\n worktree_path: string\n agent_id: string\n agent_type: string\n success: boolean\n}\n\n/**\n * Hook execution output (from hook stdout as JSON)\n */\nexport interface HookOutput {\n /** Whether Claude should continue after hook execution */\n continue?: boolean\n\n /** Message shown when continue is false */\n stopReason?: string\n\n /** Hide stdout from transcript mode */\n suppressOutput?: boolean\n\n /** Optional warning message shown to user */\n systemMessage?: string\n\n /** Hook-specific output fields */\n hookSpecificOutput?: HookSpecificOutput\n\n /** Deprecated: Use hookSpecificOutput.permissionDecision instead */\n decision?: 'approve' | 'block'\n\n /** Deprecated: Use hookSpecificOutput.permissionDecisionReason instead */\n reason?: string\n}\n\n/**\n * Hook-specific output for different events\n */\nexport type HookSpecificOutput =\n | PreToolUseOutput\n | PostToolUseOutput\n | UserPromptSubmitOutput\n | SessionStartOutput\n\n/**\n * PreToolUse hook-specific output\n */\nexport interface PreToolUseOutput {\n hookEventName: HookEvent.PreToolUse\n\n /** Permission decision: allow (bypass), deny (block), ask (prompt user) */\n permissionDecision: 'allow' | 'deny' | 'ask'\n\n /** Reason shown to user (allow/ask) or Claude (deny) */\n permissionDecisionReason?: string\n\n /** Modified tool input parameters */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook-specific output\n */\nexport interface PostToolUseOutput {\n hookEventName: HookEvent.PostToolUse\n\n /** Additional context for Claude to consider */\n additionalContext?: string\n}\n\n/**\n * UserPromptSubmit hook-specific output\n */\nexport interface UserPromptSubmitOutput {\n hookEventName: HookEvent.UserPromptSubmit\n\n /** Additional context to add to conversation */\n additionalContext?: string\n}\n\n/**\n * SessionStart hook-specific output\n */\nexport interface SessionStartOutput {\n hookEventName: HookEvent.SessionStart\n\n /** Additional context to load at session start */\n additionalContext?: string\n}\n\n/**\n * Hook execution result (internal)\n */\nexport interface HookExecutionResult {\n /** Whether hook execution succeeded */\n success: boolean\n\n /** Exit code from hook command */\n exitCode: number\n\n /** Standard output */\n stdout: string\n\n /** Standard error */\n stderr: string\n\n /** Parsed JSON output (if valid) */\n output?: HookOutput\n\n /** Error if execution failed */\n error?: Error\n\n /** Execution time in milliseconds */\n executionTime: number\n}\n\n/**\n * Zod schema for hooks.json validation\n */\nexport const HookDefinitionSchema = z.object({\n type: z.enum(['command', 'prompt', 'agent']),\n command: z.string().optional(),\n prompt: z.string().optional(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n async: z.boolean().optional(),\n once: z.boolean().optional(),\n})\n\nexport const HookMatcherSchema = z.object({\n matcher: z.string().optional(),\n toolInput: z.record(z.string()).optional(),\n hooks: z.array(HookDefinitionSchema),\n})\n\nexport const HooksConfigSchema = z.object({\n description: z.string().optional(),\n hooks: z\n .record(z.nativeEnum(HookEvent), z.array(HookMatcherSchema))\n .optional(),\n})\n\n/**\n * Hook execution context (passed to executor)\n */\nexport interface HookExecutionContext {\n /** Hook definition to execute */\n hook: HookDefinition\n\n /** Hook input data */\n input: HookInput\n\n /** Environment variables to pass to hook */\n env?: Record<string, string>\n\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal\n}\n\n/**\n * Hook decision result (processed from hook output)\n */\nexport interface HookDecision {\n /** Allow the action */\n allow: boolean\n\n /** Block the action */\n block: boolean\n\n /** Ask user for confirmation */\n ask: boolean\n\n /** Reason for decision */\n reason?: string\n\n /** Message to show to user */\n systemMessage?: string\n\n /** Stop execution entirely */\n stop: boolean\n\n /** Stop reason */\n stopReason?: string\n\n /** Additional context to inject */\n additionalContext?: string\n\n /** Modified tool input (for PreToolUse) */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * Loaded hook (runtime representation)\n * Used by both plugin-loaded hooks and settings.json hooks.\n */\nexport interface LoadedHook {\n /** Hook name/identifier */\n name: string\n\n /** File path to hook definition */\n filePath: string\n\n /** Hook configuration (extends HookDefinition with event routing fields) */\n config: HookDefinition & {\n /** Hook event this config responds to */\n event: HookEvent\n /** Matcher pattern for tool name matching */\n matcher?: string\n /** Whether the hook blocks execution until complete */\n blocking?: boolean\n /** Tool input field patterns for matching (CC spec) */\n toolInput?: Record<string, string>\n }\n\n /** Source plugin name */\n pluginName: string\n\n /** Hook event this hook responds to (root-level for easier access) */\n event: HookEvent\n\n /** Matcher pattern (root-level for easier access) */\n matcher?: string\n}\n"],
5
+ "mappings": "AAIA,SAAS,SAAS;AAMX,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,wBAAqB;AAGrB,EAAAA,WAAA,uBAAoB;AAGpB,EAAAA,WAAA,sBAAmB;AAGnB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,gBAAa;AAGb,EAAAA,WAAA,UAAO;AAGP,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AAGd,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,mBAAgB;AAGhB,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,oBAAiB;AAzCP,SAAAA;AAAA,GAAA;AAoZL,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,KAAK,CAAC,WAAW,UAAU,OAAO,CAAC;AAAA,EAC3C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,MAAM,EAAE,QAAQ,EAAE,SAAS;AAC7B,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,OAAO,EAAE,MAAM,oBAAoB;AACrC,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EACJ,OAAO,EAAE,WAAW,SAAS,GAAG,EAAE,MAAM,iBAAiB,CAAC,EAC1D,SAAS;AACd,CAAC;",
6
6
  "names": ["HookEvent"]
7
7
  }
@@ -53,6 +53,7 @@ const PluginManifestSchema = z.object({
53
53
  // Plugin-specific configuration schema
54
54
  configSchema: z.record(z.any()).optional()
55
55
  });
56
+ import { HookEvent as HookEvent2 } from "./hooks.js";
56
57
  class PluginError extends Error {
57
58
  constructor(message, code, pluginName, details) {
58
59
  super(message);
@@ -76,6 +77,7 @@ var PluginErrorCode = /* @__PURE__ */ ((PluginErrorCode2) => {
76
77
  })(PluginErrorCode || {});
77
78
  export {
78
79
  AuthorSchema,
80
+ HookEvent2 as HookEvent,
79
81
  MCPServerConfigSchema,
80
82
  PluginError,
81
83
  PluginErrorCode,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/plugin.ts"],
4
- "sourcesContent": ["/**\n * Plugin System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Author information (can be string or object)\n */\nexport const AuthorSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n }),\n])\n\n/**\n * MCP Server Configuration Schema\n * Compatible with Claude Code CLI's .mcp.json format\n */\nexport const MCPServerConfigSchema = z.object({\n // Command-based (stdio) servers\n command: z.string().optional(),\n args: z.array(z.string()).optional().default([]),\n env: z.record(z.string()).optional().default({}),\n timeout: z.number().optional(),\n\n // Transport type: stdio (default), http (Streamable HTTP), sse (legacy SSE)\n type: z.enum(['stdio', 'http', 'sse']).optional().default('stdio'),\n url: z.string().optional(),\n headers: z.record(z.string()).optional(),\n})\n\nexport type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>\n\n/**\n * Plugin Manifest Schema (plugin.json)\n * This is the source of truth for plugin metadata\n */\nexport const PluginManifestSchema = z.object({\n // Required fields\n name: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9-]+$/,\n 'Plugin name must be lowercase alphanumeric with hyphens',\n ),\n version: z.string().min(1), // Supports semver and commit hashes (for CC sync)\n description: z.string().min(1),\n\n // Optional metadata\n displayName: z.string().optional(),\n author: AuthorSchema.optional(),\n homepage: z.string().url().optional(),\n repository: z.string().url().optional(),\n license: z.string().optional(),\n\n // Plugin components (relative paths from plugin root)\n agents: z.array(z.string()).optional().default([]),\n commands: z.array(z.string()).optional().default([]),\n skills: z.array(z.string()).optional().default([]),\n hooks: z.array(z.string()).optional().default([]),\n\n // MCP servers support both:\n // - Array of file paths: [\"mcp-servers/server1.json\"]\n // - Object with inline configs: { \"server1\": { command: \"...\" } }\n mcpServers: z\n .union([z.array(z.string()), z.record(MCPServerConfigSchema)])\n .optional()\n .default([]),\n\n // Dependencies\n dependencies: z.record(z.string()).optional().default({}),\n\n // Minto/Claude Code version requirements\n engines: z\n .object({\n minto: z.string().optional(),\n 'claude-code': z.string().optional(),\n node: z.string().optional(),\n })\n .optional(),\n\n // Plugin-specific configuration schema\n configSchema: z.record(z.any()).optional(),\n})\n\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\n\n/**\n * Loaded Plugin (runtime representation)\n */\nexport interface LoadedPlugin {\n name: string\n manifest: PluginManifest\n location: string // Absolute path to plugin directory\n source: PluginSource\n agents: LoadedAgent[]\n commands: LoadedCommand[]\n skills: LoadedSkill[]\n hooks: LoadedHook[]\n mcpServers: LoadedMCPServer[]\n lspServers: LoadedLSPServer[]\n enabled: boolean\n config?: Record<string, any>\n /** Plugin agent settings (CC format: { defaultAgent, maxTurns, ... }) */\n settings?: Record<string, any> | null\n}\n\n/**\n * Plugin source types\n */\nexport type PluginSource =\n | { type: 'local'; path: string }\n | { type: 'git'; repo: string; ref?: string }\n | { type: 'npm'; package: string; version?: string }\n | { type: 'marketplace'; marketplace: string; name: string }\n | { type: 'claude-code'; marketplace: string; name: string }\n\n/**\n * Agent component (from plugin)\n */\nexport interface LoadedAgent {\n name: string\n filePath: string\n config: {\n name: string\n description: string\n tools?: string | string[]\n model?: string\n content: string\n }\n pluginName: string\n}\n\n/**\n * Command component (from plugin)\n */\nexport interface LoadedCommand {\n name: string\n filePath: string\n config: {\n name: string\n description?: string\n aliases?: string[]\n enabled?: boolean\n hidden?: boolean\n progressMessage?: string\n argNames?: string[]\n 'allowed-tools'?: string[]\n content: string\n }\n pluginName: string\n}\n\n/**\n * Skill hook definition (inline in SKILL.md frontmatter)\n */\nexport interface SkillHookDefinition {\n event: HookEvent\n matcher?: string\n type?: 'command' | 'prompt' | 'agent'\n command?: string\n prompt?: string\n timeout?: number\n}\n\n/**\n * Skill configuration (Claude Code specification compliant)\n */\nexport interface SkillConfig {\n // Identity\n name: string\n description: string\n argumentHint?: string // Hint for expected arguments\n\n // Invocation control (Claude Code spec)\n disableModelInvocation?: boolean // If true, model cannot auto-invoke (user-only)\n userInvocable?: boolean // If true, user can invoke via /command (default: true)\n\n // Execution configuration\n allowedTools?: string[] // Tools the skill can use\n model?: 'sonnet' | 'opus' | 'haiku' | 'inherit' // Model to use\n\n // Fork context (Claude Code spec)\n context?: 'fork' // Execute in isolated context\n agent?: string // Agent type to use for fork execution\n\n // Lifecycle hooks (Claude Code spec)\n hooks?: SkillHookDefinition[]\n\n // Metadata (Claude Code spec standard fields)\n license?: string\n compatibility?: string | Record<string, string>\n metadata?: Record<string, unknown>\n\n // Content\n content: string\n}\n\n/**\n * Skill component (from plugin or standalone)\n */\nexport interface LoadedSkill {\n name: string\n filePath: string\n config: SkillConfig\n pluginName: string // 'standalone' for standalone skills\n source: 'plugin' | 'user' | 'project' // Where the skill was loaded from\n}\n\n/**\n * Hook component (from plugin)\n */\nexport interface LoadedHook {\n name: string\n filePath: string\n config: {\n event: HookEvent\n matcher?: string\n type: 'command' | 'prompt' | 'agent'\n command?: string\n prompt?: string\n blocking?: boolean\n timeout?: number\n async?: boolean\n once?: boolean\n /** Tool input field patterns for matching (CC spec) */\n toolInput?: Record<string, string>\n }\n pluginName: string\n event: HookEvent // Also store event at root level for easier access\n matcher?: string // Also store matcher at root level\n}\n\n/**\n * Hook lifecycle events\n */\nexport type HookEvent =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'PostToolUseFailure'\n | 'PermissionRequest'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n | 'Stop'\n | 'SubagentStart'\n | 'SubagentStop'\n | 'Notification'\n | 'PreCompact'\n | 'PostCompact'\n | 'ConfigChange'\n | 'TaskCompleted'\n | 'TeammateIdle'\n\n/**\n * MCP Server component (from plugin)\n */\nexport interface LoadedMCPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n timeout?: number\n }\n pluginName: string\n}\n\n/**\n * LSP Server component (from plugin)\n * Claude Code CLI compatible: plugins can define language servers\n * via .lsp.json or inline lspServers in plugin.json manifest.\n */\nexport interface LoadedLSPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n /** File patterns this LSP server handles (e.g. [\"*.py\", \"*.pyi\"]) */\n filePatterns?: string[]\n /** Language identifiers (e.g. [\"python\", \"typescript\"]) */\n languages?: string[]\n /** Initialization options for the LSP server */\n initializationOptions?: Record<string, unknown>\n }\n pluginName: string\n}\n\n/**\n * Plugin installation options\n */\nexport interface PluginInstallOptions {\n source: PluginSource\n global?: boolean // Install globally vs project-level\n enable?: boolean // Auto-enable after install\n config?: Record<string, any> // Plugin-specific config\n}\n\n/**\n * Plugin marketplace configuration\n */\nexport interface PluginMarketplace {\n name: string\n source: PluginSource\n plugins: PluginManifest[]\n}\n\n/**\n * Plugin error types\n */\nexport class PluginError extends Error {\n constructor(\n message: string,\n public code: PluginErrorCode,\n public pluginName?: string,\n public details?: any,\n ) {\n super(message)\n this.name = 'PluginError'\n }\n}\n\nexport enum PluginErrorCode {\n MANIFEST_INVALID = 'MANIFEST_INVALID',\n MANIFEST_NOT_FOUND = 'MANIFEST_NOT_FOUND',\n VERSION_MISMATCH = 'VERSION_MISMATCH',\n DEPENDENCY_MISSING = 'DEPENDENCY_MISSING',\n COMPONENT_NOT_FOUND = 'COMPONENT_NOT_FOUND',\n COMPONENT_INVALID = 'COMPONENT_INVALID',\n ALREADY_INSTALLED = 'ALREADY_INSTALLED',\n NOT_INSTALLED = 'NOT_INSTALLED',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n}\n\n// ============================================================================\n// Session Plugin Types (Claude Code CLI Compatible)\n// ============================================================================\n\n/**\n * A loaded plugin in the current session\n * Compatible with Claude Code CLI session plugins\n */\nexport interface SessionPlugin {\n /** Plugin name from manifest */\n name: string\n /** Root directory of the plugin */\n rootDir: string\n /** Path to the manifest file */\n manifestPath: string\n /** Raw manifest data */\n manifest: unknown\n /** Directories containing custom commands */\n commandsDirs: string[]\n /** Directories containing skills */\n skillsDirs: string[]\n /** Directories containing agents */\n agentsDirs: string[]\n /** Paths to hooks configuration files */\n hooksFiles: string[]\n /** Directories containing output styles */\n outputStylesDirs: string[]\n /** Paths to MCP server configuration files */\n mcpConfigFiles: string[]\n /** Paths to LSP server configuration files (Claude Code CLI specific) */\n lspConfigFiles: string[]\n}\n\n/**\n * Plugin scope - where the plugin is installed/activated\n */\nexport type PluginScope = 'user' | 'project' | 'local'\n\n/**\n * Installed skill plugin record\n */\nexport interface InstalledSkillPlugin {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n"],
5
- "mappings": "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",
6
- "names": ["PluginErrorCode"]
4
+ "sourcesContent": ["/**\n * Plugin System Type Definitions\n */\n\nimport { z } from 'zod'\nimport { HookEvent, type LoadedHook } from './hooks'\n\n/**\n * Author information (can be string or object)\n */\nexport const AuthorSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n }),\n])\n\n/**\n * MCP Server Configuration Schema\n * Compatible with Claude Code CLI's .mcp.json format\n */\nexport const MCPServerConfigSchema = z.object({\n // Command-based (stdio) servers\n command: z.string().optional(),\n args: z.array(z.string()).optional().default([]),\n env: z.record(z.string()).optional().default({}),\n timeout: z.number().optional(),\n\n // Transport type: stdio (default), http (Streamable HTTP), sse (legacy SSE)\n type: z.enum(['stdio', 'http', 'sse']).optional().default('stdio'),\n url: z.string().optional(),\n headers: z.record(z.string()).optional(),\n})\n\nexport type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>\n\n/**\n * Plugin Manifest Schema (plugin.json)\n * This is the source of truth for plugin metadata\n */\nexport const PluginManifestSchema = z.object({\n // Required fields\n name: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9-]+$/,\n 'Plugin name must be lowercase alphanumeric with hyphens',\n ),\n version: z.string().min(1), // Supports semver and commit hashes (for CC sync)\n description: z.string().min(1),\n\n // Optional metadata\n displayName: z.string().optional(),\n author: AuthorSchema.optional(),\n homepage: z.string().url().optional(),\n repository: z.string().url().optional(),\n license: z.string().optional(),\n\n // Plugin components (relative paths from plugin root)\n agents: z.array(z.string()).optional().default([]),\n commands: z.array(z.string()).optional().default([]),\n skills: z.array(z.string()).optional().default([]),\n hooks: z.array(z.string()).optional().default([]),\n\n // MCP servers support both:\n // - Array of file paths: [\"mcp-servers/server1.json\"]\n // - Object with inline configs: { \"server1\": { command: \"...\" } }\n mcpServers: z\n .union([z.array(z.string()), z.record(MCPServerConfigSchema)])\n .optional()\n .default([]),\n\n // Dependencies\n dependencies: z.record(z.string()).optional().default({}),\n\n // Minto/Claude Code version requirements\n engines: z\n .object({\n minto: z.string().optional(),\n 'claude-code': z.string().optional(),\n node: z.string().optional(),\n })\n .optional(),\n\n // Plugin-specific configuration schema\n configSchema: z.record(z.any()).optional(),\n})\n\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\n\n// Re-export from hooks.ts to avoid duplicate definitions\n// HookEvent is an enum (value), LoadedHook is an interface (type-only)\nexport { HookEvent } from './hooks'\nexport type { LoadedHook } from './hooks'\n\n/**\n * Loaded Plugin (runtime representation)\n */\nexport interface LoadedPlugin {\n name: string\n manifest: PluginManifest\n location: string // Absolute path to plugin directory\n source: PluginSource\n agents: LoadedAgent[]\n commands: LoadedCommand[]\n skills: LoadedSkill[]\n hooks: LoadedHook[]\n mcpServers: LoadedMCPServer[]\n lspServers: LoadedLSPServer[]\n enabled: boolean\n config?: Record<string, any>\n /** Plugin agent settings (CC format: { defaultAgent, maxTurns, ... }) */\n settings?: Record<string, any> | null\n}\n\n/**\n * Plugin source types\n */\nexport type PluginSource =\n | { type: 'local'; path: string }\n | { type: 'git'; repo: string; ref?: string }\n | { type: 'npm'; package: string; version?: string }\n | { type: 'marketplace'; marketplace: string; name: string }\n | { type: 'claude-code'; marketplace: string; name: string }\n\n/**\n * Agent component (from plugin)\n */\nexport interface LoadedAgent {\n name: string\n filePath: string\n config: {\n name: string\n description: string\n tools?: string | string[]\n model?: string\n content: string\n }\n pluginName: string\n}\n\n/**\n * Command component (from plugin)\n */\nexport interface LoadedCommand {\n name: string\n filePath: string\n config: {\n name: string\n description?: string\n aliases?: string[]\n enabled?: boolean\n hidden?: boolean\n progressMessage?: string\n argNames?: string[]\n 'allowed-tools'?: string[]\n content: string\n }\n pluginName: string\n}\n\n/**\n * Skill hook definition (inline in SKILL.md frontmatter)\n */\nexport interface SkillHookDefinition {\n event: HookEvent\n matcher?: string\n type?: 'command' | 'prompt' | 'agent'\n command?: string\n prompt?: string\n timeout?: number\n}\n\n/**\n * Skill configuration (Claude Code specification compliant)\n */\nexport interface SkillConfig {\n // Identity\n name: string\n description: string\n argumentHint?: string // Hint for expected arguments\n\n // Invocation control (Claude Code spec)\n disableModelInvocation?: boolean // If true, model cannot auto-invoke (user-only)\n userInvocable?: boolean // If true, user can invoke via /command (default: true)\n\n // Execution configuration\n allowedTools?: string[] // Tools the skill can use\n model?: 'sonnet' | 'opus' | 'haiku' | 'inherit' // Model to use\n\n // Fork context (Claude Code spec)\n context?: 'fork' // Execute in isolated context\n agent?: string // Agent type to use for fork execution\n\n // Lifecycle hooks (Claude Code spec)\n hooks?: SkillHookDefinition[]\n\n // Metadata (Claude Code spec standard fields)\n license?: string\n compatibility?: string | Record<string, string>\n metadata?: Record<string, unknown>\n\n // Content\n content: string\n}\n\n/**\n * Skill component (from plugin or standalone)\n */\nexport interface LoadedSkill {\n name: string\n filePath: string\n config: SkillConfig\n pluginName: string // 'standalone' for standalone skills\n source: 'plugin' | 'user' | 'project' // Where the skill was loaded from\n}\n\n/**\n * MCP Server component (from plugin)\n */\nexport interface LoadedMCPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n timeout?: number\n }\n pluginName: string\n}\n\n/**\n * LSP Server component (from plugin)\n * Claude Code CLI compatible: plugins can define language servers\n * via .lsp.json or inline lspServers in plugin.json manifest.\n */\nexport interface LoadedLSPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n /** File patterns this LSP server handles (e.g. [\"*.py\", \"*.pyi\"]) */\n filePatterns?: string[]\n /** Language identifiers (e.g. [\"python\", \"typescript\"]) */\n languages?: string[]\n /** Initialization options for the LSP server */\n initializationOptions?: Record<string, unknown>\n }\n pluginName: string\n}\n\n/**\n * Plugin installation options\n */\nexport interface PluginInstallOptions {\n source: PluginSource\n global?: boolean // Install globally vs project-level\n enable?: boolean // Auto-enable after install\n config?: Record<string, any> // Plugin-specific config\n}\n\n/**\n * Plugin marketplace configuration\n */\nexport interface PluginMarketplace {\n name: string\n source: PluginSource\n plugins: PluginManifest[]\n}\n\n/**\n * Plugin error types\n */\nexport class PluginError extends Error {\n constructor(\n message: string,\n public code: PluginErrorCode,\n public pluginName?: string,\n public details?: any,\n ) {\n super(message)\n this.name = 'PluginError'\n }\n}\n\nexport enum PluginErrorCode {\n MANIFEST_INVALID = 'MANIFEST_INVALID',\n MANIFEST_NOT_FOUND = 'MANIFEST_NOT_FOUND',\n VERSION_MISMATCH = 'VERSION_MISMATCH',\n DEPENDENCY_MISSING = 'DEPENDENCY_MISSING',\n COMPONENT_NOT_FOUND = 'COMPONENT_NOT_FOUND',\n COMPONENT_INVALID = 'COMPONENT_INVALID',\n ALREADY_INSTALLED = 'ALREADY_INSTALLED',\n NOT_INSTALLED = 'NOT_INSTALLED',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n}\n\n// ============================================================================\n// Session Plugin Types (Claude Code CLI Compatible)\n// ============================================================================\n\n/**\n * A loaded plugin in the current session\n * Compatible with Claude Code CLI session plugins\n */\nexport interface SessionPlugin {\n /** Plugin name from manifest */\n name: string\n /** Root directory of the plugin */\n rootDir: string\n /** Path to the manifest file */\n manifestPath: string\n /** Raw manifest data */\n manifest: unknown\n /** Directories containing custom commands */\n commandsDirs: string[]\n /** Directories containing skills */\n skillsDirs: string[]\n /** Directories containing agents */\n agentsDirs: string[]\n /** Paths to hooks configuration files */\n hooksFiles: string[]\n /** Directories containing output styles */\n outputStylesDirs: string[]\n /** Paths to MCP server configuration files */\n mcpConfigFiles: string[]\n /** Paths to LSP server configuration files (Claude Code CLI specific) */\n lspConfigFiles: string[]\n}\n\n/**\n * Plugin scope - where the plugin is installed/activated\n */\nexport type PluginScope = 'user' | 'project' | 'local'\n\n/**\n * Installed skill plugin record\n */\nexport interface InstalledSkillPlugin {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["HookEvent", "PluginErrorCode"]
7
7
  }
@@ -61,15 +61,21 @@ class CircuitBreaker {
61
61
  if (!timeout) {
62
62
  return this.execute(operation);
63
63
  }
64
- return Promise.race([
65
- this.execute(operation),
66
- new Promise(
67
- (_, reject) => setTimeout(
68
- () => reject(new Error(`Operation timeout after ${timeout}ms`)),
69
- timeout
70
- )
71
- )
72
- ]);
64
+ let timeoutId;
65
+ try {
66
+ const result = await Promise.race([
67
+ this.execute(operation),
68
+ new Promise((_, reject) => {
69
+ timeoutId = setTimeout(
70
+ () => reject(new Error(`Operation timeout after ${timeout}ms`)),
71
+ timeout
72
+ );
73
+ })
74
+ ]);
75
+ return result;
76
+ } finally {
77
+ if (timeoutId !== void 0) clearTimeout(timeoutId);
78
+ }
73
79
  }
74
80
  /**
75
81
  * Get current circuit state