@machina.ai/cell-cli-core 1.41.1-rc2 → 1.45.1-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 (834) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +1 -1
  2. package/dist/docs/changelogs/index.md +63 -0
  3. package/dist/docs/changelogs/latest.md +200 -244
  4. package/dist/docs/changelogs/preview.md +198 -385
  5. package/dist/docs/cli/auto-memory.md +61 -40
  6. package/dist/docs/cli/cli-reference.md +2 -1
  7. package/dist/docs/cli/creating-skills.md +165 -38
  8. package/dist/docs/cli/custom-commands.md +1 -0
  9. package/dist/docs/cli/gemini-md.md +0 -3
  10. package/dist/docs/cli/model-routing.md +3 -3
  11. package/dist/docs/cli/plan-mode.md +2 -2
  12. package/dist/docs/cli/settings.md +20 -19
  13. package/dist/docs/cli/skills-best-practices.md +78 -0
  14. package/dist/docs/cli/skills.md +98 -176
  15. package/dist/docs/cli/tutorials/memory-management.md +3 -3
  16. package/dist/docs/cli/tutorials/session-management.md +13 -0
  17. package/dist/docs/cli/tutorials/skills-getting-started.md +140 -92
  18. package/dist/docs/cli/using-agent-skills.md +90 -0
  19. package/dist/docs/core/gemma-setup.md +83 -0
  20. package/dist/docs/core/index.md +3 -2
  21. package/dist/docs/core/local-model-routing.md +14 -7
  22. package/dist/docs/extensions/reference.md +16 -0
  23. package/dist/docs/extensions/releasing.md +58 -24
  24. package/dist/docs/extensions/writing-extensions.md +7 -0
  25. package/dist/docs/get-started/installation.mdx +2 -2
  26. package/dist/docs/model-routing-spec.md +683 -0
  27. package/dist/docs/reference/commands.md +14 -7
  28. package/dist/docs/reference/configuration.md +264 -88
  29. package/dist/docs/reference/keyboard-shortcuts.md +24 -1
  30. package/dist/docs/reference/policy-engine.md +14 -3
  31. package/dist/docs/reference/tools.md +48 -1
  32. package/dist/docs/releases.md +2 -2
  33. package/dist/docs/sidebar.json +24 -2
  34. package/dist/docs/tools/activate-skill.md +1 -1
  35. package/dist/docs/tools/mcp-server.md +24 -3
  36. package/dist/docs/tools/memory.md +10 -13
  37. package/dist/docs/tools/shell.md +17 -0
  38. package/dist/package.json +18 -18
  39. package/dist/src/agent/content-utils.js +6 -1
  40. package/dist/src/agent/content-utils.js.map +1 -1
  41. package/dist/src/agent/content-utils.test.js +5 -1
  42. package/dist/src/agent/content-utils.test.js.map +1 -1
  43. package/dist/src/agent/event-translator.js +8 -7
  44. package/dist/src/agent/event-translator.js.map +1 -1
  45. package/dist/src/agent/event-translator.test.js +2 -2
  46. package/dist/src/agent/event-translator.test.js.map +1 -1
  47. package/dist/src/agent/legacy-agent-session.js +5 -1
  48. package/dist/src/agent/legacy-agent-session.js.map +1 -1
  49. package/dist/src/agent/legacy-agent-session.test.js +11 -3
  50. package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
  51. package/dist/src/agent/tool-display-utils.d.ts +3 -2
  52. package/dist/src/agent/tool-display-utils.js +3 -2
  53. package/dist/src/agent/tool-display-utils.js.map +1 -1
  54. package/dist/src/agent/types.d.ts +33 -3
  55. package/dist/src/agents/a2aUtils.d.ts +1 -1
  56. package/dist/src/agents/a2aUtils.js +5 -4
  57. package/dist/src/agents/a2aUtils.js.map +1 -1
  58. package/dist/src/agents/a2aUtils.test.js +18 -0
  59. package/dist/src/agents/a2aUtils.test.js.map +1 -1
  60. package/dist/src/agents/agent-tool.d.ts +3 -1
  61. package/dist/src/agents/agent-tool.js +19 -3
  62. package/dist/src/agents/agent-tool.js.map +1 -1
  63. package/dist/src/agents/agent-tool.test.js +76 -0
  64. package/dist/src/agents/agent-tool.test.js.map +1 -1
  65. package/dist/src/agents/agentLoader.d.ts +127 -22
  66. package/dist/src/agents/agentLoader.js +20 -0
  67. package/dist/src/agents/agentLoader.js.map +1 -1
  68. package/dist/src/agents/agentLoader.test.js +60 -0
  69. package/dist/src/agents/agentLoader.test.js.map +1 -1
  70. package/dist/src/agents/auth-provider/types.d.ts +5 -0
  71. package/dist/src/agents/browser/browserAgentInvocation.js +24 -19
  72. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  73. package/dist/src/agents/browser/snapshotSuperseder.js +11 -8
  74. package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -1
  75. package/dist/src/agents/browser/snapshotSuperseder.test.js +6 -1
  76. package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -1
  77. package/dist/src/agents/generalist-agent.js +8 -1
  78. package/dist/src/agents/generalist-agent.js.map +1 -1
  79. package/dist/src/agents/generalist-agent.test.js +24 -0
  80. package/dist/src/agents/generalist-agent.test.js.map +1 -1
  81. package/dist/src/agents/local-executor.d.ts +1 -0
  82. package/dist/src/agents/local-executor.js +76 -45
  83. package/dist/src/agents/local-executor.js.map +1 -1
  84. package/dist/src/agents/local-executor.test.js +199 -27
  85. package/dist/src/agents/local-executor.test.js.map +1 -1
  86. package/dist/src/agents/local-invocation.d.ts +1 -1
  87. package/dist/src/agents/local-invocation.js +47 -48
  88. package/dist/src/agents/local-invocation.js.map +1 -1
  89. package/dist/src/agents/local-invocation.test.js +13 -15
  90. package/dist/src/agents/local-invocation.test.js.map +1 -1
  91. package/dist/src/agents/local-session-invocation.d.ts +51 -0
  92. package/dist/src/agents/local-session-invocation.js +320 -0
  93. package/dist/src/agents/local-session-invocation.js.map +1 -0
  94. package/dist/src/agents/local-session-invocation.test.js +512 -0
  95. package/dist/src/agents/local-session-invocation.test.js.map +1 -0
  96. package/dist/src/agents/local-subagent-protocol.d.ts +18 -0
  97. package/dist/src/agents/local-subagent-protocol.js +357 -0
  98. package/dist/src/agents/local-subagent-protocol.js.map +1 -0
  99. package/dist/src/agents/local-subagent-protocol.test.js +676 -0
  100. package/dist/src/agents/local-subagent-protocol.test.js.map +1 -0
  101. package/dist/src/agents/registry.d.ts +8 -4
  102. package/dist/src/agents/registry.js +112 -47
  103. package/dist/src/agents/registry.js.map +1 -1
  104. package/dist/src/agents/registry.test.js +9 -20
  105. package/dist/src/agents/registry.test.js.map +1 -1
  106. package/dist/src/agents/remote-invocation.js +6 -6
  107. package/dist/src/agents/remote-invocation.js.map +1 -1
  108. package/dist/src/agents/remote-invocation.test.js +23 -12
  109. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  110. package/dist/src/agents/remote-session-invocation.d.ts +48 -0
  111. package/dist/src/agents/remote-session-invocation.js +193 -0
  112. package/dist/src/agents/remote-session-invocation.js.map +1 -0
  113. package/dist/src/agents/remote-session-invocation.test.d.ts +6 -0
  114. package/dist/src/agents/remote-session-invocation.test.js +405 -0
  115. package/dist/src/agents/remote-session-invocation.test.js.map +1 -0
  116. package/dist/src/agents/remote-subagent-protocol.d.ts +42 -0
  117. package/dist/src/agents/remote-subagent-protocol.js +348 -0
  118. package/dist/src/agents/remote-subagent-protocol.js.map +1 -0
  119. package/dist/src/agents/remote-subagent-protocol.test.d.ts +6 -0
  120. package/dist/src/agents/remote-subagent-protocol.test.js +652 -0
  121. package/dist/src/agents/remote-subagent-protocol.test.js.map +1 -0
  122. package/dist/src/agents/skill-extraction-agent.d.ts +8 -1
  123. package/dist/src/agents/skill-extraction-agent.js +171 -21
  124. package/dist/src/agents/skill-extraction-agent.js.map +1 -1
  125. package/dist/src/agents/skill-extraction-agent.test.js +66 -2
  126. package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
  127. package/dist/src/agents/types.d.ts +38 -2
  128. package/dist/src/agents/types.js +7 -0
  129. package/dist/src/agents/types.js.map +1 -1
  130. package/dist/src/availability/autoRoutingFallback.integration.test.d.ts +6 -0
  131. package/dist/src/availability/autoRoutingFallback.integration.test.js +288 -0
  132. package/dist/src/availability/autoRoutingFallback.integration.test.js.map +1 -0
  133. package/dist/src/availability/fallbackIntegration.test.js +29 -0
  134. package/dist/src/availability/fallbackIntegration.test.js.map +1 -1
  135. package/dist/src/availability/modelAvailabilityService.d.ts +6 -6
  136. package/dist/src/availability/modelAvailabilityService.js +16 -8
  137. package/dist/src/availability/modelAvailabilityService.js.map +1 -1
  138. package/dist/src/availability/modelAvailabilityService.test.js +39 -0
  139. package/dist/src/availability/modelAvailabilityService.test.js.map +1 -1
  140. package/dist/src/availability/modelPolicy.d.ts +1 -0
  141. package/dist/src/availability/policyCatalog.d.ts +2 -0
  142. package/dist/src/availability/policyCatalog.js +38 -9
  143. package/dist/src/availability/policyCatalog.js.map +1 -1
  144. package/dist/src/availability/policyCatalog.test.js +5 -4
  145. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  146. package/dist/src/availability/policyHelpers.js +42 -27
  147. package/dist/src/availability/policyHelpers.js.map +1 -1
  148. package/dist/src/availability/policyHelpers.test.js +47 -7
  149. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  150. package/dist/src/availability/testUtils.js +1 -1
  151. package/dist/src/availability/testUtils.js.map +1 -1
  152. package/dist/src/code_assist/admin/admin_controls.js +3 -1
  153. package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
  154. package/dist/src/code_assist/experiments/flagNames.d.ts +1 -1
  155. package/dist/src/code_assist/experiments/flagNames.js +1 -1
  156. package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
  157. package/dist/src/code_assist/oauth-credential-storage.js +12 -3
  158. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  159. package/dist/src/code_assist/oauth-credential-storage.test.js +29 -2
  160. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  161. package/dist/src/code_assist/oauth2.js +12 -3
  162. package/dist/src/code_assist/oauth2.js.map +1 -1
  163. package/dist/src/code_assist/oauth2.test.js +38 -0
  164. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  165. package/dist/src/code_assist/setup.d.ts +3 -0
  166. package/dist/src/code_assist/setup.js +9 -0
  167. package/dist/src/code_assist/setup.js.map +1 -1
  168. package/dist/src/code_assist/setup.test.js +10 -1
  169. package/dist/src/code_assist/setup.test.js.map +1 -1
  170. package/dist/src/commands/memory.d.ts +83 -2
  171. package/dist/src/commands/memory.js +479 -28
  172. package/dist/src/commands/memory.js.map +1 -1
  173. package/dist/src/commands/memory.test.js +414 -58
  174. package/dist/src/commands/memory.test.js.map +1 -1
  175. package/dist/src/config/config.d.ts +61 -37
  176. package/dist/src/config/config.js +294 -101
  177. package/dist/src/config/config.js.map +1 -1
  178. package/dist/src/config/config.test.js +365 -113
  179. package/dist/src/config/config.test.js.map +1 -1
  180. package/dist/src/config/defaultModelConfigs.js +185 -61
  181. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  182. package/dist/src/config/flashFallback.test.js +31 -0
  183. package/dist/src/config/flashFallback.test.js.map +1 -1
  184. package/dist/src/config/models.d.ts +20 -10
  185. package/dist/src/config/models.js +105 -34
  186. package/dist/src/config/models.js.map +1 -1
  187. package/dist/src/config/models.test.js +204 -47
  188. package/dist/src/config/models.test.js.map +1 -1
  189. package/dist/src/config/projectRegistry.d.ts +1 -0
  190. package/dist/src/config/projectRegistry.js +14 -3
  191. package/dist/src/config/projectRegistry.js.map +1 -1
  192. package/dist/src/config/projectRegistry.test.js +43 -0
  193. package/dist/src/config/projectRegistry.test.js.map +1 -1
  194. package/dist/src/config/scoped-config.d.ts +22 -0
  195. package/dist/src/config/scoped-config.js +32 -0
  196. package/dist/src/config/scoped-config.js.map +1 -1
  197. package/dist/src/config/storage.d.ts +0 -1
  198. package/dist/src/config/storage.js +0 -3
  199. package/dist/src/config/storage.js.map +1 -1
  200. package/dist/src/confirmation-bus/message-bus.d.ts +3 -1
  201. package/dist/src/confirmation-bus/message-bus.js +14 -5
  202. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  203. package/dist/src/confirmation-bus/message-bus.test.js +34 -0
  204. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  205. package/dist/src/context/chatCompressionService.js +7 -5
  206. package/dist/src/context/chatCompressionService.js.map +1 -1
  207. package/dist/src/context/chatCompressionService.test.js +1 -1
  208. package/dist/src/context/chatCompressionService.test.js.map +1 -1
  209. package/dist/src/context/config/configLoader.js +4 -1
  210. package/dist/src/context/config/configLoader.js.map +1 -1
  211. package/dist/src/context/config/profiles.d.ts +10 -0
  212. package/dist/src/context/config/profiles.js +98 -3
  213. package/dist/src/context/config/profiles.js.map +1 -1
  214. package/dist/src/context/config/schema.d.ts +4 -0
  215. package/dist/src/context/config/schema.js +4 -0
  216. package/dist/src/context/config/schema.js.map +1 -1
  217. package/dist/src/context/config/types.d.ts +13 -1
  218. package/dist/src/context/contextCompressionService.test.js +7 -3
  219. package/dist/src/context/contextCompressionService.test.js.map +1 -1
  220. package/dist/src/context/contextManager.barrier.test.js +39 -16
  221. package/dist/src/context/contextManager.barrier.test.js.map +1 -1
  222. package/dist/src/context/contextManager.d.ts +25 -28
  223. package/dist/src/context/contextManager.hotstart.test.d.ts +6 -0
  224. package/dist/src/context/contextManager.hotstart.test.js +65 -0
  225. package/dist/src/context/contextManager.hotstart.test.js.map +1 -0
  226. package/dist/src/context/contextManager.incremental.test.d.ts +6 -0
  227. package/dist/src/context/contextManager.incremental.test.js +101 -0
  228. package/dist/src/context/contextManager.incremental.test.js.map +1 -0
  229. package/dist/src/context/contextManager.js +276 -79
  230. package/dist/src/context/contextManager.js.map +1 -1
  231. package/dist/src/context/contextManager.test.d.ts +6 -0
  232. package/dist/src/context/contextManager.test.js +142 -0
  233. package/dist/src/context/contextManager.test.js.map +1 -0
  234. package/dist/src/context/eventBus.d.ts +13 -0
  235. package/dist/src/context/eventBus.js +12 -0
  236. package/dist/src/context/eventBus.js.map +1 -1
  237. package/dist/src/context/graph/behaviorRegistry.d.ts +4 -12
  238. package/dist/src/context/graph/behaviorRegistry.js.map +1 -1
  239. package/dist/src/context/graph/builtinBehaviors.d.ts +6 -1
  240. package/dist/src/context/graph/builtinBehaviors.js +23 -108
  241. package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
  242. package/dist/src/context/graph/fromGraph.d.ts +8 -3
  243. package/dist/src/context/graph/fromGraph.js +46 -30
  244. package/dist/src/context/graph/fromGraph.js.map +1 -1
  245. package/dist/src/context/graph/fromGraph.test.d.ts +6 -0
  246. package/dist/src/context/graph/fromGraph.test.js +186 -0
  247. package/dist/src/context/graph/fromGraph.test.js.map +1 -0
  248. package/dist/src/context/graph/mapper.d.ts +8 -10
  249. package/dist/src/context/graph/mapper.js +11 -19
  250. package/dist/src/context/graph/mapper.js.map +1 -1
  251. package/dist/src/context/graph/mapper.test.d.ts +6 -0
  252. package/dist/src/context/graph/mapper.test.js +101 -0
  253. package/dist/src/context/graph/mapper.test.js.map +1 -0
  254. package/dist/src/context/graph/nodeIdService.d.ts +17 -0
  255. package/dist/src/context/graph/nodeIdService.js +24 -0
  256. package/dist/src/context/graph/nodeIdService.js.map +1 -0
  257. package/dist/src/context/graph/render.d.ts +24 -5
  258. package/dist/src/context/graph/render.js +129 -34
  259. package/dist/src/context/graph/render.js.map +1 -1
  260. package/dist/src/context/graph/render.test.d.ts +6 -0
  261. package/dist/src/context/graph/render.test.js +280 -0
  262. package/dist/src/context/graph/render.test.js.map +1 -0
  263. package/dist/src/context/graph/toGraph.d.ts +16 -14
  264. package/dist/src/context/graph/toGraph.js +180 -202
  265. package/dist/src/context/graph/toGraph.js.map +1 -1
  266. package/dist/src/context/graph/toGraph.test.d.ts +6 -0
  267. package/dist/src/context/graph/toGraph.test.js +116 -0
  268. package/dist/src/context/graph/toGraph.test.js.map +1 -0
  269. package/dist/src/context/graph/types.d.ts +36 -73
  270. package/dist/src/context/graph/types.js +23 -14
  271. package/dist/src/context/graph/types.js.map +1 -1
  272. package/dist/src/context/initializer.js +26 -5
  273. package/dist/src/context/initializer.js.map +1 -1
  274. package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +5 -8
  275. package/dist/src/context/pipeline/contextWorkingBuffer.js +105 -35
  276. package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
  277. package/dist/src/context/pipeline/contextWorkingBuffer.test.js +81 -13
  278. package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -1
  279. package/dist/src/context/pipeline/environment.d.ts +4 -0
  280. package/dist/src/context/pipeline/environmentImpl.d.ts +6 -5
  281. package/dist/src/context/pipeline/environmentImpl.js +7 -9
  282. package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
  283. package/dist/src/context/pipeline/environmentImpl.test.js +5 -1
  284. package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
  285. package/dist/src/context/pipeline/orchestrator.d.ts +20 -6
  286. package/dist/src/context/pipeline/orchestrator.js +97 -80
  287. package/dist/src/context/pipeline/orchestrator.js.map +1 -1
  288. package/dist/src/context/pipeline/orchestrator.test.js +33 -36
  289. package/dist/src/context/pipeline/orchestrator.test.js.map +1 -1
  290. package/dist/src/context/pipeline.d.ts +0 -1
  291. package/dist/src/context/processors/blobDegradationProcessor.js +43 -84
  292. package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -1
  293. package/dist/src/context/processors/blobDegradationProcessor.test.js +33 -37
  294. package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -1
  295. package/dist/src/context/processors/nodeDistillationProcessor.js +58 -80
  296. package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -1
  297. package/dist/src/context/processors/nodeDistillationProcessor.test.js +21 -15
  298. package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -1
  299. package/dist/src/context/processors/nodeTruncationProcessor.js +16 -60
  300. package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -1
  301. package/dist/src/context/processors/nodeTruncationProcessor.test.js +16 -19
  302. package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -1
  303. package/dist/src/context/processors/rollingSummaryProcessor.js +12 -25
  304. package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -1
  305. package/dist/src/context/processors/rollingSummaryProcessor.test.js +10 -9
  306. package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -1
  307. package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +7 -0
  308. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +37 -19
  309. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -1
  310. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +35 -10
  311. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -1
  312. package/dist/src/context/processors/stateSnapshotProcessor.d.ts +2 -0
  313. package/dist/src/context/processors/stateSnapshotProcessor.js +53 -21
  314. package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -1
  315. package/dist/src/context/processors/stateSnapshotProcessor.test.js +52 -12
  316. package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -1
  317. package/dist/src/context/processors/toolMaskingProcessor.js +96 -117
  318. package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
  319. package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -17
  320. package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
  321. package/dist/src/context/system-tests/hysteresis.test.d.ts +6 -0
  322. package/dist/src/context/system-tests/hysteresis.test.js +100 -0
  323. package/dist/src/context/system-tests/hysteresis.test.js.map +1 -0
  324. package/dist/src/context/system-tests/lifecycle.golden.test.js +107 -72
  325. package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
  326. package/dist/src/context/system-tests/powerUserLifecycle.test.d.ts +6 -0
  327. package/dist/src/context/system-tests/powerUserLifecycle.test.js +91 -0
  328. package/dist/src/context/system-tests/powerUserLifecycle.test.js.map +1 -0
  329. package/dist/src/context/system-tests/simulationHarness.d.ts +2 -5
  330. package/dist/src/context/system-tests/simulationHarness.js +34 -35
  331. package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
  332. package/dist/src/context/testing/contextTestUtils.d.ts +5 -3
  333. package/dist/src/context/testing/contextTestUtils.js +74 -53
  334. package/dist/src/context/testing/contextTestUtils.js.map +1 -1
  335. package/dist/src/context/testing/testProfile.js +1 -0
  336. package/dist/src/context/testing/testProfile.js.map +1 -1
  337. package/dist/src/context/toolOutputMaskingService.js +1 -2
  338. package/dist/src/context/toolOutputMaskingService.js.map +1 -1
  339. package/dist/src/context/toolOutputMaskingService.test.js +5 -20
  340. package/dist/src/context/toolOutputMaskingService.test.js.map +1 -1
  341. package/dist/src/context/utils/adaptiveTokenCalculator.d.ts +70 -0
  342. package/dist/src/context/utils/adaptiveTokenCalculator.js +138 -0
  343. package/dist/src/context/utils/adaptiveTokenCalculator.js.map +1 -0
  344. package/dist/src/context/utils/adaptiveTokenCalculator.test.d.ts +6 -0
  345. package/dist/src/context/utils/adaptiveTokenCalculator.test.js +129 -0
  346. package/dist/src/context/utils/adaptiveTokenCalculator.test.js.map +1 -0
  347. package/dist/src/context/utils/contextTokenCalculator.d.ts +63 -2
  348. package/dist/src/context/utils/contextTokenCalculator.js +80 -5
  349. package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
  350. package/dist/src/context/utils/contextTokenCalculator.test.d.ts +6 -0
  351. package/dist/src/context/utils/contextTokenCalculator.test.js +54 -0
  352. package/dist/src/context/utils/contextTokenCalculator.test.js.map +1 -0
  353. package/dist/src/context/utils/formatNodesForLlm.d.ts +21 -0
  354. package/dist/src/context/utils/formatNodesForLlm.js +69 -0
  355. package/dist/src/context/utils/formatNodesForLlm.js.map +1 -0
  356. package/dist/src/context/utils/formatNodesForLlm.test.d.ts +6 -0
  357. package/dist/src/context/utils/formatNodesForLlm.test.js +110 -0
  358. package/dist/src/context/utils/formatNodesForLlm.test.js.map +1 -0
  359. package/dist/src/context/utils/invariantChecker.d.ts +11 -0
  360. package/dist/src/context/utils/invariantChecker.js +36 -0
  361. package/dist/src/context/utils/invariantChecker.js.map +1 -0
  362. package/dist/src/context/utils/snapshotGenerator.d.ts +43 -1
  363. package/dist/src/context/utils/snapshotGenerator.js +332 -33
  364. package/dist/src/context/utils/snapshotGenerator.js.map +1 -1
  365. package/dist/src/context/utils/snapshotGenerator.test.d.ts +6 -0
  366. package/dist/src/context/utils/snapshotGenerator.test.js +362 -0
  367. package/dist/src/context/utils/snapshotGenerator.test.js.map +1 -0
  368. package/dist/src/context/utils/tokenCalibration.d.ts +9 -0
  369. package/dist/src/context/utils/tokenCalibration.js +30 -0
  370. package/dist/src/context/utils/tokenCalibration.js.map +1 -0
  371. package/dist/src/core/agentChatHistory.d.ts +29 -14
  372. package/dist/src/core/agentChatHistory.js +27 -27
  373. package/dist/src/core/agentChatHistory.js.map +1 -1
  374. package/dist/src/core/baseLlmClient.d.ts +8 -0
  375. package/dist/src/core/baseLlmClient.js +23 -3
  376. package/dist/src/core/baseLlmClient.js.map +1 -1
  377. package/dist/src/core/baseLlmClient.test.js +27 -23
  378. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  379. package/dist/src/core/client.d.ts +7 -5
  380. package/dist/src/core/client.js +65 -40
  381. package/dist/src/core/client.js.map +1 -1
  382. package/dist/src/core/client.test.js +35 -131
  383. package/dist/src/core/client.test.js.map +1 -1
  384. package/dist/src/core/contentGenerator.js +46 -21
  385. package/dist/src/core/contentGenerator.js.map +1 -1
  386. package/dist/src/core/contentGenerator.test.js +191 -13
  387. package/dist/src/core/contentGenerator.test.js.map +1 -1
  388. package/dist/src/core/fakeContentGenerator.d.ts +15 -3
  389. package/dist/src/core/fakeContentGenerator.js +29 -9
  390. package/dist/src/core/fakeContentGenerator.js.map +1 -1
  391. package/dist/src/core/geminiChat.d.ts +18 -7
  392. package/dist/src/core/geminiChat.js +312 -54
  393. package/dist/src/core/geminiChat.js.map +1 -1
  394. package/dist/src/core/geminiChat.test.js +448 -54
  395. package/dist/src/core/geminiChat.test.js.map +1 -1
  396. package/dist/src/core/geminiChat_network_retry.test.js +39 -0
  397. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  398. package/dist/src/core/localLiteRtLmClient.js +6 -2
  399. package/dist/src/core/localLiteRtLmClient.js.map +1 -1
  400. package/dist/src/core/prompts.test.js +12 -7
  401. package/dist/src/core/prompts.test.js.map +1 -1
  402. package/dist/src/core/turn.d.ts +7 -2
  403. package/dist/src/core/turn.js +61 -4
  404. package/dist/src/core/turn.js.map +1 -1
  405. package/dist/src/core/turn.test.js +19 -10
  406. package/dist/src/core/turn.test.js.map +1 -1
  407. package/dist/src/fallback/handler.js +16 -6
  408. package/dist/src/fallback/handler.js.map +1 -1
  409. package/dist/src/fallback/handler.test.js +8 -2
  410. package/dist/src/fallback/handler.test.js.map +1 -1
  411. package/dist/src/generated/git-commit.d.ts +2 -2
  412. package/dist/src/generated/git-commit.js +2 -2
  413. package/dist/src/hooks/hookEventHandler.js +3 -2
  414. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  415. package/dist/src/hooks/hookEventHandler.test.js +80 -0
  416. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  417. package/dist/src/hooks/hookRunner.test.js +3 -3
  418. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  419. package/dist/src/hooks/hookTranslator.js +95 -5
  420. package/dist/src/hooks/hookTranslator.js.map +1 -1
  421. package/dist/src/hooks/hookTranslator.test.js +171 -0
  422. package/dist/src/hooks/hookTranslator.test.js.map +1 -1
  423. package/dist/src/ide/ide-client.js +5 -3
  424. package/dist/src/ide/ide-client.js.map +1 -1
  425. package/dist/src/ide/ide-connection-utils.js +12 -10
  426. package/dist/src/ide/ide-connection-utils.js.map +1 -1
  427. package/dist/src/ide/ide-connection-utils.test.js +25 -2
  428. package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
  429. package/dist/src/ide/types.d.ts +16 -16
  430. package/dist/src/index.d.ts +5 -2
  431. package/dist/src/index.js +5 -3
  432. package/dist/src/index.js.map +1 -1
  433. package/dist/src/mcp/oauth-provider.d.ts +8 -0
  434. package/dist/src/mcp/oauth-provider.js +41 -0
  435. package/dist/src/mcp/oauth-provider.js.map +1 -1
  436. package/dist/src/mcp/oauth-token-storage.js +7 -1
  437. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  438. package/dist/src/mcp/oauth-token-storage.test.js +55 -0
  439. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  440. package/dist/src/mcp/stored-token-provider.d.ts +27 -0
  441. package/dist/src/mcp/stored-token-provider.js +76 -0
  442. package/dist/src/mcp/stored-token-provider.js.map +1 -0
  443. package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -2
  444. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  445. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +14 -1
  446. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  447. package/dist/src/output/json-formatter.d.ts +1 -1
  448. package/dist/src/output/json-formatter.js +4 -1
  449. package/dist/src/output/json-formatter.js.map +1 -1
  450. package/dist/src/output/json-formatter.test.js +7 -0
  451. package/dist/src/output/json-formatter.test.js.map +1 -1
  452. package/dist/src/output/types.d.ts +1 -0
  453. package/dist/src/output/types.js.map +1 -1
  454. package/dist/src/policy/config.js +25 -0
  455. package/dist/src/policy/config.js.map +1 -1
  456. package/dist/src/policy/config.test.js +80 -0
  457. package/dist/src/policy/config.test.js.map +1 -1
  458. package/dist/src/policy/core-tools-mapping.test.js +9 -1
  459. package/dist/src/policy/core-tools-mapping.test.js.map +1 -1
  460. package/dist/src/policy/policies/plan.toml +1 -1
  461. package/dist/src/policy/policies/write.toml +0 -7
  462. package/dist/src/policy/policy-engine.test.js +0 -8
  463. package/dist/src/policy/policy-engine.test.js.map +1 -1
  464. package/dist/src/policy/sandboxPolicyManager.d.ts +20 -20
  465. package/dist/src/policy/stable-stringify.js +10 -6
  466. package/dist/src/policy/stable-stringify.js.map +1 -1
  467. package/dist/src/policy/stable-stringify.test.js +157 -0
  468. package/dist/src/policy/stable-stringify.test.js.map +1 -0
  469. package/dist/src/policy/types.d.ts +1 -0
  470. package/dist/src/policy/types.js.map +1 -1
  471. package/dist/src/prompts/promptProvider.js +8 -9
  472. package/dist/src/prompts/promptProvider.js.map +1 -1
  473. package/dist/src/prompts/promptProvider.test.js +3 -1
  474. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  475. package/dist/src/prompts/snippets-memory.test.d.ts +6 -0
  476. package/dist/src/prompts/{snippets-memory-v2.test.js → snippets-memory.test.js} +5 -23
  477. package/dist/src/prompts/snippets-memory.test.js.map +1 -0
  478. package/dist/src/prompts/snippets.d.ts +6 -11
  479. package/dist/src/prompts/snippets.js +28 -30
  480. package/dist/src/prompts/snippets.js.map +1 -1
  481. package/dist/src/prompts/snippets.legacy.d.ts +0 -1
  482. package/dist/src/prompts/snippets.legacy.js +8 -15
  483. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  484. package/dist/src/routing/strategies/approvalModeStrategy.js +5 -3
  485. package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -1
  486. package/dist/src/routing/strategies/approvalModeStrategy.test.js +9 -0
  487. package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -1
  488. package/dist/src/routing/strategies/classifierStrategy.js +18 -4
  489. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  490. package/dist/src/routing/strategies/classifierStrategy.test.js +77 -1
  491. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  492. package/dist/src/routing/strategies/defaultStrategy.js +1 -1
  493. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -1
  494. package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
  495. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  496. package/dist/src/routing/strategies/gemmaClassifierStrategy.js +7 -1
  497. package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -1
  498. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +15 -1
  499. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -1
  500. package/dist/src/routing/strategies/numericalClassifierStrategy.d.ts +1 -0
  501. package/dist/src/routing/strategies/numericalClassifierStrategy.js +32 -5
  502. package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
  503. package/dist/src/routing/strategies/numericalClassifierStrategy.test.js +247 -25
  504. package/dist/src/routing/strategies/numericalClassifierStrategy.test.js.map +1 -1
  505. package/dist/src/routing/strategies/overrideStrategy.js +1 -1
  506. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  507. package/dist/src/sandbox/utils/commandSafety.js +22 -2
  508. package/dist/src/sandbox/utils/commandSafety.js.map +1 -1
  509. package/dist/src/sandbox/utils/commandSafety.test.d.ts +6 -0
  510. package/dist/src/sandbox/utils/commandSafety.test.js +85 -0
  511. package/dist/src/sandbox/utils/commandSafety.test.js.map +1 -0
  512. package/dist/src/scheduler/confirmation.test.js +29 -0
  513. package/dist/src/scheduler/confirmation.test.js.map +1 -1
  514. package/dist/src/scheduler/scheduler.js +15 -0
  515. package/dist/src/scheduler/scheduler.js.map +1 -1
  516. package/dist/src/scheduler/scheduler.test.js +1 -1
  517. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  518. package/dist/src/scheduler/scheduler_parallel.test.js +37 -0
  519. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
  520. package/dist/src/scheduler/state-manager.js +5 -1
  521. package/dist/src/scheduler/state-manager.js.map +1 -1
  522. package/dist/src/scheduler/tool-executor.js +7 -4
  523. package/dist/src/scheduler/tool-executor.js.map +1 -1
  524. package/dist/src/scheduler/types.d.ts +5 -1
  525. package/dist/src/scheduler/types.js.map +1 -1
  526. package/dist/src/services/chatRecordingService.d.ts +14 -7
  527. package/dist/src/services/chatRecordingService.js +157 -133
  528. package/dist/src/services/chatRecordingService.js.map +1 -1
  529. package/dist/src/services/chatRecordingService.test.js +189 -52
  530. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  531. package/dist/src/services/fileDiscoveryService.js +2 -1
  532. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  533. package/dist/src/services/fileDiscoveryService.test.js +36 -0
  534. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  535. package/dist/src/services/gitService.js +43 -4
  536. package/dist/src/services/gitService.js.map +1 -1
  537. package/dist/src/services/gitService.test.js +105 -1
  538. package/dist/src/services/gitService.test.js.map +1 -1
  539. package/dist/src/services/keychainService.js +14 -5
  540. package/dist/src/services/keychainService.js.map +1 -1
  541. package/dist/src/services/memoryPatchUtils.d.ts +93 -0
  542. package/dist/src/services/memoryPatchUtils.js +310 -2
  543. package/dist/src/services/memoryPatchUtils.js.map +1 -1
  544. package/dist/src/services/memoryService.d.ts +2 -0
  545. package/dist/src/services/memoryService.js +214 -9
  546. package/dist/src/services/memoryService.js.map +1 -1
  547. package/dist/src/services/memoryService.test.js +133 -0
  548. package/dist/src/services/memoryService.test.js.map +1 -1
  549. package/dist/src/services/modelConfigService.d.ts +3 -0
  550. package/dist/src/services/modelConfigService.js +22 -13
  551. package/dist/src/services/modelConfigService.js.map +1 -1
  552. package/dist/src/services/modelConfigService.test.js +73 -0
  553. package/dist/src/services/modelConfigService.test.js.map +1 -1
  554. package/dist/src/services/shellExecutionService.js +88 -41
  555. package/dist/src/services/shellExecutionService.js.map +1 -1
  556. package/dist/src/services/shellExecutionService.test.js +22 -9
  557. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  558. package/dist/src/services/shellExecutionService.windows.integration.test.d.ts +6 -0
  559. package/dist/src/services/shellExecutionService.windows.integration.test.js +63 -0
  560. package/dist/src/services/shellExecutionService.windows.integration.test.js.map +1 -0
  561. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +85 -7
  562. package/dist/src/services/test-data/resolved-aliases.golden.json +85 -7
  563. package/dist/src/services/trackerTypes.d.ts +4 -4
  564. package/dist/src/skills/skillManager.d.ts +4 -0
  565. package/dist/src/skills/skillManager.js +6 -0
  566. package/dist/src/skills/skillManager.js.map +1 -1
  567. package/dist/src/skills/skillManager.test.js +10 -0
  568. package/dist/src/skills/skillManager.test.js.map +1 -1
  569. package/dist/src/telemetry/file-exporters.d.ts +4 -1
  570. package/dist/src/telemetry/file-exporters.js +21 -3
  571. package/dist/src/telemetry/file-exporters.js.map +1 -1
  572. package/dist/src/telemetry/file-exporters.test.js +32 -2
  573. package/dist/src/telemetry/file-exporters.test.js.map +1 -1
  574. package/dist/src/telemetry/gcp-exporters.d.ts +3 -0
  575. package/dist/src/telemetry/gcp-exporters.js +72 -5
  576. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  577. package/dist/src/telemetry/gcp-exporters.test.js +52 -0
  578. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
  579. package/dist/src/telemetry/heap-snapshot.d.ts +12 -0
  580. package/dist/src/telemetry/heap-snapshot.js +35 -0
  581. package/dist/src/telemetry/heap-snapshot.js.map +1 -0
  582. package/dist/src/telemetry/heap-snapshot.test.d.ts +6 -0
  583. package/dist/src/telemetry/heap-snapshot.test.js +38 -0
  584. package/dist/src/telemetry/heap-snapshot.test.js.map +1 -0
  585. package/dist/src/telemetry/index.d.ts +1 -0
  586. package/dist/src/telemetry/index.js +1 -0
  587. package/dist/src/telemetry/index.js.map +1 -1
  588. package/dist/src/telemetry/loggers.test.js +1 -0
  589. package/dist/src/telemetry/loggers.test.js.map +1 -1
  590. package/dist/src/telemetry/memory-monitor.d.ts +5 -0
  591. package/dist/src/telemetry/memory-monitor.js +8 -0
  592. package/dist/src/telemetry/memory-monitor.js.map +1 -1
  593. package/dist/src/telemetry/metrics.js +13 -2
  594. package/dist/src/telemetry/metrics.js.map +1 -1
  595. package/dist/src/telemetry/metrics.test.js +61 -1
  596. package/dist/src/telemetry/metrics.test.js.map +1 -1
  597. package/dist/src/test-utils/config.js +10 -1
  598. package/dist/src/test-utils/config.js.map +1 -1
  599. package/dist/src/tools/ask-user.js +25 -1
  600. package/dist/src/tools/ask-user.js.map +1 -1
  601. package/dist/src/tools/ask-user.test.js +46 -1
  602. package/dist/src/tools/ask-user.test.js.map +1 -1
  603. package/dist/src/tools/definitions/base-declarations.d.ts +0 -3
  604. package/dist/src/tools/definitions/base-declarations.js +0 -4
  605. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  606. package/dist/src/tools/definitions/coreTools.d.ts +1 -2
  607. package/dist/src/tools/definitions/coreTools.js +2 -8
  608. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  609. package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js +1 -2
  610. package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js.map +1 -1
  611. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +7 -31
  612. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  613. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +9 -26
  614. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  615. package/dist/src/tools/definitions/types.d.ts +0 -1
  616. package/dist/src/tools/edit.js +27 -5
  617. package/dist/src/tools/edit.js.map +1 -1
  618. package/dist/src/tools/edit.test.js +37 -0
  619. package/dist/src/tools/edit.test.js.map +1 -1
  620. package/dist/src/tools/grep.js +14 -2
  621. package/dist/src/tools/grep.js.map +1 -1
  622. package/dist/src/tools/grep.test.js +17 -0
  623. package/dist/src/tools/grep.test.js.map +1 -1
  624. package/dist/src/tools/jit-context.d.ts +1 -1
  625. package/dist/src/tools/jit-context.js +1 -4
  626. package/dist/src/tools/jit-context.js.map +1 -1
  627. package/dist/src/tools/jit-context.test.js +1 -13
  628. package/dist/src/tools/jit-context.test.js.map +1 -1
  629. package/dist/src/tools/ls.js +5 -0
  630. package/dist/src/tools/ls.js.map +1 -1
  631. package/dist/src/tools/mcp-client-manager.js +2 -1
  632. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  633. package/dist/src/tools/mcp-client-manager.test.js +29 -0
  634. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  635. package/dist/src/tools/mcp-client.js +89 -50
  636. package/dist/src/tools/mcp-client.js.map +1 -1
  637. package/dist/src/tools/mcp-client.test.js +353 -59
  638. package/dist/src/tools/mcp-client.test.js.map +1 -1
  639. package/dist/src/tools/{xcode-mcp-fix-transport.d.ts → mcp-compliance-transport.d.ts} +6 -6
  640. package/dist/src/tools/{xcode-mcp-fix-transport.js → mcp-compliance-transport.js} +6 -6
  641. package/dist/src/tools/mcp-compliance-transport.js.map +1 -0
  642. package/dist/src/tools/mcp-compliance-transport.test.d.ts +6 -0
  643. package/dist/src/tools/mcp-compliance-transport.test.js +162 -0
  644. package/dist/src/tools/mcp-compliance-transport.test.js.map +1 -0
  645. package/dist/src/tools/memoryTool.d.ts +9 -31
  646. package/dist/src/tools/memoryTool.js +47 -262
  647. package/dist/src/tools/memoryTool.js.map +1 -1
  648. package/dist/src/tools/memoryTool.test.js +41 -312
  649. package/dist/src/tools/memoryTool.test.js.map +1 -1
  650. package/dist/src/tools/read-file.js +11 -6
  651. package/dist/src/tools/read-file.js.map +1 -1
  652. package/dist/src/tools/read-file.test.js +20 -8
  653. package/dist/src/tools/read-file.test.js.map +1 -1
  654. package/dist/src/tools/read-many-files.js +2 -2
  655. package/dist/src/tools/read-many-files.js.map +1 -1
  656. package/dist/src/tools/ripGrep.d.ts +3 -7
  657. package/dist/src/tools/ripGrep.js +57 -35
  658. package/dist/src/tools/ripGrep.js.map +1 -1
  659. package/dist/src/tools/ripGrep.test.js +197 -276
  660. package/dist/src/tools/ripGrep.test.js.map +1 -1
  661. package/dist/src/tools/shell.d.ts +5 -3
  662. package/dist/src/tools/shell.js +130 -36
  663. package/dist/src/tools/shell.js.map +1 -1
  664. package/dist/src/tools/shell.test.js +186 -14
  665. package/dist/src/tools/shell.test.js.map +1 -1
  666. package/dist/src/tools/shell_proactive.test.js +1 -0
  667. package/dist/src/tools/shell_proactive.test.js.map +1 -1
  668. package/dist/src/tools/tool-names.d.ts +3 -3
  669. package/dist/src/tools/tool-names.js +4 -5
  670. package/dist/src/tools/tool-names.js.map +1 -1
  671. package/dist/src/tools/tool-registry.js +1 -1
  672. package/dist/src/tools/tool-registry.js.map +1 -1
  673. package/dist/src/tools/tools.d.ts +6 -0
  674. package/dist/src/tools/tools.js.map +1 -1
  675. package/dist/src/tools/topicTool.js +5 -0
  676. package/dist/src/tools/topicTool.js.map +1 -1
  677. package/dist/src/tools/write-file.js +13 -0
  678. package/dist/src/tools/write-file.js.map +1 -1
  679. package/dist/src/tools/write-file.test.js +8 -0
  680. package/dist/src/tools/write-file.test.js.map +1 -1
  681. package/dist/src/utils/atCommandUtils.d.ts +35 -0
  682. package/dist/src/utils/atCommandUtils.js +163 -0
  683. package/dist/src/utils/atCommandUtils.js.map +1 -0
  684. package/dist/src/utils/atCommandUtils.test.d.ts +6 -0
  685. package/dist/src/utils/atCommandUtils.test.js +292 -0
  686. package/dist/src/utils/atCommandUtils.test.js.map +1 -0
  687. package/dist/src/utils/channel.d.ts +8 -0
  688. package/dist/src/utils/channel.js +21 -10
  689. package/dist/src/utils/channel.js.map +1 -1
  690. package/dist/src/utils/cryptoUtils.d.ts +11 -0
  691. package/dist/src/utils/cryptoUtils.js +19 -0
  692. package/dist/src/utils/cryptoUtils.js.map +1 -0
  693. package/dist/src/utils/cryptoUtils.test.d.ts +6 -0
  694. package/dist/src/utils/cryptoUtils.test.js +31 -0
  695. package/dist/src/utils/cryptoUtils.test.js.map +1 -0
  696. package/dist/src/utils/editor.d.ts +29 -3
  697. package/dist/src/utils/editor.js +94 -3
  698. package/dist/src/utils/editor.js.map +1 -1
  699. package/dist/src/utils/editor.test.js +176 -2
  700. package/dist/src/utils/editor.test.js.map +1 -1
  701. package/dist/src/utils/environmentContext.d.ts +2 -1
  702. package/dist/src/utils/environmentContext.js +15 -8
  703. package/dist/src/utils/environmentContext.js.map +1 -1
  704. package/dist/src/utils/environmentContext.test.js +4 -14
  705. package/dist/src/utils/environmentContext.test.js.map +1 -1
  706. package/dist/src/utils/errors.js +3 -8
  707. package/dist/src/utils/errors.js.map +1 -1
  708. package/dist/src/utils/events.d.ts +26 -1
  709. package/dist/src/utils/events.js +21 -2
  710. package/dist/src/utils/events.js.map +1 -1
  711. package/dist/src/utils/events.test.js +39 -0
  712. package/dist/src/utils/events.test.js.map +1 -1
  713. package/dist/src/utils/extensionLoader.js +2 -2
  714. package/dist/src/utils/extensionLoader.js.map +1 -1
  715. package/dist/src/utils/extensionLoader.test.js +22 -15
  716. package/dist/src/utils/extensionLoader.test.js.map +1 -1
  717. package/dist/src/utils/fetch.d.ts +3 -3
  718. package/dist/src/utils/fetch.js +41 -17
  719. package/dist/src/utils/fetch.js.map +1 -1
  720. package/dist/src/utils/fetch.test.js +93 -17
  721. package/dist/src/utils/fetch.test.js.map +1 -1
  722. package/dist/src/utils/fileUtils.js +4 -1
  723. package/dist/src/utils/fileUtils.js.map +1 -1
  724. package/dist/src/utils/filesearch/fileSearch.js +20 -9
  725. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  726. package/dist/src/utils/filesearch/ignore.js +4 -1
  727. package/dist/src/utils/filesearch/ignore.js.map +1 -1
  728. package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -0
  729. package/dist/src/utils/generateContentResponseUtilities.js +37 -7
  730. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  731. package/dist/src/utils/generateContentResponseUtilities.test.js +33 -0
  732. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  733. package/dist/src/utils/gitUtils.d.ts +5 -0
  734. package/dist/src/utils/gitUtils.js +11 -0
  735. package/dist/src/utils/gitUtils.js.map +1 -1
  736. package/dist/src/utils/historyHardening.d.ts +37 -0
  737. package/dist/src/utils/historyHardening.js +332 -0
  738. package/dist/src/utils/historyHardening.js.map +1 -0
  739. package/dist/src/utils/historyHardening.test.d.ts +6 -0
  740. package/dist/src/utils/historyHardening.test.js +317 -0
  741. package/dist/src/utils/historyHardening.test.js.map +1 -0
  742. package/dist/src/utils/ignoreFileParser.js +1 -1
  743. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  744. package/dist/src/utils/ignorePatterns.js +2 -0
  745. package/dist/src/utils/ignorePatterns.js.map +1 -1
  746. package/dist/src/utils/ignorePatterns.test.js +1 -0
  747. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  748. package/dist/src/utils/memoryDiscovery.d.ts +0 -20
  749. package/dist/src/utils/memoryDiscovery.js +57 -220
  750. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  751. package/dist/src/utils/memoryDiscovery.test.js +112 -403
  752. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  753. package/dist/src/utils/modelUtils.d.ts +14 -0
  754. package/dist/src/utils/modelUtils.js +17 -0
  755. package/dist/src/utils/modelUtils.js.map +1 -0
  756. package/dist/src/utils/modelUtils.test.d.ts +6 -0
  757. package/dist/src/utils/modelUtils.test.js +23 -0
  758. package/dist/src/utils/modelUtils.test.js.map +1 -0
  759. package/dist/src/utils/partUtils.d.ts +26 -1
  760. package/dist/src/utils/partUtils.js +37 -0
  761. package/dist/src/utils/partUtils.js.map +1 -1
  762. package/dist/src/utils/path-validator.d.ts +17 -0
  763. package/dist/src/utils/path-validator.js +76 -0
  764. package/dist/src/utils/path-validator.js.map +1 -0
  765. package/dist/src/utils/path-validator.test.d.ts +6 -0
  766. package/dist/src/utils/path-validator.test.js +91 -0
  767. package/dist/src/utils/path-validator.test.js.map +1 -0
  768. package/dist/src/utils/pathReader.js +12 -0
  769. package/dist/src/utils/pathReader.js.map +1 -1
  770. package/dist/src/utils/pathReader.test.js +95 -0
  771. package/dist/src/utils/pathReader.test.js.map +1 -1
  772. package/dist/src/utils/paths.d.ts +19 -1
  773. package/dist/src/utils/paths.js +74 -9
  774. package/dist/src/utils/paths.js.map +1 -1
  775. package/dist/src/utils/paths.test.js +111 -1
  776. package/dist/src/utils/paths.test.js.map +1 -1
  777. package/dist/src/utils/quotaErrorDetection.js +23 -12
  778. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  779. package/dist/src/utils/ragLogger.d.ts +32 -0
  780. package/dist/src/utils/ragLogger.js +56 -0
  781. package/dist/src/utils/ragLogger.js.map +1 -0
  782. package/dist/src/utils/ragLogger.test.d.ts +6 -0
  783. package/dist/src/utils/ragLogger.test.js +97 -0
  784. package/dist/src/utils/ragLogger.test.js.map +1 -0
  785. package/dist/src/utils/retry.js +8 -3
  786. package/dist/src/utils/retry.js.map +1 -1
  787. package/dist/src/utils/retry.test.js +17 -0
  788. package/dist/src/utils/retry.test.js.map +1 -1
  789. package/dist/src/utils/safeJsonStringify.js +0 -2
  790. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  791. package/dist/src/utils/sessionOperations.d.ts +26 -0
  792. package/dist/src/utils/sessionOperations.js +177 -8
  793. package/dist/src/utils/sessionOperations.js.map +1 -1
  794. package/dist/src/utils/sessionUtils.d.ts +11 -5
  795. package/dist/src/utils/sessionUtils.js +139 -68
  796. package/dist/src/utils/sessionUtils.js.map +1 -1
  797. package/dist/src/utils/sessionUtils.test.js +31 -5
  798. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  799. package/dist/src/utils/shell-utils.d.ts +9 -1
  800. package/dist/src/utils/shell-utils.js +51 -20
  801. package/dist/src/utils/shell-utils.js.map +1 -1
  802. package/dist/src/utils/shell-utils.test.js +87 -46
  803. package/dist/src/utils/shell-utils.test.js.map +1 -1
  804. package/dist/src/utils/textUtils.d.ts +12 -2
  805. package/dist/src/utils/textUtils.js +30 -3
  806. package/dist/src/utils/textUtils.js.map +1 -1
  807. package/dist/src/utils/textUtils.test.js +96 -1
  808. package/dist/src/utils/textUtils.test.js.map +1 -1
  809. package/dist/src/utils/tokenCalculation.d.ts +3 -2
  810. package/dist/src/utils/tokenCalculation.js +9 -5
  811. package/dist/src/utils/tokenCalculation.js.map +1 -1
  812. package/dist/src/utils/tokenCalculation.test.js +15 -0
  813. package/dist/src/utils/tokenCalculation.test.js.map +1 -1
  814. package/dist/tsconfig.tsbuildinfo +1 -1
  815. package/package.json +18 -18
  816. package/dist/src/context/historyObserver.d.ts +0 -28
  817. package/dist/src/context/historyObserver.js +0 -63
  818. package/dist/src/context/historyObserver.js.map +0 -1
  819. package/dist/src/policy/memory-manager-policy.test.js +0 -80
  820. package/dist/src/policy/memory-manager-policy.test.js.map +0 -1
  821. package/dist/src/policy/policies/memory-manager.toml +0 -20
  822. package/dist/src/prompts/snippets-memory-v2.test.js.map +0 -1
  823. package/dist/src/tools/xcode-mcp-fix-transport.js.map +0 -1
  824. package/dist/src/tools/xcode-mcp-fix-transport.test.d.ts +0 -1
  825. package/dist/src/tools/xcode-mcp-fix-transport.test.js +0 -98
  826. package/dist/src/tools/xcode-mcp-fix-transport.test.js.map +0 -1
  827. package/dist/src/utils/systemEncoding.d.ts +0 -40
  828. package/dist/src/utils/systemEncoding.js +0 -150
  829. package/dist/src/utils/systemEncoding.js.map +0 -1
  830. package/dist/src/utils/systemEncoding.test.js +0 -369
  831. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  832. /package/dist/src/{policy/memory-manager-policy.test.d.ts → agents/local-session-invocation.test.d.ts} +0 -0
  833. /package/dist/src/{prompts/snippets-memory-v2.test.d.ts → agents/local-subagent-protocol.test.d.ts} +0 -0
  834. /package/dist/src/{utils/systemEncoding.test.d.ts → policy/stable-stringify.test.d.ts} +0 -0
