@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
@@ -7,22 +7,10 @@ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
7
  import * as fsPromises from 'node:fs/promises';
8
8
  import * as os from 'node:os';
9
9
  import * as path from 'node:path';
10
- import { loadServerHierarchicalMemory, getGlobalMemoryPaths, getExtensionMemoryPaths, getEnvironmentMemoryPaths, loadJitSubdirectoryMemory, refreshServerHierarchicalMemory, } from './memoryDiscovery.js';
11
- import { setGeminiMdFilename, DEFAULT_CONTEXT_FILENAME, } from '../tools/memoryTool.js';
12
- import { flattenMemory } from '../config/memory.js';
13
- import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
14
- import { CELL_DIR, normalizePath, homedir as pathsHomedir } from './paths.js';
15
- function flattenResult(result) {
16
- return {
17
- ...result,
18
- memoryContent: flattenMemory(result.memoryContent),
19
- filePaths: result.filePaths.map((p) => normalizePath(p)),
20
- };
21
- }
22
- import { Config } from '../config/config.js';
23
- import { Storage } from '../config/storage.js';
10
+ import { deduplicatePathsByFileIdentity, getGlobalMemoryPaths, getExtensionMemoryPaths, getEnvironmentMemoryPaths, getUserProjectMemoryPaths, loadJitSubdirectoryMemory, readGeminiMdFiles, } from './memoryDiscovery.js';
11
+ import { setGeminiMdFilename, DEFAULT_CONTEXT_FILENAME, PROJECT_MEMORY_INDEX_FILENAME, } from '../tools/memoryTool.js';
12
+ import { CELL_DIR, toAbsolutePath, homedir as pathsHomedir } from './paths.js';
24
13
  import { SimpleExtensionLoader } from './extensionLoader.js';
