@machina.ai/cell-cli-core 1.22.5-rc1 → 1.25.0-rc1

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 (732) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +26 -0
  2. package/dist/docs/CHANGES.md +124 -0
  3. package/dist/docs/api-proxy.md +27 -0
  4. package/dist/docs/architecture.md +80 -0
  5. package/dist/docs/assets/connected_devtools.png +0 -0
  6. package/dist/docs/assets/gemini-screenshot.png +0 -0
  7. package/dist/docs/assets/monitoring-dashboard-logs.png +0 -0
  8. package/dist/docs/assets/monitoring-dashboard-metrics.png +0 -0
  9. package/dist/docs/assets/monitoring-dashboard-overview.png +0 -0
  10. package/dist/docs/assets/release_patch.png +0 -0
  11. package/dist/docs/assets/theme-ansi-light.png +0 -0
  12. package/dist/docs/assets/theme-ansi.png +0 -0
  13. package/dist/docs/assets/theme-atom-one.png +0 -0
  14. package/dist/docs/assets/theme-ayu-light.png +0 -0
  15. package/dist/docs/assets/theme-ayu.png +0 -0
  16. package/dist/docs/assets/theme-custom.png +0 -0
  17. package/dist/docs/assets/theme-default-light.png +0 -0
  18. package/dist/docs/assets/theme-default.png +0 -0
  19. package/dist/docs/assets/theme-dracula.png +0 -0
  20. package/dist/docs/assets/theme-github-light.png +0 -0
  21. package/dist/docs/assets/theme-github.png +0 -0
  22. package/dist/docs/assets/theme-google-light.png +0 -0
  23. package/dist/docs/assets/theme-xcode-light.png +0 -0
  24. package/dist/docs/changelogs/index.md +612 -0
  25. package/dist/docs/changelogs/latest.md +153 -0
  26. package/dist/docs/changelogs/preview.md +131 -0
  27. package/dist/docs/changelogs/releases.md +1162 -0
  28. package/dist/docs/cli/authentication.md +3 -0
  29. package/dist/docs/cli/checkpointing.md +94 -0
  30. package/dist/docs/cli/commands.md +357 -0
  31. package/dist/docs/cli/custom-commands.md +315 -0
  32. package/dist/docs/cli/enterprise.md +564 -0
  33. package/dist/docs/cli/gemini-ignore.md +71 -0
  34. package/dist/docs/cli/gemini-md.md +109 -0
  35. package/dist/docs/cli/generation-settings.md +210 -0
  36. package/dist/docs/cli/headless.md +388 -0
  37. package/dist/docs/cli/index.md +63 -0
  38. package/dist/docs/cli/keyboard-shortcuts.md +136 -0
  39. package/dist/docs/cli/model-routing.md +37 -0
  40. package/dist/docs/cli/model.md +62 -0
  41. package/dist/docs/cli/sandbox.md +171 -0
  42. package/dist/docs/cli/session-management.md +158 -0
  43. package/dist/docs/cli/settings.md +148 -0
  44. package/dist/docs/cli/skills.md +188 -0
  45. package/dist/docs/cli/system-prompt.md +94 -0
  46. package/dist/docs/cli/telemetry.md +813 -0
  47. package/dist/docs/cli/themes.md +237 -0
  48. package/dist/docs/cli/token-caching.md +20 -0
  49. package/dist/docs/cli/trusted-folders.md +95 -0
  50. package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
  51. package/dist/docs/cli/tutorials.md +87 -0
  52. package/dist/docs/cli/uninstall.md +47 -0
  53. package/dist/docs/core/index.md +101 -0
  54. package/dist/docs/core/memport.md +246 -0
  55. package/dist/docs/core/policy-engine.md +268 -0
  56. package/dist/docs/core/tools-api.md +131 -0
  57. package/dist/docs/examples/proxy-script.md +83 -0
  58. package/dist/docs/extensions/extension-releasing.md +183 -0
  59. package/dist/docs/extensions/getting-started-extensions.md +244 -0
  60. package/dist/docs/extensions/index.md +343 -0
  61. package/dist/docs/faq.md +153 -0
  62. package/dist/docs/get-started/authentication.md +321 -0
  63. package/dist/docs/get-started/configuration-v1.md +890 -0
  64. package/dist/docs/get-started/configuration.md +1643 -0
  65. package/dist/docs/get-started/examples.md +218 -0
  66. package/dist/docs/get-started/gemini-3.md +101 -0
  67. package/dist/docs/get-started/index.md +71 -0
  68. package/dist/docs/get-started/installation.md +141 -0
  69. package/dist/docs/hooks/best-practices.md +856 -0
  70. package/dist/docs/hooks/index.md +723 -0
  71. package/dist/docs/hooks/reference.md +178 -0
  72. package/dist/docs/hooks/writing-hooks.md +1044 -0
  73. package/dist/docs/ide-integration/ide-companion-spec.md +267 -0
  74. package/dist/docs/ide-integration/index.md +201 -0
  75. package/dist/docs/index.md +147 -0
  76. package/dist/docs/integration-tests.md +211 -0
  77. package/dist/docs/issue-and-pr-automation.md +134 -0
  78. package/dist/docs/local-development.md +128 -0
  79. package/dist/docs/mcp_integration.md +160 -0
  80. package/dist/docs/mermaid/context.mmd +103 -0
  81. package/dist/docs/mermaid/render-path.mmd +64 -0
  82. package/dist/docs/npm.md +62 -0
  83. package/dist/docs/quota-and-pricing.md +158 -0
  84. package/dist/docs/release-confidence.md +164 -0
  85. package/dist/docs/releases.md +540 -0
  86. package/dist/docs/sidebar.json +301 -0
  87. package/dist/docs/tools/file-system.md +217 -0
  88. package/dist/docs/tools/index.md +95 -0
  89. package/dist/docs/tools/mcp-server.md +1045 -0
  90. package/dist/docs/tools/memory.md +54 -0
  91. package/dist/docs/tools/shell.md +260 -0
  92. package/dist/docs/tools/todos.md +56 -0
  93. package/dist/docs/tools/web-fetch.md +59 -0
  94. package/dist/docs/tools/web-search.md +42 -0
  95. package/dist/docs/tos-privacy.md +96 -0
  96. package/dist/docs/troubleshooting.md +162 -0
  97. package/dist/package.json +7 -4
  98. package/dist/src/agents/a2a-client-manager.d.ts +82 -0
  99. package/dist/src/agents/a2a-client-manager.js +295 -0
  100. package/dist/src/agents/a2a-client-manager.js.map +1 -0
  101. package/dist/src/agents/a2a-client-manager.test.js +281 -0
  102. package/dist/src/agents/a2a-client-manager.test.js.map +1 -0
  103. package/dist/src/agents/a2aUtils.d.ts +29 -0
  104. package/dist/src/agents/a2aUtils.js +113 -0
  105. package/dist/src/agents/a2aUtils.js.map +1 -0
  106. package/dist/src/agents/a2aUtils.test.js +147 -0
  107. package/dist/src/agents/a2aUtils.test.js.map +1 -0
  108. package/dist/src/agents/agentLoader.d.ts +68 -0
  109. package/dist/src/agents/agentLoader.js +255 -0
  110. package/dist/src/agents/agentLoader.js.map +1 -0
  111. package/dist/src/agents/agentLoader.test.js +307 -0
  112. package/dist/src/agents/agentLoader.test.js.map +1 -0
  113. package/dist/src/agents/cli-help-agent.d.ts +24 -0
  114. package/dist/src/agents/cli-help-agent.js +85 -0
  115. package/dist/src/agents/cli-help-agent.js.map +1 -0
  116. package/dist/src/agents/cli-help-agent.test.js +65 -0
  117. package/dist/src/agents/cli-help-agent.test.js.map +1 -0
  118. package/dist/src/agents/codebase-investigator.d.ts +2 -2
  119. package/dist/src/agents/codebase-investigator.js +14 -8
  120. package/dist/src/agents/codebase-investigator.js.map +1 -1
  121. package/dist/src/agents/delegate-to-agent-tool.d.ts +2 -2
  122. package/dist/src/agents/delegate-to-agent-tool.js +25 -14
  123. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
  124. package/dist/src/agents/delegate-to-agent-tool.test.js +101 -21
  125. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
  126. package/dist/src/agents/{executor.d.ts → local-executor.d.ts} +5 -11
  127. package/dist/src/agents/{executor.js → local-executor.js} +123 -62
  128. package/dist/src/agents/local-executor.js.map +1 -0
  129. package/dist/src/agents/local-executor.test.d.ts +6 -0
  130. package/dist/src/agents/{executor.test.js → local-executor.test.js} +136 -58
  131. package/dist/src/agents/local-executor.test.js.map +1 -0
  132. package/dist/src/agents/{invocation.d.ts → local-invocation.d.ts} +6 -7
  133. package/dist/src/agents/{invocation.js → local-invocation.js} +9 -10
  134. package/dist/src/agents/local-invocation.js.map +1 -0
  135. package/dist/src/agents/local-invocation.test.d.ts +6 -0
  136. package/dist/src/agents/{invocation.test.js → local-invocation.test.js} +29 -20
  137. package/dist/src/agents/local-invocation.test.js.map +1 -0
  138. package/dist/src/agents/registry.d.ts +22 -1
  139. package/dist/src/agents/registry.js +192 -35
  140. package/dist/src/agents/registry.js.map +1 -1
  141. package/dist/src/agents/registry.test.js +407 -33
  142. package/dist/src/agents/registry.test.js.map +1 -1
  143. package/dist/src/agents/remote-invocation.d.ts +35 -0
  144. package/dist/src/agents/remote-invocation.js +126 -0
  145. package/dist/src/agents/remote-invocation.js.map +1 -0
  146. package/dist/src/agents/remote-invocation.test.d.ts +6 -0
  147. package/dist/src/agents/remote-invocation.test.js +201 -0
  148. package/dist/src/agents/remote-invocation.test.js.map +1 -0
  149. package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
  150. package/dist/src/agents/subagent-tool-wrapper.js +11 -6
  151. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  152. package/dist/src/agents/subagent-tool-wrapper.test.js +33 -19
  153. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  154. package/dist/src/agents/types.d.ts +21 -15
  155. package/dist/src/agents/types.js.map +1 -1
  156. package/dist/src/availability/fallbackIntegration.test.d.ts +6 -0
  157. package/dist/src/availability/fallbackIntegration.test.js +58 -0
  158. package/dist/src/availability/fallbackIntegration.test.js.map +1 -0
  159. package/dist/src/availability/modelAvailabilityService.d.ts +2 -1
  160. package/dist/src/availability/policyHelpers.d.ts +4 -3
  161. package/dist/src/availability/policyHelpers.js +13 -22
  162. package/dist/src/availability/policyHelpers.js.map +1 -1
  163. package/dist/src/availability/policyHelpers.test.js +28 -18
  164. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  165. package/dist/src/code_assist/experiments/experiments.d.ts +1 -1
  166. package/dist/src/code_assist/experiments/experiments.js +21 -0
  167. package/dist/src/code_assist/experiments/experiments.js.map +1 -1
  168. package/dist/src/code_assist/experiments/experiments_local.test.d.ts +6 -0
  169. package/dist/src/code_assist/experiments/experiments_local.test.js +110 -0
  170. package/dist/src/code_assist/experiments/experiments_local.test.js.map +1 -0
  171. package/dist/src/code_assist/oauth-credential-storage.js +3 -4
  172. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  173. package/dist/src/code_assist/oauth2.js +32 -2
  174. package/dist/src/code_assist/oauth2.js.map +1 -1
  175. package/dist/src/code_assist/oauth2.test.js +111 -16
  176. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  177. package/dist/src/code_assist/server.d.ts +9 -1
  178. package/dist/src/code_assist/server.js +74 -11
  179. package/dist/src/code_assist/server.js.map +1 -1
  180. package/dist/src/code_assist/server.test.js +199 -27
  181. package/dist/src/code_assist/server.test.js.map +1 -1
  182. package/dist/src/code_assist/setup.js +6 -4
  183. package/dist/src/code_assist/setup.js.map +1 -1
  184. package/dist/src/code_assist/setup.test.js +63 -0
  185. package/dist/src/code_assist/setup.test.js.map +1 -1
  186. package/dist/src/code_assist/telemetry.d.ts +14 -0
  187. package/dist/src/code_assist/telemetry.js +157 -0
  188. package/dist/src/code_assist/telemetry.js.map +1 -0
  189. package/dist/src/code_assist/telemetry.test.d.ts +6 -0
  190. package/dist/src/code_assist/telemetry.test.js +301 -0
  191. package/dist/src/code_assist/telemetry.test.js.map +1 -0
  192. package/dist/src/code_assist/types.d.ts +77 -1
  193. package/dist/src/code_assist/types.js +28 -0
  194. package/dist/src/code_assist/types.js.map +1 -1
  195. package/dist/src/commands/memory.d.ts +11 -0
  196. package/dist/src/commands/memory.js +80 -0
  197. package/dist/src/commands/memory.js.map +1 -0
  198. package/dist/src/commands/memory.test.d.ts +6 -0
  199. package/dist/src/commands/memory.test.js +155 -0
  200. package/dist/src/commands/memory.test.js.map +1 -0
  201. package/dist/src/config/config.d.ts +120 -26
  202. package/dist/src/config/config.js +241 -120
  203. package/dist/src/config/config.js.map +1 -1
  204. package/dist/src/config/config.test.js +215 -43
  205. package/dist/src/config/config.test.js.map +1 -1
  206. package/dist/src/config/flashFallback.test.js +11 -35
  207. package/dist/src/config/flashFallback.test.js.map +1 -1
  208. package/dist/src/config/models.d.ts +8 -9
  209. package/dist/src/config/models.js +18 -15
  210. package/dist/src/config/models.js.map +1 -1
  211. package/dist/src/config/models.test.js +52 -16
  212. package/dist/src/config/models.test.js.map +1 -1
  213. package/dist/src/config/storage.d.ts +5 -0
  214. package/dist/src/config/storage.js +17 -2
  215. package/dist/src/config/storage.js.map +1 -1
  216. package/dist/src/config/storage.test.js +16 -0
  217. package/dist/src/config/storage.test.js.map +1 -1
  218. package/dist/src/confirmation-bus/message-bus.js +2 -1
  219. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  220. package/dist/src/core/baseLlmClient.js +44 -43
  221. package/dist/src/core/baseLlmClient.js.map +1 -1
  222. package/dist/src/core/baseLlmClient.test.js +12 -19
  223. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  224. package/dist/src/core/client.d.ts +7 -1
  225. package/dist/src/core/client.js +245 -114
  226. package/dist/src/core/client.js.map +1 -1
  227. package/dist/src/core/client.test.js +277 -74
  228. package/dist/src/core/client.test.js.map +1 -1
  229. package/dist/src/core/clientHookTriggers.js +2 -2
  230. package/dist/src/core/clientHookTriggers.js.map +1 -1
  231. package/dist/src/core/contentGenerator.js +3 -3
  232. package/dist/src/core/contentGenerator.js.map +1 -1
  233. package/dist/src/core/contentGenerator.test.js +1 -7
  234. package/dist/src/core/contentGenerator.test.js.map +1 -1
  235. package/dist/src/core/coreToolHookTriggers.d.ts +9 -5
  236. package/dist/src/core/coreToolHookTriggers.js +119 -21
  237. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  238. package/dist/src/core/coreToolHookTriggers.test.d.ts +6 -0
  239. package/dist/src/core/coreToolHookTriggers.test.js +191 -0
  240. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -0
  241. package/dist/src/core/coreToolScheduler.d.ts +7 -93
  242. package/dist/src/core/coreToolScheduler.js +133 -369
  243. package/dist/src/core/coreToolScheduler.js.map +1 -1
  244. package/dist/src/core/coreToolScheduler.test.js +252 -394
  245. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  246. package/dist/src/core/geminiChat.d.ts +26 -1
  247. package/dist/src/core/geminiChat.js +112 -79
  248. package/dist/src/core/geminiChat.js.map +1 -1
  249. package/dist/src/core/geminiChat.test.js +125 -92
  250. package/dist/src/core/geminiChat.test.js.map +1 -1
  251. package/dist/src/core/geminiChatHookTriggers.d.ts +8 -4
  252. package/dist/src/core/geminiChatHookTriggers.js +34 -12
  253. package/dist/src/core/geminiChatHookTriggers.js.map +1 -1
  254. package/dist/src/core/geminiChatHookTriggers.test.d.ts +6 -0
  255. package/dist/src/core/geminiChatHookTriggers.test.js +153 -0
  256. package/dist/src/core/geminiChatHookTriggers.test.js.map +1 -0
  257. package/dist/src/core/geminiChat_network_retry.test.js +4 -6
  258. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  259. package/dist/src/core/loggingContentGenerator.js +19 -2
  260. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  261. package/dist/src/core/loggingContentGenerator.test.js +30 -0
  262. package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
  263. package/dist/src/core/nonInteractiveToolExecutor.test.js +4 -4
  264. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  265. package/dist/src/core/prompts.js +37 -13
  266. package/dist/src/core/prompts.js.map +1 -1
  267. package/dist/src/core/prompts.test.js +47 -3
  268. package/dist/src/core/prompts.test.js.map +1 -1
  269. package/dist/src/core/tokenLimits.js +6 -12
  270. package/dist/src/core/tokenLimits.js.map +1 -1
  271. package/dist/src/core/tokenLimits.test.js +8 -4
  272. package/dist/src/core/tokenLimits.test.js.map +1 -1
  273. package/dist/src/core/turn.d.ts +21 -22
  274. package/dist/src/core/turn.js +31 -21
  275. package/dist/src/core/turn.js.map +1 -1
  276. package/dist/src/core/turn.test.js +79 -5
  277. package/dist/src/core/turn.test.js.map +1 -1
  278. package/dist/src/fallback/handler.js +1 -7
  279. package/dist/src/fallback/handler.js.map +1 -1
  280. package/dist/src/fallback/handler.test.js +10 -29
  281. package/dist/src/fallback/handler.test.js.map +1 -1
  282. package/dist/src/generated/git-commit.d.ts +3 -3
  283. package/dist/src/generated/git-commit.js +3 -3
  284. package/dist/src/hooks/hookAggregator.js +7 -0
  285. package/dist/src/hooks/hookAggregator.js.map +1 -1
  286. package/dist/src/hooks/hookEventHandler.d.ts +9 -5
  287. package/dist/src/hooks/hookEventHandler.js +61 -15
  288. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  289. package/dist/src/hooks/hookEventHandler.test.js +223 -8
  290. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  291. package/dist/src/hooks/hookPlanner.d.ts +1 -5
  292. package/dist/src/hooks/hookPlanner.js +2 -7
  293. package/dist/src/hooks/hookPlanner.js.map +1 -1
  294. package/dist/src/hooks/hookPlanner.test.js +62 -2
  295. package/dist/src/hooks/hookPlanner.test.js.map +1 -1
  296. package/dist/src/hooks/hookRegistry.d.ts +6 -11
  297. package/dist/src/hooks/hookRegistry.js +41 -14
  298. package/dist/src/hooks/hookRegistry.js.map +1 -1
  299. package/dist/src/hooks/hookRegistry.test.js +166 -2
  300. package/dist/src/hooks/hookRegistry.test.js.map +1 -1
  301. package/dist/src/hooks/hookRunner.d.ts +5 -3
  302. package/dist/src/hooks/hookRunner.js +57 -17
  303. package/dist/src/hooks/hookRunner.js.map +1 -1
  304. package/dist/src/hooks/hookRunner.test.js +172 -35
  305. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  306. package/dist/src/hooks/hookSystem.d.ts +12 -0
  307. package/dist/src/hooks/hookSystem.js +39 -1
  308. package/dist/src/hooks/hookSystem.js.map +1 -1
  309. package/dist/src/hooks/hookTranslator.js +2 -1
  310. package/dist/src/hooks/hookTranslator.js.map +1 -1
  311. package/dist/src/hooks/index.d.ts +1 -2
  312. package/dist/src/hooks/index.js +1 -3
  313. package/dist/src/hooks/index.js.map +1 -1
  314. package/dist/src/hooks/trustedHooks.d.ts +28 -0
  315. package/dist/src/hooks/trustedHooks.js +90 -0
  316. package/dist/src/hooks/trustedHooks.js.map +1 -0
  317. package/dist/src/hooks/trustedHooks.test.d.ts +6 -0
  318. package/dist/src/hooks/trustedHooks.test.js +154 -0
  319. package/dist/src/hooks/trustedHooks.test.js.map +1 -0
  320. package/dist/src/hooks/types.d.ts +41 -9
  321. package/dist/src/hooks/types.js +31 -41
  322. package/dist/src/hooks/types.js.map +1 -1
  323. package/dist/src/hooks/types.test.js +9 -52
  324. package/dist/src/hooks/types.test.js.map +1 -1
  325. package/dist/src/ide/detect-ide.d.ts +4 -0
  326. package/dist/src/ide/detect-ide.js +7 -2
  327. package/dist/src/ide/detect-ide.js.map +1 -1
  328. package/dist/src/ide/detect-ide.test.js +10 -0
  329. package/dist/src/ide/detect-ide.test.js.map +1 -1
  330. package/dist/src/ide/ide-client.js +4 -1
  331. package/dist/src/ide/ide-client.js.map +1 -1
  332. package/dist/src/ide/ide-installer.js +2 -2
  333. package/dist/src/ide/ide-installer.js.map +1 -1
  334. package/dist/src/ide/ide-installer.test.js +11 -2
  335. package/dist/src/ide/ide-installer.test.js.map +1 -1
  336. package/dist/src/index.d.ts +16 -2
  337. package/dist/src/index.js +18 -3
  338. package/dist/src/index.js.map +1 -1
  339. package/dist/src/mcp/oauth-provider.js +7 -3
  340. package/dist/src/mcp/oauth-provider.js.map +1 -1
  341. package/dist/src/mcp/oauth-provider.test.js +4 -1
  342. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  343. package/dist/src/mcp/oauth-utils.d.ts +8 -1
  344. package/dist/src/mcp/oauth-utils.js +31 -2
  345. package/dist/src/mcp/oauth-utils.js.map +1 -1
  346. package/dist/src/mcp/oauth-utils.test.js +42 -0
  347. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  348. package/dist/src/mcp/token-storage/file-token-storage.js +2 -2
  349. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  350. package/dist/src/mcp/token-storage/keychain-token-storage.js +1 -1
  351. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  352. package/dist/src/policy/config.js +62 -23
  353. package/dist/src/policy/config.js.map +1 -1
  354. package/dist/src/policy/config.test.js +24 -2
  355. package/dist/src/policy/config.test.js.map +1 -1
  356. package/dist/src/policy/persistence.test.js +1 -1
  357. package/dist/src/policy/persistence.test.js.map +1 -1
  358. package/dist/src/policy/policies/agent.toml +1 -1
  359. package/dist/src/policy/policies/write.toml +5 -0
  360. package/dist/src/policy/policies/yolo.toml +1 -0
  361. package/dist/src/policy/policy-engine.d.ts +4 -0
  362. package/dist/src/policy/policy-engine.js +137 -53
  363. package/dist/src/policy/policy-engine.js.map +1 -1
  364. package/dist/src/policy/policy-engine.test.js +289 -1
  365. package/dist/src/policy/policy-engine.test.js.map +1 -1
  366. package/dist/src/policy/policy-updater.test.js +5 -5
  367. package/dist/src/policy/policy-updater.test.js.map +1 -1
  368. package/dist/src/policy/shell-safety.test.js +371 -8
  369. package/dist/src/policy/shell-safety.test.js.map +1 -1
  370. package/dist/src/policy/toml-loader.d.ts +0 -8
  371. package/dist/src/policy/toml-loader.js +13 -45
  372. package/dist/src/policy/toml-loader.js.map +1 -1
  373. package/dist/src/policy/toml-loader.test.js +13 -0
  374. package/dist/src/policy/toml-loader.test.js.map +1 -1
  375. package/dist/src/policy/types.d.ts +10 -0
  376. package/dist/src/policy/utils.d.ts +21 -0
  377. package/dist/src/policy/utils.js +45 -0
  378. package/dist/src/policy/utils.js.map +1 -0
  379. package/dist/src/policy/utils.test.d.ts +6 -0
  380. package/dist/src/policy/utils.test.js +92 -0
  381. package/dist/src/policy/utils.test.js.map +1 -0
  382. package/dist/src/routing/routingStrategy.d.ts +2 -0
  383. package/dist/src/routing/strategies/classifierStrategy.js +1 -1
  384. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  385. package/dist/src/routing/strategies/classifierStrategy.test.js +16 -0
  386. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  387. package/dist/src/routing/strategies/compositeStrategy.js +4 -2
  388. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
  389. package/dist/src/routing/strategies/compositeStrategy.test.js +11 -10
  390. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -1
  391. package/dist/src/routing/strategies/fallbackStrategy.d.ts +1 -1
  392. package/dist/src/routing/strategies/fallbackStrategy.js +2 -5
  393. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  394. package/dist/src/routing/strategies/fallbackStrategy.test.js +13 -6
  395. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  396. package/dist/src/routing/strategies/overrideStrategy.d.ts +1 -1
  397. package/dist/src/routing/strategies/overrideStrategy.js +6 -6
  398. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  399. package/dist/src/routing/strategies/overrideStrategy.test.js +14 -0
  400. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
  401. package/dist/src/scheduler/tool-executor.d.ts +22 -0
  402. package/dist/src/scheduler/tool-executor.js +198 -0
  403. package/dist/src/scheduler/tool-executor.js.map +1 -0
  404. package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
  405. package/dist/src/scheduler/tool-executor.test.js +231 -0
  406. package/dist/src/scheduler/tool-executor.test.js.map +1 -0
  407. package/dist/src/scheduler/tool-modifier.d.ts +23 -0
  408. package/dist/src/scheduler/tool-modifier.js +50 -0
  409. package/dist/src/scheduler/tool-modifier.js.map +1 -0
  410. package/dist/src/scheduler/tool-modifier.test.d.ts +6 -0
  411. package/dist/src/scheduler/tool-modifier.test.js +159 -0
  412. package/dist/src/scheduler/tool-modifier.test.js.map +1 -0
  413. package/dist/src/scheduler/types.d.ts +95 -0
  414. package/dist/src/scheduler/types.js +7 -0
  415. package/dist/src/scheduler/types.js.map +1 -0
  416. package/dist/src/services/chatCompressionService.js +3 -10
  417. package/dist/src/services/chatCompressionService.js.map +1 -1
  418. package/dist/src/services/chatCompressionService.test.js +1 -0
  419. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  420. package/dist/src/services/chatRecordingService.d.ts +7 -1
  421. package/dist/src/services/chatRecordingService.js +20 -2
  422. package/dist/src/services/chatRecordingService.js.map +1 -1
  423. package/dist/src/services/chatRecordingService.test.js +43 -0
  424. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  425. package/dist/src/services/contextManager.d.ts +5 -11
  426. package/dist/src/services/contextManager.js +20 -17
  427. package/dist/src/services/contextManager.js.map +1 -1
  428. package/dist/src/services/contextManager.test.js +40 -41
  429. package/dist/src/services/contextManager.test.js.map +1 -1
  430. package/dist/src/services/environmentSanitization.d.ts +15 -0
  431. package/dist/src/services/environmentSanitization.js +142 -0
  432. package/dist/src/services/environmentSanitization.js.map +1 -0
  433. package/dist/src/services/environmentSanitization.test.d.ts +6 -0
  434. package/dist/src/services/environmentSanitization.test.js +284 -0
  435. package/dist/src/services/environmentSanitization.test.js.map +1 -0
  436. package/dist/src/services/gitService.js +10 -1
  437. package/dist/src/services/gitService.js.map +1 -1
  438. package/dist/src/services/gitService.test.js +28 -2
  439. package/dist/src/services/gitService.test.js.map +1 -1
  440. package/dist/src/services/loopDetectionService.js +2 -1
  441. package/dist/src/services/loopDetectionService.js.map +1 -1
  442. package/dist/src/services/loopDetectionService.test.js +14 -8
  443. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  444. package/dist/src/services/modelConfig.integration.test.js +3 -3
  445. package/dist/src/services/modelConfig.integration.test.js.map +1 -1
  446. package/dist/src/services/modelConfigService.d.ts +38 -4
  447. package/dist/src/services/modelConfigService.js +135 -76
  448. package/dist/src/services/modelConfigService.js.map +1 -1
  449. package/dist/src/services/modelConfigService.test.js +116 -0
  450. package/dist/src/services/modelConfigService.test.js.map +1 -1
  451. package/dist/src/services/shellExecutionService.d.ts +2 -0
  452. package/dist/src/services/shellExecutionService.js +6 -50
  453. package/dist/src/services/shellExecutionService.js.map +1 -1
  454. package/dist/src/services/shellExecutionService.test.js +68 -4
  455. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  456. package/dist/src/skills/skillLoader.d.ts +31 -0
  457. package/dist/src/skills/skillLoader.js +77 -0
  458. package/dist/src/skills/skillLoader.js.map +1 -0
  459. package/dist/src/skills/skillLoader.test.d.ts +6 -0
  460. package/dist/src/skills/skillLoader.test.js +75 -0
  461. package/dist/src/skills/skillLoader.test.js.map +1 -0
  462. package/dist/src/skills/skillManager.d.ts +69 -0
  463. package/dist/src/skills/skillManager.js +127 -0
  464. package/dist/src/skills/skillManager.js.map +1 -0
  465. package/dist/src/skills/skillManager.test.d.ts +6 -0
  466. package/dist/src/skills/skillManager.test.js +210 -0
  467. package/dist/src/skills/skillManager.test.js.map +1 -0
  468. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +18 -9
  469. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +234 -160
  470. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  471. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +162 -32
  472. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  473. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +11 -3
  474. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +24 -5
  475. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  476. package/dist/src/telemetry/loggers.d.ts +3 -3
  477. package/dist/src/telemetry/loggers.js +6 -5
  478. package/dist/src/telemetry/loggers.js.map +1 -1
  479. package/dist/src/telemetry/loggers.test.circular.js +1 -0
  480. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  481. package/dist/src/telemetry/loggers.test.js +51 -10
  482. package/dist/src/telemetry/loggers.test.js.map +1 -1
  483. package/dist/src/telemetry/sdk.js +5 -6
  484. package/dist/src/telemetry/sdk.js.map +1 -1
  485. package/dist/src/telemetry/types.d.ts +7 -7
  486. package/dist/src/telemetry/types.js +14 -12
  487. package/dist/src/telemetry/types.js.map +1 -1
  488. package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
  489. package/dist/src/test-utils/mock-message-bus.js +29 -0
  490. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  491. package/dist/src/test-utils/mock-tool.d.ts +5 -3
  492. package/dist/src/test-utils/mock-tool.js +11 -10
  493. package/dist/src/test-utils/mock-tool.js.map +1 -1
  494. package/dist/src/tools/activate-skill.d.ts +27 -0
  495. package/dist/src/tools/activate-skill.js +133 -0
  496. package/dist/src/tools/activate-skill.js.map +1 -0
  497. package/dist/src/tools/activate-skill.test.d.ts +6 -0
  498. package/dist/src/tools/activate-skill.test.js +113 -0
  499. package/dist/src/tools/activate-skill.test.js.map +1 -0
  500. package/dist/src/tools/confirmation-policy.test.js +3 -12
  501. package/dist/src/tools/confirmation-policy.test.js.map +1 -1
  502. package/dist/src/tools/edit.d.ts +27 -5
  503. package/dist/src/tools/edit.js +455 -136
  504. package/dist/src/tools/edit.js.map +1 -1
  505. package/dist/src/tools/edit.test.js +292 -526
  506. package/dist/src/tools/edit.test.js.map +1 -1
  507. package/dist/src/tools/get-internal-docs.d.ts +27 -0
  508. package/dist/src/tools/get-internal-docs.js +122 -0
  509. package/dist/src/tools/get-internal-docs.js.map +1 -0
  510. package/dist/src/tools/get-internal-docs.test.d.ts +6 -0
  511. package/dist/src/tools/get-internal-docs.test.js +57 -0
  512. package/dist/src/tools/get-internal-docs.test.js.map +1 -0
  513. package/dist/src/tools/glob.d.ts +2 -2
  514. package/dist/src/tools/glob.js +1 -1
  515. package/dist/src/tools/glob.js.map +1 -1
  516. package/dist/src/tools/glob.test.js +2 -1
  517. package/dist/src/tools/glob.test.js.map +1 -1
  518. package/dist/src/tools/grep.d.ts +2 -2
  519. package/dist/src/tools/grep.js +1 -1
  520. package/dist/src/tools/grep.js.map +1 -1
  521. package/dist/src/tools/grep.test.js +5 -4
  522. package/dist/src/tools/grep.test.js.map +1 -1
  523. package/dist/src/tools/ls.d.ts +2 -2
  524. package/dist/src/tools/ls.js +2 -2
  525. package/dist/src/tools/ls.js.map +1 -1
  526. package/dist/src/tools/ls.test.js +2 -1
  527. package/dist/src/tools/ls.test.js.map +1 -1
  528. package/dist/src/tools/mcp-client-manager.js +14 -7
  529. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  530. package/dist/src/tools/mcp-client-manager.test.js +28 -0
  531. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  532. package/dist/src/tools/mcp-client.d.ts +5 -4
  533. package/dist/src/tools/mcp-client.js +10 -8
  534. package/dist/src/tools/mcp-client.js.map +1 -1
  535. package/dist/src/tools/mcp-client.test.js +47 -42
  536. package/dist/src/tools/mcp-client.test.js.map +1 -1
  537. package/dist/src/tools/mcp-tool.d.ts +20 -5
  538. package/dist/src/tools/mcp-tool.js +8 -8
  539. package/dist/src/tools/mcp-tool.js.map +1 -1
  540. package/dist/src/tools/mcp-tool.test.js +11 -6
  541. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  542. package/dist/src/tools/memoryTool.d.ts +3 -3
  543. package/dist/src/tools/memoryTool.js +2 -4
  544. package/dist/src/tools/memoryTool.js.map +1 -1
  545. package/dist/src/tools/memoryTool.test.js +5 -2
  546. package/dist/src/tools/memoryTool.test.js.map +1 -1
  547. package/dist/src/tools/message-bus-integration.test.js +10 -37
  548. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  549. package/dist/src/tools/read-file.d.ts +2 -2
  550. package/dist/src/tools/read-file.js +1 -1
  551. package/dist/src/tools/read-file.js.map +1 -1
  552. package/dist/src/tools/read-file.test.js +3 -2
  553. package/dist/src/tools/read-file.test.js.map +1 -1
  554. package/dist/src/tools/read-many-files.d.ts +2 -2
  555. package/dist/src/tools/read-many-files.js +2 -3
  556. package/dist/src/tools/read-many-files.js.map +1 -1
  557. package/dist/src/tools/read-many-files.test.js +3 -2
  558. package/dist/src/tools/read-many-files.test.js.map +1 -1
  559. package/dist/src/tools/ripGrep.d.ts +3 -2
  560. package/dist/src/tools/ripGrep.js +18 -7
  561. package/dist/src/tools/ripGrep.js.map +1 -1
  562. package/dist/src/tools/ripGrep.test.js +60 -4
  563. package/dist/src/tools/ripGrep.test.js.map +1 -1
  564. package/dist/src/tools/shell.d.ts +3 -6
  565. package/dist/src/tools/shell.js +21 -49
  566. package/dist/src/tools/shell.js.map +1 -1
  567. package/dist/src/tools/shell.test.js +35 -59
  568. package/dist/src/tools/shell.test.js.map +1 -1
  569. package/dist/src/tools/tool-error.d.ts +6 -1
  570. package/dist/src/tools/tool-error.js +6 -0
  571. package/dist/src/tools/tool-error.js.map +1 -1
  572. package/dist/src/tools/tool-names.d.ts +15 -0
  573. package/dist/src/tools/tool-names.js +57 -0
  574. package/dist/src/tools/tool-names.js.map +1 -1
  575. package/dist/src/tools/tool-names.test.d.ts +6 -0
  576. package/dist/src/tools/tool-names.test.js +43 -0
  577. package/dist/src/tools/tool-names.test.js.map +1 -0
  578. package/dist/src/tools/tool-registry.d.ts +11 -7
  579. package/dist/src/tools/tool-registry.js +15 -10
  580. package/dist/src/tools/tool-registry.js.map +1 -1
  581. package/dist/src/tools/tool-registry.test.js +16 -11
  582. package/dist/src/tools/tool-registry.test.js.map +1 -1
  583. package/dist/src/tools/tools.d.ts +8 -6
  584. package/dist/src/tools/tools.js +16 -18
  585. package/dist/src/tools/tools.js.map +1 -1
  586. package/dist/src/tools/tools.test.js +3 -1
  587. package/dist/src/tools/tools.test.js.map +1 -1
  588. package/dist/src/tools/web-fetch.d.ts +2 -2
  589. package/dist/src/tools/web-fetch.js +4 -4
  590. package/dist/src/tools/web-fetch.js.map +1 -1
  591. package/dist/src/tools/web-fetch.test.js +17 -19
  592. package/dist/src/tools/web-fetch.test.js.map +1 -1
  593. package/dist/src/tools/web-search.d.ts +2 -2
  594. package/dist/src/tools/web-search.js +5 -5
  595. package/dist/src/tools/web-search.js.map +1 -1
  596. package/dist/src/tools/web-search.test.js +2 -1
  597. package/dist/src/tools/web-search.test.js.map +1 -1
  598. package/dist/src/tools/write-file.d.ts +2 -2
  599. package/dist/src/tools/write-file.js +9 -6
  600. package/dist/src/tools/write-file.js.map +1 -1
  601. package/dist/src/tools/write-file.test.js +49 -7
  602. package/dist/src/tools/write-file.test.js.map +1 -1
  603. package/dist/src/tools/write-todos.d.ts +2 -2
  604. package/dist/src/tools/write-todos.js +5 -4
  605. package/dist/src/tools/write-todos.js.map +1 -1
  606. package/dist/src/tools/write-todos.test.js +2 -1
  607. package/dist/src/tools/write-todos.test.js.map +1 -1
  608. package/dist/src/utils/apiConversionUtils.d.ts +12 -0
  609. package/dist/src/utils/apiConversionUtils.js +46 -0
  610. package/dist/src/utils/apiConversionUtils.js.map +1 -0
  611. package/dist/src/utils/apiConversionUtils.test.d.ts +6 -0
  612. package/dist/src/utils/apiConversionUtils.test.js +150 -0
  613. package/dist/src/utils/apiConversionUtils.test.js.map +1 -0
  614. package/dist/src/utils/checkpointUtils.d.ts +1 -1
  615. package/dist/src/utils/checkpointUtils.js +1 -1
  616. package/dist/src/utils/checkpointUtils.js.map +1 -1
  617. package/dist/src/utils/checkpointUtils.test.js +1 -1
  618. package/dist/src/utils/checkpointUtils.test.js.map +1 -1
  619. package/dist/src/utils/debugLogger.js +1 -0
  620. package/dist/src/utils/debugLogger.js.map +1 -1
  621. package/dist/src/utils/editCorrector.d.ts +3 -3
  622. package/dist/src/utils/editCorrector.js +27 -10
  623. package/dist/src/utils/editCorrector.js.map +1 -1
  624. package/dist/src/utils/editCorrector.test.js +23 -23
  625. package/dist/src/utils/editCorrector.test.js.map +1 -1
  626. package/dist/src/utils/editor.d.ts +3 -2
  627. package/dist/src/utils/editor.js +26 -6
  628. package/dist/src/utils/editor.js.map +1 -1
  629. package/dist/src/utils/editor.test.js +27 -4
  630. package/dist/src/utils/editor.test.js.map +1 -1
  631. package/dist/src/utils/environmentContext.d.ts +1 -0
  632. package/dist/src/utils/environmentContext.js +4 -0
  633. package/dist/src/utils/environmentContext.js.map +1 -1
  634. package/dist/src/utils/environmentContext.test.js +2 -0
  635. package/dist/src/utils/environmentContext.test.js.map +1 -1
  636. package/dist/src/utils/errorReporting.d.ts +1 -1
  637. package/dist/src/utils/errorReporting.js +13 -12
  638. package/dist/src/utils/errorReporting.js.map +1 -1
  639. package/dist/src/utils/errorReporting.test.js +17 -14
  640. package/dist/src/utils/errorReporting.test.js.map +1 -1
  641. package/dist/src/utils/events.d.ts +71 -19
  642. package/dist/src/utils/events.js +35 -9
  643. package/dist/src/utils/events.js.map +1 -1
  644. package/dist/src/utils/events.test.js +25 -0
  645. package/dist/src/utils/events.test.js.map +1 -1
  646. package/dist/src/utils/fileDiffUtils.d.ts +18 -0
  647. package/dist/src/utils/fileDiffUtils.js +37 -0
  648. package/dist/src/utils/fileDiffUtils.js.map +1 -0
  649. package/dist/src/utils/fileDiffUtils.test.d.ts +6 -0
  650. package/dist/src/utils/fileDiffUtils.test.js +84 -0
  651. package/dist/src/utils/fileDiffUtils.test.js.map +1 -0
  652. package/dist/src/utils/fileUtils.d.ts +4 -0
  653. package/dist/src/utils/fileUtils.js +53 -0
  654. package/dist/src/utils/fileUtils.js.map +1 -1
  655. package/dist/src/utils/fileUtils.test.js +112 -1
  656. package/dist/src/utils/fileUtils.test.js.map +1 -1
  657. package/dist/src/utils/geminiIgnoreParser.d.ts +11 -0
  658. package/dist/src/utils/geminiIgnoreParser.js +20 -0
  659. package/dist/src/utils/geminiIgnoreParser.js.map +1 -1
  660. package/dist/src/utils/geminiIgnoreParser.test.js +48 -0
  661. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -1
  662. package/dist/src/utils/generateContentResponseUtilities.d.ts +3 -1
  663. package/dist/src/utils/generateContentResponseUtilities.js +106 -0
  664. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  665. package/dist/src/utils/generateContentResponseUtilities.test.js +279 -2
  666. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  667. package/dist/src/utils/getFolderStructure.js +7 -2
  668. package/dist/src/utils/getFolderStructure.js.map +1 -1
  669. package/dist/src/utils/gitIgnoreParser.js +9 -10
  670. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  671. package/dist/src/utils/installationManager.test.js +11 -3
  672. package/dist/src/utils/installationManager.test.js.map +1 -1
  673. package/dist/src/utils/memoryDiscovery.js +3 -4
  674. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  675. package/dist/src/utils/memoryDiscovery.test.js +12 -1
  676. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  677. package/dist/src/utils/partUtils.js +1 -1
  678. package/dist/src/utils/partUtils.js.map +1 -1
  679. package/dist/src/utils/paths.d.ts +10 -0
  680. package/dist/src/utils/paths.js +20 -1
  681. package/dist/src/utils/paths.js.map +1 -1
  682. package/dist/src/utils/retry.d.ts +1 -0
  683. package/dist/src/utils/retry.js +17 -5
  684. package/dist/src/utils/retry.js.map +1 -1
  685. package/dist/src/utils/retry.test.js +11 -11
  686. package/dist/src/utils/retry.test.js.map +1 -1
  687. package/dist/src/utils/shell-utils.d.ts +6 -0
  688. package/dist/src/utils/shell-utils.js +97 -12
  689. package/dist/src/utils/shell-utils.js.map +1 -1
  690. package/dist/src/utils/shell-utils.test.js +99 -1
  691. package/dist/src/utils/shell-utils.test.js.map +1 -1
  692. package/dist/src/utils/summarizer.test.js +3 -2
  693. package/dist/src/utils/summarizer.test.js.map +1 -1
  694. package/dist/src/utils/terminal.d.ts +4 -0
  695. package/dist/src/utils/terminal.js +12 -0
  696. package/dist/src/utils/terminal.js.map +1 -1
  697. package/dist/src/utils/tokenCalculation.js +20 -5
  698. package/dist/src/utils/tokenCalculation.js.map +1 -1
  699. package/dist/src/utils/tokenCalculation.test.js +11 -2
  700. package/dist/src/utils/tokenCalculation.test.js.map +1 -1
  701. package/dist/src/utils/tool-utils.d.ts +9 -0
  702. package/dist/src/utils/tool-utils.js +29 -0
  703. package/dist/src/utils/tool-utils.js.map +1 -1
  704. package/dist/src/utils/tool-utils.test.js +17 -2
  705. package/dist/src/utils/tool-utils.test.js.map +1 -1
  706. package/dist/src/utils/userAccountManager.test.js +5 -5
  707. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  708. package/dist/src/utils/workspaceContext.test.js +1 -1
  709. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  710. package/dist/tsconfig.tsbuildinfo +1 -1
  711. package/package.json +8 -6
  712. package/dist/src/agents/executor.js.map +0 -1
  713. package/dist/src/agents/executor.test.js.map +0 -1
  714. package/dist/src/agents/invocation.js.map +0 -1
  715. package/dist/src/agents/invocation.test.js.map +0 -1
  716. package/dist/src/core/sessionHookTriggers.d.ts +0 -28
  717. package/dist/src/core/sessionHookTriggers.js +0 -68
  718. package/dist/src/core/sessionHookTriggers.js.map +0 -1
  719. package/dist/src/tools/smart-edit.d.ts +0 -78
  720. package/dist/src/tools/smart-edit.js +0 -722
  721. package/dist/src/tools/smart-edit.js.map +0 -1
  722. package/dist/src/tools/smart-edit.test.js +0 -592
  723. package/dist/src/tools/smart-edit.test.js.map +0 -1
  724. package/dist/src/utils/shell-permissions.d.ts +0 -52
  725. package/dist/src/utils/shell-permissions.js +0 -188
  726. package/dist/src/utils/shell-permissions.js.map +0 -1
  727. package/dist/src/utils/shell-permissions.test.js +0 -347
  728. package/dist/src/utils/shell-permissions.test.js.map +0 -1
  729. /package/dist/src/agents/{executor.test.d.ts → a2a-client-manager.test.d.ts} +0 -0
  730. /package/dist/src/agents/{invocation.test.d.ts → a2aUtils.test.d.ts} +0 -0
  731. /package/dist/src/{tools/smart-edit.test.d.ts → agents/agentLoader.test.d.ts} +0 -0
  732. /package/dist/src/{utils/shell-permissions.test.d.ts → agents/cli-help-agent.test.d.ts} +0 -0