@@ -4,9 +4,9 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
- import { canUseRipgrep, RipGrepTool, ensureRgPath, getRipgrepPath, } from './ripGrep.js';
7
+ import { RipGrepTool, resolveRipgrepPath, } from './ripGrep.js';
8
8
  import path from 'node:path';
9
- import { isSubpath } from '../utils/paths.js';
9
+ import { isSubpath, resolveToRealPath } from '../utils/paths.js';
10
10
  import fs from 'node:fs/promises';
11
11
  import os from 'node:os';
12
12
  import { GEMINI_IGNORE_FILE_NAME } from '../config/constants.js';
@@ -16,6 +16,7 @@ import { PassThrough, Readable } from 'node:stream';
16
16
  import EventEmitter from 'node:events';
17
17
  import { createMockMessageBus } from '../test-utils/mock-message-bus.js';
18
18
  import { fileExists } from '../utils/fileUtils.js';
19
+ import { resolveExecutable } from '../utils/shell-utils.js';
19
20
  vi.mock('../utils/fileUtils.js', async (importOriginal) => {
20
21
  const actual = await importOriginal();
21
22
  return {
@@ -23,40 +24,26 @@ vi.mock('../utils/fileUtils.js', async (importOriginal) => {
23
24
  fileExists: vi.fn(),
24
25
  };
25
26
  });
27
+ vi.mock('../utils/shell-utils.js', async (importOriginal) => {
28
+ const actual = await importOriginal();
29
+ return {
30
+ ...actual,
31
+ resolveExecutable: vi.fn(),
32
+ };
33
+ });
34
+ vi.mock('../utils/paths.js', async (importOriginal) => {
35
+ const actual = await importOriginal();
36
+ return {
37
+ ...actual,
38
+ resolveToRealPath: vi.fn((p) => p),
39
+ normalizePath: vi.fn((p) => typeof p === 'string' ? p.replace(/\\/g, '/') : p),
40
+ };
41
+ });
26
42
  // Mock child_process for ripgrep calls
27
43
  vi.mock('child_process', () => ({
28
44
  spawn: vi.fn(),
29
45
  }));
30
46
  const mockSpawn = vi.mocked(spawn);
31
- describe('canUseRipgrep', () => {
32
- beforeEach(() => {
33
- vi.mocked(fileExists).mockReset();
34
- });
35
- it('should return true if ripgrep already exists', async () => {
36
- vi.mocked(fileExists).mockResolvedValue(true);
37
- const result = await canUseRipgrep();
38
- expect(result).toBe(true);
39
- });
40
- it('should return false if file does not exist', async () => {
41
- vi.mocked(fileExists).mockResolvedValue(false);
42
- const result = await canUseRipgrep();
43
- expect(result).toBe(false);
44
- });
45
- });
46
- describe('ensureRgPath', () => {
47
- beforeEach(() => {
48
- vi.mocked(fileExists).mockReset();
49
- });
50
- it('should return rg path if ripgrep already exists', async () => {
51
- vi.mocked(fileExists).mockResolvedValue(true);
52
- const rgPath = await ensureRgPath();
53
- expect(rgPath).toBe(await getRipgrepPath());
54
- });
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/);
58
- });
59
- });
60
47
  // Helper function to create mock spawn implementations
