@machina.ai/cell-cli-core 1.38.1-rc2 → 1.40.1-rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +1 -1
  2. package/dist/docs/admin/enterprise-controls.md +1 -1
  3. package/dist/docs/changelogs/index.md +42 -0
  4. package/dist/docs/changelogs/latest.md +254 -361
  5. package/dist/docs/changelogs/preview.md +237 -406
  6. package/dist/docs/cli/acp-mode.md +6 -6
  7. package/dist/docs/cli/auto-memory.md +143 -0
  8. package/dist/docs/cli/checkpointing.md +5 -5
  9. package/dist/docs/cli/cli-reference.md +12 -11
  10. package/dist/docs/cli/creating-skills.md +2 -2
  11. package/dist/docs/cli/custom-commands.md +15 -14
  12. package/dist/docs/cli/enterprise.md +17 -14
  13. package/dist/docs/cli/gemini-ignore.md +2 -2
  14. package/dist/docs/cli/generation-settings.md +21 -20
  15. package/dist/docs/cli/model-routing.md +2 -2
  16. package/dist/docs/cli/model-steering.md +1 -1
  17. package/dist/docs/cli/plan-mode.md +11 -6
  18. package/dist/docs/cli/sandbox.md +7 -5
  19. package/dist/docs/cli/settings.md +32 -28
  20. package/dist/docs/cli/system-prompt.md +8 -8
  21. package/dist/docs/cli/telemetry.md +18 -11
  22. package/dist/docs/cli/themes.md +2 -2
  23. package/dist/docs/cli/trusted-folders.md +41 -13
  24. package/dist/docs/cli/tutorials/mcp-setup.md +1 -1
  25. package/dist/docs/cli/tutorials/memory-management.md +3 -1
  26. package/dist/docs/cli/tutorials/plan-mode-steering.md +2 -2
  27. package/dist/docs/cli/tutorials/session-management.md +1 -1
  28. package/dist/docs/cli/tutorials/shell-commands.md +1 -1
  29. package/dist/docs/cli/tutorials/task-planning.md +3 -3
  30. package/dist/docs/core/index.md +5 -6
  31. package/dist/docs/core/local-model-routing.md +1 -1
  32. package/dist/docs/core/remote-agents.md +1 -1
  33. package/dist/docs/core/subagents.md +38 -8
  34. package/dist/docs/extensions/best-practices.md +5 -4
  35. package/dist/docs/extensions/reference.md +6 -5
  36. package/dist/docs/extensions/releasing.md +6 -5
  37. package/dist/docs/extensions/writing-extensions.md +11 -11
  38. package/dist/docs/get-started/{authentication.md → authentication.mdx} +139 -93
  39. package/dist/docs/get-started/gemini-3.md +1 -1
  40. package/dist/docs/get-started/index.md +4 -4
  41. package/dist/docs/get-started/installation.mdx +201 -0
  42. package/dist/docs/hooks/best-practices.md +18 -17
  43. package/dist/docs/hooks/index.md +10 -8
  44. package/dist/docs/hooks/reference.md +10 -10
  45. package/dist/docs/ide-integration/ide-companion-spec.md +14 -14
  46. package/dist/docs/ide-integration/index.md +4 -4
  47. package/dist/docs/index.md +2 -2
  48. package/dist/docs/integration-tests.md +84 -2
  49. package/dist/docs/issue-and-pr-automation.md +8 -7
  50. package/dist/docs/npm.md +2 -2
  51. package/dist/docs/reference/commands.md +11 -11
  52. package/dist/docs/reference/configuration.md +150 -47
  53. package/dist/docs/reference/keyboard-shortcuts.md +79 -2
  54. package/dist/docs/reference/memport.md +2 -3
  55. package/dist/docs/reference/policy-engine.md +60 -26
  56. package/dist/docs/reference/tools.md +38 -4
  57. package/dist/docs/release-confidence.md +1 -1
  58. package/dist/docs/releases.md +19 -19
  59. package/dist/docs/resources/faq.md +5 -5
  60. package/dist/docs/resources/tos-privacy.md +10 -9
  61. package/dist/docs/resources/troubleshooting.md +17 -16
  62. package/dist/docs/resources/uninstall.md +5 -4
  63. package/dist/docs/sidebar.json +13 -1
  64. package/dist/docs/tools/ask-user.md +3 -3
  65. package/dist/docs/tools/file-system.md +7 -7
  66. package/dist/docs/tools/mcp-resources.md +44 -0
  67. package/dist/docs/tools/mcp-server.md +42 -39
  68. package/dist/docs/tools/shell.md +5 -5
  69. package/dist/docs/tools/tracker.md +61 -0
  70. package/dist/package.json +5 -4
  71. package/dist/src/agent/content-utils.d.ts +0 -6
  72. package/dist/src/agent/content-utils.js +0 -14
  73. package/dist/src/agent/content-utils.js.map +1 -1
  74. package/dist/src/agent/content-utils.test.js +1 -18
  75. package/dist/src/agent/content-utils.test.js.map +1 -1
  76. package/dist/src/agent/event-translator.js +8 -3
  77. package/dist/src/agent/event-translator.js.map +1 -1
  78. package/dist/src/agent/event-translator.test.js +14 -9
  79. package/dist/src/agent/event-translator.test.js.map +1 -1
  80. package/dist/src/agent/legacy-agent-session.js +9 -3
  81. package/dist/src/agent/legacy-agent-session.js.map +1 -1
  82. package/dist/src/agent/legacy-agent-session.test.js +4 -3
  83. package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
  84. package/dist/src/agent/tool-display-utils.d.ts +30 -0
  85. package/dist/src/agent/tool-display-utils.js +69 -0
  86. package/dist/src/agent/tool-display-utils.js.map +1 -0
  87. package/dist/src/agent/tool-display-utils.test.js +101 -0
  88. package/dist/src/agent/tool-display-utils.test.js.map +1 -0
  89. package/dist/src/agent/types.d.ts +25 -5
  90. package/dist/src/agents/a2aUtils.js +28 -15
  91. package/dist/src/agents/a2aUtils.js.map +1 -1
  92. package/dist/src/agents/a2aUtils.test.js +43 -0
  93. package/dist/src/agents/a2aUtils.test.js.map +1 -1
  94. package/dist/src/agents/agent-tool.d.ts +31 -0
  95. package/dist/src/agents/agent-tool.js +155 -0
  96. package/dist/src/agents/agent-tool.js.map +1 -0
  97. package/dist/src/agents/agent-tool.test.js +110 -0
  98. package/dist/src/agents/agent-tool.test.js.map +1 -0
  99. package/dist/src/agents/agentLoader.d.ts +79 -4
  100. package/dist/src/agents/agentLoader.js +40 -2
  101. package/dist/src/agents/agentLoader.js.map +1 -1
  102. package/dist/src/agents/agentLoader.test.js +32 -0
  103. package/dist/src/agents/agentLoader.test.js.map +1 -1
  104. package/dist/src/agents/browser/analyzeScreenshot.js +1 -1
  105. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
  106. package/dist/src/agents/browser/analyzeScreenshot.test.js +19 -7
  107. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
  108. package/dist/src/agents/browser/browserAgentInvocation.d.ts +2 -2
  109. package/dist/src/agents/browser/browserAgentInvocation.js +2 -1
  110. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  111. package/dist/src/agents/browser/browserAgentInvocation.test.js +61 -17
  112. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
  113. package/dist/src/agents/browser/mcpToolWrapper.js +1 -1
  114. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
  115. package/dist/src/agents/browser/mcpToolWrapper.test.js +22 -10
  116. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
  117. package/dist/src/agents/codebase-investigator.js +2 -2
  118. package/dist/src/agents/codebase-investigator.js.map +1 -1
  119. package/dist/src/agents/generalist-agent.js +3 -2
  120. package/dist/src/agents/generalist-agent.js.map +1 -1
  121. package/dist/src/agents/generalist-agent.test.js +1 -0
  122. package/dist/src/agents/generalist-agent.test.js.map +1 -1
  123. package/dist/src/agents/local-executor.d.ts +1 -1
  124. package/dist/src/agents/local-executor.js +10 -7
  125. package/dist/src/agents/local-executor.js.map +1 -1
  126. package/dist/src/agents/local-executor.test.js +5 -3
  127. package/dist/src/agents/local-executor.test.js.map +1 -1
  128. package/dist/src/agents/local-invocation.d.ts +2 -2
  129. package/dist/src/agents/local-invocation.js +8 -2
  130. package/dist/src/agents/local-invocation.js.map +1 -1
  131. package/dist/src/agents/local-invocation.test.js +29 -13
  132. package/dist/src/agents/local-invocation.test.js.map +1 -1
  133. package/dist/src/agents/registry.d.ts +2 -0
  134. package/dist/src/agents/registry.js +20 -19
  135. package/dist/src/agents/registry.js.map +1 -1
  136. package/dist/src/agents/registry.test.js +19 -30
  137. package/dist/src/agents/registry.test.js.map +1 -1
  138. package/dist/src/agents/remote-invocation.d.ts +3 -4
  139. package/dist/src/agents/remote-invocation.js +2 -1
  140. package/dist/src/agents/remote-invocation.js.map +1 -1
  141. package/dist/src/agents/remote-invocation.test.js +45 -18
  142. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  143. package/dist/src/agents/skill-extraction-agent.d.ts +3 -2
  144. package/dist/src/agents/skill-extraction-agent.js +99 -56
  145. package/dist/src/agents/skill-extraction-agent.js.map +1 -1
  146. package/dist/src/agents/skill-extraction-agent.test.js +54 -0
  147. package/dist/src/agents/skill-extraction-agent.test.js.map +1 -0
  148. package/dist/src/availability/policyCatalog.js +1 -1
  149. package/dist/src/availability/policyCatalog.js.map +1 -1
  150. package/dist/src/availability/policyCatalog.test.js +1 -1
  151. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  152. package/dist/src/code_assist/oauth2.js +14 -4
  153. package/dist/src/code_assist/oauth2.js.map +1 -1
  154. package/dist/src/commands/memory.d.ts +77 -0
  155. package/dist/src/commands/memory.js +494 -0
  156. package/dist/src/commands/memory.js.map +1 -1
  157. package/dist/src/commands/memory.test.js +720 -1
  158. package/dist/src/commands/memory.test.js.map +1 -1
  159. package/dist/src/config/config-agents-reload.test.js +26 -31
  160. package/dist/src/config/config-agents-reload.test.js.map +1 -1
  161. package/dist/src/config/config.d.ts +24 -10
  162. package/dist/src/config/config.js +148 -82
  163. package/dist/src/config/config.js.map +1 -1
  164. package/dist/src/config/config.test.js +373 -10
  165. package/dist/src/config/config.test.js.map +1 -1
  166. package/dist/src/config/constants.d.ts +1 -0
  167. package/dist/src/config/constants.js +2 -0
  168. package/dist/src/config/constants.js.map +1 -1
  169. package/dist/src/config/defaultModelConfigs.js +7 -7
  170. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  171. package/dist/src/config/memory.js +1 -1
  172. package/dist/src/config/memory.js.map +1 -1
  173. package/dist/src/config/path-validation.test.js +15 -6
  174. package/dist/src/config/path-validation.test.js.map +1 -1
  175. package/dist/src/config/projectRegistry.js +113 -32
  176. package/dist/src/config/projectRegistry.js.map +1 -1
  177. package/dist/src/config/projectRegistry.test.js +51 -0
  178. package/dist/src/config/projectRegistry.test.js.map +1 -1
  179. package/dist/src/config/storage.d.ts +5 -1
  180. package/dist/src/config/storage.js +14 -1
  181. package/dist/src/config/storage.js.map +1 -1
  182. package/dist/src/config/storage.test.js +12 -0
  183. package/dist/src/config/storage.test.js.map +1 -1
  184. package/dist/src/confirmation-bus/message-bus.d.ts +4 -1
  185. package/dist/src/confirmation-bus/message-bus.js +39 -1
  186. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  187. package/dist/src/confirmation-bus/message-bus.test.js +43 -0
  188. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  189. package/dist/src/context/config/configLoader.d.ts +13 -0
  190. package/dist/src/context/config/configLoader.js +65 -0
  191. package/dist/src/context/config/configLoader.js.map +1 -0
  192. package/dist/src/context/config/configLoader.test.d.ts +6 -0
  193. package/dist/src/context/config/configLoader.test.js +79 -0
  194. package/dist/src/context/config/configLoader.test.js.map +1 -0
  195. package/dist/src/context/config/profiles.d.ts +17 -0
  196. package/dist/src/context/config/profiles.js +93 -0
  197. package/dist/src/context/config/profiles.js.map +1 -0
  198. package/dist/src/context/config/registry.d.ts +21 -0
  199. package/dist/src/context/config/registry.js +32 -0
  200. package/dist/src/context/config/registry.js.map +1 -0
  201. package/dist/src/context/config/schema.d.ts +45 -0
  202. package/dist/src/context/config/schema.js +47 -0
  203. package/dist/src/context/config/schema.js.map +1 -0
  204. package/dist/src/context/config/types.d.ts +39 -0
  205. package/dist/src/context/config/types.js +7 -0
  206. package/dist/src/context/config/types.js.map +1 -0
  207. package/dist/src/context/contextManager.barrier.test.d.ts +6 -0
  208. package/dist/src/context/contextManager.barrier.test.js +56 -0
  209. package/dist/src/context/contextManager.barrier.test.js.map +1 -0
  210. package/dist/src/context/contextManager.d.ts +49 -0
  211. package/dist/src/context/contextManager.js +120 -0
  212. package/dist/src/context/contextManager.js.map +1 -0
  213. package/dist/src/context/eventBus.d.ts +28 -0
  214. package/dist/src/context/eventBus.js +27 -0
  215. package/dist/src/context/eventBus.js.map +1 -0
  216. package/dist/src/context/graph/behaviorRegistry.d.ts +28 -0
  217. package/dist/src/context/graph/behaviorRegistry.js +14 -0
  218. package/dist/src/context/graph/behaviorRegistry.js.map +1 -0
  219. package/dist/src/context/graph/builtinBehaviors.d.ts +11 -0
  220. package/dist/src/context/graph/builtinBehaviors.js +145 -0
  221. package/dist/src/context/graph/builtinBehaviors.js.map +1 -0
  222. package/dist/src/context/graph/fromGraph.d.ts +9 -0
  223. package/dist/src/context/graph/fromGraph.js +34 -0
  224. package/dist/src/context/graph/fromGraph.js.map +1 -0
  225. package/dist/src/context/graph/mapper.d.ts +16 -0
  226. package/dist/src/context/graph/mapper.js +16 -0
  227. package/dist/src/context/graph/mapper.js.map +1 -0
  228. package/dist/src/context/graph/render.d.ts +15 -0
  229. package/dist/src/context/graph/render.js +72 -0
  230. package/dist/src/context/graph/render.js.map +1 -0
  231. package/dist/src/context/graph/toGraph.d.ts +10 -0
  232. package/dist/src/context/graph/toGraph.js +172 -0
  233. package/dist/src/context/graph/toGraph.js.map +1 -0
  234. package/dist/src/context/graph/types.d.ts +139 -0
  235. package/dist/src/context/graph/types.js +36 -0
  236. package/dist/src/context/graph/types.js.map +1 -0
  237. package/dist/src/context/historyObserver.d.ts +27 -0
  238. package/dist/src/context/historyObserver.js +64 -0
  239. package/dist/src/context/historyObserver.js.map +1 -0
  240. package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +33 -0
  241. package/dist/src/context/pipeline/contextWorkingBuffer.js +197 -0
  242. package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -0
  243. package/dist/src/context/pipeline/contextWorkingBuffer.test.d.ts +6 -0
  244. package/dist/src/context/pipeline/contextWorkingBuffer.test.js +89 -0
  245. package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -0
  246. package/dist/src/context/pipeline/environment.d.ts +27 -0
  247. package/dist/src/context/pipeline/environment.js +2 -0
  248. package/dist/src/context/pipeline/environment.js.map +1 -0
  249. package/dist/src/context/pipeline/environmentImpl.d.ts +28 -0
  250. package/dist/src/context/pipeline/environmentImpl.js +40 -0
  251. package/dist/src/context/pipeline/environmentImpl.js.map +1 -0
  252. package/dist/src/context/pipeline/environmentImpl.test.d.ts +1 -0
  253. package/dist/src/context/pipeline/environmentImpl.test.js +32 -0
  254. package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -0
  255. package/dist/src/context/pipeline/inbox.d.ts +15 -0
  256. package/dist/src/context/pipeline/inbox.js +52 -0
  257. package/dist/src/context/pipeline/inbox.js.map +1 -0
  258. package/dist/src/context/pipeline/inbox.test.d.ts +1 -0
  259. package/dist/src/context/pipeline/inbox.test.js +36 -0
  260. package/dist/src/context/pipeline/inbox.test.js.map +1 -0
  261. package/dist/src/context/pipeline/orchestrator.d.ts +22 -0
  262. package/dist/src/context/pipeline/orchestrator.js +126 -0
  263. package/dist/src/context/pipeline/orchestrator.js.map +1 -0
  264. package/dist/src/context/pipeline/orchestrator.test.d.ts +6 -0
  265. package/dist/src/context/pipeline/orchestrator.test.js +154 -0
  266. package/dist/src/context/pipeline/orchestrator.test.js.map +1 -0
  267. package/dist/src/context/pipeline.d.ts +52 -0
  268. package/dist/src/context/pipeline.js +7 -0
  269. package/dist/src/context/pipeline.js.map +1 -0
  270. package/dist/src/context/processors/blobDegradationProcessor.d.ts +6 -0
  271. package/dist/src/context/processors/blobDegradationProcessor.js +127 -0
  272. package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -0
  273. package/dist/src/context/processors/blobDegradationProcessor.test.d.ts +6 -0
  274. package/dist/src/context/processors/blobDegradationProcessor.test.js +72 -0
  275. package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -0
  276. package/dist/src/context/processors/historyTruncationProcessor.d.ts +11 -0
  277. package/dist/src/context/processors/historyTruncationProcessor.js +61 -0
  278. package/dist/src/context/processors/historyTruncationProcessor.js.map +1 -0
  279. package/dist/src/context/processors/nodeDistillationProcessor.d.ts +8 -0
  280. package/dist/src/context/processors/nodeDistillationProcessor.js +167 -0
  281. package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -0
  282. package/dist/src/context/processors/nodeDistillationProcessor.test.d.ts +6 -0
  283. package/dist/src/context/processors/nodeDistillationProcessor.test.js +77 -0
  284. package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -0
  285. package/dist/src/context/processors/nodeTruncationProcessor.d.ts +8 -0
  286. package/dist/src/context/processors/nodeTruncationProcessor.js +109 -0
  287. package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -0
  288. package/dist/src/context/processors/nodeTruncationProcessor.test.d.ts +6 -0
  289. package/dist/src/context/processors/nodeTruncationProcessor.test.js +71 -0
  290. package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -0
  291. package/dist/src/context/processors/rollingSummaryProcessor.d.ts +8 -0
  292. package/dist/src/context/processors/rollingSummaryProcessor.js +129 -0
  293. package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -0
  294. package/dist/src/context/processors/rollingSummaryProcessor.test.d.ts +1 -0
  295. package/dist/src/context/processors/rollingSummaryProcessor.test.js +60 -0
  296. package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -0
  297. package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +9 -0
  298. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +75 -0
  299. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -0
  300. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.d.ts +1 -0
  301. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +80 -0
  302. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -0
  303. package/dist/src/context/processors/stateSnapshotProcessor.d.ts +9 -0
  304. package/dist/src/context/processors/stateSnapshotProcessor.js +130 -0
  305. package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -0
  306. package/dist/src/context/processors/stateSnapshotProcessor.test.d.ts +1 -0
  307. package/dist/src/context/processors/stateSnapshotProcessor.test.js +91 -0
  308. package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -0
  309. package/dist/src/context/processors/toolMaskingProcessor.d.ts +8 -0
  310. package/dist/src/context/processors/toolMaskingProcessor.js +194 -0
  311. package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -0
  312. package/dist/src/context/processors/toolMaskingProcessor.test.d.ts +1 -0
  313. package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -0
  314. package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -0
  315. package/dist/src/context/system-tests/lifecycle.golden.test.d.ts +6 -0
  316. package/dist/src/context/system-tests/lifecycle.golden.test.js +195 -0
  317. package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -0
  318. package/dist/src/context/system-tests/simulationHarness.d.ts +41 -0
  319. package/dist/src/context/system-tests/simulationHarness.js +88 -0
  320. package/dist/src/context/system-tests/simulationHarness.js.map +1 -0
  321. package/dist/src/context/testing/contextTestUtils.d.ts +44 -0
  322. package/dist/src/context/testing/contextTestUtils.js +176 -0
  323. package/dist/src/context/testing/contextTestUtils.js.map +1 -0
  324. package/dist/src/context/testing/testProfile.d.ts +7 -0
  325. package/dist/src/context/testing/testProfile.js +20 -0
  326. package/dist/src/context/testing/testProfile.js.map +1 -0
  327. package/dist/src/context/tracer.d.ts +19 -0
  328. package/dist/src/context/tracer.js +79 -0
  329. package/dist/src/context/tracer.js.map +1 -0
  330. package/dist/src/context/tracer.test.d.ts +6 -0
  331. package/dist/src/context/tracer.test.js +71 -0
  332. package/dist/src/context/tracer.test.js.map +1 -0
  333. package/dist/src/context/utils/contextTokenCalculator.d.ts +53 -0
  334. package/dist/src/context/utils/contextTokenCalculator.js +97 -0
  335. package/dist/src/context/utils/contextTokenCalculator.js.map +1 -0
  336. package/dist/src/context/utils/snapshotGenerator.d.ts +12 -0
  337. package/dist/src/context/utils/snapshotGenerator.js +43 -0
  338. package/dist/src/context/utils/snapshotGenerator.js.map +1 -0
  339. package/dist/src/core/agentChatHistory.d.ts +26 -0
  340. package/dist/src/core/agentChatHistory.js +50 -0
  341. package/dist/src/core/agentChatHistory.js.map +1 -0
  342. package/dist/src/core/client.js +3 -1
  343. package/dist/src/core/client.js.map +1 -1
  344. package/dist/src/core/client.test.js +4 -0
  345. package/dist/src/core/client.test.js.map +1 -1
  346. package/dist/src/core/contentGenerator.d.ts +8 -1
  347. package/dist/src/core/contentGenerator.js +46 -4
  348. package/dist/src/core/contentGenerator.js.map +1 -1
  349. package/dist/src/core/contentGenerator.test.js +174 -8
  350. package/dist/src/core/contentGenerator.test.js.map +1 -1
  351. package/dist/src/core/coreToolHookTriggers.d.ts +1 -1
  352. package/dist/src/core/coreToolHookTriggers.js +5 -1
  353. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  354. package/dist/src/core/coreToolHookTriggers.test.js +1 -1
  355. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
  356. package/dist/src/core/geminiChat.d.ts +2 -1
  357. package/dist/src/core/geminiChat.js +7 -2
  358. package/dist/src/core/geminiChat.js.map +1 -1
  359. package/dist/src/core/geminiChat.test.js +19 -6
  360. package/dist/src/core/geminiChat.test.js.map +1 -1
  361. package/dist/src/core/geminiChat_network_retry.test.js +42 -0
  362. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  363. package/dist/src/core/localLiteRtLmClient.js +2 -0
  364. package/dist/src/core/localLiteRtLmClient.js.map +1 -1
  365. package/dist/src/core/localLiteRtLmClient.test.js +7 -0
  366. package/dist/src/core/localLiteRtLmClient.test.js.map +1 -1
  367. package/dist/src/core/loggingContentGenerator.js +19 -6
  368. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  369. package/dist/src/core/loggingContentGenerator.test.js +55 -0
  370. package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
  371. package/dist/src/core/prompts-substitution.test.js +1 -0
  372. package/dist/src/core/prompts-substitution.test.js.map +1 -1
  373. package/dist/src/core/prompts.d.ts +1 -1
  374. package/dist/src/core/prompts.js +2 -2
  375. package/dist/src/core/prompts.js.map +1 -1
  376. package/dist/src/core/prompts.test.js +39 -8
  377. package/dist/src/core/prompts.test.js.map +1 -1
  378. package/dist/src/generated/git-commit.d.ts +2 -2
  379. package/dist/src/generated/git-commit.js +2 -2
  380. package/dist/src/hooks/hookRunner.js +8 -0
  381. package/dist/src/hooks/hookRunner.js.map +1 -1
  382. package/dist/src/hooks/hookRunner.test.js +23 -0
  383. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  384. package/dist/src/ide/ide-client.js +3 -4
  385. package/dist/src/ide/ide-client.js.map +1 -1
  386. package/dist/src/index.d.ts +7 -3
  387. package/dist/src/index.js +7 -2
  388. package/dist/src/index.js.map +1 -1
  389. package/dist/src/mcp/mcpLauncher.js +1 -1
  390. package/dist/src/mcp/mcpLauncher.js.map +1 -1
  391. package/dist/src/mcp/oauth-provider.test.js +24 -17
  392. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  393. package/dist/src/policy/config.d.ts +2 -0
  394. package/dist/src/policy/config.js +67 -12
  395. package/dist/src/policy/config.js.map +1 -1
  396. package/dist/src/policy/core-tools-mapping.test.d.ts +6 -0
  397. package/dist/src/policy/core-tools-mapping.test.js +44 -0
  398. package/dist/src/policy/core-tools-mapping.test.js.map +1 -0
  399. package/dist/src/policy/policies/agents.toml +10 -0
  400. package/dist/src/policy/policies/plan.toml +17 -43
  401. package/dist/src/policy/policies/read-only.toml +24 -38
  402. package/dist/src/policy/policy-engine.d.ts +1 -1
  403. package/dist/src/policy/policy-engine.js +72 -67
  404. package/dist/src/policy/policy-engine.js.map +1 -1
  405. package/dist/src/policy/policy-engine.test.js +71 -4
  406. package/dist/src/policy/policy-engine.test.js.map +1 -1
  407. package/dist/src/policy/sandboxPolicyManager.js +4 -4
  408. package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
  409. package/dist/src/policy/shell-safety-regression.test.d.ts +6 -0
  410. package/dist/src/policy/shell-safety-regression.test.js +86 -0
  411. package/dist/src/policy/shell-safety-regression.test.js.map +1 -0
  412. package/dist/src/policy/shell-safety.test.js +24 -0
  413. package/dist/src/policy/shell-safety.test.js.map +1 -1
  414. package/dist/src/policy/shell-substitution.test.d.ts +6 -0
  415. package/dist/src/policy/shell-substitution.test.js +75 -0
  416. package/dist/src/policy/shell-substitution.test.js.map +1 -0
  417. package/dist/src/policy/toml-loader.test.js +25 -11
  418. package/dist/src/policy/toml-loader.test.js.map +1 -1
  419. package/dist/src/policy/types.d.ts +6 -2
  420. package/dist/src/policy/types.js +4 -2
  421. package/dist/src/policy/types.js.map +1 -1
  422. package/dist/src/prompts/promptProvider.d.ts +1 -1
  423. package/dist/src/prompts/promptProvider.js +41 -24
  424. package/dist/src/prompts/promptProvider.js.map +1 -1
  425. package/dist/src/prompts/promptProvider.test.js +36 -2
  426. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  427. package/dist/src/prompts/snippets-memory-v2.test.d.ts +6 -0
  428. package/dist/src/prompts/snippets-memory-v2.test.js +94 -0
  429. package/dist/src/prompts/snippets-memory-v2.test.js.map +1 -0
  430. package/dist/src/prompts/snippets.d.ts +19 -1
  431. package/dist/src/prompts/snippets.js +33 -6
  432. package/dist/src/prompts/snippets.js.map +1 -1
  433. package/dist/src/prompts/snippets.legacy.d.ts +6 -1
  434. package/dist/src/prompts/snippets.legacy.js +14 -7
  435. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  436. package/dist/src/prompts/utils.test.js +1 -0
  437. package/dist/src/prompts/utils.test.js.map +1 -1
  438. package/dist/src/routing/modelRouterService.js +1 -1
  439. package/dist/src/routing/modelRouterService.js.map +1 -1
  440. package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +2 -0
  441. package/dist/src/sandbox/linux/LinuxSandboxManager.js +43 -19
  442. package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
  443. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +16 -0
  444. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
  445. package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +3 -7
  446. package/dist/src/sandbox/linux/bwrapArgsBuilder.js +96 -105
  447. package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -1
  448. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +144 -41
  449. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -1
  450. package/dist/src/sandbox/macos/MacOsSandboxManager.js +19 -10
  451. package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
  452. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +24 -37
  453. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
  454. package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +3 -9
  455. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +129 -96
  456. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
  457. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +78 -77
  458. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
  459. package/dist/src/sandbox/utils/fsUtils.d.ts +2 -3
  460. package/dist/src/sandbox/utils/fsUtils.js +12 -27
  461. package/dist/src/sandbox/utils/fsUtils.js.map +1 -1
  462. package/dist/src/sandbox/utils/fsUtils.test.js +87 -29
  463. package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -1
  464. package/dist/src/sandbox/windows/GeminiSandbox.cs +186 -77
  465. package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +4 -16
  466. package/dist/src/sandbox/windows/WindowsSandboxManager.js +138 -204
  467. package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
  468. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +105 -122
  469. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
  470. package/dist/src/scheduler/policy.js +1 -2
  471. package/dist/src/scheduler/policy.js.map +1 -1
  472. package/dist/src/scheduler/policy.test.js +58 -2
  473. package/dist/src/scheduler/policy.test.js.map +1 -1
  474. package/dist/src/scheduler/scheduler.d.ts +2 -1
  475. package/dist/src/scheduler/scheduler.js +13 -14
  476. package/dist/src/scheduler/scheduler.js.map +1 -1
  477. package/dist/src/scheduler/scheduler.test.js +66 -0
  478. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  479. package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
  480. package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
  481. package/dist/src/scheduler/scheduler_parallel.test.js +2 -0
  482. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
  483. package/dist/src/scheduler/tool-executor.js +2 -0
  484. package/dist/src/scheduler/tool-executor.js.map +1 -1
  485. package/dist/src/services/chatRecordingService.d.ts +12 -153
  486. package/dist/src/services/chatRecordingService.js +444 -350
  487. package/dist/src/services/chatRecordingService.js.map +1 -1
  488. package/dist/src/services/chatRecordingService.test.js +174 -128
  489. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  490. package/dist/src/services/chatRecordingTypes.d.ts +111 -0
  491. package/dist/src/services/chatRecordingTypes.js +10 -0
  492. package/dist/src/services/chatRecordingTypes.js.map +1 -0
  493. package/dist/src/services/gitService.d.ts +2 -0
  494. package/dist/src/services/gitService.js +10 -1
  495. package/dist/src/services/gitService.js.map +1 -1
  496. package/dist/src/services/gitService.test.js +6 -2
  497. package/dist/src/services/gitService.test.js.map +1 -1
  498. package/dist/src/services/keychainService.d.ts +2 -2
  499. package/dist/src/services/keychainService.js +9 -9
  500. package/dist/src/services/keychainService.js.map +1 -1
  501. package/dist/src/services/keychainService.test.js +7 -7
  502. package/dist/src/services/keychainService.test.js.map +1 -1
  503. package/dist/src/services/keychainTypes.d.ts +1 -1
  504. package/dist/src/services/memoryPatchUtils.d.ts +42 -0
  505. package/dist/src/services/memoryPatchUtils.js +216 -0
  506. package/dist/src/services/memoryPatchUtils.js.map +1 -0
  507. package/dist/src/services/memoryService.d.ts +21 -1
  508. package/dist/src/services/memoryService.js +405 -64
  509. package/dist/src/services/memoryService.js.map +1 -1
  510. package/dist/src/services/memoryService.test.js +686 -2
  511. package/dist/src/services/memoryService.test.js.map +1 -1
  512. package/dist/src/services/sandboxManager.d.ts +33 -19
  513. package/dist/src/services/sandboxManager.integration.test.js +728 -266
  514. package/dist/src/services/sandboxManager.integration.test.js.map +1 -1
  515. package/dist/src/services/sandboxManager.js +65 -62
  516. package/dist/src/services/sandboxManager.js.map +1 -1
  517. package/dist/src/services/sandboxManager.test.js +17 -114
  518. package/dist/src/services/sandboxManager.test.js.map +1 -1
  519. package/dist/src/services/sandboxedFileSystemService.js +72 -62
  520. package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
  521. package/dist/src/services/sessionSummaryUtils.d.ts +1 -1
  522. package/dist/src/services/sessionSummaryUtils.js +111 -38
  523. package/dist/src/services/sessionSummaryUtils.js.map +1 -1
  524. package/dist/src/services/sessionSummaryUtils.test.js +204 -51
  525. package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
  526. package/dist/src/services/shellExecutionService.d.ts +19 -0
  527. package/dist/src/services/shellExecutionService.js +88 -34
  528. package/dist/src/services/shellExecutionService.js.map +1 -1
  529. package/dist/src/services/shellExecutionService.test.js +38 -4
  530. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  531. package/dist/src/telemetry/activity-monitor.js +1 -0
  532. package/dist/src/telemetry/activity-monitor.js.map +1 -1
  533. package/dist/src/telemetry/config.js +3 -0
  534. package/dist/src/telemetry/config.js.map +1 -1
  535. package/dist/src/telemetry/conseca-logger.js +18 -20
  536. package/dist/src/telemetry/conseca-logger.js.map +1 -1
  537. package/dist/src/telemetry/conseca-logger.test.js +100 -0
  538. package/dist/src/telemetry/conseca-logger.test.js.map +1 -1
  539. package/dist/src/telemetry/event-loop-monitor.d.ts +17 -0
  540. package/dist/src/telemetry/event-loop-monitor.js +76 -0
  541. package/dist/src/telemetry/event-loop-monitor.js.map +1 -0
  542. package/dist/src/telemetry/index.d.ts +2 -1
  543. package/dist/src/telemetry/index.js +2 -1
  544. package/dist/src/telemetry/index.js.map +1 -1
  545. package/dist/src/telemetry/llmRole.d.ts +2 -1
  546. package/dist/src/telemetry/llmRole.js +1 -0
  547. package/dist/src/telemetry/llmRole.js.map +1 -1
  548. package/dist/src/telemetry/loggers.test.js +184 -8
  549. package/dist/src/telemetry/loggers.test.js.map +1 -1
  550. package/dist/src/telemetry/memory-monitor.d.ts +1 -0
  551. package/dist/src/telemetry/memory-monitor.js +8 -1
  552. package/dist/src/telemetry/memory-monitor.js.map +1 -1
  553. package/dist/src/telemetry/memory-monitor.test.js +6 -1
  554. package/dist/src/telemetry/memory-monitor.test.js.map +1 -1
  555. package/dist/src/telemetry/metrics.d.ts +12 -0
  556. package/dist/src/telemetry/metrics.js +19 -0
  557. package/dist/src/telemetry/metrics.js.map +1 -1
  558. package/dist/src/telemetry/sdk.js +20 -1
  559. package/dist/src/telemetry/sdk.js.map +1 -1
  560. package/dist/src/telemetry/trace.d.ts +23 -6
  561. package/dist/src/telemetry/trace.js +71 -22
  562. package/dist/src/telemetry/trace.js.map +1 -1
  563. package/dist/src/telemetry/trace.test.js +79 -15
  564. package/dist/src/telemetry/trace.test.js.map +1 -1
  565. package/dist/src/telemetry/types.js +61 -15
  566. package/dist/src/telemetry/types.js.map +1 -1
  567. package/dist/src/test-utils/mock-tool.d.ts +3 -2
  568. package/dist/src/test-utils/mock-tool.js +4 -3
  569. package/dist/src/test-utils/mock-tool.js.map +1 -1
  570. package/dist/src/tools/activate-skill.js +1 -1
  571. package/dist/src/tools/activate-skill.js.map +1 -1
  572. package/dist/src/tools/activate-skill.test.js +6 -2
  573. package/dist/src/tools/activate-skill.test.js.map +1 -1
  574. package/dist/src/tools/ask-user.d.ts +2 -2
  575. package/dist/src/tools/ask-user.js +1 -1
  576. package/dist/src/tools/ask-user.js.map +1 -1
  577. package/dist/src/tools/ask-user.test.js +9 -3
  578. package/dist/src/tools/ask-user.test.js.map +1 -1
  579. package/dist/src/tools/complete-task.d.ts +2 -2
  580. package/dist/src/tools/complete-task.js +1 -1
  581. package/dist/src/tools/complete-task.js.map +1 -1
  582. package/dist/src/tools/complete-task.test.js +9 -3
  583. package/dist/src/tools/complete-task.test.js.map +1 -1
  584. package/dist/src/tools/definitions/base-declarations.d.ts +2 -0
  585. package/dist/src/tools/definitions/base-declarations.js +3 -0
  586. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  587. package/dist/src/tools/definitions/coreTools.d.ts +3 -1
  588. package/dist/src/tools/definitions/coreTools.js +13 -1
  589. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  590. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +29 -1
  591. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  592. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +29 -1
  593. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  594. package/dist/src/tools/definitions/types.d.ts +2 -0
  595. package/dist/src/tools/edit.js +20 -4
  596. package/dist/src/tools/edit.js.map +1 -1
  597. package/dist/src/tools/edit.test.js +41 -18
  598. package/dist/src/tools/edit.test.js.map +1 -1
  599. package/dist/src/tools/enter-plan-mode.d.ts +2 -2
  600. package/dist/src/tools/enter-plan-mode.js +1 -1
  601. package/dist/src/tools/enter-plan-mode.js.map +1 -1
  602. package/dist/src/tools/enter-plan-mode.test.js +10 -4
  603. package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
  604. package/dist/src/tools/exit-plan-mode.d.ts +2 -2
  605. package/dist/src/tools/exit-plan-mode.js +9 -12
  606. package/dist/src/tools/exit-plan-mode.js.map +1 -1
  607. package/dist/src/tools/exit-plan-mode.test.js +44 -17
  608. package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
  609. package/dist/src/tools/get-internal-docs.js +6 -3
  610. package/dist/src/tools/get-internal-docs.js.map +1 -1
  611. package/dist/src/tools/get-internal-docs.test.js +4 -4
  612. package/dist/src/tools/get-internal-docs.test.js.map +1 -1
  613. package/dist/src/tools/glob.js +1 -1
  614. package/dist/src/tools/glob.js.map +1 -1
  615. package/dist/src/tools/glob.test.js +16 -16
  616. package/dist/src/tools/glob.test.js.map +1 -1
  617. package/dist/src/tools/grep.js +21 -12
  618. package/dist/src/tools/grep.js.map +1 -1
  619. package/dist/src/tools/grep.test.js +18 -18
  620. package/dist/src/tools/grep.test.js.map +1 -1
  621. package/dist/src/tools/line-endings.test.js +3 -3
  622. package/dist/src/tools/line-endings.test.js.map +1 -1
  623. package/dist/src/tools/list-mcp-resources.d.ts +24 -0
  624. package/dist/src/tools/list-mcp-resources.js +74 -0
  625. package/dist/src/tools/list-mcp-resources.js.map +1 -0
  626. package/dist/src/tools/list-mcp-resources.test.d.ts +6 -0
  627. package/dist/src/tools/list-mcp-resources.test.js +79 -0
  628. package/dist/src/tools/list-mcp-resources.test.js.map +1 -0
  629. package/dist/src/tools/ls.js +2 -2
  630. package/dist/src/tools/ls.js.map +1 -1
  631. package/dist/src/tools/ls.test.js +21 -21
  632. package/dist/src/tools/ls.test.js.map +1 -1
  633. package/dist/src/tools/mcp-client-manager.d.ts +3 -1
  634. package/dist/src/tools/mcp-client-manager.js +24 -1
  635. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  636. package/dist/src/tools/mcp-client-manager.test.js +43 -0
  637. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  638. package/dist/src/tools/mcp-client.js +10 -12
  639. package/dist/src/tools/mcp-client.js.map +1 -1
  640. package/dist/src/tools/mcp-client.test.js +14 -2
  641. package/dist/src/tools/mcp-client.test.js.map +1 -1
  642. package/dist/src/tools/mcp-tool.d.ts +2 -2
  643. package/dist/src/tools/mcp-tool.js +1 -1
  644. package/dist/src/tools/mcp-tool.js.map +1 -1
  645. package/dist/src/tools/mcp-tool.test.js +51 -21
  646. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  647. package/dist/src/tools/memoryTool.d.ts +4 -3
  648. package/dist/src/tools/memoryTool.js +43 -14
  649. package/dist/src/tools/memoryTool.js.map +1 -1
  650. package/dist/src/tools/memoryTool.test.js +29 -9
  651. package/dist/src/tools/memoryTool.test.js.map +1 -1
  652. package/dist/src/tools/read-file.js +1 -1
  653. package/dist/src/tools/read-file.js.map +1 -1
  654. package/dist/src/tools/read-file.test.js +17 -17
  655. package/dist/src/tools/read-file.test.js.map +1 -1
  656. package/dist/src/tools/read-many-files.js +4 -4
  657. package/dist/src/tools/read-many-files.js.map +1 -1
  658. package/dist/src/tools/read-many-files.test.js +70 -24
  659. package/dist/src/tools/read-many-files.test.js.map +1 -1
  660. package/dist/src/tools/read-mcp-resource.d.ts +25 -0
  661. package/dist/src/tools/read-mcp-resource.js +120 -0
  662. package/dist/src/tools/read-mcp-resource.js.map +1 -0
  663. package/dist/src/tools/read-mcp-resource.test.d.ts +6 -0
  664. package/dist/src/tools/read-mcp-resource.test.js +110 -0
  665. package/dist/src/tools/read-mcp-resource.test.js.map +1 -0
  666. package/dist/src/tools/ripGrep.d.ts +3 -2
  667. package/dist/src/tools/ripGrep.js +26 -55
  668. package/dist/src/tools/ripGrep.js.map +1 -1
  669. package/dist/src/tools/ripGrep.test.js +113 -167
  670. package/dist/src/tools/ripGrep.test.js.map +1 -1
  671. package/dist/src/tools/shell.d.ts +2 -2
  672. package/dist/src/tools/shell.js +51 -21
  673. package/dist/src/tools/shell.js.map +1 -1
  674. package/dist/src/tools/shell.test.js +479 -76
  675. package/dist/src/tools/shell.test.js.map +1 -1
  676. package/dist/src/tools/shellBackgroundTools.d.ts +3 -3
  677. package/dist/src/tools/shellBackgroundTools.integration.test.js +6 -2
  678. package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -1
  679. package/dist/src/tools/shellBackgroundTools.js +2 -2
  680. package/dist/src/tools/shellBackgroundTools.js.map +1 -1
  681. package/dist/src/tools/shellBackgroundTools.test.js +30 -10
  682. package/dist/src/tools/shellBackgroundTools.test.js.map +1 -1
  683. package/dist/src/tools/tool-error.d.ts +1 -0
  684. package/dist/src/tools/tool-error.js +1 -0
  685. package/dist/src/tools/tool-error.js.map +1 -1
  686. package/dist/src/tools/tool-names.d.ts +5 -4
  687. package/dist/src/tools/tool-names.js +8 -2
  688. package/dist/src/tools/tool-names.js.map +1 -1
  689. package/dist/src/tools/tool-registry.js +137 -114
  690. package/dist/src/tools/tool-registry.js.map +1 -1
  691. package/dist/src/tools/tool-registry.test.js +3 -1
  692. package/dist/src/tools/tool-registry.test.js.map +1 -1
  693. package/dist/src/tools/tools.d.ts +6 -6
  694. package/dist/src/tools/tools.js +6 -2
  695. package/dist/src/tools/tools.js.map +1 -1
  696. package/dist/src/tools/topicTool.d.ts +2 -2
  697. package/dist/src/tools/topicTool.js +1 -1
  698. package/dist/src/tools/topicTool.js.map +1 -1
  699. package/dist/src/tools/topicTool.test.js +6 -2
  700. package/dist/src/tools/topicTool.test.js.map +1 -1
  701. package/dist/src/tools/trackerTools.d.ts +7 -7
  702. package/dist/src/tools/trackerTools.js +6 -6
  703. package/dist/src/tools/trackerTools.js.map +1 -1
  704. package/dist/src/tools/web-fetch.js +1 -1
  705. package/dist/src/tools/web-fetch.js.map +1 -1
  706. package/dist/src/tools/web-fetch.test.js +59 -23
  707. package/dist/src/tools/web-fetch.test.js.map +1 -1
  708. package/dist/src/tools/web-search.js +1 -1
  709. package/dist/src/tools/web-search.js.map +1 -1
  710. package/dist/src/tools/web-search.test.js +5 -5
  711. package/dist/src/tools/web-search.test.js.map +1 -1
  712. package/dist/src/tools/write-file.js +22 -4
  713. package/dist/src/tools/write-file.js.map +1 -1
  714. package/dist/src/tools/write-file.test.js +29 -11
  715. package/dist/src/tools/write-file.test.js.map +1 -1
  716. package/dist/src/tools/write-todos.js +1 -1
  717. package/dist/src/tools/write-todos.js.map +1 -1
  718. package/dist/src/utils/compatibility.js +6 -1
  719. package/dist/src/utils/compatibility.js.map +1 -1
  720. package/dist/src/utils/compatibility.test.js +23 -0
  721. package/dist/src/utils/compatibility.test.js.map +1 -1
  722. package/dist/src/utils/errors.d.ts +3 -0
  723. package/dist/src/utils/errors.js +6 -0
  724. package/dist/src/utils/errors.js.map +1 -1
  725. package/dist/src/utils/fileUtils.d.ts +1 -2
  726. package/dist/src/utils/fileUtils.js +80 -40
  727. package/dist/src/utils/fileUtils.js.map +1 -1
  728. package/dist/src/utils/fileUtils.test.js +61 -0
  729. package/dist/src/utils/fileUtils.test.js.map +1 -1
  730. package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
  731. package/dist/src/utils/filesearch/fileSearch.js +97 -6
  732. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  733. package/dist/src/utils/filesearch/fileSearch.test.js +54 -0
  734. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  735. package/dist/src/utils/filesearch/fileWatcher.d.ts +25 -0
  736. package/dist/src/utils/filesearch/fileWatcher.js +86 -0
  737. package/dist/src/utils/filesearch/fileWatcher.js.map +1 -0
  738. package/dist/src/utils/filesearch/fileWatcher.test.js +142 -0
  739. package/dist/src/utils/filesearch/fileWatcher.test.js.map +1 -0
  740. package/dist/src/utils/getFolderStructure.js +4 -2
  741. package/dist/src/utils/getFolderStructure.js.map +1 -1
  742. package/dist/src/utils/gitIgnoreParser.js +1 -1
  743. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  744. package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
  745. package/dist/src/utils/googleQuotaErrors.js +30 -35
  746. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  747. package/dist/src/utils/googleQuotaErrors.test.js +24 -0
  748. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  749. package/dist/src/utils/ignoreFileParser.js +1 -1
  750. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  751. package/dist/src/utils/memoryDiscovery.js +15 -5
  752. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  753. package/dist/src/utils/oauth-flow.js +17 -5
  754. package/dist/src/utils/oauth-flow.js.map +1 -1
  755. package/dist/src/utils/oauth-flow.test.js +20 -0
  756. package/dist/src/utils/oauth-flow.test.js.map +1 -1
  757. package/dist/src/utils/paths.d.ts +9 -0
  758. package/dist/src/utils/paths.js +37 -0
  759. package/dist/src/utils/paths.js.map +1 -1
  760. package/dist/src/utils/paths.test.js +45 -1
  761. package/dist/src/utils/paths.test.js.map +1 -1
  762. package/dist/src/utils/planUtils.d.ts +11 -2
  763. package/dist/src/utils/planUtils.js +43 -11
  764. package/dist/src/utils/planUtils.js.map +1 -1
  765. package/dist/src/utils/planUtils.test.js +10 -9
  766. package/dist/src/utils/planUtils.test.js.map +1 -1
  767. package/dist/src/utils/process-utils.d.ts +2 -1
  768. package/dist/src/utils/process-utils.js +64 -33
  769. package/dist/src/utils/process-utils.js.map +1 -1
  770. package/dist/src/utils/process-utils.test.js +9 -0
  771. package/dist/src/utils/process-utils.test.js.map +1 -1
  772. package/dist/src/utils/retry.js +18 -6
  773. package/dist/src/utils/retry.js.map +1 -1
  774. package/dist/src/utils/retry.test.js +30 -0
  775. package/dist/src/utils/retry.test.js.map +1 -1
  776. package/dist/src/utils/sessionOperations.js +3 -2
  777. package/dist/src/utils/sessionOperations.js.map +1 -1
  778. package/dist/src/utils/shell-utils.d.ts +2 -0
  779. package/dist/src/utils/shell-utils.js +237 -107
  780. package/dist/src/utils/shell-utils.js.map +1 -1
  781. package/dist/src/utils/tool-utils.d.ts +1 -29
  782. package/dist/src/utils/tool-utils.js +0 -39
  783. package/dist/src/utils/tool-utils.js.map +1 -1
  784. package/dist/src/utils/tool-utils.test.js +2 -76
  785. package/dist/src/utils/tool-utils.test.js.map +1 -1
  786. package/dist/src/utils/tool-visibility.d.ts +40 -0
  787. package/dist/src/utils/tool-visibility.js +111 -0
  788. package/dist/src/utils/tool-visibility.js.map +1 -0
  789. package/dist/src/utils/tool-visibility.test.d.ts +6 -0
  790. package/dist/src/utils/tool-visibility.test.js +96 -0
  791. package/dist/src/utils/tool-visibility.test.js.map +1 -0
  792. package/dist/src/utils/trust.d.ts +64 -0
  793. package/dist/src/utils/trust.js +276 -0
  794. package/dist/src/utils/trust.js.map +1 -0
  795. package/dist/src/utils/trust.test.d.ts +6 -0
  796. package/dist/src/utils/trust.test.js +159 -0
  797. package/dist/src/utils/trust.test.js.map +1 -0
  798. package/dist/tsconfig.tsbuildinfo +1 -1
  799. package/package.json +5 -4
  800. package/dist/docs/get-started/installation.md +0 -181
  801. package/dist/src/agents/memory-manager-agent.d.ts +0 -25
  802. package/dist/src/agents/memory-manager-agent.js +0 -138
  803. package/dist/src/agents/memory-manager-agent.js.map +0 -1
  804. package/dist/src/agents/memory-manager-agent.test.js +0 -123
  805. package/dist/src/agents/memory-manager-agent.test.js.map +0 -1
  806. package/dist/src/agents/subagent-tool-wrapper.d.ts +0 -38
  807. package/dist/src/agents/subagent-tool-wrapper.js +0 -58
  808. package/dist/src/agents/subagent-tool-wrapper.js.map +0 -1
  809. package/dist/src/agents/subagent-tool-wrapper.test.js +0 -123
  810. package/dist/src/agents/subagent-tool-wrapper.test.js.map +0 -1
  811. package/dist/src/agents/subagent-tool.d.ts +0 -18
  812. package/dist/src/agents/subagent-tool.js +0 -134
  813. package/dist/src/agents/subagent-tool.js.map +0 -1
  814. package/dist/src/agents/subagent-tool.test.js +0 -287
  815. package/dist/src/agents/subagent-tool.test.js.map +0 -1
  816. package/dist/src/policy/policies/tracker.toml +0 -34
  817. package/dist/src/prompts/snippets-memory-manager.test.js +0 -31
  818. package/dist/src/prompts/snippets-memory-manager.test.js.map +0 -1
  819. /package/dist/src/{agents/memory-manager-agent.test.d.ts → agent/tool-display-utils.test.d.ts} +0 -0
  820. /package/dist/src/agents/{subagent-tool.test.d.ts → agent-tool.test.d.ts} +0 -0
  821. /package/dist/src/{prompts/snippets-memory-manager.test.d.ts → agents/skill-extraction-agent.test.d.ts} +0 -0
  822. /package/dist/src/{agents/subagent-tool-wrapper.test.d.ts → utils/filesearch/fileWatcher.test.d.ts} +0 -0