25
- import { CoreEvent, coreEvents } from './events.js';
26
14
  vi.mock('os', async (importOriginal) => {
27
15
  const actualOs = await importOriginal();
28
16
  return {
@@ -42,33 +30,29 @@ vi.mock('../utils/paths.js', async (importOriginal) => {
42
30
  };
43
31
  });
44
32
  describe('memoryDiscovery', () => {
45
- const DEFAULT_FOLDER_TRUST = true;
46
33
  let testRootDir;
47
- let cwd;
48
34
  let projectRoot;
49
35
  let homedir;
50
36
  async function createEmptyDir(fullPath) {
51
37
  await fsPromises.mkdir(fullPath, { recursive: true });
52
- return normalizePath(fullPath);
38
+ return toAbsolutePath(fullPath);
53
39
  }
54
40
  async function createTestFile(fullPath, fileContents) {
55
41
  await fsPromises.mkdir(path.dirname(fullPath), { recursive: true });
56
42
  await fsPromises.writeFile(fullPath, fileContents);
57
- return normalizePath(path.resolve(testRootDir, fullPath));
43
+ return toAbsolutePath(path.resolve(testRootDir, fullPath));
58
44
  }
59
45
  beforeEach(async () => {
60
- testRootDir = normalizePath(await fsPromises.mkdtemp(path.join(os.tmpdir(), 'folder-structure-test-')));
46
+ testRootDir = toAbsolutePath(await fsPromises.mkdtemp(path.join(os.tmpdir(), 'folder-structure-test-')));
61
47
  vi.resetAllMocks();
62
48
  // Set environment variables to indicate test environment
63
49
  vi.stubEnv('NODE_ENV', 'test');
64
50
  vi.stubEnv('VITEST', 'true');
65
51
  projectRoot = await createEmptyDir(path.join(testRootDir, 'project'));
66
- cwd = await createEmptyDir(path.join(projectRoot, 'src'));
67
52
  homedir = await createEmptyDir(path.join(testRootDir, 'userhome'));
68
53
  vi.mocked(os.homedir).mockReturnValue(homedir);
69
54
  vi.mocked(pathsHomedir).mockReturnValue(homedir);
70
55
  });
71
- const normMarker = (p) => process.platform === 'win32' ? p.toLowerCase() : p;
72
56
  afterEach(async () => {
73
57
  vi.unstubAllEnvs();
74
58
  // Some tests set this to a different value.
@@ -82,289 +66,15 @@ describe('memoryDiscovery', () => {
82
66
  retryDelay: 10,
83
67
  });
84
68
  });
85
- describe('when untrusted', () => {
86
- it('does not load context files from untrusted workspaces', async () => {
87
- await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
88
- await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
89
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), false));
90
- expect(result).toEqual({
91
- memoryContent: '',
92
- fileCount: 0,
93
- filePaths: [],
94
- });
95
- });
96
- it('loads context from outside the untrusted workspace', async () => {
97
- await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
98
- await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
99
- const filepathInput = path.join(homedir, CELL_DIR, DEFAULT_CONTEXT_FILENAME);
100
- const filepath = await createTestFile(filepathInput, 'default context content'); // In user home dir (outside untrusted space).
101
- const { fileCount, memoryContent, filePaths } = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), false));
102
- expect(fileCount).toEqual(1);
103
- expect(memoryContent).toContain(filepath);
104
- expect(filePaths).toEqual([filepath]);
105
- });
106
- });
107
- it('should return empty memory and count if no context files are found', async () => {
108
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
109
- expect(result).toEqual({
110
- memoryContent: '',
111
- fileCount: 0,
112
- filePaths: [],
113
- });
114
- });
115
- it('should load only the global context file if present and others are not (default filename)', async () => {
116
- const defaultContextFile = await createTestFile(path.join(homedir, CELL_DIR, DEFAULT_CONTEXT_FILENAME), 'default context content');
117
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
118
- expect({
119
- ...result,
120
- memoryContent: flattenMemory(result.memoryContent),
121
- }).toEqual({
122
- memoryContent: `--- Global ---
123
- --- Context from: ${defaultContextFile} ---
124
- default context content
125
- --- End of Context from: ${defaultContextFile} ---`,
126
- fileCount: 1,
127
- filePaths: [defaultContextFile],
128
- });
129
- });
130
- it('should load only the global custom context file if present and filename is changed', async () => {
131
- const customFilename = 'CUSTOM_AGENTS.md';
132
- setGeminiMdFilename(customFilename);
133
- const customContextFile = await createTestFile(path.join(homedir, CELL_DIR, customFilename), 'custom context content');
134
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
135
- expect(result).toEqual({
136
- memoryContent: `--- Global ---
137
- --- Context from: ${customContextFile} ---
138
- custom context content
139
- --- End of Context from: ${customContextFile} ---`,
140
- fileCount: 1,
141
- filePaths: [customContextFile],
142
- });
143
- });
144
- it('should load context files by upward traversal with custom filename', async () => {
145
- const customFilename = 'PROJECT_CONTEXT.md';
146
- setGeminiMdFilename(customFilename);
147
- const projectContextFile = await createTestFile(path.join(projectRoot, customFilename), 'project context content');
148
- const cwdContextFile = await createTestFile(path.join(cwd, customFilename), 'cwd context content');
149
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
150
- expect(result).toEqual({
151
- memoryContent: `--- Project ---
152
- --- Context from: ${projectContextFile} ---
153
- project context content
154
- --- End of Context from: ${projectContextFile} ---
155
-
156
- --- Context from: ${cwdContextFile} ---
157
- cwd context content
158
- --- End of Context from: ${cwdContextFile} ---`,
159
- fileCount: 2,
160
- filePaths: [projectContextFile, cwdContextFile],
161
- });
162
- });
163
- it('should load context files by downward traversal with custom filename', async () => {
164
- const customFilename = 'LOCAL_CONTEXT.md';
165
- setGeminiMdFilename(customFilename);
166
- const subdirCustomFile = await createTestFile(path.join(cwd, 'subdir', customFilename), 'Subdir custom memory');
167
- const cwdCustomFile = await createTestFile(path.join(cwd, customFilename), 'CWD custom memory');
168
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
169
- expect(result).toEqual({
170
- memoryContent: `--- Project ---
171
- --- Context from: ${cwdCustomFile} ---
172
- CWD custom memory
173
- --- End of Context from: ${cwdCustomFile} ---
174
-
175
- --- Context from: ${subdirCustomFile} ---
176
- Subdir custom memory
177
- --- End of Context from: ${subdirCustomFile} ---`,
178
- fileCount: 2,
179
- filePaths: [cwdCustomFile, subdirCustomFile],
180
- });
181
- });
182
- it('should load ORIGINAL_GEMINI_MD_FILENAME files by upward traversal from CWD to project root', async () => {
183
- const projectRootGeminiFile = await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
184
- const srcGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
185
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
186
- expect(result).toEqual({
187
- memoryContent: `--- Project ---
188
- --- Context from: ${projectRootGeminiFile} ---
189
- Project root memory
190
- --- End of Context from: ${projectRootGeminiFile} ---
191
-
192
- --- Context from: ${srcGeminiFile} ---
193
- Src directory memory
194
- --- End of Context from: ${srcGeminiFile} ---`,
195
- fileCount: 2,
196
- filePaths: [projectRootGeminiFile, srcGeminiFile],
197
- });
198
- });
199
- it('should load ORIGINAL_GEMINI_MD_FILENAME files by downward traversal from CWD', async () => {
200
- const subDirGeminiFile = await createTestFile(path.join(cwd, 'subdir', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
201
- const cwdGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'CWD memory');
202
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
203
- expect(result).toEqual({
204
- memoryContent: `--- Project ---
205
- --- Context from: ${cwdGeminiFile} ---
206
- CWD memory
207
- --- End of Context from: ${cwdGeminiFile} ---
208
-
209
- --- Context from: ${subDirGeminiFile} ---
210
- Subdir memory
211
- --- End of Context from: ${subDirGeminiFile} ---`,
212
- fileCount: 2,
213
- filePaths: [cwdGeminiFile, subDirGeminiFile],
214
- });
215
- });
216
- it('should load and correctly order global, upward, and downward ORIGINAL_GEMINI_MD_FILENAME files', async () => {
217
- const defaultContextFile = await createTestFile(path.join(homedir, CELL_DIR, DEFAULT_CONTEXT_FILENAME), 'default context content');
218
- const rootGeminiFile = await createTestFile(path.join(testRootDir, DEFAULT_CONTEXT_FILENAME), 'Project parent memory');
219
- const projectRootGeminiFile = await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
220
- const cwdGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'CWD memory');
221
- const subDirGeminiFile = await createTestFile(path.join(cwd, 'sub', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
222
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
223
- expect(result).toEqual({
224
- memoryContent: `--- Global ---
225
- --- Context from: ${defaultContextFile} ---
226
- default context content
227
- --- End of Context from: ${defaultContextFile} ---
228
-
229
- --- Project ---
230
- --- Context from: ${rootGeminiFile} ---
231
- Project parent memory
232
- --- End of Context from: ${rootGeminiFile} ---
233
-
234
- --- Context from: ${projectRootGeminiFile} ---
235
- Project root memory
236
- --- End of Context from: ${projectRootGeminiFile} ---
237
-
238
- --- Context from: ${cwdGeminiFile} ---
239
- CWD memory
240
- --- End of Context from: ${cwdGeminiFile} ---
241
-
242
- --- Context from: ${subDirGeminiFile} ---
243
- Subdir memory
244
- --- End of Context from: ${subDirGeminiFile} ---`,
245
- fileCount: 5,
246
- filePaths: [
247
- defaultContextFile,
248
- rootGeminiFile,
249
- projectRootGeminiFile,
250
- cwdGeminiFile,
251
- subDirGeminiFile,
252
- ],
253
- });
254
- });
255
- it('should ignore specified directories during downward scan', async () => {
256
- await createEmptyDir(path.join(projectRoot, '.git'));
257
- await createTestFile(path.join(projectRoot, '.gitignore'), 'node_modules');
258
- await createTestFile(path.join(cwd, 'node_modules', DEFAULT_CONTEXT_FILENAME), 'Ignored memory');
259
- const regularSubDirGeminiFile = await createTestFile(path.join(cwd, 'my_code', DEFAULT_CONTEXT_FILENAME), 'My code memory');
260
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST, 'tree', {
261
- respectGitIgnore: true,
262
- respectGeminiIgnore: true,
263
- customIgnoreFilePaths: [],
264
- }, 200));
265
- expect(result).toEqual({
266
- memoryContent: `--- Project ---
267
- --- Context from: ${regularSubDirGeminiFile} ---
268
- My code memory
269
- --- End of Context from: ${regularSubDirGeminiFile} ---`,
270
- fileCount: 1,
271
- filePaths: [regularSubDirGeminiFile],
272
- });
273
- });
274
- it('should respect the maxDirs parameter during downward scan', async () => {
275
- // Create directories in parallel for better performance
276
- const dirPromises = Array.from({ length: 2 }, (_, i) => createEmptyDir(path.join(cwd, `deep_dir_${i}`)));
277
- await Promise.all(dirPromises);
278
- // Pass the custom limit directly to the function
279
- await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST, 'tree', // importFormat
280
- {
281
- respectGitIgnore: true,
282
- respectGeminiIgnore: true,
283
- customIgnoreFilePaths: [],
284
- }, 1);
285
- // Note: bfsFileSearch debug logging is no longer controlled via debugMode parameter
286
- // The test verifies maxDirs is respected by checking the result, not debug logs
287
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
288
- expect(result).toEqual({
289
- memoryContent: '',
290
- fileCount: 0,
291
- filePaths: [],
292
- });
293
- });
294
- it('should load extension context file paths', async () => {
295
- const extensionFilePath = await createTestFile(path.join(testRootDir, 'extensions/ext1/GEMINI.md'), 'Extension memory content');
296
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([
297
- {
298
- contextFiles: [extensionFilePath],
299
- isActive: true,
300
- },
301
- ]), DEFAULT_FOLDER_TRUST));
302
- expect(result).toEqual({
303
- memoryContent: `--- Extension ---
304
- --- Context from: ${extensionFilePath} ---
305
- Extension memory content
306
- --- End of Context from: ${extensionFilePath} ---`,
307
- fileCount: 1,
308
- filePaths: [extensionFilePath],
309
- });
310
- });
311
- it('should load memory from included directories', async () => {
312
- const includedDir = await createEmptyDir(path.join(testRootDir, 'included'));
313
- const includedFile = await createTestFile(path.join(includedDir, DEFAULT_CONTEXT_FILENAME), 'included directory memory');
314
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [includedDir], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
315
- expect(result).toEqual({
316
- memoryContent: `--- Project ---
317
- --- Context from: ${includedFile} ---
318
- included directory memory
319
- --- End of Context from: ${includedFile} ---`,
320
- fileCount: 1,
321
- filePaths: [includedFile],
69
+ describe('EISDIR handling for GEMINI.md as a directory', () => {
70
+ it('readGeminiMdFiles returns null content (without throwing) when path is a directory', async () => {
71
+ const dirAsFilePath = await createEmptyDir(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME));
72
+ const results = await readGeminiMdFiles([dirAsFilePath]);
73
+ expect(results).toHaveLength(1);
74
+ expect(results[0].filePath).toBe(dirAsFilePath);
75
+ expect(results[0].content).toBeNull();
322
76
  });
323
77
  });
324
- it('should handle multiple directories and files in parallel correctly', async () => {
325
- // Create multiple test directories with GEMINI.md files
326
- const numDirs = 5;
327
- const createdFiles = [];
328
- for (let i = 0; i < numDirs; i++) {
329
- const dirPath = await createEmptyDir(path.join(testRootDir, `project-${i}`));
330
- const filePath = await createTestFile(path.join(dirPath, DEFAULT_CONTEXT_FILENAME), `Content from project ${i}`);
331
- createdFiles.push(filePath);
332
- }
333
- // Load memory from all directories
334
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, createdFiles.map((f) => path.dirname(f)), new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
335
- // Should have loaded all files
336
- expect(result.fileCount).toBe(numDirs);
337
- expect(result.filePaths.length).toBe(numDirs);
338
- expect(result.filePaths.sort()).toEqual(createdFiles.sort());
339
- // Content should include all project contents
340
- const flattenedMemory = flattenMemory(result.memoryContent);
341
- for (let i = 0; i < numDirs; i++) {
342
- expect(flattenedMemory).toContain(`Content from project ${i}`);
343
- }
344
- });
345
- it('should preserve order and prevent duplicates when processing multiple directories', async () => {
346
- // Create overlapping directory structure
347
- const parentDir = await createEmptyDir(path.join(testRootDir, 'parent'));
348
- const childDir = await createEmptyDir(path.join(parentDir, 'child'));
349
- const parentFile = await createTestFile(path.join(parentDir, DEFAULT_CONTEXT_FILENAME), 'Parent content');
350
- const childFile = await createTestFile(path.join(childDir, DEFAULT_CONTEXT_FILENAME), 'Child content');
351
- // Include both parent and child directories
352
- const result = flattenResult(await loadServerHierarchicalMemory(parentDir, [childDir, parentDir], // Deliberately include duplicates
353
- new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
354
- // Should have both files without duplicates
355
- const flattenedMemory = flattenMemory(result.memoryContent);
356
- expect(result.fileCount).toBe(2);
357
- expect(flattenedMemory).toContain('Parent content');
358
- expect(flattenedMemory).toContain('Child content');
359
- expect(result.filePaths.sort()).toEqual([parentFile, childFile].sort());
360
- // Check that files are not duplicated
361
- const parentOccurrences = (flattenedMemory.match(/Parent content/g) || [])
362
- .length;
363
- const childOccurrences = (flattenedMemory.match(/Child content/g) || [])
364
- .length;
365
- expect(parentOccurrences).toBe(1);
366
- expect(childOccurrences).toBe(1);
367
- });
368
78
  describe('getGlobalMemoryPaths', () => {
369
79
  it('should find global memory file if it exists', async () => {
370
80
  const globalMemoryFile = await createTestFile(path.join(homedir, CELL_DIR, DEFAULT_CONTEXT_FILENAME), 'Global memory content');
@@ -377,6 +87,38 @@ included directory memory
377
87
  expect(result).toHaveLength(0);
378
88
  });
379
89
  });
90
+ describe('getUserProjectMemoryPaths', () => {
91
+ it('should find MEMORY.md when it exists', async () => {
92
+ const memoryDir = await createEmptyDir(path.join(testRootDir, 'memdir1'));
93
+ const memoryFile = await createTestFile(path.join(memoryDir, PROJECT_MEMORY_INDEX_FILENAME), 'project memory');
94
+ const result = await getUserProjectMemoryPaths(memoryDir);
95
+ expect(result).toHaveLength(1);
96
+ expect(result[0]).toBe(memoryFile);
97
+ });
98
+ it('should preserve the on-disk casing of the index filename', async () => {
99
+ // Regression: paths surfaced through /memory list and /memory show
100
+ // were previously lowercased on macOS/Windows because they passed
101
+ // through normalizePath. The MEMORY.md filename must be kept as-is
102
+ // for display.
103
+ const memoryDir = await createEmptyDir(path.join(testRootDir, 'memdir2'));
104
+ await createTestFile(path.join(memoryDir, PROJECT_MEMORY_INDEX_FILENAME), 'project memory');
105
+ const result = await getUserProjectMemoryPaths(memoryDir);
106
+ expect(result).toHaveLength(1);
107
+ expect(result[0]).toContain(PROJECT_MEMORY_INDEX_FILENAME);
108
+ expect(result[0]).not.toContain(PROJECT_MEMORY_INDEX_FILENAME.toLowerCase());
109
+ });
110
+ it('should fall back to legacy GEMINI.md when MEMORY.md is absent', async () => {
111
+ const memoryDir = await createEmptyDir(path.join(testRootDir, 'memdir3'));
112
+ const legacyFile = await createTestFile(path.join(memoryDir, DEFAULT_CONTEXT_FILENAME), 'legacy memory');
113
+ const result = await getUserProjectMemoryPaths(memoryDir);
114
+ expect(result).toContain(legacyFile);
115
+ });
116
+ it('should return empty array when neither MEMORY.md nor GEMINI.md exists', async () => {
117
+ const memoryDir = await createEmptyDir(path.join(testRootDir, 'memdir4'));
118
+ const result = await getUserProjectMemoryPaths(memoryDir);
119
+ expect(result).toHaveLength(0);
120
+ });
121
+ });
380
122
  describe('getExtensionMemoryPaths', () => {
381
123
  it('should return active extension context files', async () => {
382
124
  const extFile = await createTestFile(path.join(testRootDir, 'ext', 'GEMINI.md'), 'Extension content');
@@ -443,6 +185,43 @@ included directory memory
443
185
  expect(result).toHaveLength(1);
444
186
  expect(result[0]).toBe(repoFile);
445
187
  });
188
+ it('should preserve case-distinct files before identity deduplication', async () => {
189
+ const platformSpy = vi
190
+ .spyOn(process, 'platform', 'get')
191
+ .mockReturnValue('win32');
192
+ vi.resetModules();
193
+ vi.doMock('node:fs/promises', async () => {
194
+ const actual = await vi.importActual('node:fs/promises');
195
+ return {
196
+ ...actual,
197
+ access: vi.fn().mockResolvedValue(undefined),
198
+ stat: vi.fn(async (filePath) => {
199
+ const normalizedPath = String(filePath).replace(/\\/g, '/');
200
+ return {
201
+ dev: 1,
202
+ ino: normalizedPath.endsWith('/GEMINI.md') ? 101 : 202,
203
+ };
204
+ }),
205
+ };
206
+ });
207
+ try {
208
+ const paths = await import('./paths.js');
209
+ const memoryTool = await import('../tools/memoryTool.js');
210
+ const memoryDiscovery = await import('./memoryDiscovery.js');
211
+ vi.mocked(paths.homedir).mockReturnValue('/home/tester');
212
+ memoryTool.setGeminiMdFilename(['GEMINI.md', 'gemini.md']);
213
+ const result = await memoryDiscovery.getEnvironmentMemoryPaths(['/case-root'], []);
214
+ expect(result).toEqual([
215
+ paths.toAbsolutePath('/case-root/GEMINI.md'),
216
+ paths.toAbsolutePath('/case-root/gemini.md'),
217
+ ]);
218
+ }
219
+ finally {
220
+ platformSpy.mockRestore();
221
+ vi.doUnmock('node:fs/promises');
222
+ vi.resetModules();
223
+ }
224
+ });
446
225
  it('should recognize .git as a file (submodules/worktrees)', async () => {
447
226
  const repoDir = await createEmptyDir(path.join(testRootDir, 'worktree_repo'));
448
227
  // .git as a file, like in submodules and worktrees
@@ -472,7 +251,7 @@ included directory memory
472
251
  expect(result[1]).toBe(secondaryFile);
473
252
  });
474
253
  });
475
- describe('case-insensitive filesystem deduplication', () => {
254
+ describe('file identity deduplication', () => {
476
255
  it('should deduplicate files that point to the same inode (same physical file)', async () => {
477
256
  const geminiFile = await createTestFile(path.join(projectRoot, 'gemini.md'), 'Project root memory');
478
257
  // create hard link to simulate case-insensitive filesystem behavior
@@ -493,13 +272,12 @@ included directory memory
493
272
  const stats2 = await fsPromises.lstat(geminiFileLink);
494
273
  expect(stats1.ino).toBe(stats2.ino);
495
274
  expect(stats1.dev).toBe(stats2.dev);
496
- setGeminiMdFilename(['GEMINI.md', 'gemini.md']);
497
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
498
- expect(result.fileCount).toBe(1);
499
- expect(result.filePaths).toHaveLength(1);
500
- expect(result.memoryContent).toContain('Project root memory');
501
- const contentMatches = result.memoryContent.match(/Project root memory/g);
502
- expect(contentMatches).toHaveLength(1);
275
+ const result = await deduplicatePathsByFileIdentity([
276
+ geminiFileLink,
277
+ geminiFile,
278
+ ]);
279
+ expect(result.paths).toHaveLength(1);
280
+ expect(result.identityMap.get(geminiFile)).toBe(result.identityMap.get(geminiFileLink));
503
281
  try {
504
282
  await fsPromises.unlink(geminiFileLink);
505
283
  }
@@ -513,20 +291,24 @@ included directory memory
513
291
  const stats1 = await fsPromises.lstat(geminiFileLower);
514
292
  const stats2 = await fsPromises.lstat(geminiFileUpper);
515
293
  if (stats1.ino !== stats2.ino || stats1.dev !== stats2.dev) {
516
- setGeminiMdFilename(['GEMINI.md', 'gemini.md']);
517
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
518
- expect(result.fileCount).toBe(2);
519
- expect(result.filePaths).toHaveLength(2);
520
- expect(result.memoryContent).toContain('Lowercase file content');
521
- expect(result.memoryContent).toContain('Uppercase file content');
294
+ const result = await deduplicatePathsByFileIdentity([
295
+ geminiFileLower,
296
+ geminiFileUpper,
297
+ ]);
298
+ expect(result.paths).toHaveLength(2);
299
+ expect(result.paths).toContain(geminiFileLower);
300
+ expect(result.paths).toContain(geminiFileUpper);
522
301
  }
523
302
  });
524
303
  it("should handle files that cannot be stat'd (missing files)", async () => {
525
- await createTestFile(path.join(projectRoot, 'gemini.md'), 'Valid file content');
526
- setGeminiMdFilename(['gemini.md', 'missing.md']);
527
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
528
- expect(result.fileCount).toBe(1);
529
- expect(result.memoryContent).toContain('Valid file content');
304
+ const geminiFile = await createTestFile(path.join(projectRoot, 'gemini.md'), 'Valid file content');
305
+ const missingFile = path.join(projectRoot, 'missing.md');
306
+ const result = await deduplicatePathsByFileIdentity([
307
+ geminiFile,
308
+ missingFile,
309
+ ]);
310
+ expect(result.paths).toEqual([geminiFile, missingFile]);
311
+ expect(result.identityMap.has(missingFile)).toBe(false);
530
312
  });
531
313
  it('should deduplicate multiple paths pointing to same file (3+ duplicates)', async () => {
532
314
  const geminiFile = await createTestFile(path.join(projectRoot, 'gemini.md'), 'Project root memory');
@@ -550,13 +332,14 @@ included directory memory
550
332
  const stats3 = await fsPromises.lstat(link2);
551
333
  expect(stats1.ino).toBe(stats2.ino);
552
334
  expect(stats1.ino).toBe(stats3.ino);
553
- setGeminiMdFilename(['gemini.md', 'GEMINI.md', 'Gemini.md']);
554
- const result = flattenResult(await loadServerHierarchicalMemory(cwd, [], new FileDiscoveryService(projectRoot), new SimpleExtensionLoader([]), DEFAULT_FOLDER_TRUST));
555
- expect(result.fileCount).toBe(1);
556
- expect(result.filePaths).toHaveLength(1);
557
- expect(result.memoryContent).toContain('Project root memory');
558
- const contentMatches = result.memoryContent.match(/Project root memory/g);
559
- expect(contentMatches).toHaveLength(1);
335
+ const result = await deduplicatePathsByFileIdentity([
336
+ geminiFile,
337
+ link1,
338
+ link2,
339
+ ]);
340
+ expect(result.paths).toHaveLength(1);
341
+ expect(result.identityMap.get(geminiFile)).toBe(result.identityMap.get(link1));
342
+ expect(result.identityMap.get(geminiFile)).toBe(result.identityMap.get(link2));
560
343
  try {
561
344
  await fsPromises.unlink(link1);
562
345
  await fsPromises.unlink(link2);
@@ -726,79 +509,5 @@ included directory memory
726
509
  expect(result.files.find((f) => f.path === subDirMemory)).toBeDefined();
727
510
  });
728
511
  });
729
- it('refreshServerHierarchicalMemory should refresh memory and update config', async () => {
730
- const extensionLoader = new SimpleExtensionLoader([]);
731
- const config = new Config({
732
- sessionId: '1',
733
- targetDir: cwd,
734
- cwd,
735
- debugMode: false,
736
- model: 'fake-model',
737
- extensionLoader,
738
- });
739
- const result = flattenResult(await loadServerHierarchicalMemory(config.getWorkingDir(), config.shouldLoadMemoryFromIncludeDirectories()
740
- ? config.getWorkspaceContext().getDirectories()
741
- : [], config.getFileService(), config.getExtensionLoader(), config.isTrustedFolder(), config.getImportFormat()));
742
- expect(result.fileCount).equals(0);
743
- // Now add an extension with a memory file
744
- const extensionsDir = new Storage(homedir).getExtensionsDir();
745
- const extensionPath = path.join(extensionsDir, 'new-extension');
746
- const contextFilePath = path.join(extensionPath, 'CustomContext.md');
747
- await fsPromises.mkdir(extensionPath, { recursive: true });
748
- await fsPromises.writeFile(contextFilePath, 'Really cool custom context!');
749
- await extensionLoader.loadExtension({
750
- name: 'new-extension',
751
- isActive: true,
752
- contextFiles: [contextFilePath],
753
- version: '1.0.0',
754
- id: '1234',
755
- path: extensionPath,
756
- });
757
- const mockEventListener = vi.fn();
758
- coreEvents.on(CoreEvent.MemoryChanged, mockEventListener);
759
- const refreshResult = await refreshServerHierarchicalMemory(config);
760
- expect(refreshResult.fileCount).equals(1);
761
- expect(config.getGeminiMdFileCount()).equals(refreshResult.fileCount);
762
- const flattenedMemory = flattenMemory(refreshResult.memoryContent);
763
- expect(flattenedMemory).toContain('Really cool custom context!');
764
- expect(config.getUserMemory()).toStrictEqual(refreshResult.memoryContent);
765
- expect(refreshResult.filePaths[0]).toContain(normMarker(path.join(extensionPath, 'CustomContext.md')));
766
- expect(config.getGeminiMdFilePaths()).equals(refreshResult.filePaths);
767
- expect(mockEventListener).toHaveBeenCalledExactlyOnceWith({
768
- fileCount: refreshResult.fileCount,
769
- });
770
- });
771
- it('should include MCP instructions in user memory', async () => {
772
- const mockConfig = {
773
- getWorkingDir: vi.fn().mockReturnValue(cwd),
774
- shouldLoadMemoryFromIncludeDirectories: vi.fn().mockReturnValue(false),
775
- getFileService: vi
776
- .fn()
777
- .mockReturnValue(new FileDiscoveryService(projectRoot)),
778
- getExtensionLoader: vi
779
- .fn()
780
- .mockReturnValue(new SimpleExtensionLoader([])),
781
- isTrustedFolder: vi.fn().mockReturnValue(true),
782
- getImportFormat: vi.fn().mockReturnValue('tree'),
783
- getFileFilteringOptions: vi.fn().mockReturnValue(undefined),
784
- getDiscoveryMaxDirs: vi.fn().mockReturnValue(200),
785
- getMemoryBoundaryMarkers: vi.fn().mockReturnValue(['.git']),
786
- setUserMemory: vi.fn(),
787
- setGeminiMdFileCount: vi.fn(),
788
- setGeminiMdFilePaths: vi.fn(),
789
- getMcpClientManager: vi.fn().mockReturnValue({
790
- getMcpInstructions: vi
791
- .fn()
792
- .mockReturnValue("\n\n# Instructions for MCP Server 'extension-server'\nAlways be polite."),
793
- }),
794
- };
795
- await refreshServerHierarchicalMemory(mockConfig);
796
- expect(mockConfig.setUserMemory).toHaveBeenCalledWith(expect.objectContaining({
797
- project: expect.stringContaining("# Instructions for MCP Server 'extension-server'"),
798
- }));
799
- expect(mockConfig.setUserMemory).toHaveBeenCalledWith(expect.objectContaining({
800
- project: expect.stringContaining('Always be polite.'),
801
- }));
802
- });
803
512
  });
804
513
  //# sourceMappingURL=memoryDiscovery.test.js.map