@machina.ai/cell-cli-core 1.11.0-rc1 → 1.13.0-rc2

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 (432) hide show
  1. package/dist/index.d.ts +5 -0
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +9 -3
  5. package/dist/src/agents/executor.d.ts +19 -0
  6. package/dist/src/agents/executor.js +226 -32
  7. package/dist/src/agents/executor.js.map +1 -1
  8. package/dist/src/agents/executor.test.js +335 -9
  9. package/dist/src/agents/executor.test.js.map +1 -1
  10. package/dist/src/agents/subagent-tool-wrapper.test.js +2 -4
  11. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  12. package/dist/src/agents/types.d.ts +2 -1
  13. package/dist/src/agents/types.js +1 -0
  14. package/dist/src/agents/types.js.map +1 -1
  15. package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
  16. package/dist/src/code_assist/experiments/client_metadata.js +49 -0
  17. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
  18. package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
  19. package/dist/src/code_assist/experiments/experiments.js +36 -0
  20. package/dist/src/code_assist/experiments/experiments.js.map +1 -0
  21. package/dist/src/code_assist/experiments/types.d.ts +35 -0
  22. package/dist/src/code_assist/experiments/types.js +7 -0
  23. package/dist/src/code_assist/experiments/types.js.map +1 -0
  24. package/dist/src/code_assist/oauth-credential-storage.js +5 -4
  25. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  26. package/dist/src/code_assist/oauth-credential-storage.test.js +15 -3
  27. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  28. package/dist/src/code_assist/oauth2.d.ts +2 -2
  29. package/dist/src/code_assist/oauth2.js +53 -41
  30. package/dist/src/code_assist/oauth2.js.map +1 -1
  31. package/dist/src/code_assist/oauth2.test.js +65 -33
  32. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  33. package/dist/src/code_assist/server.d.ts +6 -4
  34. package/dist/src/code_assist/server.js +11 -0
  35. package/dist/src/code_assist/server.js.map +1 -1
  36. package/dist/src/code_assist/server.test.js +17 -0
  37. package/dist/src/code_assist/server.test.js.map +1 -1
  38. package/dist/src/code_assist/setup.d.ts +2 -2
  39. package/dist/src/code_assist/setup.js.map +1 -1
  40. package/dist/src/code_assist/types.d.ts +1 -1
  41. package/dist/src/code_assist/types.js.map +1 -1
  42. package/dist/src/commands/extensions.d.ts +7 -0
  43. package/dist/src/commands/extensions.js +9 -0
  44. package/dist/src/commands/extensions.js.map +1 -0
  45. package/dist/src/commands/extensions.test.d.ts +6 -0
  46. package/dist/src/commands/extensions.test.js +19 -0
  47. package/dist/src/commands/extensions.test.js.map +1 -0
  48. package/dist/src/config/config.d.ts +72 -24
  49. package/dist/src/config/config.js +168 -55
  50. package/dist/src/config/config.js.map +1 -1
  51. package/dist/src/config/config.test.js +59 -23
  52. package/dist/src/config/config.test.js.map +1 -1
  53. package/dist/src/config/models.d.ts +1 -1
  54. package/dist/src/config/models.js +2 -2
  55. package/dist/src/config/models.js.map +1 -1
  56. package/dist/src/config/storage.d.ts +3 -0
  57. package/dist/src/config/storage.js +20 -0
  58. package/dist/src/config/storage.js.map +1 -1
  59. package/dist/src/core/apiKeyCredentialStorage.d.ts +17 -0
  60. package/dist/src/core/apiKeyCredentialStorage.js +64 -0
  61. package/dist/src/core/apiKeyCredentialStorage.js.map +1 -0
  62. package/dist/src/core/apiKeyCredentialStorage.test.d.ts +6 -0
  63. package/dist/src/core/apiKeyCredentialStorage.test.js +71 -0
  64. package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -0
  65. package/dist/src/core/client.d.ts +2 -11
  66. package/dist/src/core/client.js +28 -168
  67. package/dist/src/core/client.js.map +1 -1
  68. package/dist/src/core/client.test.js +107 -409
  69. package/dist/src/core/client.test.js.map +1 -1
  70. package/dist/src/core/contentGenerator.js +64 -59
  71. package/dist/src/core/contentGenerator.js.map +1 -1
  72. package/dist/src/core/contentGenerator.test.js +38 -4
  73. package/dist/src/core/contentGenerator.test.js.map +1 -1
  74. package/dist/src/core/coreToolScheduler.d.ts +7 -8
  75. package/dist/src/core/coreToolScheduler.js +316 -187
  76. package/dist/src/core/coreToolScheduler.js.map +1 -1
  77. package/dist/src/core/coreToolScheduler.test.js +240 -10
  78. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  79. package/dist/src/core/fakeContentGenerator.d.ts +33 -0
  80. package/dist/src/core/fakeContentGenerator.js +58 -0
  81. package/dist/src/core/fakeContentGenerator.js.map +1 -0
  82. package/dist/src/core/fakeContentGenerator.test.d.ts +6 -0
  83. package/dist/src/core/fakeContentGenerator.test.js +127 -0
  84. package/dist/src/core/fakeContentGenerator.test.js.map +1 -0
  85. package/dist/src/core/geminiChat.d.ts +2 -0
  86. package/dist/src/core/geminiChat.js +6 -2
  87. package/dist/src/core/geminiChat.js.map +1 -1
  88. package/dist/src/core/geminiChat.test.js +15 -3
  89. package/dist/src/core/geminiChat.test.js.map +1 -1
  90. package/dist/src/core/logger.js +10 -9
  91. package/dist/src/core/logger.js.map +1 -1
  92. package/dist/src/core/loggingContentGenerator.d.ts +1 -0
  93. package/dist/src/core/loggingContentGenerator.js +113 -33
  94. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  95. package/dist/src/core/nonInteractiveToolExecutor.js +5 -4
  96. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  97. package/dist/src/core/prompts.js +104 -55
  98. package/dist/src/core/prompts.js.map +1 -1
  99. package/dist/src/core/prompts.test.js +30 -108
  100. package/dist/src/core/prompts.test.js.map +1 -1
  101. package/dist/src/core/recordingContentGenerator.d.ts +18 -0
  102. package/dist/src/core/recordingContentGenerator.js +77 -0
  103. package/dist/src/core/recordingContentGenerator.js.map +1 -0
  104. package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
  105. package/dist/src/core/recordingContentGenerator.test.js +101 -0
  106. package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
  107. package/dist/src/fallback/handler.js +2 -0
  108. package/dist/src/fallback/handler.js.map +1 -1
  109. package/dist/src/generated/git-commit.d.ts +2 -2
  110. package/dist/src/generated/git-commit.js +2 -2
  111. package/dist/src/hooks/hookPlanner.d.ts +46 -0
  112. package/dist/src/hooks/hookPlanner.js +108 -0
  113. package/dist/src/hooks/hookPlanner.js.map +1 -0
  114. package/dist/src/hooks/hookPlanner.test.d.ts +6 -0
  115. package/dist/src/hooks/hookPlanner.test.js +255 -0
  116. package/dist/src/hooks/hookPlanner.test.js.map +1 -0
  117. package/dist/src/hooks/hookRegistry.d.ts +87 -0
  118. package/dist/src/hooks/hookRegistry.js +198 -0
  119. package/dist/src/hooks/hookRegistry.js.map +1 -0
  120. package/dist/src/hooks/hookRegistry.test.d.ts +6 -0
  121. package/dist/src/hooks/hookRegistry.test.js +341 -0
  122. package/dist/src/hooks/hookRegistry.test.js.map +1 -0
  123. package/dist/src/hooks/hookTranslator.d.ts +113 -0
  124. package/dist/src/hooks/hookTranslator.js +232 -0
  125. package/dist/src/hooks/hookTranslator.js.map +1 -0
  126. package/dist/src/hooks/hookTranslator.test.d.ts +6 -0
  127. package/dist/src/hooks/hookTranslator.test.js +192 -0
  128. package/dist/src/hooks/hookTranslator.test.js.map +1 -0
  129. package/dist/src/hooks/types.d.ts +384 -0
  130. package/dist/src/hooks/types.js +284 -0
  131. package/dist/src/hooks/types.js.map +1 -0
  132. package/dist/src/hooks/types.test.d.ts +6 -0
  133. package/dist/src/hooks/types.test.js +35 -0
  134. package/dist/src/hooks/types.test.js.map +1 -0
  135. package/dist/src/index.d.ts +11 -0
  136. package/dist/src/index.js +14 -0
  137. package/dist/src/index.js.map +1 -1
  138. package/dist/src/mcp/google-auth-provider.d.ts +2 -0
  139. package/dist/src/mcp/google-auth-provider.js +21 -3
  140. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  141. package/dist/src/mcp/google-auth-provider.test.js +42 -9
  142. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  143. package/dist/src/mcp/mcpLauncher.d.ts +26 -0
  144. package/dist/src/mcp/mcpLauncher.js +238 -0
  145. package/dist/src/mcp/mcpLauncher.js.map +1 -0
  146. package/dist/src/mcp/oauth-provider.d.ts +8 -5
  147. package/dist/src/mcp/oauth-provider.js +120 -36
  148. package/dist/src/mcp/oauth-provider.js.map +1 -1
  149. package/dist/src/mcp/oauth-provider.test.js +191 -2
  150. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  151. package/dist/src/mcp/oauth-token-storage.js +5 -4
  152. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  153. package/dist/src/mcp/oauth-token-storage.test.js +17 -11
  154. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  155. package/dist/src/mcp/oauth-utils.d.ts +7 -0
  156. package/dist/src/mcp/oauth-utils.js +19 -0
  157. package/dist/src/mcp/oauth-utils.js.map +1 -1
  158. package/dist/src/mcp/oauth-utils.test.js +32 -0
  159. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  160. package/dist/src/mcp/sa-impersonation-provider.d.ts +0 -6
  161. package/dist/src/mcp/sa-impersonation-provider.js +6 -23
  162. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  163. package/dist/src/mcp/token-storage/base-token-storage.test.js +75 -84
  164. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
  165. package/dist/src/mcp/token-storage/file-token-storage.js +1 -1
  166. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  167. package/dist/src/mcp/token-storage/file-token-storage.test.js +7 -5
  168. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  169. package/dist/src/mcp/token-storage/hybrid-token-storage.js +1 -1
  170. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -1
  171. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +2 -2
  172. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -1
  173. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
  174. package/dist/src/mcp/token-storage/keychain-token-storage.js +63 -7
  175. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  176. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +54 -3
  177. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  178. package/dist/src/mcp/token-storage/types.d.ts +6 -0
  179. package/dist/src/mcp/token-storage/types.js.map +1 -1
  180. package/dist/src/policy/config.d.ts +31 -0
  181. package/dist/src/policy/config.js +197 -0
  182. package/dist/src/policy/config.js.map +1 -0
  183. package/dist/src/policy/config.test.d.ts +6 -0
  184. package/dist/src/policy/config.test.js +404 -0
  185. package/dist/src/policy/config.test.js.map +1 -0
  186. package/dist/src/policy/index.d.ts +2 -0
  187. package/dist/src/policy/index.js +2 -0
  188. package/dist/src/policy/index.js.map +1 -1
  189. package/dist/src/policy/policies/read-only.toml +56 -0
  190. package/dist/src/policy/policies/write.toml +63 -0
  191. package/dist/src/policy/policies/yolo.toml +31 -0
  192. package/dist/src/policy/policy-engine.js +4 -0
  193. package/dist/src/policy/policy-engine.js.map +1 -1
  194. package/dist/src/policy/toml-loader.d.ts +46 -0
  195. package/dist/src/policy/toml-loader.js +314 -0
  196. package/dist/src/policy/toml-loader.js.map +1 -0
  197. package/dist/src/policy/toml-loader.test.d.ts +6 -0
  198. package/dist/src/policy/toml-loader.test.js +522 -0
  199. package/dist/src/policy/toml-loader.test.js.map +1 -0
  200. package/dist/src/policy/types.d.ts +18 -0
  201. package/dist/src/policy/types.js +6 -0
  202. package/dist/src/policy/types.js.map +1 -1
  203. package/dist/src/services/chatCompressionService.d.ts +32 -0
  204. package/dist/src/services/chatCompressionService.js +162 -0
  205. package/dist/src/services/chatCompressionService.js.map +1 -0
  206. package/dist/src/services/chatCompressionService.test.d.ts +6 -0
  207. package/dist/src/services/chatCompressionService.test.js +209 -0
  208. package/dist/src/services/chatCompressionService.test.js.map +1 -0
  209. package/dist/src/services/chatRecordingService.js +9 -8
  210. package/dist/src/services/chatRecordingService.js.map +1 -1
  211. package/dist/src/services/fileDiscoveryService.d.ts +2 -14
  212. package/dist/src/services/fileDiscoveryService.js +19 -55
  213. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  214. package/dist/src/services/fileDiscoveryService.test.js +91 -11
  215. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  216. package/dist/src/services/loopDetectionService.d.ts +1 -1
  217. package/dist/src/services/loopDetectionService.js +26 -13
  218. package/dist/src/services/loopDetectionService.js.map +1 -1
  219. package/dist/src/services/loopDetectionService.test.js +119 -11
  220. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  221. package/dist/src/services/shellExecutionService.js +22 -6
  222. package/dist/src/services/shellExecutionService.js.map +1 -1
  223. package/dist/src/services/shellExecutionService.test.js +32 -6
  224. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  225. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +4 -1
  226. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +84 -33
  227. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  228. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +40 -61
  229. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  230. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
  231. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +6 -0
  232. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  233. package/dist/src/telemetry/gcp-exporters.js +0 -1
  234. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  235. package/dist/src/telemetry/gcp-exporters.test.js +1 -1
  236. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
  237. package/dist/src/telemetry/index.d.ts +2 -1
  238. package/dist/src/telemetry/index.js +3 -2
  239. package/dist/src/telemetry/index.js.map +1 -1
  240. package/dist/src/telemetry/loggers.d.ts +2 -1
  241. package/dist/src/telemetry/loggers.js +37 -26
  242. package/dist/src/telemetry/loggers.js.map +1 -1
  243. package/dist/src/telemetry/loggers.test.js +199 -44
  244. package/dist/src/telemetry/loggers.test.js.map +1 -1
  245. package/dist/src/telemetry/metrics.d.ts +55 -6
  246. package/dist/src/telemetry/metrics.js +89 -1
  247. package/dist/src/telemetry/metrics.js.map +1 -1
  248. package/dist/src/telemetry/metrics.test.js +172 -213
  249. package/dist/src/telemetry/metrics.test.js.map +1 -1
  250. package/dist/src/telemetry/semantic.d.ts +82 -0
  251. package/dist/src/telemetry/semantic.js +269 -0
  252. package/dist/src/telemetry/semantic.js.map +1 -0
  253. package/dist/src/telemetry/semantic.test.d.ts +6 -0
  254. package/dist/src/telemetry/semantic.test.js +387 -0
  255. package/dist/src/telemetry/semantic.test.js.map +1 -0
  256. package/dist/src/telemetry/telemetry-utils.test.js +29 -28
  257. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -1
  258. package/dist/src/telemetry/trace.d.ts +46 -0
  259. package/dist/src/telemetry/trace.js +121 -0
  260. package/dist/src/telemetry/trace.js.map +1 -0
  261. package/dist/src/telemetry/types.d.ts +64 -28
  262. package/dist/src/telemetry/types.js +163 -55
  263. package/dist/src/telemetry/types.js.map +1 -1
  264. package/dist/src/telemetry/uiTelemetry.js +6 -6
  265. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  266. package/dist/src/telemetry/uiTelemetry.test.js +88 -66
  267. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  268. package/dist/src/tools/edit.d.ts +3 -2
  269. package/dist/src/tools/edit.js +16 -12
  270. package/dist/src/tools/edit.js.map +1 -1
  271. package/dist/src/tools/edit.test.js +78 -1
  272. package/dist/src/tools/edit.test.js.map +1 -1
  273. package/dist/src/tools/glob.js +9 -13
  274. package/dist/src/tools/glob.js.map +1 -1
  275. package/dist/src/tools/glob.test.js +203 -199
  276. package/dist/src/tools/glob.test.js.map +1 -1
  277. package/dist/src/tools/grep.js +2 -2
  278. package/dist/src/tools/grep.js.map +1 -1
  279. package/dist/src/tools/ls.js +7 -13
  280. package/dist/src/tools/ls.js.map +1 -1
  281. package/dist/src/tools/ls.test.js +2 -9
  282. package/dist/src/tools/ls.test.js.map +1 -1
  283. package/dist/src/tools/mcp-client-manager.d.ts +49 -4
  284. package/dist/src/tools/mcp-client-manager.js +209 -23
  285. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  286. package/dist/src/tools/mcp-client-manager.test.js +130 -33
  287. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  288. package/dist/src/tools/mcp-client.d.ts +5 -1
  289. package/dist/src/tools/mcp-client.js +72 -92
  290. package/dist/src/tools/mcp-client.js.map +1 -1
  291. package/dist/src/tools/mcp-client.test.js +65 -6
  292. package/dist/src/tools/mcp-client.test.js.map +1 -1
  293. package/dist/src/tools/mcp-tool.d.ts +4 -2
  294. package/dist/src/tools/mcp-tool.js +14 -10
  295. package/dist/src/tools/mcp-tool.js.map +1 -1
  296. package/dist/src/tools/memoryTool.d.ts +5 -3
  297. package/dist/src/tools/memoryTool.js +10 -8
  298. package/dist/src/tools/memoryTool.js.map +1 -1
  299. package/dist/src/tools/modifiable-tool.js +3 -2
  300. package/dist/src/tools/modifiable-tool.js.map +1 -1
  301. package/dist/src/tools/read-file.js +7 -3
  302. package/dist/src/tools/read-file.js.map +1 -1
  303. package/dist/src/tools/read-file.test.js +25 -2
  304. package/dist/src/tools/read-file.test.js.map +1 -1
  305. package/dist/src/tools/read-many-files.js +8 -29
  306. package/dist/src/tools/read-many-files.js.map +1 -1
  307. package/dist/src/tools/shell.d.ts +6 -4
  308. package/dist/src/tools/shell.js +23 -16
  309. package/dist/src/tools/shell.js.map +1 -1
  310. package/dist/src/tools/shell.test.js +8 -1
  311. package/dist/src/tools/shell.test.js.map +1 -1
  312. package/dist/src/tools/smart-edit.d.ts +3 -2
  313. package/dist/src/tools/smart-edit.js +23 -12
  314. package/dist/src/tools/smart-edit.js.map +1 -1
  315. package/dist/src/tools/smart-edit.test.js +62 -1
  316. package/dist/src/tools/smart-edit.test.js.map +1 -1
  317. package/dist/src/tools/tool-registry.d.ts +6 -19
  318. package/dist/src/tools/tool-registry.js +11 -47
  319. package/dist/src/tools/tool-registry.js.map +1 -1
  320. package/dist/src/tools/tool-registry.test.js +2 -24
  321. package/dist/src/tools/tool-registry.test.js.map +1 -1
  322. package/dist/src/tools/tools.d.ts +8 -1
  323. package/dist/src/tools/tools.js +32 -18
  324. package/dist/src/tools/tools.js.map +1 -1
  325. package/dist/src/tools/web-fetch.js +4 -18
  326. package/dist/src/tools/web-fetch.js.map +1 -1
  327. package/dist/src/tools/web-fetch.test.js +3 -3
  328. package/dist/src/tools/web-fetch.test.js.map +1 -1
  329. package/dist/src/tools/write-file.d.ts +2 -1
  330. package/dist/src/tools/write-file.js +7 -7
  331. package/dist/src/tools/write-file.js.map +1 -1
  332. package/dist/src/tools/write-file.test.js +1 -1
  333. package/dist/src/tools/write-file.test.js.map +1 -1
  334. package/dist/src/tools/write-todos.d.ts +2 -1
  335. package/dist/src/tools/write-todos.js +5 -2
  336. package/dist/src/tools/write-todos.js.map +1 -1
  337. package/dist/src/utils/channel.d.ts +19 -0
  338. package/dist/src/utils/channel.js +49 -0
  339. package/dist/src/utils/channel.js.map +1 -0
  340. package/dist/src/utils/channel.test.d.ts +6 -0
  341. package/dist/src/utils/channel.test.js +170 -0
  342. package/dist/src/utils/channel.test.js.map +1 -0
  343. package/dist/src/utils/environmentContext.d.ts +2 -1
  344. package/dist/src/utils/environmentContext.js +18 -0
  345. package/dist/src/utils/environmentContext.js.map +1 -1
  346. package/dist/src/utils/errorParsing.d.ts +1 -1
  347. package/dist/src/utils/errorParsing.js +5 -33
  348. package/dist/src/utils/errorParsing.js.map +1 -1
  349. package/dist/src/utils/errorParsing.test.js +0 -88
  350. package/dist/src/utils/errorParsing.test.js.map +1 -1
  351. package/dist/src/utils/errors.d.ts +3 -0
  352. package/dist/src/utils/errors.js +6 -0
  353. package/dist/src/utils/errors.js.map +1 -1
  354. package/dist/src/utils/events.d.ts +88 -0
  355. package/dist/src/utils/events.js +77 -0
  356. package/dist/src/utils/events.js.map +1 -0
  357. package/dist/src/utils/events.test.d.ts +6 -0
  358. package/dist/src/utils/events.test.js +131 -0
  359. package/dist/src/utils/events.test.js.map +1 -0
  360. package/dist/src/utils/extensionLoader.d.ts +78 -0
  361. package/dist/src/utils/extensionLoader.js +162 -0
  362. package/dist/src/utils/extensionLoader.js.map +1 -0
  363. package/dist/src/utils/extensionLoader.test.d.ts +6 -0
  364. package/dist/src/utils/extensionLoader.test.js +90 -0
  365. package/dist/src/utils/extensionLoader.test.js.map +1 -0
  366. package/dist/src/utils/fetch.js +1 -6
  367. package/dist/src/utils/fetch.js.map +1 -1
  368. package/dist/src/utils/flashFallback.test.js +26 -45
  369. package/dist/src/utils/flashFallback.test.js.map +1 -1
  370. package/dist/src/utils/getFolderStructure.js +7 -16
  371. package/dist/src/utils/getFolderStructure.js.map +1 -1
  372. package/dist/src/utils/gitIgnoreParser.d.ts +4 -1
  373. package/dist/src/utils/gitIgnoreParser.js +21 -4
  374. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  375. package/dist/src/utils/gitIgnoreParser.test.js +28 -0
  376. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  377. package/dist/src/utils/googleErrors.d.ts +104 -0
  378. package/dist/src/utils/googleErrors.js +152 -0
  379. package/dist/src/utils/googleErrors.js.map +1 -0
  380. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  381. package/dist/src/utils/googleErrors.test.js +301 -0
  382. package/dist/src/utils/googleErrors.test.js.map +1 -0
  383. package/dist/src/utils/googleQuotaErrors.d.ts +36 -0
  384. package/dist/src/utils/googleQuotaErrors.js +149 -0
  385. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  386. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  387. package/dist/src/utils/googleQuotaErrors.test.js +311 -0
  388. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  389. package/dist/src/utils/ignorePatterns.test.js +26 -30
  390. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  391. package/dist/src/utils/installationManager.js +2 -1
  392. package/dist/src/utils/installationManager.js.map +1 -1
  393. package/dist/src/utils/installationManager.test.js +3 -3
  394. package/dist/src/utils/installationManager.test.js.map +1 -1
  395. package/dist/src/utils/llm-edit-fixer.d.ts +1 -1
  396. package/dist/src/utils/llm-edit-fixer.js +27 -3
  397. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  398. package/dist/src/utils/llm-edit-fixer.test.js +21 -0
  399. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  400. package/dist/src/utils/memoryDiscovery.d.ts +11 -2
  401. package/dist/src/utils/memoryDiscovery.js +140 -2
  402. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  403. package/dist/src/utils/memoryDiscovery.test.js +153 -37
  404. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  405. package/dist/src/utils/package.d.ts +12 -0
  406. package/dist/src/utils/package.js +15 -0
  407. package/dist/src/utils/package.js.map +1 -0
  408. package/dist/src/utils/paths.js +126 -26
  409. package/dist/src/utils/paths.js.map +1 -1
  410. package/dist/src/utils/paths.test.js +200 -68
  411. package/dist/src/utils/paths.test.js.map +1 -1
  412. package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
  413. package/dist/src/utils/quotaErrorDetection.js +0 -46
  414. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  415. package/dist/src/utils/retry.js +41 -145
  416. package/dist/src/utils/retry.js.map +1 -1
  417. package/dist/src/utils/retry.test.js +31 -110
  418. package/dist/src/utils/retry.test.js.map +1 -1
  419. package/dist/src/utils/shell-utils.js +29 -1
  420. package/dist/src/utils/shell-utils.js.map +1 -1
  421. package/dist/src/utils/shell-utils.test.js +88 -0
  422. package/dist/src/utils/shell-utils.test.js.map +1 -1
  423. package/dist/src/utils/summarizer.js +2 -1
  424. package/dist/src/utils/summarizer.js.map +1 -1
  425. package/dist/src/utils/summarizer.test.js +0 -1
  426. package/dist/src/utils/summarizer.test.js.map +1 -1
  427. package/dist/src/utils/workspaceContext.js +1 -1
  428. package/dist/src/utils/workspaceContext.js.map +1 -1
  429. package/dist/src/utils/workspaceContext.test.js +2 -2
  430. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  431. package/dist/tsconfig.tsbuildinfo +1 -1
  432. package/package.json +9 -3
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { debugLogger } from '../utils/debugLogger.js';
7
+ /**
8
+ * Hook planner that selects matching hooks and creates execution plans
9
+ */
10
+ export class HookPlanner {
11
+ hookRegistry;
12
+ constructor(hookRegistry) {
13
+ this.hookRegistry = hookRegistry;
14
+ }
15
+ /**
16
+ * Create execution plan for a hook event
17
+ */
18
+ createExecutionPlan(eventName, context) {
19
+ const hookEntries = this.hookRegistry.getHooksForEvent(eventName);
20
+ if (hookEntries.length === 0) {
21
+ return null;
22
+ }
23
+ // Filter hooks by matcher
24
+ const matchingEntries = hookEntries.filter((entry) => this.matchesContext(entry, context));
25
+ if (matchingEntries.length === 0) {
26
+ return null;
27
+ }
28
+ // Deduplicate identical hooks
29
+ const deduplicatedEntries = this.deduplicateHooks(matchingEntries);
30
+ // Extract hook configs
31
+ const hookConfigs = deduplicatedEntries.map((entry) => entry.config);
32
+ // Determine execution strategy - if ANY hook definition has sequential=true, run all sequentially
33
+ const sequential = deduplicatedEntries.some((entry) => entry.sequential === true);
34
+ const plan = {
35
+ eventName,
36
+ hookConfigs,
37
+ sequential,
38
+ };
39
+ debugLogger.debug(`Created execution plan for ${eventName}: ${hookConfigs.length} hook(s) to execute ${sequential ? 'sequentially' : 'in parallel'}`);
40
+ return plan;
41
+ }
42
+ /**
43
+ * Check if a hook entry matches the given context
44
+ */
45
+ matchesContext(entry, context) {
46
+ if (!entry.matcher || !context) {
47
+ return true; // No matcher means match all
48
+ }
49
+ const matcher = entry.matcher.trim();
50
+ if (matcher === '' || matcher === '*') {
51
+ return true; // Empty string or wildcard matches all
52
+ }
53
+ // For tool events, match against tool name
54
+ if (context.toolName) {
55
+ return this.matchesToolName(matcher, context.toolName);
56
+ }
57
+ // For other events, match against trigger/source
58
+ if (context.trigger) {
59
+ return this.matchesTrigger(matcher, context.trigger);
60
+ }
61
+ return true;
62
+ }
63
+ /**
64
+ * Match tool name against matcher pattern
65
+ */
66
+ matchesToolName(matcher, toolName) {
67
+ try {
68
+ // Attempt to treat the matcher as a regular expression.
69
+ const regex = new RegExp(matcher);
70
+ return regex.test(toolName);
71
+ }
72
+ catch {
73
+ // If it's not a valid regex, treat it as a literal string for an exact match.
74
+ return matcher === toolName;
75
+ }
76
+ }
77
+ /**
78
+ * Match trigger/source against matcher pattern
79
+ */
80
+ matchesTrigger(matcher, trigger) {
81
+ return matcher === trigger;
82
+ }
83
+ /**
84
+ * Deduplicate identical hook configurations
85
+ */
86
+ deduplicateHooks(entries) {
87
+ const seen = new Set();
88
+ const deduplicated = [];
89
+ for (const entry of entries) {
90
+ const key = this.getHookKey(entry);
91
+ if (!seen.has(key)) {
92
+ seen.add(key);
93
+ deduplicated.push(entry);
94
+ }
95
+ else {
96
+ debugLogger.debug(`Deduplicated hook: ${key}`);
97
+ }
98
+ }
99
+ return deduplicated;
100
+ }
101
+ /**
102
+ * Generate a unique key for a hook entry
103
+ */
104
+ getHookKey(entry) {
105
+ return `command:${entry.config.command}`;
106
+ }
107
+ }
108
+ //# sourceMappingURL=hookPlanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookPlanner.js","sourceRoot":"","sources":["../../../src/hooks/hookPlanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,255 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { HookPlanner } from './hookPlanner.js';
8
+ import { HookEventName, HookType } from './types.js';
9
+ import { ConfigSource } from './hookRegistry.js';
10
+ // Mock debugLogger using vi.hoisted
11
+ const mockDebugLogger = vi.hoisted(() => ({
12
+ log: vi.fn(),
13
+ warn: vi.fn(),
14
+ error: vi.fn(),
15
+ debug: vi.fn(),
16
+ }));
17
+ vi.mock('../utils/debugLogger.js', () => ({
18
+ debugLogger: mockDebugLogger,
19
+ }));
20
+ describe('HookPlanner', () => {
21
+ let hookPlanner;
22
+ let mockHookRegistry;
23
+ beforeEach(() => {
24
+ vi.resetAllMocks();
25
+ mockHookRegistry = {
26
+ getHooksForEvent: vi.fn(),
27
+ };
28
+ hookPlanner = new HookPlanner(mockHookRegistry);
29
+ });
30
+ describe('createExecutionPlan', () => {
31
+ it('should return empty plan when no hooks registered', () => {
32
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue([]);
33
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool);
34
+ expect(plan).toBeNull();
35
+ });
36
+ it('should create plan for hooks without matchers', () => {
37
+ const mockEntries = [
38
+ {
39
+ config: { type: HookType.Command, command: './hook1.sh' },
40
+ source: ConfigSource.Project,
41
+ eventName: HookEventName.BeforeTool,
42
+ enabled: true,
43
+ },
44
+ {
45
+ config: {
46
+ type: HookType.Command,
47
+ command: './test-hook.sh',
48
+ },
49
+ source: ConfigSource.User,
50
+ eventName: HookEventName.BeforeTool,
51
+ enabled: true,
52
+ },
53
+ ];
54
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
55
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool);
56
+ expect(plan).not.toBeNull();
57
+ expect(plan.hookConfigs).toHaveLength(2);
58
+ expect(plan.hookConfigs[0].command).toBe('./hook1.sh');
59
+ expect(plan.hookConfigs[1].command).toBe('./test-hook.sh');
60
+ });
61
+ it('should filter hooks by tool name matcher', () => {
62
+ const mockEntries = [
63
+ {
64
+ config: { type: HookType.Command, command: './edit_hook.sh' },
65
+ source: ConfigSource.Project,
66
+ eventName: HookEventName.BeforeTool,
67
+ matcher: 'EditTool',
68
+ enabled: true,
69
+ },
70
+ {
71
+ config: { type: HookType.Command, command: './general_hook.sh' },
72
+ source: ConfigSource.Project,
73
+ eventName: HookEventName.BeforeTool,
74
+ enabled: true,
75
+ },
76
+ ];
77
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
78
+ // Test with EditTool context
79
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, {
80
+ toolName: 'EditTool',
81
+ });
82
+ expect(plan).not.toBeNull();
83
+ expect(plan.hookConfigs).toHaveLength(2); // Both should match (one specific, one general)
84
+ });
85
+ it('should filter hooks by regex matcher', () => {
86
+ const mockEntries = [
87
+ {
88
+ config: { type: HookType.Command, command: './edit_hook.sh' },
89
+ source: ConfigSource.Project,
90
+ eventName: HookEventName.BeforeTool,
91
+ matcher: 'Edit|Write',
92
+ enabled: true,
93
+ },
94
+ {
95
+ config: { type: HookType.Command, command: './read_hook.sh' },
96
+ source: ConfigSource.Project,
97
+ eventName: HookEventName.BeforeTool,
98
+ matcher: 'ReadTool',
99
+ enabled: true,
100
+ },
101
+ ];
102
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
103
+ // Test with EditTool - should match first hook
104
+ const editPlan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, { toolName: 'EditTool' });
105
+ expect(editPlan).not.toBeNull();
106
+ expect(editPlan.hookConfigs).toHaveLength(1);
107
+ expect(editPlan.hookConfigs[0].command).toBe('./edit_hook.sh');
108
+ // Test with WriteTool - should match first hook
109
+ const writePlan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, { toolName: 'WriteTool' });
110
+ expect(writePlan).not.toBeNull();
111
+ expect(writePlan.hookConfigs).toHaveLength(1);
112
+ expect(writePlan.hookConfigs[0].command).toBe('./edit_hook.sh');
113
+ // Test with ReadTool - should match second hook
114
+ const readPlan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, { toolName: 'ReadTool' });
115
+ expect(readPlan).not.toBeNull();
116
+ expect(readPlan.hookConfigs).toHaveLength(1);
117
+ expect(readPlan.hookConfigs[0].command).toBe('./read_hook.sh');
118
+ // Test with unmatched tool - should match no hooks
119
+ const otherPlan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, { toolName: 'OtherTool' });
120
+ expect(otherPlan).toBeNull();
121
+ });
122
+ it('should handle wildcard matcher', () => {
123
+ const mockEntries = [
124
+ {
125
+ config: { type: HookType.Command, command: './wildcard_hook.sh' },
126
+ source: ConfigSource.Project,
127
+ eventName: HookEventName.BeforeTool,
128
+ matcher: '*',
129
+ enabled: true,
130
+ },
131
+ ];
132
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
133
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, {
134
+ toolName: 'AnyTool',
135
+ });
136
+ expect(plan).not.toBeNull();
137
+ expect(plan.hookConfigs).toHaveLength(1);
138
+ });
139
+ it('should handle empty string matcher', () => {
140
+ const mockEntries = [
141
+ {
142
+ config: {
143
+ type: HookType.Command,
144
+ command: './empty_matcher_hook.sh',
145
+ },
146
+ source: ConfigSource.Project,
147
+ eventName: HookEventName.BeforeTool,
148
+ matcher: '',
149
+ enabled: true,
150
+ },
151
+ ];
152
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
153
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, {
154
+ toolName: 'AnyTool',
155
+ });
156
+ expect(plan).not.toBeNull();
157
+ expect(plan.hookConfigs).toHaveLength(1);
158
+ });
159
+ it('should handle invalid regex matcher gracefully', () => {
160
+ const mockEntries = [
161
+ {
162
+ config: {
163
+ type: HookType.Command,
164
+ command: './invalid_regex_hook.sh',
165
+ },
166
+ source: ConfigSource.Project,
167
+ eventName: HookEventName.BeforeTool,
168
+ matcher: '[invalid-regex',
169
+ enabled: true,
170
+ },
171
+ ];
172
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
173
+ // Should match when toolName exactly equals the invalid regex pattern
174
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, {
175
+ toolName: '[invalid-regex',
176
+ });
177
+ expect(plan).not.toBeNull();
178
+ expect(plan.hookConfigs).toHaveLength(1); // Should fall back to exact match
179
+ // Should not match when toolName doesn't exactly equal the pattern
180
+ const planNoMatch = hookPlanner.createExecutionPlan(HookEventName.BeforeTool, {
181
+ toolName: 'other-tool',
182
+ });
183
+ expect(planNoMatch).toBeNull();
184
+ });
185
+ it('should deduplicate identical hooks', () => {
186
+ const mockEntries = [
187
+ {
188
+ config: { type: HookType.Command, command: './same_hook.sh' },
189
+ source: ConfigSource.Project,
190
+ eventName: HookEventName.BeforeTool,
191
+ enabled: true,
192
+ },
193
+ {
194
+ config: { type: HookType.Command, command: './same_hook.sh' },
195
+ source: ConfigSource.User,
196
+ eventName: HookEventName.BeforeTool,
197
+ enabled: true,
198
+ },
199
+ {
200
+ config: {
201
+ type: HookType.Command,
202
+ command: './test-hook.sh',
203
+ },
204
+ source: ConfigSource.Project,
205
+ eventName: HookEventName.BeforeTool,
206
+ enabled: true,
207
+ },
208
+ {
209
+ config: {
210
+ type: HookType.Command,
211
+ command: './test-hook.sh',
212
+ },
213
+ source: ConfigSource.User,
214
+ eventName: HookEventName.BeforeTool,
215
+ enabled: true,
216
+ },
217
+ ];
218
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
219
+ const plan = hookPlanner.createExecutionPlan(HookEventName.BeforeTool);
220
+ expect(plan).not.toBeNull();
221
+ expect(plan.hookConfigs).toHaveLength(2); // Should be deduplicated to 2 unique hooks
222
+ expect(mockDebugLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Deduplicated hook'));
223
+ });
224
+ it('should match trigger for session events', () => {
225
+ const mockEntries = [
226
+ {
227
+ config: { type: HookType.Command, command: './startup_hook.sh' },
228
+ source: ConfigSource.Project,
229
+ eventName: HookEventName.SessionStart,
230
+ matcher: 'startup',
231
+ enabled: true,
232
+ },
233
+ {
234
+ config: { type: HookType.Command, command: './resume_hook.sh' },
235
+ source: ConfigSource.Project,
236
+ eventName: HookEventName.SessionStart,
237
+ matcher: 'resume',
238
+ enabled: true,
239
+ },
240
+ ];
241
+ vi.mocked(mockHookRegistry.getHooksForEvent).mockReturnValue(mockEntries);
242
+ // Test startup trigger
243
+ const startupPlan = hookPlanner.createExecutionPlan(HookEventName.SessionStart, { trigger: 'startup' });
244
+ expect(startupPlan).not.toBeNull();
245
+ expect(startupPlan.hookConfigs).toHaveLength(1);
246
+ expect(startupPlan.hookConfigs[0].command).toBe('./startup_hook.sh');
247
+ // Test resume trigger
248
+ const resumePlan = hookPlanner.createExecutionPlan(HookEventName.SessionStart, { trigger: 'resume' });
249
+ expect(resumePlan).not.toBeNull();
250
+ expect(resumePlan.hookConfigs).toHaveLength(1);
251
+ expect(resumePlan.hookConfigs[0].command).toBe('./resume_hook.sh');
252
+ });
253
+ });
254
+ });
255
+ //# sourceMappingURL=hookPlanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookPlanner.test.js","sourceRoot":"","sources":["../../../src/hooks/hookPlanner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Config } from '../config/config.js';
7
+ import type { HookConfig } from './types.js';
8
+ import { HookEventName } from './types.js';
9
+ /**
10
+ * Error thrown when attempting to use HookRegistry before initialization
11
+ */
12
+ export declare class HookRegistryNotInitializedError extends Error {
13
+ constructor(message?: string);
14
+ }
15
+ /**
16
+ * Configuration source levels in precedence order (highest to lowest)
17
+ */
18
+ export declare enum ConfigSource {
19
+ Project = "project",
20
+ User = "user",
21
+ System = "system",
22
+ Extensions = "extensions"
23
+ }
24
+ /**
25
+ * Hook registry entry with source information
26
+ */
27
+ export interface HookRegistryEntry {
28
+ config: HookConfig;
29
+ source: ConfigSource;
30
+ eventName: HookEventName;
31
+ matcher?: string;
32
+ sequential?: boolean;
33
+ enabled: boolean;
34
+ }
35
+ /**
36
+ * Hook registry that loads and validates hook definitions from multiple sources
37
+ */
38
+ export declare class HookRegistry {
39
+ private readonly config;
40
+ private entries;
41
+ private initialized;
42
+ constructor(config: Config);
43
+ /**
44
+ * Initialize the registry by processing hooks from config
45
+ */
46
+ initialize(): Promise<void>;
47
+ /**
48
+ * Get all hook entries for a specific event
49
+ */
50
+ getHooksForEvent(eventName: HookEventName): HookRegistryEntry[];
51
+ /**
52
+ * Get all registered hooks
53
+ */
54
+ getAllHooks(): HookRegistryEntry[];
55
+ /**
56
+ * Enable or disable a specific hook
57
+ */
58
+ setHookEnabled(hookName: string, enabled: boolean): void;
59
+ /**
60
+ * Get hook name for display purposes
61
+ */
62
+ private getHookName;
63
+ /**
64
+ * Process hooks from the config that was already loaded by the CLI
65
+ */
66
+ private processHooksFromConfig;
67
+ /**
68
+ * Process hooks configuration and add entries
69
+ */
70
+ private processHooksConfiguration;
71
+ /**
72
+ * Process a single hook definition
73
+ */
74
+ private processHookDefinition;
75
+ /**
76
+ * Validate a hook configuration
77
+ */
78
+ private validateHookConfig;
79
+ /**
80
+ * Check if an event name is valid
81
+ */
82
+ private isValidEventName;
83
+ /**
84
+ * Get source priority (lower number = higher priority)
85
+ */
86
+ private getSourcePriority;
87
+ }
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { HookEventName } from './types.js';
7
+ import { debugLogger } from '../utils/debugLogger.js';
8
+ /**
9
+ * Error thrown when attempting to use HookRegistry before initialization
10
+ */
11
+ export class HookRegistryNotInitializedError extends Error {
12
+ constructor(message = 'Hook registry not initialized') {
13
+ super(message);
14
+ this.name = 'HookRegistryNotInitializedError';
15
+ }
16
+ }
17
+ /**
18
+ * Configuration source levels in precedence order (highest to lowest)
19
+ */
20
+ export var ConfigSource;
21
+ (function (ConfigSource) {
22
+ ConfigSource["Project"] = "project";
23
+ ConfigSource["User"] = "user";
24
+ ConfigSource["System"] = "system";
25
+ ConfigSource["Extensions"] = "extensions";
26
+ })(ConfigSource || (ConfigSource = {}));
27
+ /**
28
+ * Hook registry that loads and validates hook definitions from multiple sources
29
+ */
30
+ export class HookRegistry {
31
+ config;
32
+ entries = [];
33
+ initialized = false;
34
+ constructor(config) {
35
+ this.config = config;
36
+ }
37
+ /**
38
+ * Initialize the registry by processing hooks from config
39
+ */
40
+ async initialize() {
41
+ if (this.initialized) {
42
+ return;
43
+ }
44
+ this.entries = [];
45
+ this.processHooksFromConfig();
46
+ this.initialized = true;
47
+ debugLogger.log(`Hook registry initialized with ${this.entries.length} hook entries`);
48
+ }
49
+ /**
50
+ * Get all hook entries for a specific event
51
+ */
52
+ getHooksForEvent(eventName) {
53
+ if (!this.initialized) {
54
+ throw new HookRegistryNotInitializedError();
55
+ }
56
+ return this.entries
57
+ .filter((entry) => entry.eventName === eventName && entry.enabled)
58
+ .sort((a, b) => this.getSourcePriority(a.source) - this.getSourcePriority(b.source));
59
+ }
60
+ /**
61
+ * Get all registered hooks
62
+ */
63
+ getAllHooks() {
64
+ if (!this.initialized) {
65
+ throw new HookRegistryNotInitializedError();
66
+ }
67
+ return [...this.entries];
68
+ }
69
+ /**
70
+ * Enable or disable a specific hook
71
+ */
72
+ setHookEnabled(hookName, enabled) {
73
+ const updated = this.entries.filter((entry) => {
74
+ const name = this.getHookName(entry);
75
+ if (name === hookName) {
76
+ entry.enabled = enabled;
77
+ return true;
78
+ }
79
+ return false;
80
+ });
81
+ if (updated.length > 0) {
82
+ debugLogger.log(`${enabled ? 'Enabled' : 'Disabled'} ${updated.length} hook(s) matching "${hookName}"`);
83
+ }
84
+ else {
85
+ debugLogger.warn(`No hooks found matching "${hookName}"`);
86
+ }
87
+ }
88
+ /**
89
+ * Get hook name for display purposes
90
+ */
91
+ getHookName(entry) {
92
+ return entry.config.command || 'unknown-command';
93
+ }
94
+ /**
95
+ * Process hooks from the config that was already loaded by the CLI
96
+ */
97
+ processHooksFromConfig() {
98
+ // Get hooks from the main config (this comes from the merged settings)
99
+ const configHooks = this.config.getHooks();
100
+ if (configHooks) {
101
+ this.processHooksConfiguration(configHooks, ConfigSource.Project);
102
+ }
103
+ // Get hooks from extensions
104
+ const extensions = this.config.getExtensions() || [];
105
+ for (const extension of extensions) {
106
+ if (extension.isActive && extension.hooks) {
107
+ this.processHooksConfiguration(extension.hooks, ConfigSource.Extensions);
108
+ }
109
+ }
110
+ }
111
+ /**
112
+ * Process hooks configuration and add entries
113
+ */
114
+ processHooksConfiguration(hooksConfig, source) {
115
+ for (const [eventName, definitions] of Object.entries(hooksConfig)) {
116
+ if (!this.isValidEventName(eventName)) {
117
+ debugLogger.warn(`Invalid hook event name: ${eventName}`);
118
+ continue;
119
+ }
120
+ const typedEventName = eventName;
121
+ if (!Array.isArray(definitions)) {
122
+ debugLogger.warn(`Hook definitions for event "${eventName}" from source "${source}" is not an array. Skipping.`);
123
+ continue;
124
+ }
125
+ for (const definition of definitions) {
126
+ this.processHookDefinition(definition, typedEventName, source);
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Process a single hook definition
132
+ */
133
+ processHookDefinition(definition, eventName, source) {
134
+ if (!definition ||
135
+ typeof definition !== 'object' ||
136
+ !Array.isArray(definition.hooks)) {
137
+ debugLogger.warn(`Discarding invalid hook definition for ${eventName} from ${source}:`, definition);
138
+ return;
139
+ }
140
+ for (const hookConfig of definition.hooks) {
141
+ if (hookConfig &&
142
+ typeof hookConfig === 'object' &&
143
+ this.validateHookConfig(hookConfig, eventName, source)) {
144
+ this.entries.push({
145
+ config: hookConfig,
146
+ source,
147
+ eventName,
148
+ matcher: definition.matcher,
149
+ sequential: definition.sequential,
150
+ enabled: true,
151
+ });
152
+ }
153
+ else {
154
+ // Invalid hooks are logged and discarded here, they won't reach HookRunner
155
+ debugLogger.warn(`Discarding invalid hook configuration for ${eventName} from ${source}:`, hookConfig);
156
+ }
157
+ }
158
+ }
159
+ /**
160
+ * Validate a hook configuration
161
+ */
162
+ validateHookConfig(config, eventName, source) {
163
+ if (!config.type || !['command', 'plugin'].includes(config.type)) {
164
+ debugLogger.warn(`Invalid hook ${eventName} from ${source} type: ${config.type}`);
165
+ return false;
166
+ }
167
+ if (config.type === 'command' && !config.command) {
168
+ debugLogger.warn(`Command hook ${eventName} from ${source} missing command field`);
169
+ return false;
170
+ }
171
+ return true;
172
+ }
173
+ /**
174
+ * Check if an event name is valid
175
+ */
176
+ isValidEventName(eventName) {
177
+ const validEventNames = Object.values(HookEventName);
178
+ return validEventNames.includes(eventName);
179
+ }
180
+ /**
181
+ * Get source priority (lower number = higher priority)
182
+ */
183
+ getSourcePriority(source) {
184
+ switch (source) {
185
+ case ConfigSource.Project:
186
+ return 1;
187
+ case ConfigSource.User:
188
+ return 2;
189
+ case ConfigSource.System:
190
+ return 3;
191
+ case ConfigSource.Extensions:
192
+ return 4;
193
+ default:
194
+ return 999;
195
+ }
196
+ }
197
+ }
198
+ //# sourceMappingURL=hookRegistry.js.map