@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
@@ -3,38 +3,36 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { describe, it, expect, vi, beforeEach } from 'vitest';
7
- import { CoreToolScheduler, convertToFunctionResponse, truncateAndSaveToFile, } from './coreToolScheduler.js';
8
- import { DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES, DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD, BaseDeclarativeTool, BaseToolInvocation, ToolConfirmationOutcome, Kind, ApprovalMode, HookSystem, } from '../index.js';
6
+ import { describe, it, expect, vi } from 'vitest';
7
+ import { CoreToolScheduler } from './coreToolScheduler.js';
8
+ import { DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES, DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD, BaseDeclarativeTool, BaseToolInvocation, ToolConfirmationOutcome, Kind, ApprovalMode, HookSystem, PolicyDecision, } from '../index.js';
9
9
  import { createMockMessageBus } from '../test-utils/mock-message-bus.js';
10
10
  import { MockModifiableTool, MockTool, MOCK_TOOL_SHOULD_CONFIRM_EXECUTE, } from '../test-utils/mock-tool.js';
11
11
  import * as modifiableToolModule from '../tools/modifiable-tool.js';
12
- import * as fs from 'node:fs/promises';
13
- import * as path from 'node:path';
14
- import { isShellInvocationAllowlisted } from '../utils/shell-permissions.js';
15
- import { DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_MODEL, } from '../config/models.js';
12
+ import { DEFAULT_GEMINI_MODEL } from '../config/models.js';
13
+ import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
16
14
  vi.mock('fs/promises', () => ({
17
15
  writeFile: vi.fn(),
18
16
  }));
19
17
  class TestApprovalTool extends BaseDeclarativeTool {
20
18
  config;
21
19
  static Name = 'testApprovalTool';
22
- constructor(config) {
20
+ constructor(config, messageBus) {
23
21
  super(TestApprovalTool.Name, 'TestApprovalTool', 'A tool for testing approval logic', Kind.Edit, {
24
22
  properties: { id: { type: 'string' } },
25
23
  required: ['id'],
26
24
  type: 'object',
27
- });
25
+ }, messageBus);
28
26
  this.config = config;
29
27
  }
30
- createInvocation(params) {
31
- return new TestApprovalInvocation(this.config, params);
28
+ createInvocation(params, messageBus, _toolName, _toolDisplayName) {
29
+ return new TestApprovalInvocation(this.config, params, messageBus);
32
30
  }
33
31
  }