@@ -3,145 +3,58 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { describe, it, expect, beforeEach, afterEach, afterAll, vi, } from 'vitest';
7
- import { canUseRipgrep, RipGrepTool, ensureRgPath, } from './ripGrep.js';
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
+ import { canUseRipgrep, RipGrepTool, ensureRgPath, getRipgrepPath, } from './ripGrep.js';
8
8
  import path from 'node:path';
9
9
  import { isSubpath } from '../utils/paths.js';
10
10
  import fs from 'node:fs/promises';
11
11
  import os from 'node:os';
12
- import { Storage } from '../config/storage.js';
13
12
  import { GEMINI_IGNORE_FILE_NAME } from '../config/constants.js';
14
13
  import { createMockWorkspaceContext } from '../test-utils/mockWorkspaceContext.js';
15
14
  import { spawn } from 'node:child_process';
16
15
  import { PassThrough, Readable } from 'node:stream';
17
16
  import EventEmitter from 'node:events';
18
- import { downloadRipGrep } from '@joshua.litt/get-ripgrep';
19
17
  import { createMockMessageBus } from '../test-utils/mock-message-bus.js';
20
- // Mock dependencies for canUseRipgrep
21
- vi.mock('@joshua.litt/get-ripgrep', () => ({
22
- downloadRipGrep: vi.fn(),
23
- }));
18
+ import { fileExists } from '../utils/fileUtils.js';
19
+ vi.mock('../utils/fileUtils.js', async (importOriginal) => {
20
+ const actual = await importOriginal();
21
+ return {
22
+ ...actual,
23
+ fileExists: vi.fn(),
24
+ };
25
+ });
24
26
  // Mock child_process for ripgrep calls