@@ -9,7 +9,7 @@ import { AuthType, } from './contentGenerator.js';
9
9
  import {} from './geminiChat.js';
10
10
  import { CompressionStatus, GeminiEventType, Turn, } from './turn.js';
11
11
  import { getCoreSystemPrompt } from './prompts.js';
12
- import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL_AUTO, } from '../config/models.js';
12
+ import { DEFAULT_GEMINI_MODEL_AUTO } from '../config/models.js';
13
13
  import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
14
14
  import { setSimulate429 } from '../utils/testUtils.js';
15
15
  import { tokenLimit } from './tokenLimits.js';
@@ -18,8 +18,9 @@ import { uiTelemetryService } from '../telemetry/uiTelemetry.js';
18
18
  import { ChatCompressionService } from '../services/chatCompressionService.js';
19
19
  import { createAvailabilityServiceMock } from '../availability/testUtils.js';
20
20
  import { ClearcutLogger } from '../telemetry/clearcut-logger/clearcut-logger.js';
21
- import { HookSystem } from '../hooks/hookSystem.js';
22
21
  import * as policyCatalog from '../availability/policyCatalog.js';
22
+ import { partToString } from '../utils/partUtils.js';
23
+ import { coreEvents } from '../utils/events.js';
23
24
  vi.mock('../services/chatCompressionService.js');