61
48
  function createMockSpawn(options = {}) {
62
49
  const { outputData, exitCode = 0, signal } = options;
@@ -90,56 +77,56 @@ function createMockSpawn(options = {}) {
90
77
  return mockProcess;
91
78
  };
92
79
  }
93
- describe('RipGrepTool', () => {
94
- let tempRootDir;
95
- let grepTool;
96
- const abortSignal = new AbortController().signal;
97
- let mockConfig = {
98
- getTargetDir: () => tempRootDir,
99
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir),
80
+ // Helper function to create a mock Config
81
+ function createMockConfig(rootDir, workspaceDirs = [rootDir]) {
82
+ const config = {
83
+ getTargetDir: () => rootDir,
84
+ getWorkspaceContext: () => createMockWorkspaceContext(rootDir, workspaceDirs),
100
85
  getDebugMode: () => false,
101
- getFileFilteringRespectGitIgnore: () => true,
102
- getFileFilteringRespectGeminiIgnore: () => true,
103
86
  getFileFilteringOptions: () => ({
104
87
  respectGitIgnore: true,
105
88
  respectGeminiIgnore: true,
89
+ customIgnoreFilePaths: [],
106
90
  }),
91
+ getFileFilteringRespectGitIgnore() {
92
+ return this.getFileFilteringOptions().respectGitIgnore;
93
+ },
94
+ getFileFilteringRespectGeminiIgnore() {
95
+ return this.getFileFilteringOptions().respectGeminiIgnore;
96
+ },
97
+ storage: {
98
+ getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
99
+ },
100
+ isPathAllowed(absolutePath) {
101
+ const workspaceContext = this.getWorkspaceContext();
102
+ if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
103
+ return true;
104
+ }
105
+ const projectTempDir = this.storage.getProjectTempDir();
106
+ return isSubpath(path.resolve(projectTempDir), absolutePath);
107
+ },
108
+ validatePathAccess(absolutePath) {
109
+ if (this.isPathAllowed(absolutePath)) {
110
+ return null;
111
+ }
112
+ const workspaceDirs = this.getWorkspaceContext().getDirectories();
113
+ const projectTempDir = this.storage.getProjectTempDir();
114
+ return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
115
+ },
116
+ getRipgrepPath: vi.fn().mockResolvedValue('/mock/rg'),
107
117
  };
118
+ return config;
119
+ }
120
+ describe('RipGrepTool', () => {
121
+ let tempRootDir;
122
+ let grepTool;
123
+ const abortSignal = new AbortController().signal;
124
+ let mockConfig;
108
125
  beforeEach(async () => {
109
126
  mockSpawn.mockReset();
110
127
  mockSpawn.mockImplementation(createMockSpawn());
111
128
  tempRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'grep-tool-root-'));
112
- vi.mocked(fileExists).mockResolvedValue(true);
113
- mockConfig = {
114
- getTargetDir: () => tempRootDir,
115
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir),
116
- getDebugMode: () => false,
117
- getFileFilteringRespectGitIgnore: () => true,
118
- getFileFilteringRespectGeminiIgnore: () => true,
119
- getFileFilteringOptions: () => ({
120
- respectGitIgnore: true,
121
- respectGeminiIgnore: true,
122
- }),
123
- storage: {
124
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
125
- },
126
- isPathAllowed(absolutePath) {
127
- const workspaceContext = this.getWorkspaceContext();
128
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
129
- return true;
130
- }
131
- const projectTempDir = this.storage.getProjectTempDir();
132
- return isSubpath(path.resolve(projectTempDir), absolutePath);
133
- },
134
- validatePathAccess(absolutePath) {
135
- if (this.isPathAllowed(absolutePath)) {
136
- return null;
137
- }
138
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
139
- const projectTempDir = this.storage.getProjectTempDir();
140
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
141
- },
142
- };
129
+ mockConfig = createMockConfig(tempRootDir);
143
130
  grepTool = new RipGrepTool(mockConfig, createMockMessageBus());
144
131
  // Create some test files and directories
145
132
  await fs.writeFile(path.join(tempRootDir, 'fileA.txt'), 'hello world\nsecond line with world');
@@ -522,13 +509,13 @@ describe('RipGrepTool', () => {
522
509
  expect(() => grepTool.build(params)).toThrow(/params must have required property 'pattern'/);
523
510
  });
524
511
  it('should throw an error if ripgrep is not available', async () => {
525
- vi.mocked(fileExists).mockResolvedValue(false);
512
+ vi.mocked(mockConfig.getRipgrepPath).mockResolvedValue(null);
526
513
  const params = { pattern: 'world' };
527
514
  const invocation = grepTool.build(params);
528
515
  const result = await invocation.execute({ abortSignal });
529
516
  expect(result.llmContent).toContain('Cannot find bundled ripgrep binary');
530
517
  // restore the mock for subsequent tests
531
- vi.mocked(fileExists).mockResolvedValue(true);
518
+ vi.mocked(mockConfig.getRipgrepPath).mockResolvedValue('/mock/rg');
532
519
  });
533
520
  });