25
27
  vi.mock('child_process', () => ({
26
28
  spawn: vi.fn(),
27
29
  }));
28
30
  const mockSpawn = vi.mocked(spawn);
29
- const downloadRipGrepMock = vi.mocked(downloadRipGrep);
30
- const originalGetGlobalBinDir = Storage.getGlobalBinDir.bind(Storage);
31
- const storageSpy = vi.spyOn(Storage, 'getGlobalBinDir');
32
- function getRipgrepBinaryName() {
33
- return process.platform === 'win32' ? 'rg.exe' : 'rg';
34
- }
35
31
  describe('canUseRipgrep', () => {
36
- let tempRootDir;
37
- let binDir;
38
- beforeEach(async () => {
39
- downloadRipGrepMock.mockReset();
40
- downloadRipGrepMock.mockResolvedValue(undefined);
41
- tempRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ripgrep-bin-'));
42
- binDir = path.join(tempRootDir, 'bin');
43
- await fs.mkdir(binDir, { recursive: true });
44
- storageSpy.mockImplementation(() => binDir);
45
- });
46
- afterEach(async () => {
47
- storageSpy.mockImplementation(() => originalGetGlobalBinDir());
48
- await fs.rm(tempRootDir, { recursive: true, force: true });
32
+ beforeEach(() => {
33
+ vi.mocked(fileExists).mockReset();
49
34
  });
50
35
  it('should return true if ripgrep already exists', async () => {
51
- const existingPath = path.join(binDir, getRipgrepBinaryName());
52
- await fs.writeFile(existingPath, '');
36
+ vi.mocked(fileExists).mockResolvedValue(true);
53
37
  const result = await canUseRipgrep();
54
38
  expect(result).toBe(true);
55
- expect(downloadRipGrepMock).not.toHaveBeenCalled();
56
39
  });
57
- it('should download ripgrep and return true if it does not exist initially', async () => {
58
- const expectedPath = path.join(binDir, getRipgrepBinaryName());
59
- downloadRipGrepMock.mockImplementation(async () => {
60
- await fs.writeFile(expectedPath, '');
61
- });
62
- const result = await canUseRipgrep();
63
- expect(result).toBe(true);
64
- expect(downloadRipGrep).toHaveBeenCalledWith(binDir);
65
- await expect(fs.access(expectedPath)).resolves.toBeUndefined();
66
- });
67
- it('should return false if download fails and file does not exist', async () => {
40
+ it('should return false if file does not exist', async () => {
41
+ vi.mocked(fileExists).mockResolvedValue(false);
68
42
  const result = await canUseRipgrep();
69
43
  expect(result).toBe(false);
70
- expect(downloadRipGrep).toHaveBeenCalledWith(binDir);
71
- });
72
- it('should propagate errors from downloadRipGrep', async () => {
73
- const error = new Error('Download failed');
74
- downloadRipGrepMock.mockRejectedValue(error);
75
- await expect(canUseRipgrep()).rejects.toThrow(error);
76
- expect(downloadRipGrep).toHaveBeenCalledWith(binDir);
77
- });
78
- it('should only download once when called concurrently', async () => {
79
- const expectedPath = path.join(binDir, getRipgrepBinaryName());
80
- downloadRipGrepMock.mockImplementation(() => new Promise((resolve, reject) => {
81
- setTimeout(() => {
82
- fs.writeFile(expectedPath, '')
83
- .then(() => resolve())
84
- .catch(reject);
85
- }, 0);
86
- }));
87
- const firstCall = ensureRgPath();
88
- const secondCall = ensureRgPath();
89
- const [pathOne, pathTwo] = await Promise.all([firstCall, secondCall]);
90
- expect(pathOne).toBe(expectedPath);
91
- expect(pathTwo).toBe(expectedPath);
92
- expect(downloadRipGrepMock).toHaveBeenCalledTimes(1);
93
- await expect(fs.access(expectedPath)).resolves.toBeUndefined();
94
44
  });
95
45
  });
96
46
  describe('ensureRgPath', () => {
97
- let tempRootDir;
98
- let binDir;
99
- beforeEach(async () => {
100
- downloadRipGrepMock.mockReset();
101
- downloadRipGrepMock.mockResolvedValue(undefined);
102
- tempRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ripgrep-bin-'));
103
- binDir = path.join(tempRootDir, 'bin');
104
- await fs.mkdir(binDir, { recursive: true });
105
- storageSpy.mockImplementation(() => binDir);
106
- });
107
- afterEach(async () => {
108
- storageSpy.mockImplementation(() => originalGetGlobalBinDir());
109
- await fs.rm(tempRootDir, { recursive: true, force: true });
47
+ beforeEach(() => {
48
+ vi.mocked(fileExists).mockReset();
110
49
  });
111
50
  it('should return rg path if ripgrep already exists', async () => {
112
- const existingPath = path.join(binDir, getRipgrepBinaryName());
113
- await fs.writeFile(existingPath, '');
51
+ vi.mocked(fileExists).mockResolvedValue(true);
114
52
  const rgPath = await ensureRgPath();
115
- expect(rgPath).toBe(existingPath);
116
- expect(downloadRipGrep).not.toHaveBeenCalled();
117
- });
118
- it('should return rg path if ripgrep is downloaded successfully', async () => {
119
- const expectedPath = path.join(binDir, getRipgrepBinaryName());
120
- downloadRipGrepMock.mockImplementation(async () => {
121
- await fs.writeFile(expectedPath, '');
122
- });
123
- const rgPath = await ensureRgPath();
124
- expect(rgPath).toBe(expectedPath);
125
- expect(downloadRipGrep).toHaveBeenCalledTimes(1);
126
- await expect(fs.access(expectedPath)).resolves.toBeUndefined();
127
- });
128
- it('should throw an error if ripgrep cannot be used after download attempt', async () => {
129
- await expect(ensureRgPath()).rejects.toThrow('Cannot use ripgrep.');
130
- expect(downloadRipGrep).toHaveBeenCalledTimes(1);
53
+ expect(rgPath).toBe(await getRipgrepPath());
131
54
  });
132
- it('should propagate errors from downloadRipGrep', async () => {
133
- const error = new Error('Download failed');
134
- downloadRipGrepMock.mockRejectedValue(error);
135
- await expect(ensureRgPath()).rejects.toThrow(error);
136
- expect(downloadRipGrep).toHaveBeenCalledWith(binDir);
137
- });
138
- it.runIf(process.platform === 'win32')('should detect ripgrep when only rg.exe exists on Windows', async () => {
139
- const expectedRgExePath = path.join(binDir, 'rg.exe');
140
- await fs.writeFile(expectedRgExePath, '');
141
- const rgPath = await ensureRgPath();
142
- expect(rgPath).toBe(expectedRgExePath);
143
- expect(downloadRipGrep).not.toHaveBeenCalled();
144
- await expect(fs.access(expectedRgExePath)).resolves.toBeUndefined();
55
+ it('should throw an error if ripgrep cannot be used', async () => {
56
+ vi.mocked(fileExists).mockResolvedValue(false);
57
+ await expect(ensureRgPath()).rejects.toThrow(/Cannot find bundled ripgrep binary/);
145
58
  });
146
59
  });
147
60
  // Helper function to create mock spawn implementations
@@ -179,9 +92,6 @@ function createMockSpawn(options = {}) {
179
92
  }
180
93
  describe('RipGrepTool', () => {
181
94
  let tempRootDir;
182
- let tempBinRoot;
183
- let binDir;
184
- let ripgrepBinaryPath;
185
95
  let grepTool;
186
96
  const abortSignal = new AbortController().signal;
187
97
  let mockConfig = {
@@ -196,18 +106,10 @@ describe('RipGrepTool', () => {
196
106
  }),
197
107
  };
198
108
  beforeEach(async () => {
199
- downloadRipGrepMock.mockReset();
200
- downloadRipGrepMock.mockResolvedValue(undefined);
201
109
  mockSpawn.mockReset();
202
110
  mockSpawn.mockImplementation(createMockSpawn());
203
- tempBinRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'ripgrep-bin-'));
204
- binDir = path.join(tempBinRoot, 'bin');
205
- await fs.mkdir(binDir, { recursive: true });
206
- const binaryName = process.platform === 'win32' ? 'rg.exe' : 'rg';
207
- ripgrepBinaryPath = path.join(binDir, binaryName);
208
- await fs.writeFile(ripgrepBinaryPath, '');
209
- storageSpy.mockImplementation(() => binDir);
210
111
  tempRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'grep-tool-root-'));
112
+ vi.mocked(fileExists).mockResolvedValue(true);
211
113
  mockConfig = {
212
114
  getTargetDir: () => tempRootDir,
213
115
  getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir),
@@ -247,9 +149,7 @@ describe('RipGrepTool', () => {
247
149
  await fs.writeFile(path.join(tempRootDir, 'sub', 'fileD.md'), '# Markdown file\nThis is a test.');
248
150
  });
249
151
  afterEach(async () => {
250
- storageSpy.mockImplementation(() => originalGetGlobalBinDir());
251
152
  await fs.rm(tempRootDir, { recursive: true, force: true });
252
- await fs.rm(tempBinRoot, { recursive: true, force: true });
253
153
  });
254
154
  describe('validateToolParams', () => {
255
155
  it.each([
@@ -332,7 +232,7 @@ describe('RipGrepTool', () => {
332
232
  }));
333
233
  const params = { pattern: 'world' };
334
234
  const invocation = grepTool.build(params);
335
- const result = await invocation.execute(abortSignal);
235
+ const result = await invocation.execute({ abortSignal });
336
236
  expect(result.llmContent).toContain('Found 3 matches for pattern "world" in path "."');
337
237
  expect(result.llmContent).toContain('File: fileA.txt');
338
238
  expect(result.llmContent).toContain('L1: hello world');
@@ -365,7 +265,7 @@ describe('RipGrepTool', () => {
365
265
  }));
366
266
  const params = { pattern: 'world' };
367
267
  const invocation = grepTool.build(params);
368
- const result = await invocation.execute(abortSignal);
268
+ const result = await invocation.execute({ abortSignal });
369
269
  expect(result.llmContent).toContain('File: ..env');
370
270
  expect(result.llmContent).toContain('L1: world in ..env');
371
271
  expect(result.llmContent).not.toContain('secret.txt');
@@ -385,7 +285,7 @@ describe('RipGrepTool', () => {
385
285
  }));
386
286
  const params = { pattern: 'world', dir_path: 'sub' };
387
287
  const invocation = grepTool.build(params);
388
- const result = await invocation.execute(abortSignal);
288
+ const result = await invocation.execute({ abortSignal });
389
289
  expect(result.llmContent).toContain('Found 1 match for pattern "world" in path "sub"');
390
290
  expect(result.llmContent).toContain('File: fileC.txt'); // Path relative to 'sub'
391
291
  expect(result.llmContent).toContain('L1: another world in sub dir');
@@ -409,7 +309,7 @@ describe('RipGrepTool', () => {
409
309
  include_pattern: '*.js',
410
310
  };
411
311
  const invocation = grepTool.build(params);
412
- const result = await invocation.execute(abortSignal);
312
+ const result = await invocation.execute({ abortSignal });
413
313
  expect(result.llmContent).toContain('Found 1 match for pattern "hello" in path "." (filter: "*.js"):');
414
314
  expect(result.llmContent).toContain('File: fileB.js');
415
315
  expect(result.llmContent).toContain('L2: function baz() { return "hello"; }');
@@ -435,7 +335,7 @@ describe('RipGrepTool', () => {
435
335
  include_pattern: '*.js',
436
336
  };
437
337
  const invocation = grepTool.build(params);
438
- const result = await invocation.execute(abortSignal);
338
+ const result = await invocation.execute({ abortSignal });
439
339
  expect(result.llmContent).toContain('Found 1 match for pattern "hello" in path "sub" (filter: "*.js")');
440
340
  expect(result.llmContent).toContain('File: another.js');
441
341
  expect(result.llmContent).toContain('L1: const greeting = "hello";');
@@ -448,7 +348,7 @@ describe('RipGrepTool', () => {
448
348
  }));
449
349
  const params = { pattern: 'nonexistentpattern' };
450
350
  const invocation = grepTool.build(params);
451
- const result = await invocation.execute(abortSignal);
351
+ const result = await invocation.execute({ abortSignal });
452
352
  expect(result.llmContent).toContain('No matches found for pattern "nonexistentpattern" in path ".".');
453
353
  expect(result.returnDisplay.summary).toBe('No matches found');
454
354
  });
@@ -466,7 +366,7 @@ describe('RipGrepTool', () => {
466
366
  pattern: 'foo',
467
367
  dir_path: tempRootDir,
468
368
  });
469
- const result = await invocation.execute(abortSignal);
369
+ const result = await invocation.execute({ abortSignal });
470
370
  expect(result.llmContent).toContain('Process exited with code 2');
471
371
  expect(result.returnDisplay).toContain('Error: Process exited with code 2');
472
372
  });
@@ -525,7 +425,7 @@ describe('RipGrepTool', () => {
525
425
  pattern: 'test',
526
426
  dir_path: tempRootDir,
527
427
  });
528
- const result = await invocation.execute(abortSignal);
428
+ const result = await invocation.execute({ abortSignal });
529
429
  expect(result.returnDisplay.summary).toContain('(limited)');
530
430
  }, 10000);
531
431
  it('should filter out files based on FileDiscoveryService even if ripgrep returns them', async () => {
@@ -557,7 +457,7 @@ describe('RipGrepTool', () => {
557
457
  }));
558
458
  const params = { pattern: 'should' };
559
459
  const invocation = toolWithIgnore.build(params);
560
- const result = await invocation.execute(abortSignal);
460
+ const result = await invocation.execute({ abortSignal });
561
461
  // Verify ignored file is filtered out
562
462
  expect(result.llmContent).toContain('allowed.txt');
563
463
  expect(result.llmContent).toContain('should be kept');
@@ -580,7 +480,7 @@ describe('RipGrepTool', () => {
580
480
  }));
581
481
  const params = { pattern: 'foo.*bar' }; // Matches 'const foo = "bar";'
582
482
  const invocation = grepTool.build(params);
583
- const result = await invocation.execute(abortSignal);
483
+ const result = await invocation.execute({ abortSignal });
584
484
  expect(result.llmContent).toContain('Found 1 match for pattern "foo.*bar" in path ".":');
585
485
  expect(result.llmContent).toContain('File: fileB.js');
586
486
  expect(result.llmContent).toContain('L1: const foo = "bar";');
@@ -610,7 +510,7 @@ describe('RipGrepTool', () => {
610
510
  }));
611
511
  const params = { pattern: 'HELLO' };
612
512
  const invocation = grepTool.build(params);
613
- const result = await invocation.execute(abortSignal);
513
+ const result = await invocation.execute({ abortSignal });
614
514
  expect(result.llmContent).toContain('Found 2 matches for pattern "HELLO" in path ".":');
615
515
  expect(result.llmContent).toContain('File: fileA.txt');
616
516
  expect(result.llmContent).toContain('L1: hello world');
@@ -622,14 +522,13 @@ describe('RipGrepTool', () => {
622
522
  expect(() => grepTool.build(params)).toThrow(/params must have required property 'pattern'/);
623
523
  });
624
524
  it('should throw an error if ripgrep is not available', async () => {
625
- await fs.rm(ripgrepBinaryPath, { force: true });
626
- downloadRipGrepMock.mockResolvedValue(undefined);
525
+ vi.mocked(fileExists).mockResolvedValue(false);
627
526
  const params = { pattern: 'world' };
628
527
  const invocation = grepTool.build(params);
629
- expect(await invocation.execute(abortSignal)).toStrictEqual({
630
- llmContent: 'Error during grep search operation: Cannot use ripgrep.',
631
- returnDisplay: 'Error: Cannot use ripgrep.',
632
- });
528
+ const result = await invocation.execute({ abortSignal });
529
+ expect(result.llmContent).toContain('Cannot find bundled ripgrep binary');
530
+ // restore the mock for subsequent tests
531
+ vi.mocked(fileExists).mockResolvedValue(true);
633
532
  });
634
533
  });
635
534
  describe('multi-directory workspace', () => {
@@ -703,7 +602,7 @@ describe('RipGrepTool', () => {
703
602
  const multiDirGrepTool = new RipGrepTool(multiDirConfig, createMockMessageBus());
704
603
  const params = { pattern: 'world' };
705
604
  const invocation = multiDirGrepTool.build(params);
706
- const result = await invocation.execute(abortSignal);
605
+ const result = await invocation.execute({ abortSignal });
707
606
  // Should find matches in CWD only (default behavior now)
708
607
  expect(result.llmContent).toContain('Found 3 matches for pattern "world" in path "."');
709
608
  // Matches from first directory
@@ -772,7 +671,7 @@ describe('RipGrepTool', () => {
772
671
  // Search only in the 'sub' directory of the first workspace
773
672
  const params = { pattern: 'world', dir_path: 'sub' };
774
673
  const invocation = multiDirGrepTool.build(params);
775
- const result = await invocation.execute(abortSignal);
674
+ const result = await invocation.execute({ abortSignal });
776
675
  // Should only find matches in the specified sub directory
777
676
  expect(result.llmContent).toContain('Found 1 match for pattern "world" in path "sub"');
778
677
  expect(result.llmContent).toContain('File: fileC.txt');
@@ -789,7 +688,9 @@ describe('RipGrepTool', () => {
789
688
  const params = { pattern: 'world' };
790
689
  const invocation = grepTool.build(params);
791
690
  controller.abort();
792
- const result = await invocation.execute(controller.signal);
691
+ const result = await invocation.execute({
692
+ abortSignal: controller.signal,
693
+ });
793
694
  expect(result).toBeDefined();
794
695
  });
795
696
  it('should abort streaming search when signal is triggered', async () => {
@@ -803,7 +704,9 @@ describe('RipGrepTool', () => {
803
704
  const invocation = grepTool.build(params);
804
705
  // Abort immediately before starting the search
805
706
  controller.abort();
806
- const result = await invocation.execute(controller.signal);
707
+ const result = await invocation.execute({
708
+ abortSignal: controller.signal,
709
+ });
807
710
  expect(result.returnDisplay.summary).toContain('No matches found');
808
711
  });
809
712
  });
@@ -835,7 +738,7 @@ describe('RipGrepTool', () => {
835
738
  mockSpawn.mockImplementation(createMockSpawn({ exitCode: 1 }));
836
739
  const params = await setup();
837
740
  const invocation = grepTool.build(params);
838
- const result = await invocation.execute(abortSignal);
741
+ const result = await invocation.execute({ abortSignal });
839
742
  expect(result.llmContent).toContain('No matches found');
840
743
  });
841
744
  it('should handle special characters in file names', async () => {
@@ -854,7 +757,7 @@ describe('RipGrepTool', () => {
854
757
  }));
855
758
  const params = { pattern: 'world' };
856
759
  const invocation = grepTool.build(params);
857
- const result = await invocation.execute(abortSignal);
760
+ const result = await invocation.execute({ abortSignal });
858
761
  expect(result.llmContent).toContain(specialFileName);
859
762
  expect(result.llmContent).toContain('hello world with special chars');
860
763
  });
@@ -875,7 +778,7 @@ describe('RipGrepTool', () => {
875
778
  }));
876
779
  const params = { pattern: 'deep' };
877
780
  const invocation = grepTool.build(params);
878
- const result = await invocation.execute(abortSignal);
781
+ const result = await invocation.execute({ abortSignal });
879
782
  expect(result.llmContent).toContain('deep.txt');
880
783
  expect(result.llmContent).toContain('content in deep directory');
881
784
  });
@@ -899,7 +802,7 @@ describe('RipGrepTool', () => {
899
802
  context: 0,
900
803
  };
901
804
  const invocation = grepTool.build(params);
902
- const result = await invocation.execute(abortSignal);
805
+ const result = await invocation.execute({ abortSignal });
903
806
  expect(result.llmContent).toContain('function getName()');
904
807
  expect(result.llmContent).not.toContain('const getValue');
905
808
  });
@@ -937,7 +840,7 @@ describe('RipGrepTool', () => {
937
840
  }));
938
841
  const params = { pattern: 'hello' };
939
842
  const invocation = grepTool.build(params);
940
- const result = await invocation.execute(abortSignal);
843
+ const result = await invocation.execute({ abortSignal });
941
844
  expect(result.llmContent).toContain('Hello World');
942
845
  expect(result.llmContent).toContain('hello world');
943
846
  expect(result.llmContent).toContain('HELLO WORLD');
@@ -960,7 +863,7 @@ describe('RipGrepTool', () => {
960
863
  context: 0,
961
864
  };
962
865
  const invocation = grepTool.build(params);
963
- const result = await invocation.execute(abortSignal);
866
+ const result = await invocation.execute({ abortSignal });
964
867
  expect(result.llmContent).toContain('Price: $19.99');
965
868
  expect(result.llmContent).not.toContain('Email: test@example.com');
966
869
  });