24
25
  // Mock fs module to prevent actual file system operations during tests
25
26
  const mockFileSystem = new Map();
@@ -48,7 +49,6 @@ vi.mock('node:fs', () => {
48
49
  ...fsModule,
49
50
  };
50
51
  });
51
- // --- Mocks ---
52
52
  const mockTurnRunFn = vi.fn();
53
53
  vi.mock('./turn', async (importOriginal) => {
54
54
  const actual = await importOriginal();
@@ -60,6 +60,7 @@ vi.mock('./turn', async (importOriginal) => {
60
60
  constructor() {
61
61
  // The constructor can be empty or do some mock setup
62
62
  }
63
+ getResponseText = vi.fn().mockReturnValue('Mock Response');
63
64
  }
64
65
  // Export the mock class as 'Turn'
65
66
  return {
@@ -93,6 +94,10 @@ vi.mock('../telemetry/uiTelemetry.js', () => ({
93
94
  },
94
95
  }));
95
96
  vi.mock('../hooks/hookSystem.js');
97
+ const mockHookSystem = {
98
+ fireBeforeAgentEvent: vi.fn().mockResolvedValue(undefined),
99
+ fireAfterAgentEvent: vi.fn().mockResolvedValue(undefined),
100
+ };
96
101
  /**
97
102
  * Array.fromAsync ponyfill, which will be available in es 2024.
98
103
  *
@@ -164,6 +169,9 @@ describe('Gemini Client (client.ts)', () => {
164
169
  getVertexAI: vi.fn().mockReturnValue(false),
165
170
  getUserAgent: vi.fn().mockReturnValue('test-agent'),
166
171
  getUserMemory: vi.fn().mockReturnValue(''),
172
+ getGlobalMemory: vi.fn().mockReturnValue(''),
173
+ getEnvironmentMemory: vi.fn().mockReturnValue(''),
174
+ isJitContextEnabled: vi.fn().mockReturnValue(false),
167
175
  getSessionId: vi.fn().mockReturnValue('test-session-id'),
168
176
  getProxy: vi.fn().mockReturnValue(undefined),
169
177
  getWorkingDir: vi.fn().mockReturnValue('/test/dir'),
@@ -186,11 +194,8 @@ describe('Gemini Client (client.ts)', () => {
186
194
  .mockReturnValue(mockRouterService),
187
195
  getMessageBus: vi.fn().mockReturnValue(undefined),
188
196
  getEnableHooks: vi.fn().mockReturnValue(false),
189
- isInFallbackMode: vi.fn().mockReturnValue(false),
190
- setFallbackMode: vi.fn(),
191
197
  getChatCompression: vi.fn().mockReturnValue(undefined),
192
198
  getSkipNextSpeakerCheck: vi.fn().mockReturnValue(false),
193
- getUseSmartEdit: vi.fn().mockReturnValue(false),
194
199
  getShowModelInfoInChat: vi.fn().mockReturnValue(false),
195
200
  getContinueOnFailedApiCall: vi.fn(),
196
201
  getProjectRoot: vi.fn().mockReturnValue('/test/project/root'),
@@ -217,21 +222,21 @@ describe('Gemini Client (client.ts)', () => {
217
222
  },
218
223
  isInteractive: vi.fn().mockReturnValue(false),
219
224
  getExperiments: () => { },
220
- isModelAvailabilityServiceEnabled: vi.fn().mockReturnValue(false),
221
225
  getActiveModel: vi.fn().mockReturnValue('test-model'),
222
226
  setActiveModel: vi.fn(),
223
227
  resetTurn: vi.fn(),
224
- getModelAvailabilityService: vi.fn(),
228
+ getModelAvailabilityService: vi
229
+ .fn()
230
+ .mockReturnValue(createAvailabilityServiceMock()),
225
231
  };
226
- mockConfig.getHookSystem = vi
227
- .fn()
228
- .mockReturnValue(new HookSystem(mockConfig));
232
+ mockConfig.getHookSystem = vi.fn().mockReturnValue(mockHookSystem);
229
233
  client = new GeminiClient(mockConfig);
230
234
  await client.initialize();
231
235
  vi.mocked(mockConfig.getGeminiClient).mockReturnValue(client);
232
236
  vi.mocked(uiTelemetryService.setLastPromptTokenCount).mockClear();
233
237
  });
234
238
  afterEach(() => {
239
+ client.dispose();
235
240
  vi.restoreAllMocks();
236
241
  });
237
242
  describe('addHistory', () => {
@@ -252,18 +257,18 @@ describe('Gemini Client (client.ts)', () => {
252
257
  it('should create a new chat session, clearing the old history', async () => {
253
258
  // 1. Get the initial chat instance and add some history.
254
259
  const initialChat = client.getChat();
255
- const initialHistory = await client.getHistory();
260
+ const initialHistory = client.getHistory();
256
261
  await client.addHistory({
257
262
  role: 'user',
258
263
  parts: [{ text: 'some old message' }],
259
264
  });
260
- const historyWithOldMessage = await client.getHistory();
265
+ const historyWithOldMessage = client.getHistory();
261
266
  expect(historyWithOldMessage.length).toBeGreaterThan(initialHistory.length);
262
267
  // 2. Call resetChat.
263
268
  await client.resetChat();
264
269
  // 3. Get the new chat instance and its history.
265
270
  const newChat = client.getChat();
266
- const newHistory = await client.getHistory();
271
+ const newHistory = client.getHistory();
267
272
  // 4. Assert that the chat instance is new and the history is reset.
268
273
  expect(newChat).not.toBe(initialChat);
269
274
  expect(newHistory.length).toBe(initialHistory.length);
@@ -308,6 +313,10 @@ describe('Gemini Client (client.ts)', () => {
308
313
  getHistory: vi.fn((_curated) => chatHistory),
309
314
  setHistory: vi.fn(),
310
315
  getLastPromptTokenCount: vi.fn().mockReturnValue(originalTokenCount),
316
+ getChatRecordingService: vi.fn().mockReturnValue({
317
+ getConversation: vi.fn().mockReturnValue(null),
318
+ getConversationFilePath: vi.fn().mockReturnValue(null),
319
+ }),
311
320
  };
312
321
  client['chat'] = mockOriginalChat;
313
322
  vi.mocked(uiTelemetryService.getLastPromptTokenCount).mockReturnValue(originalTokenCount);
@@ -421,13 +430,15 @@ describe('Gemini Client (client.ts)', () => {
421
430
  // 2. Test Step 1: Trigger a non-forced failure
422
431
  await client.tryCompressChat('prompt-1', false); // force = false
423
432
  // 3. Assert Step 1: Check that the flag became true
424
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
425
- expect(client.hasFailedCompressionAttempt).toBe(true);
433
+ // 3. Assert Step 1: Check that the flag became true
434
+ expect(client
435
+ .hasFailedCompressionAttempt).toBe(true);
426
436
  // 4. Test Step 2: Trigger a forced failure
427
437
  await client.tryCompressChat('prompt-2', true); // force = true
428
438
  // 5. Assert Step 2: Check that the flag REMAINS true
429
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
430
- expect(client.hasFailedCompressionAttempt).toBe(true);
439
+ // 5. Assert Step 2: Check that the flag REMAINS true
440
+ expect(client
441
+ .hasFailedCompressionAttempt).toBe(true);
431
442
  });
432
443
  it('should not trigger summarization if token count is below threshold', async () => {
433
444
  const MOCKED_TOKEN_LIMIT = 1000;
@@ -464,6 +475,25 @@ describe('Gemini Client (client.ts)', () => {
464
475
  newTokenCount: 50,
465
476
  });
466
477
  });
478
+ it('should resume the session file when compression succeeds', async () => {
479
+ const { client, mockOriginalChat } = setup({
480
+ compressionStatus: CompressionStatus.COMPRESSED,
481
+ });
482
+ const mockConversation = { some: 'conversation' };
483
+ const mockFilePath = '/tmp/session.json';
484
+ // Override the mock to return values
485
+ const mockRecordingService = {
486
+ getConversation: vi.fn().mockReturnValue(mockConversation),
487
+ getConversationFilePath: vi.fn().mockReturnValue(mockFilePath),
488
+ };
489
+ vi.mocked(mockOriginalChat.getChatRecordingService).mockReturnValue(mockRecordingService);
490
+ await client.tryCompressChat('prompt-id', false);
491
+ expect(client['startChat']).toHaveBeenCalledWith(expect.anything(), // newHistory
492
+ {
493
+ conversation: mockConversation,
494
+ filePath: mockFilePath,
495
+ });
496
+ });
467
497
  });
468
498
  describe('sendMessageStream', () => {
469
499
  it('emits a compression event when the context was automatically compressed', async () => {
@@ -1121,38 +1151,48 @@ ${JSON.stringify({
1121
1151
  // Should use the newly routed model
1122
1152
  expect(mockTurnRunFn).toHaveBeenCalledWith({ model: 'new-routed-model' }, [{ text: 'A new topic' }], expect.any(AbortSignal));
1123
1153
  });
1124
- it('should use the fallback model and bypass routing when in fallback mode', async () => {
1125
- vi.mocked(mockConfig.isInFallbackMode).mockReturnValue(true);
1126
- mockRouterService.route.mockResolvedValue({
1127
- model: DEFAULT_GEMINI_FLASH_MODEL,
1128
- reason: 'fallback',
1154
+ it('should re-route within the same prompt when the configured model changes', async () => {
1155
+ mockTurnRunFn.mockClear();
1156
+ mockTurnRunFn.mockImplementation(async function* () {
1157
+ yield { type: 'content', value: 'Hello' };
1129
1158
  });
1130
- const stream = client.sendMessageStream([{ text: 'Hi' }], new AbortController().signal, 'prompt-1');
1159
+ mockRouterService.route.mockResolvedValueOnce({
1160
+ model: 'original-model',
1161
+ reason: 'test',
1162
+ });
1163
+ let stream = client.sendMessageStream([{ text: 'Hi' }], new AbortController().signal, 'prompt-1');
1131
1164
  await fromAsync(stream);
1132
- expect(mockTurnRunFn).toHaveBeenCalledWith({ model: DEFAULT_GEMINI_FLASH_MODEL }, [{ text: 'Hi' }], expect.any(AbortSignal));
1133
- });
1134
- it('should stick to the fallback model for the entire sequence even if fallback mode ends', async () => {
1135
- // Start the sequence in fallback mode
1136
- vi.mocked(mockConfig.isInFallbackMode).mockReturnValue(true);
1165
+ expect(mockRouterService.route).toHaveBeenCalledTimes(1);
1166
+ expect(mockTurnRunFn).toHaveBeenNthCalledWith(1, { model: 'original-model' }, [{ text: 'Hi' }], expect.any(AbortSignal));
1137
1167
  mockRouterService.route.mockResolvedValue({
1138
- model: DEFAULT_GEMINI_FLASH_MODEL,
1139
- reason: 'fallback',
1168
+ model: 'fallback-model',
1169
+ reason: 'test',
1140
1170
  });
1141
- let stream = client.sendMessageStream([{ text: 'Hi' }], new AbortController().signal, 'prompt-fallback-stickiness');
1142
- await fromAsync(stream);
1143
- // First call should use fallback model
1144
- expect(mockTurnRunFn).toHaveBeenCalledWith({ model: DEFAULT_GEMINI_FLASH_MODEL }, [{ text: 'Hi' }], expect.any(AbortSignal));
1145
- // End fallback mode
1146
- vi.mocked(mockConfig.isInFallbackMode).mockReturnValue(false);
1147
- // Second call in the same sequence
1148
- stream = client.sendMessageStream([{ text: 'Continue' }], new AbortController().signal, 'prompt-fallback-stickiness');
1171
+ vi.mocked(mockConfig.getModel).mockReturnValue('gemini-2.5-flash');
1172
+ coreEvents.emitModelChanged('gemini-2.5-flash');
1173
+ stream = client.sendMessageStream([{ text: 'Continue' }], new AbortController().signal, 'prompt-1');
1149
1174
  await fromAsync(stream);
1150
- // Router should still not be called, and it should stick to the fallback model
1151
- expect(mockTurnRunFn).toHaveBeenCalledTimes(2); // Ensure it was called again
1152
- expect(mockTurnRunFn).toHaveBeenLastCalledWith({ model: DEFAULT_GEMINI_FLASH_MODEL }, // Still the fallback model
1153
- [{ text: 'Continue' }], expect.any(AbortSignal));
1175
+ expect(mockRouterService.route).toHaveBeenCalledTimes(2);
1176
+ expect(mockTurnRunFn).toHaveBeenNthCalledWith(2, { model: 'fallback-model' }, [{ text: 'Continue' }], expect.any(AbortSignal));
1154
1177
  });
1155
1178
  });
1179
+ it('should use getGlobalMemory for system instruction when JIT is enabled', async () => {
1180
+ vi.mocked(mockConfig.isJitContextEnabled).mockReturnValue(true);
1181
+ vi.mocked(mockConfig.getGlobalMemory).mockReturnValue('Global JIT Memory');
1182
+ vi.mocked(mockConfig.getUserMemory).mockReturnValue('Full JIT Memory');
1183
+ const { getCoreSystemPrompt } = await import('./prompts.js');
1184
+ const mockGetCoreSystemPrompt = vi.mocked(getCoreSystemPrompt);
1185
+ await client.updateSystemInstruction();
1186
+ expect(mockGetCoreSystemPrompt).toHaveBeenCalledWith(mockConfig, 'Global JIT Memory');
1187
+ });
1188
+ it('should use getUserMemory for system instruction when JIT is disabled', async () => {
1189
+ vi.mocked(mockConfig.isJitContextEnabled).mockReturnValue(false);
1190
+ vi.mocked(mockConfig.getUserMemory).mockReturnValue('Legacy Memory');
1191
+ const { getCoreSystemPrompt } = await import('./prompts.js');
1192
+ const mockGetCoreSystemPrompt = vi.mocked(getCoreSystemPrompt);
1193
+ await client.updateSystemInstruction();
1194
+ expect(mockGetCoreSystemPrompt).toHaveBeenCalledWith(mockConfig, 'Legacy Memory');
1195
+ });
1156
1196
  it('should recursively call sendMessageStream with "Please continue." when InvalidStream event is received', async () => {
1157
1197
  vi.spyOn(client['config'], 'getContinueOnFailedApiCall').mockReturnValue(true);
1158
1198
  // Arrange
@@ -1181,7 +1221,6 @@ ${JSON.stringify({
1181
1221
  expect(events).toEqual([
1182
1222
  { type: GeminiEventType.ModelInfo, value: 'default-routed-model' },
1183
1223
  { type: GeminiEventType.InvalidStream },
1184
- { type: GeminiEventType.ModelInfo, value: 'default-routed-model' },
1185
1224
  { type: GeminiEventType.Content, value: 'Continued content' },
1186
1225
  ]);
1187
1226
  // Verify that turn.run was called twice
@@ -1238,11 +1277,11 @@ ${JSON.stringify({
1238
1277
  const stream = client.sendMessageStream(initialRequest, signal, promptId);
1239
1278
  const events = await fromAsync(stream);
1240
1279
  // Assert
1241
- // We expect 4 events (model_info + original + model_info + 1 retry)
1242
- expect(events.length).toBe(4);
1280
+ // We expect 3 events (model_info + original + 1 retry)
1281
+ expect(events.length).toBe(3);
1243
1282
  expect(events
1244
- .filter((e) => e.type !== GeminiEventType.ModelInfo)
1245
- .every((e) => e.type === GeminiEventType.InvalidStream)).toBe(true);
1283
+ .filter((e) => e.type === GeminiEventType.ModelInfo)
1284
+ .map((e) => e.value)).toEqual(['default-routed-model']);
1246
1285
  // Verify that turn.run was called twice
1247
1286
  expect(mockTurnRunFn).toHaveBeenCalledTimes(2);
1248
1287
  });
@@ -1470,7 +1509,6 @@ ${JSON.stringify({
1470
1509
  beforeEach(() => {
1471
1510
  mockAvailabilityService = createAvailabilityServiceMock();
1472
1511
  vi.mocked(mockConfig.getModelAvailabilityService).mockReturnValue(mockAvailabilityService);
1473
- vi.mocked(mockConfig.isModelAvailabilityServiceEnabled).mockReturnValue(true);
1474
1512
  vi.mocked(mockConfig.setActiveModel).mockClear();
1475
1513
  mockRouterService.route.mockResolvedValue({
1476
1514
  model: 'model-a',
@@ -1906,9 +1944,9 @@ ${JSON.stringify({
1906
1944
  it('should call generateContent with the correct parameters', async () => {
1907
1945
  const contents = [{ role: 'user', parts: [{ text: 'hello' }] }];
1908
1946
  const abortSignal = new AbortController().signal;
1909
- await client.generateContent({ model: DEFAULT_GEMINI_FLASH_MODEL }, contents, abortSignal);
1947
+ await client.generateContent({ model: 'test-model' }, contents, abortSignal);
1910
1948
  expect(mockContentGenerator.generateContent).toHaveBeenCalledWith({
1911
- model: DEFAULT_GEMINI_FLASH_MODEL,
1949
+ model: 'test-model',
1912
1950
  config: {
1913
1951
  abortSignal,
1914
1952
  systemInstruction: getCoreSystemPrompt({}, ''),
@@ -1919,33 +1957,198 @@ ${JSON.stringify({
1919
1957
  }, 'test-session-id');
1920
1958
  });
1921
1959
  it('should use current model from config for content generation', async () => {
1922
- const initialModel = client['config'].getModel();
1960
+ const initialModel = 'test-model';
1923
1961
  const contents = [{ role: 'user', parts: [{ text: 'test' }] }];
1924
- const currentModel = initialModel + '-changed';
1925
- vi.spyOn(client['config'], 'getModel').mockReturnValueOnce(currentModel);
1926
- await client.generateContent({ model: DEFAULT_GEMINI_FLASH_MODEL }, contents, new AbortController().signal);
1927
- expect(mockContentGenerator.generateContent).not.toHaveBeenCalledWith({
1962
+ await client.generateContent({ model: initialModel }, contents, new AbortController().signal);
1963
+ expect(mockContentGenerator.generateContent).toHaveBeenCalledWith(expect.objectContaining({
1928
1964
  model: initialModel,
1929
- config: expect.any(Object),
1930
- contents,
1931
- });
1932
- expect(mockContentGenerator.generateContent).toHaveBeenCalledWith({
1933
- model: DEFAULT_GEMINI_FLASH_MODEL,
1934
- config: expect.any(Object),
1935
- contents,
1936
- }, 'test-session-id');
1937
- });
1938
- it('should use the Flash model when fallback mode is active', async () => {
1939
- const contents = [{ role: 'user', parts: [{ text: 'hello' }] }];
1940
- const abortSignal = new AbortController().signal;
1941
- const requestedModel = 'gemini-2.5-pro'; // A non-flash model
1942
- // Mock config to be in fallback mode
1943
- vi.spyOn(client['config'], 'isInFallbackMode').mockReturnValue(true);
1944
- await client.generateContent({ model: requestedModel }, contents, abortSignal);
1945
- expect(mockGenerateContentFn).toHaveBeenCalledWith(expect.objectContaining({
1946
- model: DEFAULT_GEMINI_FLASH_MODEL,
1947
1965
  }), 'test-session-id');
1948
1966
  });
1967
+ describe('Hook System', () => {
1968
+ let mockMessageBus;
1969
+ beforeEach(() => {
1970
+ vi.clearAllMocks();
1971
+ mockMessageBus = { publish: vi.fn(), subscribe: vi.fn() };
1972
+ // Force override config methods on the client instance
1973
+ client['config'].getEnableHooks = vi.fn().mockReturnValue(true);
1974
+ client['config'].getMessageBus = vi
1975
+ .fn()
1976
+ .mockReturnValue(mockMessageBus);
1977
+ });
1978
+ it('should fire BeforeAgent and AfterAgent exactly once for a simple turn', async () => {
1979
+ const promptId = 'test-prompt-hook-1';
1980
+ const request = { text: 'Hello Hooks' };
1981
+ const signal = new AbortController().signal;
1982
+ mockTurnRunFn.mockImplementation(async function* () {
1983
+ this.getResponseText.mockReturnValue('Hook Response');
1984
+ yield { type: GeminiEventType.Content, value: 'Hook Response' };
1985
+ });
1986
+ const stream = client.sendMessageStream(request, signal, promptId);
1987
+ while (!(await stream.next()).done)
1988
+ ;
1989
+ expect(mockHookSystem.fireBeforeAgentEvent).toHaveBeenCalledTimes(1);
1990
+ expect(mockHookSystem.fireAfterAgentEvent).toHaveBeenCalledTimes(1);
1991
+ expect(mockHookSystem.fireAfterAgentEvent).toHaveBeenCalledWith(partToString(request), 'Hook Response');
1992
+ // Map should be empty
1993
+ expect(client['hookStateMap'].size).toBe(0);
1994
+ });
1995
+ it('should fire BeforeAgent once and AfterAgent once even with recursion', async () => {
1996
+ const { checkNextSpeaker } = await import('../utils/nextSpeakerChecker.js');
1997
+ vi.mocked(checkNextSpeaker)
1998
+ .mockResolvedValueOnce({ next_speaker: 'model', reasoning: 'more' })
1999
+ .mockResolvedValueOnce(null);
2000
+ const promptId = 'test-prompt-hook-recursive';
2001
+ const request = { text: 'Recursion Test' };
2002
+ const signal = new AbortController().signal;
2003
+ let callCount = 0;
2004
+ mockTurnRunFn.mockImplementation(async function* () {
2005
+ callCount++;
2006
+ const response = `Response ${callCount}`;
2007
+ this.getResponseText.mockReturnValue(response);
2008
+ yield { type: GeminiEventType.Content, value: response };
2009
+ });
2010
+ const stream = client.sendMessageStream(request, signal, promptId);
2011
+ while (!(await stream.next()).done)
2012
+ ;
2013
+ // BeforeAgent should fire ONLY once despite multiple internal turns
2014
+ expect(mockHookSystem.fireBeforeAgentEvent).toHaveBeenCalledTimes(1);
2015
+ // AfterAgent should fire ONLY when the stack unwinds
2016
+ expect(mockHookSystem.fireAfterAgentEvent).toHaveBeenCalledTimes(1);
2017
+ // Check cumulative response (separated by newline)
2018
+ expect(mockHookSystem.fireAfterAgentEvent).toHaveBeenCalledWith(partToString(request), 'Response 1\nResponse 2');
2019
+ expect(client['hookStateMap'].size).toBe(0);
2020
+ });
2021
+ it('should use original request in AfterAgent hook even when continuation happened', async () => {
2022
+ const { checkNextSpeaker } = await import('../utils/nextSpeakerChecker.js');
2023
+ vi.mocked(checkNextSpeaker)
2024
+ .mockResolvedValueOnce({ next_speaker: 'model', reasoning: 'more' })
2025
+ .mockResolvedValueOnce(null);
2026
+ const promptId = 'test-prompt-hook-original-req';
2027
+ const request = { text: 'Do something' };
2028
+ const signal = new AbortController().signal;
2029
+ mockTurnRunFn.mockImplementation(async function* () {
2030
+ this.getResponseText.mockReturnValue('Ok');
2031
+ yield { type: GeminiEventType.Content, value: 'Ok' };
2032
+ });
2033
+ const stream = client.sendMessageStream(request, signal, promptId);
2034
+ while (!(await stream.next()).done)
2035
+ ;
2036
+ expect(mockHookSystem.fireAfterAgentEvent).toHaveBeenCalledWith(partToString(request), // Should be 'Do something'
2037
+ expect.stringContaining('Ok'));
2038
+ });
2039
+ it('should cleanup state when prompt_id changes', async () => {
2040
+ const signal = new AbortController().signal;
2041
+ mockTurnRunFn.mockImplementation(async function* () {
2042
+ this.getResponseText.mockReturnValue('Ok');
2043
+ yield { type: GeminiEventType.Content, value: 'Ok' };
2044
+ });
2045
+ client['hookStateMap'].set('old-id', {
2046
+ hasFiredBeforeAgent: true,
2047
+ cumulativeResponse: 'Old',
2048
+ activeCalls: 0,
2049
+ originalRequest: { text: 'Old' },
2050
+ });
2051
+ client['lastPromptId'] = 'old-id';
2052
+ const stream = client.sendMessageStream({ text: 'New' }, signal, 'new-id');
2053
+ await stream.next();
2054
+ expect(client['hookStateMap'].has('old-id')).toBe(false);
2055
+ expect(client['hookStateMap'].has('new-id')).toBe(true);
2056
+ });
2057
+ it('should stop execution in BeforeAgent when hook returns continue: false', async () => {
2058
+ mockHookSystem.fireBeforeAgentEvent.mockResolvedValue({
2059
+ shouldStopExecution: () => true,
2060
+ getEffectiveReason: () => 'Stopped by hook',
2061
+ systemMessage: undefined,
2062
+ });
2063
+ const mockChat = {
2064
+ addHistory: vi.fn(),
2065
+ getHistory: vi.fn().mockReturnValue([]),
2066
+ getLastPromptTokenCount: vi.fn(),
2067
+ };
2068
+ client['chat'] = mockChat;
2069
+ const request = [{ text: 'Hello' }];
2070
+ const stream = client.sendMessageStream(request, new AbortController().signal, 'test-prompt');
2071
+ const events = await fromAsync(stream);
2072
+ expect(events).toContainEqual({
2073
+ type: GeminiEventType.AgentExecutionStopped,
2074
+ value: { reason: 'Stopped by hook' },
2075
+ });
2076
+ expect(mockChat.addHistory).toHaveBeenCalledWith({
2077
+ role: 'user',
2078
+ parts: request,
2079
+ });
2080
+ expect(mockTurnRunFn).not.toHaveBeenCalled();
2081
+ });
2082
+ it('should block execution in BeforeAgent when hook returns decision: block', async () => {
2083
+ mockHookSystem.fireBeforeAgentEvent.mockResolvedValue({
2084
+ shouldStopExecution: () => false,
2085
+ isBlockingDecision: () => true,
2086
+ getEffectiveReason: () => 'Blocked by hook',
2087
+ systemMessage: undefined,
2088
+ });
2089
+ const mockChat = {
2090
+ addHistory: vi.fn(),
2091
+ getHistory: vi.fn().mockReturnValue([]),
2092
+ getLastPromptTokenCount: vi.fn(),
2093
+ };
2094
+ client['chat'] = mockChat;
2095
+ const request = [{ text: 'Hello' }];
2096
+ const stream = client.sendMessageStream(request, new AbortController().signal, 'test-prompt');
2097
+ const events = await fromAsync(stream);
2098
+ expect(events).toContainEqual({
2099
+ type: GeminiEventType.AgentExecutionBlocked,
2100
+ value: {
2101
+ reason: 'Blocked by hook',
2102
+ },
2103
+ });
2104
+ expect(mockChat.addHistory).not.toHaveBeenCalled();
2105
+ expect(mockTurnRunFn).not.toHaveBeenCalled();
2106
+ });
2107
+ it('should stop execution in AfterAgent when hook returns continue: false', async () => {
2108
+ mockHookSystem.fireAfterAgentEvent.mockResolvedValue({
2109
+ shouldStopExecution: () => true,
2110
+ getEffectiveReason: () => 'Stopped after agent',
2111
+ systemMessage: undefined,
2112
+ });
2113
+ mockTurnRunFn.mockImplementation(async function* () {
2114
+ yield { type: GeminiEventType.Content, value: 'Hello' };
2115
+ });
2116
+ const stream = client.sendMessageStream({ text: 'Hi' }, new AbortController().signal, 'test-prompt');
2117
+ const events = await fromAsync(stream);
2118
+ expect(events).toContainEqual({
2119
+ type: GeminiEventType.AgentExecutionStopped,
2120
+ value: { reason: 'Stopped after agent' },
2121
+ });
2122
+ // sendMessageStream should not recurse
2123
+ expect(mockTurnRunFn).toHaveBeenCalledTimes(1);
2124
+ });
2125
+ it('should yield AgentExecutionBlocked and recurse in AfterAgent when hook returns decision: block', async () => {
2126
+ mockHookSystem.fireAfterAgentEvent
2127
+ .mockResolvedValueOnce({
2128
+ shouldStopExecution: () => false,
2129
+ isBlockingDecision: () => true,
2130
+ getEffectiveReason: () => 'Please explain',
2131
+ systemMessage: undefined,
2132
+ })
2133
+ .mockResolvedValueOnce({
2134
+ shouldStopExecution: () => false,
2135
+ isBlockingDecision: () => false,
2136
+ systemMessage: undefined,
2137
+ });
2138
+ mockTurnRunFn.mockImplementation(async function* () {
2139
+ yield { type: GeminiEventType.Content, value: 'Response' };
2140
+ });
2141
+ const stream = client.sendMessageStream({ text: 'Hi' }, new AbortController().signal, 'test-prompt');
2142
+ const events = await fromAsync(stream);
2143
+ expect(events).toContainEqual({
2144
+ type: GeminiEventType.AgentExecutionBlocked,
2145
+ value: { reason: 'Please explain' },
2146
+ });
2147
+ // Should have called turn run twice (original + re-prompt)
2148
+ expect(mockTurnRunFn).toHaveBeenCalledTimes(2);
2149
+ expect(mockTurnRunFn).toHaveBeenNthCalledWith(2, expect.anything(), [{ text: 'Please explain' }], expect.anything());
2150
+ });
2151
+ });
1949
2152
  });
1950
2153
  });
1951
2154
  //# sourceMappingURL=client.test.js.map