534
521
  describe('multi-directory workspace', () => {
@@ -538,36 +525,7 @@ describe('RipGrepTool', () => {
538
525
  await fs.writeFile(path.join(secondDir, 'other.txt'), 'hello from second directory\nworld in second');
539
526
  await fs.writeFile(path.join(secondDir, 'another.js'), 'function world() { return "test"; }');
540
527
  // Create a mock config with multiple directories
541
- const multiDirConfig = {
542
- getTargetDir: () => tempRootDir,
543
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir, [secondDir]),
544
- getDebugMode: () => false,
545
- getFileFilteringRespectGitIgnore: () => true,
546
- getFileFilteringRespectGeminiIgnore: () => true,
547
- getFileFilteringOptions: () => ({
548
- respectGitIgnore: true,
549
- respectGeminiIgnore: true,
550
- }),
551
- storage: {
552
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
553
- },
554
- isPathAllowed(absolutePath) {
555
- const workspaceContext = this.getWorkspaceContext();
556
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
557
- return true;
558
- }
559
- const projectTempDir = this.storage.getProjectTempDir();
560
- return isSubpath(path.resolve(projectTempDir), absolutePath);
561
- },
562
- validatePathAccess(absolutePath) {
563
- if (this.isPathAllowed(absolutePath)) {
564
- return null;
565
- }
566
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
567
- const projectTempDir = this.storage.getProjectTempDir();
568
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
569
- },
570
- };
528
+ const multiDirConfig = createMockConfig(tempRootDir, [secondDir]);
571
529
  // Setup specific mock for this test - multi-directory search for 'world'
572
530
  // Mock will be called twice - once for each directory
573
531
  mockSpawn.mockImplementation(createMockSpawn({
@@ -626,36 +584,7 @@ describe('RipGrepTool', () => {
626
584
  await fs.mkdir(path.join(secondDir, 'sub'));
627
585
  await fs.writeFile(path.join(secondDir, 'sub', 'test.txt'), 'hello from second sub directory');
628
586
  // Create a mock config with multiple directories
629
- const multiDirConfig = {
630
- getTargetDir: () => tempRootDir,
631
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir, [secondDir]),
632
- getDebugMode: () => false,
633
- getFileFilteringRespectGitIgnore: () => true,
634
- getFileFilteringRespectGeminiIgnore: () => true,
635
- getFileFilteringOptions: () => ({
636
- respectGitIgnore: true,
637
- respectGeminiIgnore: true,
638
- }),
639
- storage: {
640
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
641
- },
642
- isPathAllowed(absolutePath) {
643
- const workspaceContext = this.getWorkspaceContext();
644
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
645
- return true;
646
- }
647
- const projectTempDir = this.storage.getProjectTempDir();
648
- return isSubpath(path.resolve(projectTempDir), absolutePath);
649
- },
650
- validatePathAccess(absolutePath) {
651
- if (this.isPathAllowed(absolutePath)) {
652
- return null;
653
- }
654
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
655
- const projectTempDir = this.storage.getProjectTempDir();
656
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
657
- },
658
- };
587
+ const multiDirConfig = createMockConfig(tempRootDir, [secondDir]);
659
588
  // Setup specific mock for this test - searching in 'sub' should only return matches from that directory
660
589
  mockSpawn.mockImplementation(createMockSpawn({
661
590
  outputData: JSON.stringify({
@@ -1025,36 +954,12 @@ describe('RipGrepTool', () => {
1025
954
  expect(result.llmContent).toContain('L1: secret log entry');
1026
955
  });
1027
956
  it('should disable gitignore rules when respectGitIgnore is false', async () => {
1028
- const configWithoutGitIgnore = {
1029
- getTargetDir: () => tempRootDir,
1030
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir),
1031
- getDebugMode: () => false,
1032
- getFileFilteringRespectGitIgnore: () => false,
1033
- getFileFilteringRespectGeminiIgnore: () => true,
1034
- getFileFilteringOptions: () => ({
1035
- respectGitIgnore: false,
1036
- respectGeminiIgnore: true,
1037
- }),
1038
- storage: {
1039
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
1040
- },
1041
- isPathAllowed(absolutePath) {
1042
- const workspaceContext = this.getWorkspaceContext();
1043
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
1044
- return true;
1045
- }
1046
- const projectTempDir = this.storage.getProjectTempDir();
1047
- return isSubpath(path.resolve(projectTempDir), absolutePath);
1048
- },
1049
- validatePathAccess(absolutePath) {
1050
- if (this.isPathAllowed(absolutePath)) {
1051
- return null;
1052
- }
1053
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
1054
- const projectTempDir = this.storage.getProjectTempDir();
1055
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
1056
- },
1057
- };
957
+ const configWithoutGitIgnore = createMockConfig(tempRootDir);
958
+ vi.spyOn(configWithoutGitIgnore, 'getFileFilteringOptions').mockReturnValue({
959
+ respectGitIgnore: false,
960
+ respectGeminiIgnore: true,
961
+ customIgnoreFilePaths: [],
962
+ });
1058
963
  const gitIgnoreDisabledTool = new RipGrepTool(configWithoutGitIgnore, createMockMessageBus());
1059
964
  mockSpawn.mockImplementation(createMockSpawn({
1060
965
  outputData: JSON.stringify({
@@ -1075,36 +980,12 @@ describe('RipGrepTool', () => {
1075
980
  it('should add .geminiignore when enabled and patterns exist', async () => {
1076
981
  const geminiIgnorePath = path.join(tempRootDir, GEMINI_IGNORE_FILE_NAME);
1077
982
  await fs.writeFile(geminiIgnorePath, 'ignored.log');
1078
- const configWithGeminiIgnore = {
1079
- getTargetDir: () => tempRootDir,
1080
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir),
1081
- getDebugMode: () => false,
1082
- getFileFilteringRespectGitIgnore: () => true,
1083
- getFileFilteringRespectGeminiIgnore: () => true,
1084
- getFileFilteringOptions: () => ({
1085
- respectGitIgnore: true,
1086
- respectGeminiIgnore: true,
1087
- }),
1088
- storage: {
1089
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
1090
- },
1091
- isPathAllowed(absolutePath) {
1092
- const workspaceContext = this.getWorkspaceContext();
1093
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
1094
- return true;
1095
- }
1096
- const projectTempDir = this.storage.getProjectTempDir();
1097
- return isSubpath(path.resolve(projectTempDir), absolutePath);
1098
- },
1099
- validatePathAccess(absolutePath) {
1100
- if (this.isPathAllowed(absolutePath)) {
1101
- return null;
1102
- }
1103
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
1104
- const projectTempDir = this.storage.getProjectTempDir();
1105
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
1106
- },
1107
- };
983
+ const configWithGeminiIgnore = createMockConfig(tempRootDir);
984
+ vi.spyOn(configWithGeminiIgnore, 'getFileFilteringOptions').mockReturnValue({
985
+ respectGitIgnore: true,
986
+ respectGeminiIgnore: true,
987
+ customIgnoreFilePaths: [],
988
+ });
1108
989
  const geminiIgnoreTool = new RipGrepTool(configWithGeminiIgnore, createMockMessageBus());
1109
990
  mockSpawn.mockImplementation(createMockSpawn({
1110
991
  outputData: JSON.stringify({
@@ -1125,36 +1006,12 @@ describe('RipGrepTool', () => {
1125
1006
  it('should skip .geminiignore when disabled', async () => {
1126
1007
  const geminiIgnorePath = path.join(tempRootDir, GEMINI_IGNORE_FILE_NAME);
1127
1008
  await fs.writeFile(geminiIgnorePath, 'ignored.log');
1128
- const configWithoutGeminiIgnore = {
1129
- getTargetDir: () => tempRootDir,
1130
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir),
1131
- getDebugMode: () => false,
1132
- getFileFilteringRespectGitIgnore: () => true,
1133
- getFileFilteringRespectGeminiIgnore: () => false,
1134
- getFileFilteringOptions: () => ({
1135
- respectGitIgnore: true,
1136
- respectGeminiIgnore: false,
1137
- }),
1138
- storage: {
1139
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
1140
- },
1141
- isPathAllowed(absolutePath) {
1142
- const workspaceContext = this.getWorkspaceContext();
1143
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
1144
- return true;
1145
- }
1146
- const projectTempDir = this.storage.getProjectTempDir();
1147
- return isSubpath(path.resolve(projectTempDir), absolutePath);
1148
- },
1149
- validatePathAccess(absolutePath) {
1150
- if (this.isPathAllowed(absolutePath)) {
1151
- return null;
1152
- }
1153
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
1154
- const projectTempDir = this.storage.getProjectTempDir();
1155
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
1156
- },
1157
- };
1009
+ const configWithoutGeminiIgnore = createMockConfig(tempRootDir);
1010
+ vi.spyOn(configWithoutGeminiIgnore, 'getFileFilteringOptions').mockReturnValue({
1011
+ respectGitIgnore: true,
1012
+ respectGeminiIgnore: false,
1013
+ customIgnoreFilePaths: [],
1014
+ });
1158
1015
  const geminiIgnoreTool = new RipGrepTool(configWithoutGeminiIgnore, createMockMessageBus());
1159
1016
  mockSpawn.mockImplementation(createMockSpawn({
1160
1017
  outputData: JSON.stringify({
@@ -1269,34 +1126,7 @@ describe('RipGrepTool', () => {
1269
1126
  expect(invocation.getDescription()).toContain(path.join('src', 'app'));
1270
1127
  });
1271
1128
  it('should use ./ when no path is specified (defaults to CWD)', () => {
1272
- const multiDirConfig = {
1273
- getTargetDir: () => tempRootDir,
1274
- getWorkspaceContext: () => createMockWorkspaceContext(tempRootDir, ['/another/dir']),
1275
- getDebugMode: () => false,
1276
- getFileFilteringOptions: () => ({
1277
- respectGitIgnore: true,
1278
- respectGeminiIgnore: true,
1279
- }),
1280
- storage: {
1281
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
1282
- },
1283
- isPathAllowed(absolutePath) {
1284
- const workspaceContext = this.getWorkspaceContext();
1285
- if (workspaceContext.isPathWithinWorkspace(absolutePath)) {
1286
- return true;
1287
- }
1288
- const projectTempDir = this.storage.getProjectTempDir();
1289
- return isSubpath(path.resolve(projectTempDir), absolutePath);
1290
- },
1291
- validatePathAccess(absolutePath) {
1292
- if (this.isPathAllowed(absolutePath)) {
1293
- return null;
1294
- }
1295
- const workspaceDirs = this.getWorkspaceContext().getDirectories();
1296
- const projectTempDir = this.storage.getProjectTempDir();
1297
- return `Path not in workspace: Attempted path "${absolutePath}" resolves outside the allowed workspace directories: ${workspaceDirs.join(', ')} or the project temp directory: ${projectTempDir}`;
1298
- },
1299
- };
1129
+ const multiDirConfig = createMockConfig(tempRootDir, ['/another/dir']);
1300
1130
  const multiDirGrepTool = new RipGrepTool(multiDirConfig, createMockMessageBus());
1301
1131
  const params = { pattern: 'testPattern' };
1302
1132
  const invocation = multiDirGrepTool.build(params);
@@ -1474,10 +1304,7 @@ describe('RipGrepTool', () => {
1474
1304
  });
1475
1305
  });
1476
1306
  });
1477
- describe('getRipgrepPath', () => {
1478
- afterEach(() => {
1479
- vi.restoreAllMocks();
1480
- });
1307
+ describe('resolveRipgrepPath', () => {
1481
1308
  describe('OS/Architecture Resolution', () => {
1482
1309
  it.each([
1483
1310
  { platform: 'darwin', arch: 'arm64', expectedBin: 'rg-darwin-arm64' },
@@ -1489,34 +1316,128 @@ describe('getRipgrepPath', () => {
1489
1316
  vi.spyOn(os, 'platform').mockReturnValue(platform);
1490
1317
  vi.spyOn(os, 'arch').mockReturnValue(arch);
1491
1318
  vi.mocked(fileExists).mockImplementation(async (checkPath) => checkPath.endsWith(expectedBin));
1492
- const resolvedPath = await getRipgrepPath();
1319
+ const resolvedPath = await resolveRipgrepPath();
1493
1320
  expect(resolvedPath).not.toBeNull();
1494
1321
  expect(resolvedPath?.endsWith(expectedBin)).toBe(true);
1495
1322
  });
1496
1323
  });
1497
1324
  describe('Path Fallback Logic', () => {
1498
- beforeEach(() => {
1499
- vi.spyOn(os, 'platform').mockReturnValue('linux');
1500
- vi.spyOn(os, 'arch').mockReturnValue('x64');
1325
+ afterEach(() => {
1326
+ vi.unstubAllGlobals();
1327
+ vi.unstubAllEnvs();
1501
1328
  });
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));
1329
+ describe('on POSIX', () => {
1330
+ beforeEach(() => {
1331
+ vi.spyOn(os, 'platform').mockReturnValue('linux');
1332
+ vi.spyOn(os, 'arch').mockReturnValue('x64');
1333
+ vi.stubGlobal('process', Object.create(process, {
1334
+ platform: {
1335
+ get: () => 'linux',
1336
+ },
1337
+ }));
1338
+ });
1339
+ it('should resolve the SEA (purely flattened) path first', async () => {
1340
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => {
1341
+ const expectedTarget = path.resolve(__dirname, `rg-linux-x64`);
1342
+ return checkPath.includes(expectedTarget);
1343
+ });
1344
+ const resolvedPath = await resolveRipgrepPath();
1345
+ expect(resolvedPath).not.toBeNull();
1346
+ expect(resolvedPath).toContain('rg-linux-x64');
1347
+ });
1348
+ it('should resolve the SEA (vendor subdirectory) path if purely flattened is missing', async () => {
1349
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => checkPath.includes(path.normalize('vendor/ripgrep')));
1350
+ const resolvedPath = await resolveRipgrepPath();
1351
+ expect(resolvedPath).not.toBeNull();
1352
+ expect(resolvedPath).toContain(path.normalize('vendor/ripgrep'));
1353
+ });
1354
+ it('should resolve the Dev/Dist layout (actual output with src/) if SEA path is missing', async () => {
1355
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => {
1356
+ // Normalize the expected check against the absolute resolved path logic
1357
+ const expectedTarget = path.resolve(__dirname, '../../../vendor/ripgrep');
1358
+ return checkPath.includes(expectedTarget);
1359
+ });
1360
+ const resolvedPath = await resolveRipgrepPath();
1361
+ expect(resolvedPath).not.toBeNull();
1362
+ expect(resolvedPath).toContain('vendor');
1363
+ });
1364
+ it('should resolve the Dev/Dist layout (assumed output without src/) if others are missing', async () => {
1365
+ vi.mocked(fileExists).mockImplementation(async (checkPath) => {
1366
+ const expectedTarget = path.resolve(__dirname, '../../vendor/ripgrep');
1367
+ const skipTarget = path.resolve(__dirname, '../../../vendor/ripgrep');
1368
+ return (checkPath.includes(expectedTarget) &&
1369
+ !checkPath.includes(skipTarget));
1370
+ });
1371
+ const resolvedPath = await resolveRipgrepPath();
1372
+ expect(resolvedPath).not.toBeNull();
1373
+ expect(resolvedPath).toContain('vendor');
1374
+ });
1375
+ it('should fall back to system PATH if both bundled paths are missing and system is trusted', async () => {
1376
+ vi.mocked(fileExists).mockResolvedValue(false);
1377
+ vi.mocked(resolveExecutable).mockReturnValue('/usr/bin/rg');
1378
+ vi.mocked(resolveToRealPath).mockReturnValue('/usr/bin/rg');
1379
+ const resolvedPath = await resolveRipgrepPath();
1380
+ expect(resolvedPath).toBe('/usr/bin/rg');
1381
+ expect(resolveExecutable).toHaveBeenCalledWith('rg');
1382
+ });
1383
+ it('should reject system PATH if it is in the current working directory', async () => {
1384
+ vi.mocked(fileExists).mockResolvedValue(false);
1385
+ const unsafePath = path.join(process.cwd(), 'rg');
1386
+ vi.mocked(resolveExecutable).mockReturnValue(unsafePath);
1387
+ vi.mocked(resolveToRealPath).mockReturnValue(unsafePath);
1388
+ const resolvedPath = await resolveRipgrepPath();
1389
+ expect(resolvedPath).toBeNull();
1390
+ });
1391
+ it('should allow system PATH if the real path is in a trusted directory (e.g. Homebrew Cellar)', async () => {
1392
+ vi.mocked(fileExists).mockResolvedValue(false);
1393
+ const trustedLink = '/usr/local/bin/rg';
1394
+ const trustedRealPath = '/opt/homebrew/Cellar/ripgrep/13.0.0/bin/rg';
1395
+ vi.mocked(resolveExecutable).mockReturnValue(trustedLink);
1396
+ vi.mocked(resolveToRealPath).mockReturnValue(trustedRealPath);
1397
+ const resolvedPath = await resolveRipgrepPath();
1398
+ expect(resolvedPath).toBe(trustedRealPath);
1399
+ });
1400
+ it('should return null if binary is missing from both bundled paths and system PATH', async () => {
1401
+ vi.mocked(fileExists).mockResolvedValue(false);
1402
+ vi.mocked(resolveExecutable).mockReturnValue(undefined);
1403
+ const resolvedPath = await resolveRipgrepPath();
1404
+ expect(resolvedPath).toBeNull();
1405
+ });
1406
+ it('should handle errors gracefully and return null', async () => {
1407
+ vi.mocked(fileExists).mockRejectedValue(new Error('File system error'));
1408
+ const resolvedPath = await resolveRipgrepPath();
1409
+ expect(resolvedPath).toBeNull();
1410
+ });
1515
1411
  });
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();
1412
+ describe('on Windows', () => {
1413
+ beforeEach(() => {
1414
+ vi.spyOn(os, 'platform').mockReturnValue('win32');
1415
+ vi.spyOn(os, 'arch').mockReturnValue('x64');
1416
+ vi.stubGlobal('process', Object.create(process, {
1417
+ platform: {
1418
+ get: () => 'win32',
1419
+ },
1420
+ }));
1421
+ vi.stubEnv('SystemRoot', 'C:\\Windows');
1422
+ vi.stubEnv('ProgramFiles', 'C:\\Program Files');
1423
+ vi.stubEnv('ProgramFiles(x86)', 'C:\\Program Files (x86)');
1424
+ });
1425
+ it('should fall back to system PATH if system is trusted on Windows', async () => {
1426
+ vi.mocked(fileExists).mockResolvedValue(false);
1427
+ vi.mocked(resolveExecutable).mockReturnValue('C:\\Windows\\System32\\rg.exe');
1428
+ vi.mocked(resolveToRealPath).mockReturnValue('C:\\Windows\\System32\\rg.exe');
1429
+ const resolvedPath = await resolveRipgrepPath();
1430
+ expect(resolvedPath).toBe('C:\\Windows\\System32\\rg.exe');
1431
+ expect(resolveExecutable).toHaveBeenCalledWith('rg');
1432
+ });
1433
+ it('should reject system PATH if it is untrusted on Windows', async () => {
1434
+ vi.mocked(fileExists).mockResolvedValue(false);
1435
+ const unsafePath = 'D:\\Downloads\\rg.exe';
1436
+ vi.mocked(resolveExecutable).mockReturnValue(unsafePath);
1437
+ vi.mocked(resolveToRealPath).mockReturnValue(unsafePath);
1438
+ const resolvedPath = await resolveRipgrepPath();
1439
+ expect(resolvedPath).toBeNull();
1440
+ });
1520
1441
  });
1521
1442
  });
1522
1443
  });