@@ -997,7 +900,7 @@ describe('RipGrepTool', () => {
997
900
  include_pattern: '*.{ts,tsx}',
998
901
  };
999
902
  const invocation = grepTool.build(params);
1000
- const result = await invocation.execute(abortSignal);
903
+ const result = await invocation.execute({ abortSignal });
1001
904
  expect(result.llmContent).toContain('test.ts');
1002
905
  expect(result.llmContent).toContain('test.tsx');
1003
906
  expect(result.llmContent).not.toContain('test.js');
@@ -1023,7 +926,7 @@ describe('RipGrepTool', () => {
1023
926
  include_pattern: 'src/**',
1024
927
  };
1025
928
  const invocation = grepTool.build(params);
1026
- const result = await invocation.execute(abortSignal);
929
+ const result = await invocation.execute({ abortSignal });
1027
930
  expect(result.llmContent).toContain('main.ts');
1028
931
  expect(result.llmContent).not.toContain('other.ts');
1029
932
  });
@@ -1044,7 +947,7 @@ describe('RipGrepTool', () => {
1044
947
  }));
1045
948
  let params = { pattern: 'HELLO', context: 0 };
1046
949
  let invocation = grepTool.build(params);
1047
- let result = await invocation.execute(abortSignal);
950
+ let result = await invocation.execute({ abortSignal });
1048
951
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.arrayContaining(['--ignore-case']), expect.anything());
1049
952
  expect(result.llmContent).toContain('Found 1 match for pattern "HELLO"');