34
32
  class TestApprovalInvocation extends BaseToolInvocation {
35
33
  config;
36
- constructor(config, params) {
37
- super(params);
34
+ constructor(config, params, messageBus) {
35
+ super(params, messageBus);
38
36
  this.config = config;
39
37
  }
40
38
  getDescription() {
@@ -70,8 +68,8 @@ class TestApprovalInvocation extends BaseToolInvocation {
70
68
  class AbortDuringConfirmationInvocation extends BaseToolInvocation {
71
69
  abortController;
72
70
  abortError;
73
- constructor(abortController, abortError, params) {
74
- super(params);
71
+ constructor(abortController, abortError, params, messageBus) {
72
+ super(params, messageBus);
75
73
  this.abortController = abortController;
76
74
  this.abortError = abortError;
77
75
  }
@@ -89,16 +87,16 @@ class AbortDuringConfirmationInvocation extends BaseToolInvocation {
89
87
  class AbortDuringConfirmationTool extends BaseDeclarativeTool {
90
88
  abortController;
91
89
  abortError;
92
- constructor(abortController, abortError) {
90
+ constructor(abortController, abortError, messageBus) {
93
91
  super('abortDuringConfirmationTool', 'Abort During Confirmation Tool', 'A tool that aborts while confirming execution.', Kind.Other, {
94
92
  type: 'object',
95
93
  properties: {},
96
- });
94
+ }, messageBus);
97
95
  this.abortController = abortController;
98
96
  this.abortError = abortError;
99
97
  }
100
- createInvocation(params) {
101
- return new AbortDuringConfirmationInvocation(this.abortController, this.abortError, params);
98
+ createInvocation(params, messageBus, _toolName, _toolDisplayName) {
99
+ return new AbortDuringConfirmationInvocation(this.abortController, this.abortError, params, messageBus);
102
100
  }
103
101
  }
104
102
  async function waitForStatus(onToolCallsUpdate, status, timeout = 5000) {
@@ -155,6 +153,11 @@ function createMockConfig(overrides = {}) {
155
153
  getShellExecutionConfig: () => ({
156
154
  terminalWidth: 90,
157
155
  terminalHeight: 30,
156
+ sanitizationConfig: {
157
+ enableEnvironmentVariableRedaction: true,
158
+ allowedEnvironmentVariables: [],
159
+ blockedEnvironmentVariables: [],
160
+ },
158
161
  }),
159
162
  storage: {
160
163
  getProjectTempDir: () => '/tmp',
@@ -163,15 +166,32 @@ function createMockConfig(overrides = {}) {
163
166
  getTruncateToolOutputLines: () => DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
164
167
  getToolRegistry: () => defaultToolRegistry,
165
168
  getActiveModel: () => DEFAULT_GEMINI_MODEL,
166
- getUseSmartEdit: () => false,
167
169
  getGeminiClient: () => null,
168
- getEnableMessageBusIntegration: () => false,
169
- getMessageBus: () => null,
170
+ getMessageBus: () => createMockMessageBus(),
170
171
  getEnableHooks: () => false,
171
- getPolicyEngine: () => null,
172
172
  getExperiments: () => { },
173
173
  };
174
- return { ...baseConfig, ...overrides };
174
+ const finalConfig = { ...baseConfig, ...overrides };
175
+ // Patch the policy engine to use the final config if not overridden
176
+ if (!overrides.getPolicyEngine) {
177
+ finalConfig.getPolicyEngine = () => ({
178
+ check: async (toolCall, _serverName) => {
179
+ // Mock simple policy logic for tests
180
+ const mode = finalConfig.getApprovalMode();
181
+ if (mode === ApprovalMode.YOLO) {
182
+ return { decision: PolicyDecision.ALLOW };
183
+ }
184
+ const allowed = finalConfig.getAllowedTools();
185
+ if (allowed &&
186
+ (allowed.includes(toolCall.name) ||
187
+ allowed.some((p) => toolCall.name.startsWith(p)))) {
188
+ return { decision: PolicyDecision.ALLOW };
189
+ }
190
+ return { decision: PolicyDecision.ASK_USER };
191
+ },
192
+ });
193
+ }
194
+ return finalConfig;
175
195
  }
176
196
  describe('CoreToolScheduler', () => {
177
197
  it('should cancel a tool call if the signal is aborted before confirmation', async () => {
@@ -401,7 +421,7 @@ describe('CoreToolScheduler', () => {
401
421
  it('should mark tool call as cancelled when abort happens during confirmation error', async () => {
402
422
  const abortController = new AbortController();
403
423
  const abortError = new Error('Abort requested during confirmation');
404
- const declarativeTool = new AbortDuringConfirmationTool(abortController, abortError);
424
+ const declarativeTool = new AbortDuringConfirmationTool(abortController, abortError, createMockMessageBus());
405
425
  const mockToolRegistry = {
406
426
  getTool: () => declarativeTool,
407
427
  getFunctionDeclarations: () => [],
@@ -419,7 +439,7 @@ describe('CoreToolScheduler', () => {
419
439
  const onToolCallsUpdate = vi.fn();
420
440
  const mockConfig = createMockConfig({
421
441
  getToolRegistry: () => mockToolRegistry,
422
- isInteractive: () => false,
442
+ isInteractive: () => true,
423
443
  });
424
444
  const scheduler = new CoreToolScheduler({
425
445
  config: mockConfig,
@@ -493,35 +513,6 @@ describe('CoreToolScheduler', () => {
493
513
  const errorMessage = errorParts[0].functionResponse.response.error;
494
514
  expect(errorMessage).toContain('Tool execution for "mockTool" requires user confirmation, which is not supported in non-interactive mode.');
495
515
  });
496
- describe('getToolSuggestion', () => {
497
- it('should suggest the top N closest tool names for a typo', () => {
498
- // Create mocked tool registry
499
- const mockToolRegistry = {
500
- getAllToolNames: () => ['list_files', 'read_file', 'write_file'],
501
- };
502
- const mockConfig = createMockConfig({
503
- getToolRegistry: () => mockToolRegistry,
504
- isInteractive: () => false,
505
- });
506
- // Create scheduler
507
- const scheduler = new CoreToolScheduler({
508
- config: mockConfig,
509
- getPreferredEditor: () => 'vscode',
510
- });
511
- // Test that the right tool is selected, with only 1 result, for typos
512
- // @ts-expect-error accessing private method
513
- const misspelledTool = scheduler.getToolSuggestion('list_fils', 1);
514
- expect(misspelledTool).toBe(' Did you mean "list_files"?');
515
- // Test that the right tool is selected, with only 1 result, for prefixes
516
- // @ts-expect-error accessing private method
517
- const prefixedTool = scheduler.getToolSuggestion('github.list_files', 1);
518
- expect(prefixedTool).toBe(' Did you mean "list_files"?');
519
- // Test that the right tool is first
520
- // @ts-expect-error accessing private method
521
- const suggestionMultiple = scheduler.getToolSuggestion('list_fils');
522
- expect(suggestionMultiple).toBe(' Did you mean one of: "list_files", "read_file", "write_file"?');
523
- });
524
- });
525
516
  });
526
517
  describe('CoreToolScheduler with payload', () => {
527
518
  it('should update args and diff and execute tool when payload is provided', async () => {
@@ -573,6 +564,10 @@ describe('CoreToolScheduler with payload', () => {
573
564
  const payload = { newContent: 'final version' };
574
565
  await confirmationDetails.onConfirm(ToolConfirmationOutcome.ProceedOnce, payload);
575
566
  }
567
+ // After internal update, the tool should be awaiting approval again with the NEW content.
568
+ const updatedAwaitingCall = (await waitForStatus(onToolCallsUpdate, 'awaiting_approval'));
569
+ // Now confirm for real to execute.
570
+ await updatedAwaitingCall.confirmationDetails.onConfirm(ToolConfirmationOutcome.ProceedOnce);
576
571
  // Wait for the tool execution to complete
577
572
  await vi.waitFor(() => {
578
573
  expect(onAllToolCallsComplete).toHaveBeenCalled();
@@ -585,226 +580,9 @@ describe('CoreToolScheduler with payload', () => {
585
580
  });
586
581
  });
587
582
  });
588
- describe('convertToFunctionResponse', () => {
589
- const toolName = 'testTool';
590
- const callId = 'call1';
591
- it('should handle simple string llmContent', () => {
592
- const llmContent = 'Simple text output';
593
- const result = convertToFunctionResponse(toolName, callId, llmContent, DEFAULT_GEMINI_MODEL);
594
- expect(result).toEqual([
595
- {
596
- functionResponse: {
597
- name: toolName,
598
- id: callId,
599
- response: { output: 'Simple text output' },
600
- },
601
- },
602
- ]);
603
- });
604
- it('should handle llmContent as a single Part with text', () => {
605
- const llmContent = { text: 'Text from Part object' };
606
- const result = convertToFunctionResponse(toolName, callId, llmContent, DEFAULT_GEMINI_MODEL);
607
- expect(result).toEqual([
608
- {
609
- functionResponse: {
610
- name: toolName,
611
- id: callId,
612
- response: { output: 'Text from Part object' },
613
- },
614
- },
615
- ]);
616
- });
617
- it('should handle llmContent as a PartListUnion array with a single text Part', () => {
618
- const llmContent = [{ text: 'Text from array' }];
619
- const result = convertToFunctionResponse(toolName, callId, llmContent, DEFAULT_GEMINI_MODEL);
620
- expect(result).toEqual([
621
- {
622
- functionResponse: {
623
- name: toolName,
624
- id: callId,
625
- response: { output: 'Text from array' },
626
- },
627
- },
628
- ]);
629
- });
630
- it('should handle llmContent as a PartListUnion array with multiple Parts', () => {
631
- const llmContent = [{ text: 'part1' }, { text: 'part2' }];
632
- const result = convertToFunctionResponse(toolName, callId, llmContent, DEFAULT_GEMINI_MODEL);
633
- expect(result).toEqual([
634
- {
635
- functionResponse: {
636
- name: toolName,
637
- id: callId,
638
- response: { output: 'part1\npart2' },
639
- },
640
- },
641
- ]);
642
- });
643
- it('should handle llmContent with fileData for Gemini 3 model (should be siblings)', () => {
644
- const llmContent = {
645
- fileData: { mimeType: 'application/pdf', fileUri: 'gs://...' },
646
- };
647
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
648
- expect(result).toEqual([
649
- {
650
- functionResponse: {
651
- name: toolName,
652
- id: callId,
653
- response: { output: 'Binary content provided (1 item(s)).' },
654
- },
655
- },
656
- llmContent,
657
- ]);
658
- });
659
- it('should handle llmContent with inlineData for Gemini 3 model (should be nested)', () => {
660
- const llmContent = {
661
- inlineData: { mimeType: 'image/png', data: 'base64...' },
662
- };
663
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
664
- expect(result).toEqual([
665
- {
666
- functionResponse: {
667
- name: toolName,
668
- id: callId,
669
- response: { output: 'Binary content provided (1 item(s)).' },
670
- parts: [llmContent],
671
- },
672
- },
673
- ]);
674
- });
675
- it('should handle llmContent with fileData for non-Gemini 3 models', () => {
676
- const llmContent = {
677
- fileData: { mimeType: 'application/pdf', fileUri: 'gs://...' },
678
- };
679
- const result = convertToFunctionResponse(toolName, callId, llmContent, DEFAULT_GEMINI_MODEL);
680
- expect(result).toEqual([
681
- {
682
- functionResponse: {
683
- name: toolName,
684
- id: callId,
685
- response: { output: 'Binary content provided (1 item(s)).' },
686
- },
687
- },
688
- llmContent,
689
- ]);
690
- });
691
- it('should preserve existing functionResponse metadata', () => {
692
- const innerId = 'inner-call-id';
693
- const innerName = 'inner-tool-name';
694
- const responseMetadata = {
695
- flags: ['flag1'],
696
- isError: false,
697
- customData: { key: 'value' },
698
- };
699
- const input = {
700
- functionResponse: {
701
- id: innerId,
702
- name: innerName,
703
- response: responseMetadata,
704
- },
705
- };
706
- const result = convertToFunctionResponse(toolName, callId, input, DEFAULT_GEMINI_MODEL);
707
- expect(result).toHaveLength(1);
708
- expect(result[0].functionResponse).toEqual({
709
- id: callId,
710
- name: toolName,
711
- response: responseMetadata,
712
- });
713
- });
714
- it('should handle llmContent as an array of multiple Parts (text and inlineData)', () => {
715
- const llmContent = [
716
- { text: 'Some textual description' },
717
- { inlineData: { mimeType: 'image/jpeg', data: 'base64data...' } },
718
- { text: 'Another text part' },
719
- ];
720
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
721
- expect(result).toEqual([
722
- {
723
- functionResponse: {
724
- name: toolName,
725
- id: callId,
726
- response: {
727
- output: 'Some textual description\nAnother text part',
728
- },
729
- parts: [
730
- { inlineData: { mimeType: 'image/jpeg', data: 'base64data...' } },
731
- ],
732
- },
733
- },
734
- ]);
735
- });
736
- it('should handle llmContent as an array with a single inlineData Part', () => {
737
- const llmContent = [
738
- { inlineData: { mimeType: 'image/gif', data: 'gifdata...' } },
739
- ];
740
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
741
- expect(result).toEqual([
742
- {
743
- functionResponse: {
744
- name: toolName,
745
- id: callId,
746
- response: { output: 'Binary content provided (1 item(s)).' },
747
- parts: llmContent,
748
- },
749
- },
750
- ]);
751
- });
752
- it('should handle llmContent as a generic Part (not text, inlineData, or fileData)', () => {
753
- const llmContent = { functionCall: { name: 'test', args: {} } };
754
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
755
- expect(result).toEqual([
756
- {
757
- functionResponse: {
758
- name: toolName,
759
- id: callId,
760
- response: {},
761
- },
762
- },
763
- ]);
764
- });
765
- it('should handle empty string llmContent', () => {
766
- const llmContent = '';
767
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
768
- expect(result).toEqual([
769
- {
770
- functionResponse: {
771
- name: toolName,
772
- id: callId,
773
- response: { output: '' },
774
- },
775
- },
776
- ]);
777
- });
778
- it('should handle llmContent as an empty array', () => {
779
- const llmContent = [];
780
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
781
- expect(result).toEqual([
782
- {
783
- functionResponse: {
784
- name: toolName,
785
- id: callId,
786
- response: {},
787
- },
788
- },
789
- ]);
790
- });
791
- it('should handle llmContent as a Part with undefined inlineData/fileData/text', () => {
792
- const llmContent = {}; // An empty part object
793
- const result = convertToFunctionResponse(toolName, callId, llmContent, PREVIEW_GEMINI_MODEL);
794
- expect(result).toEqual([
795
- {
796
- functionResponse: {
797
- name: toolName,
798
- id: callId,
799
- response: {},
800
- },
801
- },
802
- ]);
803
- });
804
- });
805
583
  class MockEditToolInvocation extends BaseToolInvocation {
806
- constructor(params) {
807
- super(params);
584
+ constructor(params, messageBus) {
585
+ super(params, messageBus);
808
586
  }
809
587
  getDescription() {
810
588
  return 'A mock edit tool invocation';
@@ -829,16 +607,16 @@ class MockEditToolInvocation extends BaseToolInvocation {
829
607
  }
830
608
  }
831
609
  class MockEditTool extends BaseDeclarativeTool {
832
- constructor() {
833
- super('mockEditTool', 'mockEditTool', 'A mock edit tool', Kind.Edit, {});
610
+ constructor(messageBus) {
611
+ super('mockEditTool', 'mockEditTool', 'A mock edit tool', Kind.Edit, {}, messageBus);
834
612
  }
835
- createInvocation(params) {
836
- return new MockEditToolInvocation(params);
613
+ createInvocation(params, messageBus, _toolName, _toolDisplayName) {
614
+ return new MockEditToolInvocation(params, messageBus);
837
615
  }
838
616
  }
839
617
  describe('CoreToolScheduler edit cancellation', () => {
840
618
  it('should preserve diff when an edit is cancelled', async () => {
841
- const mockEditTool = new MockEditTool();
619
+ const mockEditTool = new MockEditTool(createMockMessageBus());
842
620
  const mockToolRegistry = {
843
621
  getTool: () => mockEditTool,
844
622
  getFunctionDeclarations: () => [],
@@ -1109,6 +887,11 @@ describe('CoreToolScheduler request queueing', () => {
1109
887
  getShellExecutionConfig: () => ({
1110
888
  terminalWidth: 80,
1111
889
  terminalHeight: 24,
890
+ sanitizationConfig: {
891
+ enableEnvironmentVariableRedaction: true,
892
+ allowedEnvironmentVariables: [],
893
+ blockedEnvironmentVariables: [],
894
+ },
1112
895
  }),
1113
896
  isInteractive: () => false,
1114
897
  });
@@ -1164,9 +947,6 @@ describe('CoreToolScheduler request queueing', () => {
1164
947
  }
1165
948
  });
1166
949
  it('should require approval for a chained shell command even when prefix is allowlisted', async () => {
1167
- expect(isShellInvocationAllowlisted({
1168
- params: { command: 'git status && rm -rf /tmp/should-not-run' },
1169
- }, ['run_shell_command(git)'])).toBe(false);
1170
950
  const executeFn = vi.fn().mockResolvedValue({
1171
951
  llmContent: 'Shell command executed',
1172
952
  returnDisplay: 'Shell command executed',
@@ -1202,9 +982,17 @@ describe('CoreToolScheduler request queueing', () => {
1202
982
  getShellExecutionConfig: () => ({
1203
983
  terminalWidth: 80,
1204
984
  terminalHeight: 24,
985
+ sanitizationConfig: {
986
+ enableEnvironmentVariableRedaction: true,
987
+ allowedEnvironmentVariables: [],
988
+ blockedEnvironmentVariables: [],
989
+ },
1205
990
  }),
1206
991
  getToolRegistry: () => toolRegistry,
1207
992
  getHookSystem: () => undefined,
993
+ getPolicyEngine: () => ({
994
+ check: async () => ({ decision: PolicyDecision.ASK_USER }),
995
+ }),
1208
996
  });
1209
997
  const scheduler = new CoreToolScheduler({
1210
998
  config: mockConfig,
@@ -1307,7 +1095,7 @@ describe('CoreToolScheduler request queueing', () => {
1307
1095
  mockConfig.getHookSystem = vi
1308
1096
  .fn()
1309
1097
  .mockReturnValue(new HookSystem(mockConfig));
1310
- const testTool = new TestApprovalTool(mockConfig);
1098
+ const testTool = new TestApprovalTool(mockConfig, mockMessageBus);
1311
1099
  const toolRegistry = {
1312
1100
  getTool: () => testTool,
1313
1101
  getFunctionDeclarations: () => [],
@@ -1662,119 +1450,189 @@ describe('CoreToolScheduler Sequential Execution', () => {
1662
1450
  });
1663
1451
  modifyWithEditorSpy.mockRestore();
1664
1452
  });
1665
- });
1666
- describe('truncateAndSaveToFile', () => {
1667
- const mockWriteFile = vi.mocked(fs.writeFile);
1668
- const THRESHOLD = 40_000;
1669
- const TRUNCATE_LINES = 1000;
1670
- beforeEach(() => {
1671
- vi.clearAllMocks();
1672
- });
1673
- it('should return content unchanged if below threshold', async () => {
1674
- const content = 'Short content';
1675
- const callId = 'test-call-id';
1676
- const projectTempDir = '/tmp';
1677
- const result = await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1678
- expect(result).toEqual({ content });
1679
- expect(mockWriteFile).not.toHaveBeenCalled();
1680
- });
1681
- it('should truncate content by lines when content has many lines', async () => {
1682
- // Create content that exceeds 100,000 character threshold with many lines
1683
- const lines = Array(2000).fill('x'.repeat(100)); // 100 chars per line * 2000 lines = 200,000 chars
1684
- const content = lines.join('\n');
1685
- const callId = 'test-call-id';
1686
- const projectTempDir = '/tmp';
1687
- mockWriteFile.mockResolvedValue(undefined);
1688
- const result = await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1689
- expect(result.outputFile).toBe(path.join(projectTempDir, `${callId}.output`));
1690
- expect(mockWriteFile).toHaveBeenCalledWith(path.join(projectTempDir, `${callId}.output`), content);
1691
- // Should contain the first and last lines with 1/5 head and 4/5 tail
1692
- const head = Math.floor(TRUNCATE_LINES / 5);
1693
- const beginning = lines.slice(0, head);
1694
- const end = lines.slice(-(TRUNCATE_LINES - head));
1695
- const expectedTruncated = beginning.join('\n') + '\n... [CONTENT TRUNCATED] ...\n' + end.join('\n');
1696
- expect(result.content).toContain('Tool output was too large and has been truncated');
1697
- expect(result.content).toContain('Truncated part of the output:');
1698
- expect(result.content).toContain(expectedTruncated);
1699
- });
1700
- it('should wrap and truncate content when content has few but long lines', async () => {
1701
- const content = 'a'.repeat(200_000); // A single very long line
1702
- const callId = 'test-call-id';
1703
- const projectTempDir = '/tmp';
1704
- const wrapWidth = 120;
1705
- mockWriteFile.mockResolvedValue(undefined);
1706
- // Manually wrap the content to generate the expected file content
1707
- const wrappedLines = [];
1708
- for (let i = 0; i < content.length; i += wrapWidth) {
1709
- wrappedLines.push(content.substring(i, i + wrapWidth));
1710
- }
1711
- const expectedFileContent = wrappedLines.join('\n');
1712
- const result = await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1713
- expect(result.outputFile).toBe(path.join(projectTempDir, `${callId}.output`));
1714
- // Check that the file was written with the wrapped content
1715
- expect(mockWriteFile).toHaveBeenCalledWith(path.join(projectTempDir, `${callId}.output`), expectedFileContent);
1716
- // Should contain the first and last lines with 1/5 head and 4/5 tail of the wrapped content
1717
- const head = Math.floor(TRUNCATE_LINES / 5);
1718
- const beginning = wrappedLines.slice(0, head);
1719
- const end = wrappedLines.slice(-(TRUNCATE_LINES - head));
1720
- const expectedTruncated = beginning.join('\n') + '\n... [CONTENT TRUNCATED] ...\n' + end.join('\n');
1721
- expect(result.content).toContain('Tool output was too large and has been truncated');
1722
- expect(result.content).toContain('Truncated part of the output:');
1723
- expect(result.content).toContain(expectedTruncated);
1724
- });
1725
- it('should handle file write errors gracefully', async () => {
1726
- const content = 'a'.repeat(2_000_000);
1727
- const callId = 'test-call-id';
1728
- const projectTempDir = '/tmp';
1729
- mockWriteFile.mockRejectedValue(new Error('File write failed'));
1730
- const result = await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1731
- expect(result.outputFile).toBeUndefined();
1732
- expect(result.content).toContain('[Note: Could not save full output to file]');
1733
- expect(mockWriteFile).toHaveBeenCalled();
1734
- });
1735
- it('should save to correct file path with call ID', async () => {
1736
- const content = 'a'.repeat(200_000);
1737
- const callId = 'unique-call-123';
1738
- const projectTempDir = '/custom/temp/dir';
1739
- const wrapWidth = 120;
1740
- mockWriteFile.mockResolvedValue(undefined);
1741
- // Manually wrap the content to generate the expected file content
1742
- const wrappedLines = [];
1743
- for (let i = 0; i < content.length; i += wrapWidth) {
1744
- wrappedLines.push(content.substring(i, i + wrapWidth));
1745
- }
1746
- const expectedFileContent = wrappedLines.join('\n');
1747
- const result = await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1748
- const expectedPath = path.join(projectTempDir, `${callId}.output`);
1749
- expect(result.outputFile).toBe(expectedPath);
1750
- expect(mockWriteFile).toHaveBeenCalledWith(expectedPath, expectedFileContent);
1453
+ it('should pass serverName to policy engine for DiscoveredMCPTool', async () => {
1454
+ const mockMcpTool = {
1455
+ tool: async () => ({ functionDeclarations: [] }),
1456
+ callTool: async () => [],
1457
+ };
1458
+ const serverName = 'test-server';
1459
+ const toolName = 'test-tool';
1460
+ const mcpTool = new DiscoveredMCPTool(mockMcpTool, serverName, toolName, 'description', { type: 'object', properties: {} }, createMockMessageBus());
1461
+ const mockToolRegistry = {
1462
+ getTool: () => mcpTool,
1463
+ getFunctionDeclarations: () => [],
1464
+ tools: new Map(),
1465
+ discovery: {},
1466
+ registerTool: () => { },
1467
+ getToolByName: () => mcpTool,
1468
+ getToolByDisplayName: () => mcpTool,
1469
+ getTools: () => [],
1470
+ discoverTools: async () => { },
1471
+ getAllTools: () => [],
1472
+ getToolsByServer: () => [],
1473
+ };
1474
+ const mockPolicyEngineCheck = vi.fn().mockResolvedValue({
1475
+ decision: PolicyDecision.ALLOW,
1476
+ });
1477
+ const mockConfig = createMockConfig({
1478
+ getToolRegistry: () => mockToolRegistry,
1479
+ getPolicyEngine: () => ({
1480
+ check: mockPolicyEngineCheck,
1481
+ }),
1482
+ isInteractive: () => false,
1483
+ });
1484
+ const scheduler = new CoreToolScheduler({
1485
+ config: mockConfig,
1486
+ getPreferredEditor: () => 'vscode',
1487
+ });
1488
+ const abortController = new AbortController();
1489
+ const request = {
1490
+ callId: '1',
1491
+ name: toolName,
1492
+ args: {},
1493
+ isClientInitiated: false,
1494
+ prompt_id: 'prompt-id-1',
1495
+ };
1496
+ await scheduler.schedule(request, abortController.signal);
1497
+ expect(mockPolicyEngineCheck).toHaveBeenCalledWith(expect.objectContaining({ name: toolName }), serverName);
1751
1498
  });
1752
- it('should include helpful instructions in truncated message', async () => {
1753
- const content = 'a'.repeat(2_000_000);
1754
- const callId = 'test-call-id';
1755
- const projectTempDir = '/tmp';
1756
- mockWriteFile.mockResolvedValue(undefined);
1757
- const result = await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1758
- expect(result.content).toContain('read_file tool with the absolute file path above');
1759
- expect(result.content).toContain('read_file tool with offset=0, limit=100');
1760
- expect(result.content).toContain('read_file tool with offset=N to skip N lines');
1761
- expect(result.content).toContain('read_file tool with limit=M to read only M lines');
1499
+ it('should not double-report completed tools when concurrent completions occur', async () => {
1500
+ // Arrange
1501
+ const executeFn = vi.fn().mockResolvedValue({ llmContent: 'success' });
1502
+ const mockTool = new MockTool({ name: 'mockTool', execute: executeFn });
1503
+ const declarativeTool = mockTool;
1504
+ const mockToolRegistry = {
1505
+ getTool: () => declarativeTool,
1506
+ getToolByName: () => declarativeTool,
1507
+ getFunctionDeclarations: () => [],
1508
+ tools: new Map(),
1509
+ discovery: {},
1510
+ registerTool: () => { },
1511
+ getToolByDisplayName: () => declarativeTool,
1512
+ getTools: () => [],
1513
+ discoverTools: async () => { },
1514
+ getAllTools: () => [],
1515
+ getToolsByServer: () => [],
1516
+ };
1517
+ let completionCallCount = 0;
1518
+ const onAllToolCallsComplete = vi.fn().mockImplementation(async () => {
1519
+ completionCallCount++;
1520
+ // Simulate slow reporting (e.g. Gemini API call)
1521
+ await new Promise((resolve) => setTimeout(resolve, 50));
1522
+ });
1523
+ const mockConfig = createMockConfig({
1524
+ getToolRegistry: () => mockToolRegistry,
1525
+ getApprovalMode: () => ApprovalMode.YOLO,
1526
+ isInteractive: () => false,
1527
+ });
1528
+ const mockMessageBus = createMockMessageBus();
1529
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(mockMessageBus);
1530
+ mockConfig.getEnableHooks = vi.fn().mockReturnValue(false);
1531
+ mockConfig.getHookSystem = vi
1532
+ .fn()
1533
+ .mockReturnValue(new HookSystem(mockConfig));
1534
+ const scheduler = new CoreToolScheduler({
1535
+ config: mockConfig,
1536
+ onAllToolCallsComplete,
1537
+ getPreferredEditor: () => 'vscode',
1538
+ });
1539
+ const abortController = new AbortController();
1540
+ const request = {
1541
+ callId: '1',
1542
+ name: 'mockTool',
1543
+ args: {},
1544
+ isClientInitiated: false,
1545
+ prompt_id: 'prompt-1',
1546
+ };
1547
+ // Act
1548
+ // 1. Start execution
1549
+ const schedulePromise = scheduler.schedule([request], abortController.signal);
1550
+ // 2. Wait just enough for it to finish and enter checkAndNotifyCompletion
1551
+ // (awaiting our slow mock)
1552
+ await vi.waitFor(() => {
1553
+ expect(completionCallCount).toBe(1);
1554
+ });
1555
+ // 3. Trigger a concurrent completion event (e.g. via cancelAll)
1556
+ scheduler.cancelAll(abortController.signal);
1557
+ await schedulePromise;
1558
+ // Assert
1559
+ // Even though cancelAll was called while the first completion was in progress,
1560
+ // it should not have triggered a SECOND completion call because the first one
1561
+ // was still 'finalizing' and will drain any new tools.
1562
+ expect(onAllToolCallsComplete).toHaveBeenCalledTimes(1);
1762
1563
  });
1763
- it('should sanitize callId to prevent path traversal', async () => {
1764
- const content = 'a'.repeat(200_000);
1765
- const callId = '../../../../../etc/passwd';
1766
- const projectTempDir = '/tmp/safe_dir';
1767
- const wrapWidth = 120;
1768
- mockWriteFile.mockResolvedValue(undefined);
1769
- // Manually wrap the content to generate the expected file content
1770
- const wrappedLines = [];
1771
- for (let i = 0; i < content.length; i += wrapWidth) {
1772
- wrappedLines.push(content.substring(i, i + wrapWidth));
1773
- }
1774
- const expectedFileContent = wrappedLines.join('\n');
1775
- await truncateAndSaveToFile(content, callId, projectTempDir, THRESHOLD, TRUNCATE_LINES);
1776
- const expectedPath = path.join(projectTempDir, 'passwd.output');
1777
- expect(mockWriteFile).toHaveBeenCalledWith(expectedPath, expectedFileContent);
1564
+ it('should complete reporting all tools even mid-callback during abort', async () => {
1565
+ // Arrange
1566
+ const onAllToolCallsComplete = vi.fn().mockImplementation(async () => {
1567
+ // Simulate slow reporting
1568
+ await new Promise((resolve) => setTimeout(resolve, 50));
1569
+ });
1570
+ const mockTool = new MockTool({ name: 'mockTool' });
1571
+ const mockToolRegistry = {
1572
+ getTool: () => mockTool,
1573
+ getToolByName: () => mockTool,
1574
+ getFunctionDeclarations: () => [],
1575
+ tools: new Map(),
1576
+ discovery: {},
1577
+ registerTool: () => { },
1578
+ getToolByDisplayName: () => mockTool,
1579
+ getTools: () => [],
1580
+ discoverTools: async () => { },
1581
+ getAllTools: () => [],
1582
+ getToolsByServer: () => [],
1583
+ };
1584
+ const mockConfig = createMockConfig({
1585
+ getToolRegistry: () => mockToolRegistry,
1586
+ getApprovalMode: () => ApprovalMode.YOLO,
1587
+ isInteractive: () => false,
1588
+ });
1589
+ const scheduler = new CoreToolScheduler({
1590
+ config: mockConfig,
1591
+ onAllToolCallsComplete,
1592
+ getPreferredEditor: () => 'vscode',
1593
+ });
1594
+ const abortController = new AbortController();
1595
+ const signal = abortController.signal;
1596
+ // Act
1597
+ // 1. Start execution of two tools
1598
+ const schedulePromise = scheduler.schedule([
1599
+ {
1600
+ callId: '1',
1601
+ name: 'mockTool',
1602
+ args: {},
1603
+ isClientInitiated: false,
1604
+ prompt_id: 'prompt-1',
1605
+ },
1606
+ {
1607
+ callId: '2',
1608
+ name: 'mockTool',
1609
+ args: {},
1610
+ isClientInitiated: false,
1611
+ prompt_id: 'prompt-1',
1612
+ },
1613
+ ], signal);
1614
+ // 2. Wait for reporting to start
1615
+ await vi.waitFor(() => {
1616
+ expect(onAllToolCallsComplete).toHaveBeenCalled();
1617
+ });
1618
+ // 3. Abort the signal while reporting is in progress
1619
+ abortController.abort();
1620
+ await schedulePromise;
1621
+ // Assert
1622
+ // Verify that onAllToolCallsComplete was called and processed the tools,
1623
+ // and that the scheduler didn't just drop them because of the abort.
1624
+ expect(onAllToolCallsComplete).toHaveBeenCalled();
1625
+ const reportedTools = onAllToolCallsComplete.mock.calls.flatMap((call) =>
1626
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1627
+ call[0].map((t) => t.request.callId));
1628
+ // Both tools should have been reported exactly once with success status
1629
+ expect(reportedTools).toContain('1');
1630
+ expect(reportedTools).toContain('2');
1631
+ const allStatuses = onAllToolCallsComplete.mock.calls.flatMap((call) =>
1632
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1633
+ call[0].map((t) => t.status));
1634
+ expect(allStatuses).toEqual(['success', 'success']);
1635
+ expect(onAllToolCallsComplete).toHaveBeenCalledTimes(1);
1778
1636
  });
1779
1637
  });
1780
1638
  //# sourceMappingURL=coreToolScheduler.test.js.map