@machina.ai/cell-cli-core 1.41.1-rc2 → 1.45.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 (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 +44 -20
  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
@@ -9,6 +9,7 @@ import { createMockSandboxConfig } from '@google/gemini-cli-test-utils';
9
9
  import { DEFAULT_MAX_ATTEMPTS } from '../utils/retry.js';
10
10
  import { ExperimentFlags } from '../code_assist/experiments/flagNames.js';
11
11
  import { debugLogger } from '../utils/debugLogger.js';
12
+ import { coreEvents } from '../utils/events.js';
12
13
  import { ApprovalMode } from '../policy/types.js';
13
14
  import { HookType, HookEventName, } from '../hooks/types.js';
14
15
  import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
@@ -23,14 +24,15 @@ import { ShellTool } from '../tools/shell.js';
23
24
  import { AgentTool } from '../agents/agent-tool.js';
24
25
  import { ReadFileTool } from '../tools/read-file.js';
25
26
  import { GrepTool } from '../tools/grep.js';
26
- import { RipGrepTool, canUseRipgrep } from '../tools/ripGrep.js';
27
+ import { RipGrepTool, resolveRipgrepPath } from '../tools/ripGrep.js';
27
28
  import { logRipgrepFallback, logApprovalModeDuration, } from '../telemetry/loggers.js';
28
29
  import { RipgrepFallbackEvent } from '../telemetry/types.js';
29
30
  import { ToolRegistry } from '../tools/tool-registry.js';
30
31
  import { ACTIVATE_SKILL_TOOL_NAME } from '../tools/tool-names.js';
31
32
  import { DEFAULT_MODEL_CONFIGS } from './defaultModelConfigs.js';
32
- import { DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_3_1_MODEL, DEFAULT_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_FLASH_MODEL, } from './models.js';
33
+ import { DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_3_1_MODEL, DEFAULT_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_MODEL_AUTO, PREVIEW_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_MODEL, } from './models.js';
33
34
  import { Storage } from './storage.js';
35
+ import { runWithScopedAutoMemoryExtractionWriteAccess, runWithScopedMemoryInboxAccess, } from './scoped-config.js';
34
36
  vi.mock('fs', async (importOriginal) => {
35
37
  const actual = await importOriginal();
36
38
  return {
@@ -42,6 +44,19 @@ vi.mock('fs', async (importOriginal) => {
42
44
  realpathSync: vi.fn((path) => path),
43
45
  };
44
46
  });
47
+ vi.mock('../utils/paths.js', async (importOriginal) => {
48
+ const actual = await importOriginal();
49
+ return {
50
+ ...actual,
51
+ resolveToRealPath: vi.fn((p) => p),
52
+ };
53
+ });
54
+ vi.mock('../utils/fileUtils.js', () => ({
55
+ fileExists: vi.fn(),
56
+ }));
57
+ vi.mock('../utils/shell-utils.js', () => ({
58
+ resolveExecutable: vi.fn(),
59
+ }));
45
60
  // Mock dependencies that might be called during Config construction or createServerConfig
46
61
  vi.mock('../tools/tool-registry', () => {
47
62
  const ToolRegistryMock = vi.fn();
@@ -62,15 +77,12 @@ vi.mock('../tools/mcp-client-manager.js', () => ({
62
77
  setMainRegistries: vi.fn(),
63
78
  })),
64
79
  }));
65
- vi.mock('../utils/memoryDiscovery.js', () => ({
66
- loadServerHierarchicalMemory: vi.fn(),
67
- }));
68
80
  // Mock individual tools if their constructors are complex or have side effects
69
81
  vi.mock('../tools/ls');
70
82
  vi.mock('../tools/read-file');
71
83
  vi.mock('../tools/grep.js');
72
84
  vi.mock('../tools/ripGrep.js', () => ({
73
- canUseRipgrep: vi.fn(),
85
+ resolveRipgrepPath: vi.fn(),
74
86
  RipGrepTool: class MockRipGrepTool {
75
87
  },
76
88
  }));
@@ -80,13 +92,14 @@ vi.mock('../tools/shell');
80
92
  vi.mock('../tools/write-file');
81
93
  vi.mock('../tools/web-fetch');
82
94
  vi.mock('../tools/read-many-files');
83
- vi.mock('../tools/memoryTool', () => ({
84
- MemoryTool: vi.fn(),
85
- setGeminiMdFilename: vi.fn(),
86
- getCurrentGeminiMdFilename: vi.fn(() => 'GEMINI.md'), // Mock the original filename
87
- DEFAULT_CONTEXT_FILENAME: 'GEMINI.md',
88
- CELL_DIR: '.cell-cli',
89
- }));
95
+ vi.mock('../tools/memoryTool', async (importOriginal) => {
96
+ const actual = await importOriginal();
97
+ return {
98
+ ...actual,
99
+ setGeminiMdFilename: vi.fn(),
100
+ getCurrentGeminiMdFilename: vi.fn(() => 'GEMINI.md'),
101
+ };
102
+ });
90
103
  vi.mock('../core/contentGenerator.js');
91
104
  vi.mock('../core/client.js', () => ({
92
105
  GeminiClient: vi.fn().mockImplementation(() => ({
@@ -148,6 +161,7 @@ const mockCoreEvents = vi.hoisted(() => ({
148
161
  emitConsoleLog: vi.fn(),
149
162
  emitQuotaChanged: vi.fn(),
150
163
  on: vi.fn(),
164
+ emit: vi.fn(),
151
165
  }));
152
166
  const mockSetGlobalProxy = vi.hoisted(() => vi.fn());
153
167
  vi.mock('../utils/events.js', async (importOriginal) => {
@@ -532,7 +546,13 @@ describe('Server Config (config.ts)', () => {
532
546
  });
533
547
  });
534
548
  describe('getGemini31LaunchedSync', () => {
535
- it.each([AuthType.USE_GEMINI, AuthType.USE_VERTEX_AI, AuthType.GATEWAY])('should return true for %s', async (authType) => {
549
+ it.each([
550
+ AuthType.USE_GEMINI,
551
+ AuthType.USE_VERTEX_AI,
552
+ AuthType.GATEWAY,
553
+ AuthType.LOGIN_WITH_GOOGLE,
554
+ AuthType.KEYCLOAK,
555
+ ])('should return true for %s', async (authType) => {
536
556
  const config = new Config(baseParams);
537
557
  vi.mocked(createContentGeneratorConfig).mockResolvedValue({
538
558
  authType,
@@ -558,16 +578,6 @@ describe('Server Config (config.ts)', () => {
558
578
  expect(config.getGemini31LaunchedSync()).toBe(true);
559
579
  });
560
580
  });
561
- describe('getGemini31FlashLiteLaunchedSync', () => {
562
- it.each([AuthType.USE_GEMINI, AuthType.USE_VERTEX_AI, AuthType.GATEWAY])('should return true for %s', async (authType) => {
563
- const config = new Config(baseParams);
564
- vi.mocked(createContentGeneratorConfig).mockResolvedValue({
565
- authType,
566
- });
567
- await config.refreshAuth(authType);
568
- expect(config.getGemini31FlashLiteLaunchedSync()).toBe(true);
569
- });
570
- });
571
581
  describe('getProModelNoAccessSync', () => {
572
582
  it('should return experiment value for AuthType.LOGIN_WITH_GOOGLE', async () => {
573
583
  vi.mocked(getExperiments).mockResolvedValue({
@@ -685,6 +695,13 @@ describe('Server Config (config.ts)', () => {
685
695
  expect(config.getContentGeneratorConfig()).toEqual(mockContentConfig);
686
696
  expect(GeminiClient).toHaveBeenCalledWith(config);
687
697
  });
698
+ it('should clear fallback overrides when refreshing auth', async () => {
699
+ const config = new Config(baseParams);
700
+ config.activateFallbackMode('fallback-model', 'failed-model');
701
+ expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
702
+ await config.refreshAuth(AuthType.USE_GEMINI);
703
+ expect(config.getFallbackOverride('failed-model')).toBeUndefined();
704
+ });
688
705
  it('should pass Vertex AI routing settings when refreshing auth', async () => {
689
706
  const vertexAiRouting = {
690
707
  requestType: 'shared',
@@ -1173,28 +1190,6 @@ describe('Server Config (config.ts)', () => {
1173
1190
  expect(config.getShellToolInactivityTimeout()).toBe(10000);
1174
1191
  });
1175
1192
  });
1176
- describe('ContinueOnFailedApiCall Configuration', () => {
1177
- it('should default continueOnFailedApiCall to false when not provided', () => {
1178
- const config = new Config(baseParams);
1179
- expect(config.getContinueOnFailedApiCall()).toBe(true);
1180
- });
1181
- it('should set continueOnFailedApiCall to true when provided as true', () => {
1182
- const paramsWithContinueOnFailedApiCall = {
1183
- ...baseParams,
1184
- continueOnFailedApiCall: true,
1185
- };
1186
- const config = new Config(paramsWithContinueOnFailedApiCall);
1187
- expect(config.getContinueOnFailedApiCall()).toBe(true);
1188
- });
1189
- it('should set continueOnFailedApiCall to false when explicitly provided as false', () => {
1190
- const paramsWithContinueOnFailedApiCall = {
1191
- ...baseParams,
1192
- continueOnFailedApiCall: false,
1193
- };
1194
- const config = new Config(paramsWithContinueOnFailedApiCall);
1195
- expect(config.getContinueOnFailedApiCall()).toBe(false);
1196
- });
1197
- });
1198
1193
  describe('createToolRegistry', () => {
1199
1194
  it('should register a tool if coreTools contains an argument-specific pattern', async () => {
1200
1195
  const params = {
@@ -1512,6 +1507,17 @@ describe('Server Config (config.ts)', () => {
1512
1507
  expect(config.getTrackerService().trackerDir).toBe(path.join(tempDir, 'session-two', 'tracker'));
1513
1508
  expect(config.getWorkspaceContext().getDirectories()).not.toContain(oldPlansDir);
1514
1509
  });
1510
+ it('clears fallback overrides when session changes', async () => {
1511
+ const config = new Config({
1512
+ ...baseParams,
1513
+ sessionId: 'session-one',
1514
+ });
1515
+ await config.initialize();
1516
+ config.activateFallbackMode('fallback-model', 'failed-model');
1517
+ expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
1518
+ config.setSessionId('session-two');
1519
+ expect(config.getFallbackOverride('failed-model')).toBeUndefined();
1520
+ });
1515
1521
  it('does not throw when changing sessions before the previous plans dir exists', async () => {
1516
1522
  const config = new Config({
1517
1523
  ...baseParams,
@@ -1563,6 +1569,49 @@ describe('Server Config (config.ts)', () => {
1563
1569
  expect(config.getSessionId()).toBe('session-two');
1564
1570
  expect(config.getApprovedPlanPath()).toBeUndefined();
1565
1571
  });
1572
+ it('performs a comprehensive reset of all session-scoped state when sessionId changes', async () => {
1573
+ const config = new Config({
1574
+ ...baseParams,
1575
+ sessionId: 'session-one',
1576
+ plan: true,
1577
+ tracker: true,
1578
+ });
1579
+ await config.initialize();
1580
+ // 1. "Dirty" the session state
1581
+ const oldTrackerService = config.getTrackerService();
1582
+ config.setApprovedPlanPath('/tmp/plan.md');
1583
+ config.topicState.setTopic('Old Topic', 'Old Intent');
1584
+ config.getSkillManager().activateSkill('old-skill');
1585
+ config.getModelAvailabilityService().markTerminal('model-1', 'quota');
1586
+ config.setLatestApiRequest({});
1587
+ const configInternal = config;
1588
+ // Mock internal quota state
1589
+ configInternal.modelQuotas.set('model-1', { remaining: 0, limit: 100 });
1590
+ configInternal.lastEmittedQuotaRemaining = 0;
1591
+ configInternal.lastEmittedQuotaLimit = 100;
1592
+ configInternal.lastQuotaFetchTime = 12345;
1593
+ configInternal.hasAccessToPreviewModel = true;
1594
+ // Listen for quota event
1595
+ const emitQuotaSpy = vi.spyOn(coreEvents, 'emitQuotaChanged');
1596
+ // 2. Trigger session change
1597
+ config.setSessionId('session-two');
1598
+ // 3. Verify EVERYTHING is reset
1599
+ expect(config.getSessionId()).toBe('session-two');
1600
+ expect(config.getApprovedPlanPath()).toBeUndefined();
1601
+ expect(config.topicState.getTopic()).toBeUndefined();
1602
+ expect(config.topicState.getIntent()).toBeUndefined();
1603
+ expect(config.getSkillManager().isSkillActive('old-skill')).toBe(false);
1604
+ expect(config.getTrackerService()).not.toBe(oldTrackerService);
1605
+ expect(config.getModelAvailabilityService().snapshot('model-1').available).toBe(true);
1606
+ expect(config.getLatestApiRequest()).toBeUndefined();
1607
+ // Quota resets
1608
+ expect(configInternal.modelQuotas.size).toBe(0);
1609
+ expect(configInternal.lastEmittedQuotaRemaining).toBeUndefined();
1610
+ expect(configInternal.lastEmittedQuotaLimit).toBeUndefined();
1611
+ expect(configInternal.lastQuotaFetchTime).toBe(0);
1612
+ // Event emission
1613
+ expect(emitQuotaSpy).toHaveBeenCalledWith(undefined, undefined, undefined);
1614
+ });
1566
1615
  });
1567
1616
  describe('GemmaModelRouterSettings', () => {
1568
1617
  const MODEL = DEFAULT_GEMINI_MODEL;
@@ -1788,7 +1837,7 @@ describe('setApprovalMode with folder trust', () => {
1788
1837
  vi.clearAllMocks();
1789
1838
  });
1790
1839
  it('should register RipGrepTool when useRipgrep is true and it is available', async () => {
1791
- vi.mocked(canUseRipgrep).mockResolvedValue(true);
1840
+ vi.mocked(resolveRipgrepPath).mockResolvedValue('/mock/rg');
1792
1841
  const config = new Config({ ...baseParams, useRipgrep: true });
1793
1842
  await config.initialize();
1794
1843
  const calls = vi.mocked(ToolRegistry.prototype.registerTool).mock.calls;
@@ -1799,7 +1848,7 @@ describe('setApprovalMode with folder trust', () => {
1799
1848
  expect(logRipgrepFallback).not.toHaveBeenCalled();
1800
1849
  });
1801
1850
  it('should register GrepTool as a fallback when useRipgrep is true but it is not available', async () => {
1802
- vi.mocked(canUseRipgrep).mockResolvedValue(false);
1851
+ vi.mocked(resolveRipgrepPath).mockResolvedValue(null);
1803
1852
  const config = new Config({ ...baseParams, useRipgrep: true });
1804
1853
  await config.initialize();
1805
1854
  const calls = vi.mocked(ToolRegistry.prototype.registerTool).mock.calls;
@@ -1813,7 +1862,7 @@ describe('setApprovalMode with folder trust', () => {
1813
1862
  });
1814
1863
  it('should register GrepTool as a fallback when canUseRipgrep throws an error', async () => {
1815
1864
  const error = new Error('ripGrep check failed');
1816
- vi.mocked(canUseRipgrep).mockRejectedValue(error);
1865
+ vi.mocked(resolveRipgrepPath).mockRejectedValue(error);
1817
1866
  const config = new Config({ ...baseParams, useRipgrep: true });
1818
1867
  await config.initialize();
1819
1868
  const calls = vi.mocked(ToolRegistry.prototype.registerTool).mock.calls;
@@ -1833,7 +1882,7 @@ describe('setApprovalMode with folder trust', () => {
1833
1882
  const wasGrepRegistered = calls.some((call) => call[0] instanceof vi.mocked(GrepTool));
1834
1883
  expect(wasRipGrepRegistered).toBe(false);
1835
1884
  expect(wasGrepRegistered).toBe(true);
1836
- expect(canUseRipgrep).not.toHaveBeenCalled();
1885
+ expect(resolveRipgrepPath).not.toHaveBeenCalled();
1837
1886
  expect(logRipgrepFallback).not.toHaveBeenCalled();
1838
1887
  });
1839
1888
  });
@@ -2102,6 +2151,13 @@ describe('Config getHooks', () => {
2102
2151
  expect(mockCoreEvents.emitModelChanged).toHaveBeenCalledWith('auto');
2103
2152
  expect(spy).toHaveBeenCalled();
2104
2153
  });
2154
+ it('should preserve fallback overrides when setting a new model', () => {
2155
+ const config = new Config(baseParams);
2156
+ config.activateFallbackMode('fallback-model', 'failed-model');
2157
+ expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
2158
+ config.setModel('new-model');
2159
+ expect(config.getFallbackOverride('failed-model')).toBe('fallback-model');
2160
+ });
2105
2161
  it('should allow setting auto model from auto model and reset availability', () => {
2106
2162
  const config = new Config({
2107
2163
  cwd: '/tmp',
@@ -2534,15 +2590,15 @@ describe('Config Quota & Preview Model Access', () => {
2534
2590
  vi.mocked(getCodeAssistServer).mockReturnValue(undefined);
2535
2591
  const result = await config.refreshUserQuota();
2536
2592
  expect(result).toBeUndefined();
2537
- // Never set => stays null (unknown); getter returns true so UI shows preview
2538
- expect(config.getHasAccessToPreviewModel()).toBe(true);
2593
+ // Never set => stays null (unknown); getter returns false by default
2594
+ expect(config.getHasAccessToPreviewModel()).toBe(false);
2539
2595
  });
2540
2596
  it('should return undefined if retrieveUserQuota fails', async () => {
2541
2597
  mockCodeAssistServer.retrieveUserQuota.mockRejectedValue(new Error('Network error'));
2542
2598
  const result = await config.refreshUserQuota();
2543
2599
  expect(result).toBeUndefined();
2544
- // Never set => stays null (unknown); getter returns true so UI shows preview
2545
- expect(config.getHasAccessToPreviewModel()).toBe(true);
2600
+ // Never set => stays null (unknown); getter returns false by default
2601
+ expect(config.getHasAccessToPreviewModel()).toBe(false);
2546
2602
  });
2547
2603
  it('should derive quota from remainingFraction when remainingAmount is missing', async () => {
2548
2604
  mockCodeAssistServer.retrieveUserQuota.mockResolvedValue({
@@ -2714,6 +2770,39 @@ describe('Config Quota & Preview Model Access', () => {
2714
2770
  expect(await config.getPlanModeRoutingEnabled()).toBe(false);
2715
2771
  });
2716
2772
  });
2773
+ describe('validatePathAccess (PathValidator integration)', () => {
2774
+ it('should reject pathologically long paths', () => {
2775
+ const config = new Config(baseParams);
2776
+ const longPath = path.join(baseParams.targetDir, 'a'.repeat(5000));
2777
+ const result = config.validatePathAccess(longPath, 'read');
2778
+ expect(result).toContain('Invalid path: Path is too long');
2779
+ });
2780
+ it('should reject paths with log markers', () => {
2781
+ const config = new Config(baseParams);
2782
+ const logPath = path.join(baseParams.targetDir, 'AssertionError: expected true to be false');
2783
+ const result = config.validatePathAccess(logPath, 'read');
2784
+ expect(result).toContain('Invalid path: Path appears to be a misinterpreted log fragment');
2785
+ });
2786
+ it('should reject paths with control characters', () => {
2787
+ const config = new Config(baseParams);
2788
+ const malformedPath = path.join(baseParams.targetDir, 'file\nwith\nnewline.txt');
2789
+ const result = config.validatePathAccess(malformedPath, 'read');
2790
+ expect(result).toContain('Invalid path: Path contains invalid characters');
2791
+ });
2792
+ it('should allow normal paths', () => {
2793
+ const config = new Config(baseParams);
2794
+ const normalPath = path.resolve(baseParams.targetDir, 'src/index.ts');
2795
+ const result = config.validatePathAccess(normalPath, 'read');
2796
+ // It might return "Path not in workspace" or similar if not authorized,
2797
+ // but it should NOT return the "Invalid path" prefix from PathValidator.
2798
+ if (result) {
2799
+ expect(result).not.toContain('Invalid path:');
2800
+ }
2801
+ else {
2802
+ expect(result).toBeNull();
2803
+ }
2804
+ });
2805
+ });
2717
2806
  });
2718
2807
  describe('Config JIT Initialization', () => {
2719
2808
  let config;
@@ -2732,13 +2821,12 @@ describe('Config JIT Initialization', () => {
2732
2821
  };
2733
2822
  MemoryContextManager.mockImplementation(() => mockMemoryContextManager);
2734
2823
  });
2735
- it('should initialize MemoryContextManager, load memory, and delegate to it when experimentalJitContext is enabled', async () => {
2824
+ it('should initialize MemoryContextManager, load memory, and delegate to it', async () => {
2736
2825
  const params = {
2737
2826
  sessionId: 'test-session',
2738
2827
  targetDir: '/tmp/test',
2739
2828
  debugMode: false,
2740
2829
  model: 'test-model',
2741
- experimentalJitContext: true,
2742
2830
  userMemory: 'Initial Memory',
2743
2831
  cwd: '/tmp/test',
2744
2832
  };
@@ -2765,27 +2853,24 @@ describe('Config JIT Initialization', () => {
2765
2853
  expect(sessionMemory).toContain('MCP Instructions');
2766
2854
  expect(sessionMemory).toContain('</project_context>');
2767
2855
  expect(sessionMemory).toContain('</loaded_context>');
2856
+ const sessionMemoryWithoutExtension = config.getSessionMemory({
2857
+ includeExtensionContext: false,
2858
+ });
2859
+ expect(sessionMemoryWithoutExtension).toContain('<loaded_context>');
2860
+ expect(sessionMemoryWithoutExtension).not.toContain('<extension_context>');
2861
+ expect(sessionMemoryWithoutExtension).not.toContain('Extension Memory');
2862
+ expect(sessionMemoryWithoutExtension).toContain('<project_context>');
2863
+ expect(sessionMemoryWithoutExtension).toContain('Environment Memory');
2864
+ expect(sessionMemoryWithoutExtension).toContain('</loaded_context>');
2768
2865
  // Verify state update (delegated to MemoryContextManager)
2769
2866
  expect(config.getGeminiMdFileCount()).toBe(1);
2770
2867
  expect(config.getGeminiMdFilePaths()).toEqual(['/path/to/GEMINI.md']);
2771
2868
  });
2772
- it('should NOT initialize MemoryContextManager when experimentalJitContext is disabled', async () => {
2773
- const params = {
2774
- sessionId: 'test-session',
2775
- targetDir: '/tmp/test',
2776
- debugMode: false,
2777
- model: 'test-model',
2778
- experimentalJitContext: false,
2779
- userMemory: 'Initial Memory',
2780
- cwd: '/tmp/test',
2781
- };
2782
- config = new Config(params);
2783
- await config.initialize();
2784
- expect(MemoryContextManager).not.toHaveBeenCalled();
2785
- expect(config.getUserMemory()).toBe('Initial Memory');
2786
- });
2787
- describe('isMemoryV2Enabled', () => {
2788
- it('should default to true', () => {
2869
+ describe('memory path access', () => {
2870
+ it('should NOT add the global ~/.cell-cli directory to the workspace', async () => {
2871
+ // Memory does not broaden the workspace to include the global ~/.cell-cli/
2872
+ // directory. Cross-project personal preferences are routed to
2873
+ // ~/.cell-cli/GEMINI.md via the surgical isPathAllowed allowlist instead.
2789
2874
  const params = {
2790
2875
  sessionId: 'test-session',
2791
2876
  targetDir: '/tmp/test',
@@ -2794,84 +2879,151 @@ describe('Config JIT Initialization', () => {
2794
2879
  cwd: '/tmp/test',
2795
2880
  };
2796
2881
  config = new Config(params);
2797
- expect(config.isMemoryV2Enabled()).toBe(true);
2882
+ await config.initialize();
2883
+ const directories = config.getWorkspaceContext().getDirectories();
2884
+ expect(directories).not.toContain(Storage.getGlobalGeminiDir());
2798
2885
  });
2799
- it('should return false when experimentalMemoryV2 is explicitly false', () => {
2886
+ it('should allow isPathAllowed to write the global ~/.cell-cli/GEMINI.md file', async () => {
2887
+ // Surgical allowlist: the prompt routes cross-project personal
2888
+ // preferences to ~/.cell-cli/GEMINI.md, so the agent must be able to edit
2889
+ // that exact file via edit/write_file.
2800
2890
  const params = {
2801
2891
  sessionId: 'test-session',
2802
2892
  targetDir: '/tmp/test',
2803
2893
  debugMode: false,
2804
2894
  model: 'test-model',
2805
2895
  cwd: '/tmp/test',
2806
- experimentalMemoryV2: false,
2807
2896
  };
2808
2897
  config = new Config(params);
2809
- expect(config.isMemoryV2Enabled()).toBe(false);
2898
+ await config.initialize();
2899
+ const globalGeminiMdPath = path.join(Storage.getGlobalGeminiDir(), 'GEMINI.md');
2900
+ expect(config.isPathAllowed(globalGeminiMdPath)).toBe(true);
2810
2901
  });
2811
- it('should return true when experimentalMemoryV2 is true', () => {
2902
+ it('should NOT allow isPathAllowed to write other files under ~/.cell-cli/ (least privilege)', async () => {
2903
+ // The allowlist is surgical: only ~/.cell-cli/GEMINI.md is reachable.
2904
+ // settings.json, keybindings.json, credentials, etc. remain disallowed.
2812
2905
  const params = {
2813
2906
  sessionId: 'test-session',
2814
2907
  targetDir: '/tmp/test',
2815
2908
  debugMode: false,
2816
2909
  model: 'test-model',
2817
2910
  cwd: '/tmp/test',
2818
- experimentalMemoryV2: true,
2819
2911
  };
2820
2912
  config = new Config(params);
2821
- expect(config.isMemoryV2Enabled()).toBe(true);
2913
+ await config.initialize();
2914
+ const globalDir = Storage.getGlobalGeminiDir();
2915
+ expect(config.isPathAllowed(path.join(globalDir, 'settings.json'))).toBe(false);
2916
+ expect(config.isPathAllowed(path.join(globalDir, 'keybindings.json'))).toBe(false);
2917
+ expect(config.isPathAllowed(path.join(globalDir, 'oauth_creds.json'))).toBe(false);
2822
2918
  });
2823
- it('should NOT add the global ~/.cell-cli directory to the workspace when enabled', async () => {
2824
- // The prompt-driven memoryV2 mode does not broaden the workspace
2825
- // to include the global ~/.cell-cli/ directory. Cross-project personal
2826
- // preferences are routed to ~/.cell-cli/GEMINI.md via the surgical
2827
- // isPathAllowed allowlist instead see the next two tests.
2919
+ it('should NOT allow isPathAllowed to write into the auto-memory inbox', () => {
2920
+ // <projectMemoryDir>/.inbox/ is owned by the extraction agent and the
2921
+ // /memory inbox review flow. The main agent must not be able to drop
2922
+ // patches in there directly, even though it falls inside <projectTempDir>.
2923
+ // We bypass Config.initialize() (the GitService init path is independently
2924
+ // flaky in this suite) by spying on the storage methods isPathAllowed
2925
+ // actually consults.
2828
2926
  const params = {
2829
2927
  sessionId: 'test-session',
2830
2928
  targetDir: '/tmp/test',
2831
2929
  debugMode: false,
2832
2930
  model: 'test-model',
2833
2931
  cwd: '/tmp/test',
2834
- experimentalMemoryV2: true,
2835
2932
  };
2836
2933
  config = new Config(params);
2837
- await config.initialize();
2838
- const directories = config.getWorkspaceContext().getDirectories();
2839
- expect(directories).not.toContain(Storage.getGlobalGeminiDir());
2840
- });
2841
- it('should allow isPathAllowed to write the global ~/.cell-cli/GEMINI.md file', async () => {
2842
- // Surgical allowlist: when memoryV2 is on, the prompt routes
2843
- // cross-project personal preferences to ~/.cell-cli/GEMINI.md, so the
2844
- // agent must be able to edit that exact file via edit/write_file.
2934
+ const fakeMemoryTempDir = '/tmp/test-fake-temp/memory';
2935
+ const fakeProjectTempDir = '/tmp/test-fake-temp';
2936
+ vi.spyOn(config.storage, 'getProjectMemoryTempDir').mockReturnValue(fakeMemoryTempDir);
2937
+ vi.spyOn(config.storage, 'getProjectTempDir').mockReturnValue(fakeProjectTempDir);
2938
+ const inboxRoot = path.join(fakeMemoryTempDir, '.inbox');
2939
+ // The inbox directory itself and any path under it are denied.
2940
+ expect(config.isPathAllowed(inboxRoot)).toBe(false);
2941
+ expect(config.isPathAllowed(path.join(inboxRoot, 'private', 'foo.patch'))).toBe(false);
2942
+ expect(config.isPathAllowed(path.join(inboxRoot, 'global', 'bar.patch'))).toBe(false);
2943
+ // Sibling files under <projectMemoryDir> stay reachable so the main
2944
+ // agent can edit MEMORY.md and topic notes directly.
2945
+ expect(config.isPathAllowed(path.join(fakeMemoryTempDir, 'MEMORY.md'))).toBe(true);
2946
+ expect(config.isPathAllowed(path.join(fakeMemoryTempDir, 'some-topic.md'))).toBe(true);
2947
+ });
2948
+ it('should allow scoped extraction access only to canonical inbox patches', () => {
2845
2949
  const params = {
2846
2950
  sessionId: 'test-session',
2847
2951
  targetDir: '/tmp/test',
2848
2952
  debugMode: false,
2849
2953
  model: 'test-model',
2850
2954
  cwd: '/tmp/test',
2851
- experimentalMemoryV2: true,
2852
2955
  };
2853
2956
  config = new Config(params);
2854
- await config.initialize();
2855
- const globalGeminiMdPath = path.join(Storage.getGlobalGeminiDir(), 'GEMINI.md');
2856
- expect(config.isPathAllowed(globalGeminiMdPath)).toBe(true);
2857
- });
2858
- it('should NOT allow isPathAllowed to write other files under ~/.cell-cli/ (least privilege)', async () => {
2859
- // The allowlist is surgical: only ~/.cell-cli/GEMINI.md is reachable.
2860
- // settings.json, keybindings.json, credentials, etc. remain disallowed.
2957
+ const fakeMemoryTempDir = '/tmp/test-fake-temp/memory';
2958
+ const fakeProjectTempDir = '/tmp/test-fake-temp';
2959
+ vi.spyOn(config.storage, 'getProjectMemoryTempDir').mockReturnValue(fakeMemoryTempDir);
2960
+ vi.spyOn(config.storage, 'getProjectTempDir').mockReturnValue(fakeProjectTempDir);
2961
+ const inboxRoot = path.join(fakeMemoryTempDir, '.inbox');
2962
+ const privateExtractionPatch = path.join(inboxRoot, 'private', 'extraction.patch');
2963
+ const globalExtractionPatch = path.join(inboxRoot, 'global', 'extraction.patch');
2964
+ expect(config.isPathAllowed(privateExtractionPatch)).toBe(false);
2965
+ runWithScopedMemoryInboxAccess(() => {
2966
+ expect(config.isPathAllowed(privateExtractionPatch)).toBe(true);
2967
+ expect(config.validatePathAccess(privateExtractionPatch)).toBeNull();
2968
+ expect(config.isPathAllowed(globalExtractionPatch)).toBe(true);
2969
+ // Writes (the default checkType for isPathAllowed) remain restricted
2970
+ // to the canonical extraction.patch filenames.
2971
+ expect(config.isPathAllowed(path.join(inboxRoot, 'private', 'other.patch'))).toBe(false);
2972
+ expect(config.isPathAllowed(path.join(inboxRoot, 'private', 'nested', 'extraction.patch'))).toBe(false);
2973
+ // Reads are broadened to the .inbox/{private,global}/ subtree so the
2974
+ // extractor can list and inspect prior patches before consolidating.
2975
+ const privateOtherPatch = path.join(inboxRoot, 'private', 'other.patch');
2976
+ const globalLeftover = path.join(inboxRoot, 'global', 'topic-a.patch');
2977
+ const nestedReadPath = path.join(inboxRoot, 'private', 'nested', 'extraction.patch');
2978
+ expect(config.validatePathAccess(privateOtherPatch, 'read')).toBeNull();
2979
+ expect(config.validatePathAccess(globalLeftover, 'read')).toBeNull();
2980
+ expect(config.validatePathAccess(nestedReadPath, 'read')).toBeNull();
2981
+ expect(config.validatePathAccess(inboxRoot, 'read')).toBeNull();
2982
+ expect(config.validatePathAccess(path.join(inboxRoot, 'private'), 'read')).toBeNull();
2983
+ expect(config.validatePathAccess(path.join(inboxRoot, 'global'), 'read')).toBeNull();
2984
+ // Writes to the same broadened paths are still rejected.
2985
+ expect(config.validatePathAccess(privateOtherPatch)).toContain('Path not in workspace');
2986
+ expect(config.validatePathAccess(nestedReadPath)).toContain('Path not in workspace');
2987
+ });
2988
+ expect(config.isPathAllowed(privateExtractionPatch)).toBe(false);
2989
+ // Outside the scope, reads of inbox files are denied again.
2990
+ expect(config.validatePathAccess(path.join(inboxRoot, 'private', 'other.patch'), 'read')).toContain('Path not in workspace');
2991
+ });
2992
+ it('should restrict scoped auto-memory extraction writes to generated artifacts', () => {
2861
2993
  const params = {
2862
2994
  sessionId: 'test-session',
2863
2995
  targetDir: '/tmp/test',
2864
2996
  debugMode: false,
2865
2997
  model: 'test-model',
2866
2998
  cwd: '/tmp/test',
2867
- experimentalMemoryV2: true,
2868
2999
  };
2869
3000
  config = new Config(params);
2870
- await config.initialize();
2871
- const globalDir = Storage.getGlobalGeminiDir();
2872
- expect(config.isPathAllowed(path.join(globalDir, 'settings.json'))).toBe(false);
2873
- expect(config.isPathAllowed(path.join(globalDir, 'keybindings.json'))).toBe(false);
2874
- expect(config.isPathAllowed(path.join(globalDir, 'oauth_creds.json'))).toBe(false);
3001
+ const fakeMemoryTempDir = '/tmp/test-fake-temp/memory';
3002
+ const fakeProjectTempDir = '/tmp/test-fake-temp';
3003
+ const fakeSkillsMemoryDir = path.join(fakeMemoryTempDir, 'skills');
3004
+ vi.spyOn(config.storage, 'getProjectMemoryTempDir').mockReturnValue(fakeMemoryTempDir);
3005
+ vi.spyOn(config.storage, 'getProjectTempDir').mockReturnValue(fakeProjectTempDir);
3006
+ vi.spyOn(config.storage, 'getProjectSkillsMemoryDir').mockReturnValue(fakeSkillsMemoryDir);
3007
+ const inboxRoot = path.join(fakeMemoryTempDir, '.inbox');
3008
+ const privateExtractionPatch = path.join(inboxRoot, 'private', 'extraction.patch');
3009
+ const skillArtifact = path.join(fakeSkillsMemoryDir, 'my-skill', 'SKILL.md');
3010
+ const activeMemoryPath = path.join(fakeMemoryTempDir, 'MEMORY.md');
3011
+ const projectTempPath = path.join(fakeProjectTempDir, 'logs', 'run.log');
3012
+ const workspaceMemoryPath = path.join('/tmp/test', 'GEMINI.md');
3013
+ expect(config.validatePathAccess(activeMemoryPath)).toBeNull();
3014
+ runWithScopedAutoMemoryExtractionWriteAccess(() => {
3015
+ expect(config.validatePathAccess(skillArtifact)).toBeNull();
3016
+ expect(config.validatePathAccess(activeMemoryPath)).toContain('Auto-memory extraction write denied');
3017
+ expect(config.validatePathAccess(projectTempPath)).toContain('Auto-memory extraction write denied');
3018
+ expect(config.validatePathAccess(workspaceMemoryPath)).toContain('Auto-memory extraction write denied');
3019
+ // Reads still use the normal workspace/temp allowlists.
3020
+ expect(config.validatePathAccess(activeMemoryPath, 'read')).toBeNull();
3021
+ });
3022
+ runWithScopedMemoryInboxAccess(() => {
3023
+ runWithScopedAutoMemoryExtractionWriteAccess(() => {
3024
+ expect(config.validatePathAccess(privateExtractionPatch)).toBeNull();
3025
+ });
3026
+ });
2875
3027
  });
2876
3028
  });
2877
3029
  describe('isAutoMemoryEnabled', () => {
@@ -2922,7 +3074,7 @@ describe('Config JIT Initialization', () => {
2922
3074
  config = new Config(params);
2923
3075
  expect(config.getExperimentalGemma()).toBe(false);
2924
3076
  });
2925
- it('should return false when experimentalGemma is not provided', () => {
3077
+ it('should return true when experimentalGemma is not provided', () => {
2926
3078
  const params = {
2927
3079
  sessionId: 'test-session',
2928
3080
  targetDir: '/tmp/test',
@@ -2931,19 +3083,17 @@ describe('Config JIT Initialization', () => {
2931
3083
  cwd: '/tmp/test',
2932
3084
  };
2933
3085
  config = new Config(params);
2934
- expect(config.getExperimentalGemma()).toBe(false);
3086
+ expect(config.getExperimentalGemma()).toBe(true);
2935
3087
  });
2936
- it('should be independent of experimentalMemoryV2', () => {
3088
+ it('should default to disabled', () => {
2937
3089
  const params = {
2938
3090
  sessionId: 'test-session',
2939
3091
  targetDir: '/tmp/test',
2940
3092
  debugMode: false,
2941
3093
  model: 'test-model',
2942
3094
  cwd: '/tmp/test',
2943
- experimentalMemoryV2: true,
2944
3095
  };
2945
3096
  config = new Config(params);
2946
- expect(config.isMemoryV2Enabled()).toBe(true);
2947
3097
  expect(config.isAutoMemoryEnabled()).toBe(false);
2948
3098
  });
2949
3099
  });
@@ -3088,6 +3238,27 @@ describe('Plans Directory Initialization', () => {
3088
3238
  const context = config.getWorkspaceContext();
3089
3239
  expect(context.getDirectories()).not.toContain(plansDir);
3090
3240
  });
3241
+ it('should gracefully fallback to default plans directory if retrieving custom directory throw an error', async () => {
3242
+ vi.spyOn(coreEvents, 'emitFeedback');
3243
+ vi.spyOn(fs.promises, 'access').mockResolvedValue(undefined);
3244
+ const config = new Config({
3245
+ ...baseParams,
3246
+ plan: true,
3247
+ planSettings: {
3248
+ directory: '/outside/project/root',
3249
+ },
3250
+ });
3251
+ await config.initialize();
3252
+ const plansDir = config.storage.getPlansDir();
3253
+ // Should fallback to default project temp plans dir
3254
+ expect(plansDir).toContain('plans');
3255
+ expect(plansDir).not.toContain('/outside/project/root');
3256
+ // Should emit a warning feedback
3257
+ expect(coreEvents.emitFeedback).toHaveBeenCalledWith('warning', expect.stringContaining('Invalid custom plans directory'), expect.any(Error));
3258
+ // Should still add the fallback plans directory to workspace context if it exists
3259
+ const context = config.getWorkspaceContext();
3260
+ expect(context.getDirectories()).toContain(plansDir);
3261
+ });
3091
3262
  it('should NOT create plans directory or add it to workspace context when plan is disabled', async () => {
3092
3263
  const config = new Config({
3093
3264
  ...baseParams,
@@ -3216,4 +3387,85 @@ describe('ADKSettings', () => {
3216
3387
  expect(config.getAgentSessionNoninteractiveEnabled()).toBe(true);
3217
3388
  });
3218
3389
  });
3390
+ describe('hasGemini35FlashGAAccess model setting', () => {
3391
+ const baseParams = {
3392
+ sessionId: 'test',
3393
+ targetDir: '.',
3394
+ debugMode: false,
3395
+ model: 'test-model',
3396
+ cwd: '.',
3397
+ };
3398
+ it('should set DEFAULT_GEMINI_FLASH_MODEL to gemini-3.5-flash and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash-preview if hasGemini35FlashGAAccess returns true and authType is USE_GEMINI', () => {
3399
+ const config = new Config(baseParams);
3400
+ config['contentGeneratorConfig'] = { authType: AuthType.USE_GEMINI };
3401
+ // Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
3402
+ config.setExperiments({
3403
+ experimentIds: [],
3404
+ flags: {
3405
+ [ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
3406
+ boolValue: true,
3407
+ },
3408
+ },
3409
+ });
3410
+ // Call the method
3411
+ const result = config.hasGemini35FlashGAAccess();
3412
+ expect(result).toBe(true);
3413
+ expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3.5-flash');
3414
+ expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash-preview');
3415
+ });
3416
+ it('should set DEFAULT_GEMINI_FLASH_MODEL to gemini-3.5-flash and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash-preview if hasGemini35FlashGAAccess returns true and authType is LOGIN_WITH_GOOGLE', () => {
3417
+ const config = new Config(baseParams);
3418
+ config['contentGeneratorConfig'] = { authType: AuthType.LOGIN_WITH_GOOGLE };
3419
+ // Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
3420
+ config.setExperiments({
3421
+ experimentIds: [],
3422
+ flags: {
3423
+ [ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
3424
+ boolValue: true,
3425
+ },
3426
+ },
3427
+ });
3428
+ // Call the method
3429
+ const result = config.hasGemini35FlashGAAccess();
3430
+ expect(result).toBe(true);
3431
+ expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3.5-flash');
3432
+ expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash-preview');
3433
+ });
3434
+ it('should set DEFAULT_GEMINI_FLASH_MODEL to gemini-3.5-flash and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash-preview if hasGemini35FlashGAAccess returns true and authType is KEYCLOAK', () => {
3435
+ const config = new Config(baseParams);
3436
+ config['contentGeneratorConfig'] = { authType: AuthType.KEYCLOAK };
3437
+ // Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
3438
+ config.setExperiments({
3439
+ experimentIds: [],
3440
+ flags: {
3441
+ [ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
3442
+ boolValue: true,
3443
+ },
3444
+ },
3445
+ });
3446
+ // Call the method
3447
+ const result = config.hasGemini35FlashGAAccess();
3448
+ expect(result).toBe(true);
3449
+ expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3.5-flash');
3450
+ expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash-preview');
3451
+ });
3452
+ it('should set DEFAULT_GEMINI_FLASH_MODEL and PREVIEW_GEMINI_FLASH_MODEL to gemini-3-flash if hasGemini35FlashGAAccess returns true and authType is USE_VERTEX_AI', () => {
3453
+ const config = new Config(baseParams);
3454
+ config['contentGeneratorConfig'] = { authType: AuthType.USE_VERTEX_AI };
3455
+ // Set experiment to return true for GEMINI_3_5_FLASH_GA_LAUNCHED
3456
+ config.setExperiments({
3457
+ experimentIds: [],
3458
+ flags: {
3459
+ [ExperimentFlags.GEMINI_3_5_FLASH_GA_LAUNCHED]: {
3460
+ boolValue: true,
3461
+ },
3462
+ },
3463
+ });
3464
+ // Call the method
3465
+ const result = config.hasGemini35FlashGAAccess();
3466
+ expect(result).toBe(true);
3467
+ expect(DEFAULT_GEMINI_FLASH_MODEL).toBe('gemini-3-flash');
3468
+ expect(PREVIEW_GEMINI_FLASH_MODEL).toBe('gemini-3-flash');
3469
+ });
3470
+ });
3219
3471
  //# sourceMappingURL=config.test.js.map