1050
953
  expect(result.llmContent).toContain('L1: hello world');
@@ -1062,7 +965,7 @@ describe('RipGrepTool', () => {
1062
965
  }));
1063
966
  params = { pattern: 'HELLO', case_sensitive: true, context: 0 };
1064
967
  invocation = grepTool.build(params);
1065
- result = await invocation.execute(abortSignal);
968
+ result = await invocation.execute({ abortSignal });
1066
969
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.not.arrayContaining(['--ignore-case']), expect.anything());
1067
970
  expect(result.llmContent).toContain('Found 1 match for pattern "HELLO"');
1068
971
  expect(result.llmContent).toContain('L1: HELLO world');
@@ -1083,7 +986,7 @@ describe('RipGrepTool', () => {
1083
986
  pattern: 'hello.world',
1084
987
  fixed_strings: true,
1085
988
  });
1086
- const result = await invocation.execute(abortSignal);
989
+ const result = await invocation.execute({ abortSignal });
1087
990
  const spawnArgs = mockSpawn.mock.calls[0][1];
1088
991
  expect(spawnArgs).toContain('--fixed-strings');
1089
992
  expect(spawnArgs).toContain('--regexp');
@@ -1114,7 +1017,7 @@ describe('RipGrepTool', () => {
1114
1017
  }));
1115
1018
  const params = { pattern: 'secret', no_ignore: true };
1116
1019
  const invocation = grepTool.build(params);
1117
- const result = await invocation.execute(abortSignal);
1020
+ const result = await invocation.execute({ abortSignal });
1118
1021
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.arrayContaining(['--no-ignore']), expect.anything());
1119
1022
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.not.arrayContaining(['--glob', '!node_modules']), expect.anything());
1120
1023
  expect(result.llmContent).toContain('Found 1 match for pattern "secret"');
@@ -1166,7 +1069,7 @@ describe('RipGrepTool', () => {
1166
1069
  }));
1167
1070
  const params = { pattern: 'secret' };
1168
1071
  const invocation = gitIgnoreDisabledTool.build(params);
1169
- await invocation.execute(abortSignal);
1072
+ await invocation.execute({ abortSignal });
1170
1073
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.arrayContaining(['--no-ignore-vcs', '--no-ignore-exclude']), expect.anything());
1171
1074
  });
1172
1075
  it('should add .geminiignore when enabled and patterns exist', async () => {
@@ -1216,7 +1119,7 @@ describe('RipGrepTool', () => {
1216
1119
  }));
1217
1120
  const params = { pattern: 'secret' };
1218
1121
  const invocation = geminiIgnoreTool.build(params);
1219
- await invocation.execute(abortSignal);
1122
+ await invocation.execute({ abortSignal });
1220
1123
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.arrayContaining(['--ignore-file', geminiIgnorePath]), expect.anything());
1221
1124
  });
1222
1125
  it('should skip .geminiignore when disabled', async () => {
@@ -1266,7 +1169,7 @@ describe('RipGrepTool', () => {
1266
1169
  }));
1267
1170
  const params = { pattern: 'secret' };
1268
1171
  const invocation = geminiIgnoreTool.build(params);
1269
- await invocation.execute(abortSignal);
1172
+ await invocation.execute({ abortSignal });
1270
1173
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.not.arrayContaining(['--ignore-file', geminiIgnorePath]), expect.anything());
1271
1174
  });
1272
1175
  it('should handle context parameters', async () => {
@@ -1316,7 +1219,7 @@ describe('RipGrepTool', () => {
1316
1219
  before: 1,
1317
1220
  };
1318
1221
  const invocation = grepTool.build(params);
1319
- const result = await invocation.execute(abortSignal);
1222
+ const result = await invocation.execute({ abortSignal });
1320
1223
  expect(mockSpawn).toHaveBeenLastCalledWith(expect.anything(), expect.arrayContaining([
1321
1224
  '--context',
1322
1225
  '1',
@@ -1430,7 +1333,7 @@ describe('RipGrepTool', () => {
1430
1333
  max_matches_per_file: 1,
1431
1334
  };
1432
1335
  const invocation = grepTool.build(params);
1433
- await invocation.execute(abortSignal);
1336
+ await invocation.execute({ abortSignal });
1434
1337
  const spawnArgs = mockSpawn.mock.calls[0][1];
1435
1338
  expect(spawnArgs).toContain('--max-count');
1436
1339
  expect(spawnArgs).toContain('1');
@@ -1473,7 +1376,7 @@ describe('RipGrepTool', () => {
1473
1376
  context: 0,
1474
1377
  };
1475
1378
  const invocation = grepTool.build(params);
1476
- const result = await invocation.execute(abortSignal);
1379
+ const result = await invocation.execute({ abortSignal });
1477
1380
  expect(result.llmContent).toContain('Found 2 matches');
1478
1381
  expect(result.llmContent).toContain('results limited to 2 matches for performance');
1479
1382
  expect(result.llmContent).toContain('L1: match 1');
@@ -1508,7 +1411,7 @@ describe('RipGrepTool', () => {
1508
1411
  names_only: true,
1509
1412
  };
1510
1413
  const invocation = grepTool.build(params);
1511
- const result = await invocation.execute(abortSignal);
1414
+ const result = await invocation.execute({ abortSignal });
1512
1415
  expect(result.llmContent).toContain('Found 2 files with matches');
1513
1416
  expect(result.llmContent).toContain('fileA.txt');
1514
1417
  expect(result.llmContent).toContain('fileB.txt');
@@ -1543,7 +1446,7 @@ describe('RipGrepTool', () => {
1543
1446
  context: 0,
1544
1447
  };
1545
1448
  const invocation = grepTool.build(params);
1546
- const result = await invocation.execute(abortSignal);
1449
+ const result = await invocation.execute({ abortSignal });
1547
1450
  expect(result.llmContent).toContain('Found 1 match');
1548
1451
  expect(result.llmContent).toContain('fileA.txt');
1549
1452
  expect(result.llmContent).not.toContain('fileB.txt');
@@ -1564,14 +1467,57 @@ describe('RipGrepTool', () => {
1564
1467
  }));
1565
1468
  const params = { pattern: 'Target match', context: 0 };
1566
1469
  const invocation = grepTool.build(params);
1567
- const result = await invocation.execute(abortSignal);
1470
+ const result = await invocation.execute({ abortSignal });
1568
1471
  // MAX_LINE_LENGTH_TEXT_FILE is 2000. It should be truncated.
1569
1472
  expect(result.llmContent).toContain('... [truncated]');
1570
1473
  expect(result.llmContent).not.toContain(longString);
1571
1474
  });
1572
1475
  });
1573
1476
  });
1574
- afterAll(() => {
1575
- storageSpy.mockRestore();
1477
+ describe('getRipgrepPath', () => {
1478
+ afterEach(() => {
1479
+ vi.restoreAllMocks();
1480
+ });
1481
+ describe('OS/Architecture Resolution', () => {
1482
+ it.each([
1483
+ { platform: 'darwin', arch: 'arm64', expectedBin: 'rg-darwin-arm64' },
1484
+ { platform: 'darwin', arch: 'x64', expectedBin: 'rg-darwin-x64' },
1485
+ { platform: 'linux', arch: 'arm64', expectedBin: 'rg-linux-arm64' },
1486
+ { platform: 'linux', arch: 'x64', expectedBin: 'rg-linux-x64' },
1487
+ { platform: 'win32', arch: 'x64', expectedBin: 'rg-win32-x64.exe' },
1488
+ ])('should map $platform $arch to $expectedBin', async ({ platform, arch, expectedBin }) => {
1489
+ vi.spyOn(os, 'platform').mockReturnValue(platform);
1490
+ vi.spyOn(os, 'arch').mockReturnValue(arch);
1491
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => checkPath.endsWith(expectedBin));
1492
+ const resolvedPath = await getRipgrepPath();
1493
+ expect(resolvedPath).not.toBeNull();
1494
+ expect(resolvedPath?.endsWith(expectedBin)).toBe(true);
1495
+ });
1496
+ });
1497
+ describe('Path Fallback Logic', () => {
1498
+ beforeEach(() => {
1499
+ vi.spyOn(os, 'platform').mockReturnValue('linux');
1500
+ vi.spyOn(os, 'arch').mockReturnValue('x64');
1501
+ });
1502
+ it('should resolve the SEA (flattened) path first', async () => {
1503
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => checkPath.includes(path.normalize('tools/vendor/ripgrep')));
1504
+ const resolvedPath = await getRipgrepPath();
1505
+ expect(resolvedPath).not.toBeNull();
1506
+ expect(resolvedPath).toContain(path.normalize('tools/vendor/ripgrep'));
1507
+ });
1508
+ it('should fall back to the Dev path if SEA path is missing', async () => {
1509
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => checkPath.includes(path.normalize('core/vendor/ripgrep')) &&
1510
+ !checkPath.includes(path.join(path.sep, 'tools', path.sep)));
1511
+ const resolvedPath = await getRipgrepPath();
1512
+ expect(resolvedPath).not.toBeNull();
1513
+ expect(resolvedPath).toContain(path.normalize('core/vendor/ripgrep'));
1514
+ expect(resolvedPath).not.toContain(path.join(path.sep, 'tools', path.sep));
1515
+ });
1516
+ it('should return null if binary is missing from both paths', async () => {
1517
+ vi.mocked(fileExists).mockResolvedValue(false);
1518
+ const resolvedPath = await getRipgrepPath();
1519
+ expect(resolvedPath).toBeNull();
1520
+ });
1521
+ });
1576
1522
  });
1577
1523
  //# sourceMappingURL=ripGrep.test.js.map