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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +1 -1
  2. package/dist/docs/admin/enterprise-controls.md +1 -1
  3. package/dist/docs/changelogs/index.md +42 -0
  4. package/dist/docs/changelogs/latest.md +254 -361
  5. package/dist/docs/changelogs/preview.md +237 -406
  6. package/dist/docs/cli/acp-mode.md +6 -6
  7. package/dist/docs/cli/auto-memory.md +143 -0
  8. package/dist/docs/cli/checkpointing.md +5 -5
  9. package/dist/docs/cli/cli-reference.md +12 -11
  10. package/dist/docs/cli/creating-skills.md +2 -2
  11. package/dist/docs/cli/custom-commands.md +15 -14
  12. package/dist/docs/cli/enterprise.md +17 -14
  13. package/dist/docs/cli/gemini-ignore.md +2 -2
  14. package/dist/docs/cli/generation-settings.md +21 -20
  15. package/dist/docs/cli/model-routing.md +2 -2
  16. package/dist/docs/cli/model-steering.md +1 -1
  17. package/dist/docs/cli/plan-mode.md +11 -6
  18. package/dist/docs/cli/sandbox.md +7 -5
  19. package/dist/docs/cli/settings.md +32 -28
  20. package/dist/docs/cli/system-prompt.md +8 -8
  21. package/dist/docs/cli/telemetry.md +18 -11
  22. package/dist/docs/cli/themes.md +2 -2
  23. package/dist/docs/cli/trusted-folders.md +41 -13
  24. package/dist/docs/cli/tutorials/mcp-setup.md +1 -1
  25. package/dist/docs/cli/tutorials/memory-management.md +3 -1
  26. package/dist/docs/cli/tutorials/plan-mode-steering.md +2 -2
  27. package/dist/docs/cli/tutorials/session-management.md +1 -1
  28. package/dist/docs/cli/tutorials/shell-commands.md +1 -1
  29. package/dist/docs/cli/tutorials/task-planning.md +3 -3
  30. package/dist/docs/core/index.md +5 -6
  31. package/dist/docs/core/local-model-routing.md +1 -1
  32. package/dist/docs/core/remote-agents.md +1 -1
  33. package/dist/docs/core/subagents.md +38 -8
  34. package/dist/docs/extensions/best-practices.md +5 -4
  35. package/dist/docs/extensions/reference.md +6 -5
  36. package/dist/docs/extensions/releasing.md +6 -5
  37. package/dist/docs/extensions/writing-extensions.md +11 -11
  38. package/dist/docs/get-started/{authentication.md → authentication.mdx} +139 -93
  39. package/dist/docs/get-started/gemini-3.md +1 -1
  40. package/dist/docs/get-started/index.md +4 -4
  41. package/dist/docs/get-started/installation.mdx +201 -0
  42. package/dist/docs/hooks/best-practices.md +18 -17
  43. package/dist/docs/hooks/index.md +10 -8
  44. package/dist/docs/hooks/reference.md +10 -10
  45. package/dist/docs/ide-integration/ide-companion-spec.md +14 -14
  46. package/dist/docs/ide-integration/index.md +4 -4
  47. package/dist/docs/index.md +2 -2
  48. package/dist/docs/integration-tests.md +84 -2
  49. package/dist/docs/issue-and-pr-automation.md +8 -7
  50. package/dist/docs/npm.md +2 -2
  51. package/dist/docs/reference/commands.md +11 -11
  52. package/dist/docs/reference/configuration.md +150 -47
  53. package/dist/docs/reference/keyboard-shortcuts.md +79 -2
  54. package/dist/docs/reference/memport.md +2 -3
  55. package/dist/docs/reference/policy-engine.md +60 -26
  56. package/dist/docs/reference/tools.md +38 -4
  57. package/dist/docs/release-confidence.md +1 -1
  58. package/dist/docs/releases.md +19 -19
  59. package/dist/docs/resources/faq.md +5 -5
  60. package/dist/docs/resources/tos-privacy.md +10 -9
  61. package/dist/docs/resources/troubleshooting.md +17 -16
  62. package/dist/docs/resources/uninstall.md +5 -4
  63. package/dist/docs/sidebar.json +13 -1
  64. package/dist/docs/tools/ask-user.md +3 -3
  65. package/dist/docs/tools/file-system.md +7 -7
  66. package/dist/docs/tools/mcp-resources.md +44 -0
  67. package/dist/docs/tools/mcp-server.md +42 -39
  68. package/dist/docs/tools/shell.md +5 -5
  69. package/dist/docs/tools/tracker.md +61 -0
  70. package/dist/package.json +5 -4
  71. package/dist/src/agent/content-utils.d.ts +0 -6
  72. package/dist/src/agent/content-utils.js +0 -14
  73. package/dist/src/agent/content-utils.js.map +1 -1
  74. package/dist/src/agent/content-utils.test.js +1 -18
  75. package/dist/src/agent/content-utils.test.js.map +1 -1
  76. package/dist/src/agent/event-translator.js +8 -3
  77. package/dist/src/agent/event-translator.js.map +1 -1
  78. package/dist/src/agent/event-translator.test.js +14 -9
  79. package/dist/src/agent/event-translator.test.js.map +1 -1
  80. package/dist/src/agent/legacy-agent-session.js +9 -3
  81. package/dist/src/agent/legacy-agent-session.js.map +1 -1
  82. package/dist/src/agent/legacy-agent-session.test.js +4 -3
  83. package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
  84. package/dist/src/agent/tool-display-utils.d.ts +30 -0
  85. package/dist/src/agent/tool-display-utils.js +69 -0
  86. package/dist/src/agent/tool-display-utils.js.map +1 -0
  87. package/dist/src/agent/tool-display-utils.test.js +101 -0
  88. package/dist/src/agent/tool-display-utils.test.js.map +1 -0
  89. package/dist/src/agent/types.d.ts +25 -5
  90. package/dist/src/agents/a2aUtils.js +28 -15
  91. package/dist/src/agents/a2aUtils.js.map +1 -1
  92. package/dist/src/agents/a2aUtils.test.js +43 -0
  93. package/dist/src/agents/a2aUtils.test.js.map +1 -1
  94. package/dist/src/agents/agent-tool.d.ts +31 -0
  95. package/dist/src/agents/agent-tool.js +155 -0
  96. package/dist/src/agents/agent-tool.js.map +1 -0
  97. package/dist/src/agents/agent-tool.test.js +110 -0
  98. package/dist/src/agents/agent-tool.test.js.map +1 -0
  99. package/dist/src/agents/agentLoader.d.ts +79 -4
  100. package/dist/src/agents/agentLoader.js +40 -2
  101. package/dist/src/agents/agentLoader.js.map +1 -1
  102. package/dist/src/agents/agentLoader.test.js +32 -0
  103. package/dist/src/agents/agentLoader.test.js.map +1 -1
  104. package/dist/src/agents/browser/analyzeScreenshot.js +1 -1
  105. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
  106. package/dist/src/agents/browser/analyzeScreenshot.test.js +19 -7
  107. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
  108. package/dist/src/agents/browser/browserAgentInvocation.d.ts +2 -2
  109. package/dist/src/agents/browser/browserAgentInvocation.js +2 -1
  110. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  111. package/dist/src/agents/browser/browserAgentInvocation.test.js +61 -17
  112. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
  113. package/dist/src/agents/browser/mcpToolWrapper.js +1 -1
  114. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
  115. package/dist/src/agents/browser/mcpToolWrapper.test.js +22 -10
  116. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
  117. package/dist/src/agents/codebase-investigator.js +2 -2
  118. package/dist/src/agents/codebase-investigator.js.map +1 -1
  119. package/dist/src/agents/generalist-agent.js +3 -2
  120. package/dist/src/agents/generalist-agent.js.map +1 -1
  121. package/dist/src/agents/generalist-agent.test.js +1 -0
  122. package/dist/src/agents/generalist-agent.test.js.map +1 -1
  123. package/dist/src/agents/local-executor.d.ts +1 -1
  124. package/dist/src/agents/local-executor.js +10 -7
  125. package/dist/src/agents/local-executor.js.map +1 -1
  126. package/dist/src/agents/local-executor.test.js +5 -3
  127. package/dist/src/agents/local-executor.test.js.map +1 -1
  128. package/dist/src/agents/local-invocation.d.ts +2 -2
  129. package/dist/src/agents/local-invocation.js +8 -2
  130. package/dist/src/agents/local-invocation.js.map +1 -1
  131. package/dist/src/agents/local-invocation.test.js +29 -13
  132. package/dist/src/agents/local-invocation.test.js.map +1 -1
  133. package/dist/src/agents/registry.d.ts +2 -0
  134. package/dist/src/agents/registry.js +20 -19
  135. package/dist/src/agents/registry.js.map +1 -1
  136. package/dist/src/agents/registry.test.js +19 -30
  137. package/dist/src/agents/registry.test.js.map +1 -1
  138. package/dist/src/agents/remote-invocation.d.ts +3 -4
  139. package/dist/src/agents/remote-invocation.js +2 -1
  140. package/dist/src/agents/remote-invocation.js.map +1 -1
  141. package/dist/src/agents/remote-invocation.test.js +45 -18
  142. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  143. package/dist/src/agents/skill-extraction-agent.d.ts +3 -2
  144. package/dist/src/agents/skill-extraction-agent.js +99 -56
  145. package/dist/src/agents/skill-extraction-agent.js.map +1 -1
  146. package/dist/src/agents/skill-extraction-agent.test.js +54 -0
  147. package/dist/src/agents/skill-extraction-agent.test.js.map +1 -0
  148. package/dist/src/availability/policyCatalog.js +1 -1
  149. package/dist/src/availability/policyCatalog.js.map +1 -1
  150. package/dist/src/availability/policyCatalog.test.js +1 -1
  151. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  152. package/dist/src/code_assist/oauth2.js +14 -4
  153. package/dist/src/code_assist/oauth2.js.map +1 -1
  154. package/dist/src/commands/memory.d.ts +77 -0
  155. package/dist/src/commands/memory.js +494 -0
  156. package/dist/src/commands/memory.js.map +1 -1
  157. package/dist/src/commands/memory.test.js +720 -1
  158. package/dist/src/commands/memory.test.js.map +1 -1
  159. package/dist/src/config/config-agents-reload.test.js +26 -31
  160. package/dist/src/config/config-agents-reload.test.js.map +1 -1
  161. package/dist/src/config/config.d.ts +24 -10
  162. package/dist/src/config/config.js +148 -82
  163. package/dist/src/config/config.js.map +1 -1
  164. package/dist/src/config/config.test.js +373 -10
  165. package/dist/src/config/config.test.js.map +1 -1
  166. package/dist/src/config/constants.d.ts +1 -0
  167. package/dist/src/config/constants.js +2 -0
  168. package/dist/src/config/constants.js.map +1 -1
  169. package/dist/src/config/defaultModelConfigs.js +7 -7
  170. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  171. package/dist/src/config/memory.js +1 -1
  172. package/dist/src/config/memory.js.map +1 -1
  173. package/dist/src/config/path-validation.test.js +15 -6
  174. package/dist/src/config/path-validation.test.js.map +1 -1
  175. package/dist/src/config/projectRegistry.js +113 -32
  176. package/dist/src/config/projectRegistry.js.map +1 -1
  177. package/dist/src/config/projectRegistry.test.js +51 -0
  178. package/dist/src/config/projectRegistry.test.js.map +1 -1
  179. package/dist/src/config/storage.d.ts +5 -1
  180. package/dist/src/config/storage.js +14 -1
  181. package/dist/src/config/storage.js.map +1 -1
  182. package/dist/src/config/storage.test.js +12 -0
  183. package/dist/src/config/storage.test.js.map +1 -1
  184. package/dist/src/confirmation-bus/message-bus.d.ts +4 -1
  185. package/dist/src/confirmation-bus/message-bus.js +39 -1
  186. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  187. package/dist/src/confirmation-bus/message-bus.test.js +43 -0
  188. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  189. package/dist/src/context/config/configLoader.d.ts +13 -0
  190. package/dist/src/context/config/configLoader.js +65 -0
  191. package/dist/src/context/config/configLoader.js.map +1 -0
  192. package/dist/src/context/config/configLoader.test.d.ts +6 -0
  193. package/dist/src/context/config/configLoader.test.js +79 -0
  194. package/dist/src/context/config/configLoader.test.js.map +1 -0
  195. package/dist/src/context/config/profiles.d.ts +17 -0
  196. package/dist/src/context/config/profiles.js +93 -0
  197. package/dist/src/context/config/profiles.js.map +1 -0
  198. package/dist/src/context/config/registry.d.ts +21 -0
  199. package/dist/src/context/config/registry.js +32 -0
  200. package/dist/src/context/config/registry.js.map +1 -0
  201. package/dist/src/context/config/schema.d.ts +45 -0
  202. package/dist/src/context/config/schema.js +47 -0
  203. package/dist/src/context/config/schema.js.map +1 -0
  204. package/dist/src/context/config/types.d.ts +39 -0
  205. package/dist/src/context/config/types.js +7 -0
  206. package/dist/src/context/config/types.js.map +1 -0
  207. package/dist/src/context/contextManager.barrier.test.d.ts +6 -0
  208. package/dist/src/context/contextManager.barrier.test.js +56 -0
  209. package/dist/src/context/contextManager.barrier.test.js.map +1 -0
  210. package/dist/src/context/contextManager.d.ts +49 -0
  211. package/dist/src/context/contextManager.js +120 -0
  212. package/dist/src/context/contextManager.js.map +1 -0
  213. package/dist/src/context/eventBus.d.ts +28 -0
  214. package/dist/src/context/eventBus.js +27 -0
  215. package/dist/src/context/eventBus.js.map +1 -0
  216. package/dist/src/context/graph/behaviorRegistry.d.ts +28 -0
  217. package/dist/src/context/graph/behaviorRegistry.js +14 -0
  218. package/dist/src/context/graph/behaviorRegistry.js.map +1 -0
  219. package/dist/src/context/graph/builtinBehaviors.d.ts +11 -0
  220. package/dist/src/context/graph/builtinBehaviors.js +145 -0
  221. package/dist/src/context/graph/builtinBehaviors.js.map +1 -0
  222. package/dist/src/context/graph/fromGraph.d.ts +9 -0
  223. package/dist/src/context/graph/fromGraph.js +34 -0
  224. package/dist/src/context/graph/fromGraph.js.map +1 -0
  225. package/dist/src/context/graph/mapper.d.ts +16 -0
  226. package/dist/src/context/graph/mapper.js +16 -0
  227. package/dist/src/context/graph/mapper.js.map +1 -0
  228. package/dist/src/context/graph/render.d.ts +15 -0
  229. package/dist/src/context/graph/render.js +72 -0
  230. package/dist/src/context/graph/render.js.map +1 -0
  231. package/dist/src/context/graph/toGraph.d.ts +10 -0
  232. package/dist/src/context/graph/toGraph.js +172 -0
  233. package/dist/src/context/graph/toGraph.js.map +1 -0
  234. package/dist/src/context/graph/types.d.ts +139 -0
  235. package/dist/src/context/graph/types.js +36 -0
  236. package/dist/src/context/graph/types.js.map +1 -0
  237. package/dist/src/context/historyObserver.d.ts +27 -0
  238. package/dist/src/context/historyObserver.js +64 -0
  239. package/dist/src/context/historyObserver.js.map +1 -0
  240. package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +33 -0
  241. package/dist/src/context/pipeline/contextWorkingBuffer.js +197 -0
  242. package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -0
  243. package/dist/src/context/pipeline/contextWorkingBuffer.test.d.ts +6 -0
  244. package/dist/src/context/pipeline/contextWorkingBuffer.test.js +89 -0
  245. package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -0
  246. package/dist/src/context/pipeline/environment.d.ts +27 -0
  247. package/dist/src/context/pipeline/environment.js +2 -0
  248. package/dist/src/context/pipeline/environment.js.map +1 -0
  249. package/dist/src/context/pipeline/environmentImpl.d.ts +28 -0
  250. package/dist/src/context/pipeline/environmentImpl.js +40 -0
  251. package/dist/src/context/pipeline/environmentImpl.js.map +1 -0
  252. package/dist/src/context/pipeline/environmentImpl.test.d.ts +1 -0
  253. package/dist/src/context/pipeline/environmentImpl.test.js +32 -0
  254. package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -0
  255. package/dist/src/context/pipeline/inbox.d.ts +15 -0
  256. package/dist/src/context/pipeline/inbox.js +52 -0
  257. package/dist/src/context/pipeline/inbox.js.map +1 -0
  258. package/dist/src/context/pipeline/inbox.test.d.ts +1 -0
  259. package/dist/src/context/pipeline/inbox.test.js +36 -0
  260. package/dist/src/context/pipeline/inbox.test.js.map +1 -0
  261. package/dist/src/context/pipeline/orchestrator.d.ts +22 -0
  262. package/dist/src/context/pipeline/orchestrator.js +126 -0
  263. package/dist/src/context/pipeline/orchestrator.js.map +1 -0
  264. package/dist/src/context/pipeline/orchestrator.test.d.ts +6 -0
  265. package/dist/src/context/pipeline/orchestrator.test.js +154 -0
  266. package/dist/src/context/pipeline/orchestrator.test.js.map +1 -0
  267. package/dist/src/context/pipeline.d.ts +52 -0
  268. package/dist/src/context/pipeline.js +7 -0
  269. package/dist/src/context/pipeline.js.map +1 -0
  270. package/dist/src/context/processors/blobDegradationProcessor.d.ts +6 -0
  271. package/dist/src/context/processors/blobDegradationProcessor.js +127 -0
  272. package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -0
  273. package/dist/src/context/processors/blobDegradationProcessor.test.d.ts +6 -0
  274. package/dist/src/context/processors/blobDegradationProcessor.test.js +72 -0
  275. package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -0
  276. package/dist/src/context/processors/historyTruncationProcessor.d.ts +11 -0
  277. package/dist/src/context/processors/historyTruncationProcessor.js +61 -0
  278. package/dist/src/context/processors/historyTruncationProcessor.js.map +1 -0
  279. package/dist/src/context/processors/nodeDistillationProcessor.d.ts +8 -0
  280. package/dist/src/context/processors/nodeDistillationProcessor.js +167 -0
  281. package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -0
  282. package/dist/src/context/processors/nodeDistillationProcessor.test.d.ts +6 -0
  283. package/dist/src/context/processors/nodeDistillationProcessor.test.js +77 -0
  284. package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -0
  285. package/dist/src/context/processors/nodeTruncationProcessor.d.ts +8 -0
  286. package/dist/src/context/processors/nodeTruncationProcessor.js +109 -0
  287. package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -0
  288. package/dist/src/context/processors/nodeTruncationProcessor.test.d.ts +6 -0
  289. package/dist/src/context/processors/nodeTruncationProcessor.test.js +71 -0
  290. package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -0
  291. package/dist/src/context/processors/rollingSummaryProcessor.d.ts +8 -0
  292. package/dist/src/context/processors/rollingSummaryProcessor.js +129 -0
  293. package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -0
  294. package/dist/src/context/processors/rollingSummaryProcessor.test.d.ts +1 -0
  295. package/dist/src/context/processors/rollingSummaryProcessor.test.js +60 -0
  296. package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -0
  297. package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +9 -0
  298. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +75 -0
  299. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -0
  300. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.d.ts +1 -0
  301. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +80 -0
  302. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -0
  303. package/dist/src/context/processors/stateSnapshotProcessor.d.ts +9 -0
  304. package/dist/src/context/processors/stateSnapshotProcessor.js +130 -0
  305. package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -0
  306. package/dist/src/context/processors/stateSnapshotProcessor.test.d.ts +1 -0
  307. package/dist/src/context/processors/stateSnapshotProcessor.test.js +91 -0
  308. package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -0
  309. package/dist/src/context/processors/toolMaskingProcessor.d.ts +8 -0
  310. package/dist/src/context/processors/toolMaskingProcessor.js +194 -0
  311. package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -0
  312. package/dist/src/context/processors/toolMaskingProcessor.test.d.ts +1 -0
  313. package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -0
  314. package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -0
  315. package/dist/src/context/system-tests/lifecycle.golden.test.d.ts +6 -0
  316. package/dist/src/context/system-tests/lifecycle.golden.test.js +195 -0
  317. package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -0
  318. package/dist/src/context/system-tests/simulationHarness.d.ts +41 -0
  319. package/dist/src/context/system-tests/simulationHarness.js +88 -0
  320. package/dist/src/context/system-tests/simulationHarness.js.map +1 -0
  321. package/dist/src/context/testing/contextTestUtils.d.ts +44 -0
  322. package/dist/src/context/testing/contextTestUtils.js +176 -0
  323. package/dist/src/context/testing/contextTestUtils.js.map +1 -0
  324. package/dist/src/context/testing/testProfile.d.ts +7 -0
  325. package/dist/src/context/testing/testProfile.js +20 -0
  326. package/dist/src/context/testing/testProfile.js.map +1 -0
  327. package/dist/src/context/tracer.d.ts +19 -0
  328. package/dist/src/context/tracer.js +79 -0
  329. package/dist/src/context/tracer.js.map +1 -0
  330. package/dist/src/context/tracer.test.d.ts +6 -0
  331. package/dist/src/context/tracer.test.js +71 -0
  332. package/dist/src/context/tracer.test.js.map +1 -0
  333. package/dist/src/context/utils/contextTokenCalculator.d.ts +53 -0
  334. package/dist/src/context/utils/contextTokenCalculator.js +97 -0
  335. package/dist/src/context/utils/contextTokenCalculator.js.map +1 -0
  336. package/dist/src/context/utils/snapshotGenerator.d.ts +12 -0
  337. package/dist/src/context/utils/snapshotGenerator.js +43 -0
  338. package/dist/src/context/utils/snapshotGenerator.js.map +1 -0
  339. package/dist/src/core/agentChatHistory.d.ts +26 -0
  340. package/dist/src/core/agentChatHistory.js +50 -0
  341. package/dist/src/core/agentChatHistory.js.map +1 -0
  342. package/dist/src/core/client.js +3 -1
  343. package/dist/src/core/client.js.map +1 -1
  344. package/dist/src/core/client.test.js +4 -0
  345. package/dist/src/core/client.test.js.map +1 -1
  346. package/dist/src/core/contentGenerator.d.ts +8 -1
  347. package/dist/src/core/contentGenerator.js +46 -4
  348. package/dist/src/core/contentGenerator.js.map +1 -1
  349. package/dist/src/core/contentGenerator.test.js +174 -8
  350. package/dist/src/core/contentGenerator.test.js.map +1 -1
  351. package/dist/src/core/coreToolHookTriggers.d.ts +1 -1
  352. package/dist/src/core/coreToolHookTriggers.js +5 -1
  353. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  354. package/dist/src/core/coreToolHookTriggers.test.js +1 -1
  355. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
  356. package/dist/src/core/geminiChat.d.ts +2 -1
  357. package/dist/src/core/geminiChat.js +7 -2
  358. package/dist/src/core/geminiChat.js.map +1 -1
  359. package/dist/src/core/geminiChat.test.js +19 -6
  360. package/dist/src/core/geminiChat.test.js.map +1 -1
  361. package/dist/src/core/geminiChat_network_retry.test.js +42 -0
  362. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  363. package/dist/src/core/localLiteRtLmClient.js +2 -0
  364. package/dist/src/core/localLiteRtLmClient.js.map +1 -1
  365. package/dist/src/core/localLiteRtLmClient.test.js +7 -0
  366. package/dist/src/core/localLiteRtLmClient.test.js.map +1 -1
  367. package/dist/src/core/loggingContentGenerator.js +19 -6
  368. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  369. package/dist/src/core/loggingContentGenerator.test.js +55 -0
  370. package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
  371. package/dist/src/core/prompts-substitution.test.js +1 -0
  372. package/dist/src/core/prompts-substitution.test.js.map +1 -1
  373. package/dist/src/core/prompts.d.ts +1 -1
  374. package/dist/src/core/prompts.js +2 -2
  375. package/dist/src/core/prompts.js.map +1 -1
  376. package/dist/src/core/prompts.test.js +39 -8
  377. package/dist/src/core/prompts.test.js.map +1 -1
  378. package/dist/src/generated/git-commit.d.ts +2 -2
  379. package/dist/src/generated/git-commit.js +2 -2
  380. package/dist/src/hooks/hookRunner.js +8 -0
  381. package/dist/src/hooks/hookRunner.js.map +1 -1
  382. package/dist/src/hooks/hookRunner.test.js +23 -0
  383. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  384. package/dist/src/ide/ide-client.js +3 -4
  385. package/dist/src/ide/ide-client.js.map +1 -1
  386. package/dist/src/index.d.ts +7 -3
  387. package/dist/src/index.js +7 -2
  388. package/dist/src/index.js.map +1 -1
  389. package/dist/src/mcp/mcpLauncher.js +1 -1
  390. package/dist/src/mcp/mcpLauncher.js.map +1 -1
  391. package/dist/src/mcp/oauth-provider.test.js +24 -17
  392. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  393. package/dist/src/policy/config.d.ts +2 -0
  394. package/dist/src/policy/config.js +67 -12
  395. package/dist/src/policy/config.js.map +1 -1
  396. package/dist/src/policy/core-tools-mapping.test.d.ts +6 -0
  397. package/dist/src/policy/core-tools-mapping.test.js +44 -0
  398. package/dist/src/policy/core-tools-mapping.test.js.map +1 -0
  399. package/dist/src/policy/policies/agents.toml +10 -0
  400. package/dist/src/policy/policies/plan.toml +17 -43
  401. package/dist/src/policy/policies/read-only.toml +24 -38
  402. package/dist/src/policy/policy-engine.d.ts +1 -1
  403. package/dist/src/policy/policy-engine.js +72 -67
  404. package/dist/src/policy/policy-engine.js.map +1 -1
  405. package/dist/src/policy/policy-engine.test.js +71 -4
  406. package/dist/src/policy/policy-engine.test.js.map +1 -1
  407. package/dist/src/policy/sandboxPolicyManager.js +4 -4
  408. package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
  409. package/dist/src/policy/shell-safety-regression.test.d.ts +6 -0
  410. package/dist/src/policy/shell-safety-regression.test.js +86 -0
  411. package/dist/src/policy/shell-safety-regression.test.js.map +1 -0
  412. package/dist/src/policy/shell-safety.test.js +24 -0
  413. package/dist/src/policy/shell-safety.test.js.map +1 -1
  414. package/dist/src/policy/shell-substitution.test.d.ts +6 -0
  415. package/dist/src/policy/shell-substitution.test.js +75 -0
  416. package/dist/src/policy/shell-substitution.test.js.map +1 -0
  417. package/dist/src/policy/toml-loader.test.js +25 -11
  418. package/dist/src/policy/toml-loader.test.js.map +1 -1
  419. package/dist/src/policy/types.d.ts +6 -2
  420. package/dist/src/policy/types.js +4 -2
  421. package/dist/src/policy/types.js.map +1 -1
  422. package/dist/src/prompts/promptProvider.d.ts +1 -1
  423. package/dist/src/prompts/promptProvider.js +41 -24
  424. package/dist/src/prompts/promptProvider.js.map +1 -1
  425. package/dist/src/prompts/promptProvider.test.js +36 -2
  426. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  427. package/dist/src/prompts/snippets-memory-v2.test.d.ts +6 -0
  428. package/dist/src/prompts/snippets-memory-v2.test.js +94 -0
  429. package/dist/src/prompts/snippets-memory-v2.test.js.map +1 -0
  430. package/dist/src/prompts/snippets.d.ts +19 -1
  431. package/dist/src/prompts/snippets.js +33 -6
  432. package/dist/src/prompts/snippets.js.map +1 -1
  433. package/dist/src/prompts/snippets.legacy.d.ts +6 -1
  434. package/dist/src/prompts/snippets.legacy.js +14 -7
  435. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  436. package/dist/src/prompts/utils.test.js +1 -0
  437. package/dist/src/prompts/utils.test.js.map +1 -1
  438. package/dist/src/routing/modelRouterService.js +1 -1
  439. package/dist/src/routing/modelRouterService.js.map +1 -1
  440. package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +2 -0
  441. package/dist/src/sandbox/linux/LinuxSandboxManager.js +43 -19
  442. package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
  443. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +16 -0
  444. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
  445. package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +3 -7
  446. package/dist/src/sandbox/linux/bwrapArgsBuilder.js +96 -105
  447. package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -1
  448. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +144 -41
  449. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -1
  450. package/dist/src/sandbox/macos/MacOsSandboxManager.js +19 -10
  451. package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
  452. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +24 -37
  453. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
  454. package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +3 -9
  455. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +129 -96
  456. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
  457. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +78 -77
  458. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
  459. package/dist/src/sandbox/utils/fsUtils.d.ts +2 -3
  460. package/dist/src/sandbox/utils/fsUtils.js +12 -27
  461. package/dist/src/sandbox/utils/fsUtils.js.map +1 -1
  462. package/dist/src/sandbox/utils/fsUtils.test.js +87 -29
  463. package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -1
  464. package/dist/src/sandbox/windows/GeminiSandbox.cs +186 -77
  465. package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +4 -16
  466. package/dist/src/sandbox/windows/WindowsSandboxManager.js +138 -204
  467. package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
  468. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +105 -122
  469. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
  470. package/dist/src/scheduler/policy.js +1 -2
  471. package/dist/src/scheduler/policy.js.map +1 -1
  472. package/dist/src/scheduler/policy.test.js +58 -2
  473. package/dist/src/scheduler/policy.test.js.map +1 -1
  474. package/dist/src/scheduler/scheduler.d.ts +2 -1
  475. package/dist/src/scheduler/scheduler.js +13 -14
  476. package/dist/src/scheduler/scheduler.js.map +1 -1
  477. package/dist/src/scheduler/scheduler.test.js +66 -0
  478. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  479. package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
  480. package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
  481. package/dist/src/scheduler/scheduler_parallel.test.js +2 -0
  482. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
  483. package/dist/src/scheduler/tool-executor.js +2 -0
  484. package/dist/src/scheduler/tool-executor.js.map +1 -1
  485. package/dist/src/services/chatRecordingService.d.ts +12 -153
  486. package/dist/src/services/chatRecordingService.js +444 -350
  487. package/dist/src/services/chatRecordingService.js.map +1 -1
  488. package/dist/src/services/chatRecordingService.test.js +174 -128
  489. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  490. package/dist/src/services/chatRecordingTypes.d.ts +111 -0
  491. package/dist/src/services/chatRecordingTypes.js +10 -0
  492. package/dist/src/services/chatRecordingTypes.js.map +1 -0
  493. package/dist/src/services/gitService.d.ts +2 -0
  494. package/dist/src/services/gitService.js +10 -1
  495. package/dist/src/services/gitService.js.map +1 -1
  496. package/dist/src/services/gitService.test.js +6 -2
  497. package/dist/src/services/gitService.test.js.map +1 -1
  498. package/dist/src/services/keychainService.d.ts +2 -2
  499. package/dist/src/services/keychainService.js +9 -9
  500. package/dist/src/services/keychainService.js.map +1 -1
  501. package/dist/src/services/keychainService.test.js +7 -7
  502. package/dist/src/services/keychainService.test.js.map +1 -1
  503. package/dist/src/services/keychainTypes.d.ts +1 -1
  504. package/dist/src/services/memoryPatchUtils.d.ts +42 -0
  505. package/dist/src/services/memoryPatchUtils.js +216 -0
  506. package/dist/src/services/memoryPatchUtils.js.map +1 -0
  507. package/dist/src/services/memoryService.d.ts +21 -1
  508. package/dist/src/services/memoryService.js +405 -64
  509. package/dist/src/services/memoryService.js.map +1 -1
  510. package/dist/src/services/memoryService.test.js +686 -2
  511. package/dist/src/services/memoryService.test.js.map +1 -1
  512. package/dist/src/services/sandboxManager.d.ts +33 -19
  513. package/dist/src/services/sandboxManager.integration.test.js +728 -266
  514. package/dist/src/services/sandboxManager.integration.test.js.map +1 -1
  515. package/dist/src/services/sandboxManager.js +65 -62
  516. package/dist/src/services/sandboxManager.js.map +1 -1
  517. package/dist/src/services/sandboxManager.test.js +17 -114
  518. package/dist/src/services/sandboxManager.test.js.map +1 -1
  519. package/dist/src/services/sandboxedFileSystemService.js +72 -62
  520. package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
  521. package/dist/src/services/sessionSummaryUtils.d.ts +1 -1
  522. package/dist/src/services/sessionSummaryUtils.js +111 -38
  523. package/dist/src/services/sessionSummaryUtils.js.map +1 -1
  524. package/dist/src/services/sessionSummaryUtils.test.js +204 -51
  525. package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
  526. package/dist/src/services/shellExecutionService.d.ts +19 -0
  527. package/dist/src/services/shellExecutionService.js +88 -34
  528. package/dist/src/services/shellExecutionService.js.map +1 -1
  529. package/dist/src/services/shellExecutionService.test.js +38 -4
  530. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  531. package/dist/src/telemetry/activity-monitor.js +1 -0
  532. package/dist/src/telemetry/activity-monitor.js.map +1 -1
  533. package/dist/src/telemetry/config.js +3 -0
  534. package/dist/src/telemetry/config.js.map +1 -1
  535. package/dist/src/telemetry/conseca-logger.js +18 -20
  536. package/dist/src/telemetry/conseca-logger.js.map +1 -1
  537. package/dist/src/telemetry/conseca-logger.test.js +100 -0
  538. package/dist/src/telemetry/conseca-logger.test.js.map +1 -1
  539. package/dist/src/telemetry/event-loop-monitor.d.ts +17 -0
  540. package/dist/src/telemetry/event-loop-monitor.js +76 -0
  541. package/dist/src/telemetry/event-loop-monitor.js.map +1 -0
  542. package/dist/src/telemetry/index.d.ts +2 -1
  543. package/dist/src/telemetry/index.js +2 -1
  544. package/dist/src/telemetry/index.js.map +1 -1
  545. package/dist/src/telemetry/llmRole.d.ts +2 -1
  546. package/dist/src/telemetry/llmRole.js +1 -0
  547. package/dist/src/telemetry/llmRole.js.map +1 -1
  548. package/dist/src/telemetry/loggers.test.js +184 -8
  549. package/dist/src/telemetry/loggers.test.js.map +1 -1
  550. package/dist/src/telemetry/memory-monitor.d.ts +1 -0
  551. package/dist/src/telemetry/memory-monitor.js +8 -1
  552. package/dist/src/telemetry/memory-monitor.js.map +1 -1
  553. package/dist/src/telemetry/memory-monitor.test.js +6 -1
  554. package/dist/src/telemetry/memory-monitor.test.js.map +1 -1
  555. package/dist/src/telemetry/metrics.d.ts +12 -0
  556. package/dist/src/telemetry/metrics.js +19 -0
  557. package/dist/src/telemetry/metrics.js.map +1 -1
  558. package/dist/src/telemetry/sdk.js +20 -1
  559. package/dist/src/telemetry/sdk.js.map +1 -1
  560. package/dist/src/telemetry/trace.d.ts +23 -6
  561. package/dist/src/telemetry/trace.js +71 -22
  562. package/dist/src/telemetry/trace.js.map +1 -1
  563. package/dist/src/telemetry/trace.test.js +79 -15
  564. package/dist/src/telemetry/trace.test.js.map +1 -1
  565. package/dist/src/telemetry/types.js +61 -15
  566. package/dist/src/telemetry/types.js.map +1 -1
  567. package/dist/src/test-utils/mock-tool.d.ts +3 -2
  568. package/dist/src/test-utils/mock-tool.js +4 -3
  569. package/dist/src/test-utils/mock-tool.js.map +1 -1
  570. package/dist/src/tools/activate-skill.js +1 -1
  571. package/dist/src/tools/activate-skill.js.map +1 -1
  572. package/dist/src/tools/activate-skill.test.js +6 -2
  573. package/dist/src/tools/activate-skill.test.js.map +1 -1
  574. package/dist/src/tools/ask-user.d.ts +2 -2
  575. package/dist/src/tools/ask-user.js +1 -1
  576. package/dist/src/tools/ask-user.js.map +1 -1
  577. package/dist/src/tools/ask-user.test.js +9 -3
  578. package/dist/src/tools/ask-user.test.js.map +1 -1
  579. package/dist/src/tools/complete-task.d.ts +2 -2
  580. package/dist/src/tools/complete-task.js +1 -1
  581. package/dist/src/tools/complete-task.js.map +1 -1
  582. package/dist/src/tools/complete-task.test.js +9 -3
  583. package/dist/src/tools/complete-task.test.js.map +1 -1
  584. package/dist/src/tools/definitions/base-declarations.d.ts +2 -0
  585. package/dist/src/tools/definitions/base-declarations.js +3 -0
  586. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  587. package/dist/src/tools/definitions/coreTools.d.ts +3 -1
  588. package/dist/src/tools/definitions/coreTools.js +13 -1
  589. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  590. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +29 -1
  591. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  592. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +29 -1
  593. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  594. package/dist/src/tools/definitions/types.d.ts +2 -0
  595. package/dist/src/tools/edit.js +20 -4
  596. package/dist/src/tools/edit.js.map +1 -1
  597. package/dist/src/tools/edit.test.js +41 -18
  598. package/dist/src/tools/edit.test.js.map +1 -1
  599. package/dist/src/tools/enter-plan-mode.d.ts +2 -2
  600. package/dist/src/tools/enter-plan-mode.js +1 -1
  601. package/dist/src/tools/enter-plan-mode.js.map +1 -1
  602. package/dist/src/tools/enter-plan-mode.test.js +10 -4
  603. package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
  604. package/dist/src/tools/exit-plan-mode.d.ts +2 -2
  605. package/dist/src/tools/exit-plan-mode.js +9 -12
  606. package/dist/src/tools/exit-plan-mode.js.map +1 -1
  607. package/dist/src/tools/exit-plan-mode.test.js +44 -17
  608. package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
  609. package/dist/src/tools/get-internal-docs.js +6 -3
  610. package/dist/src/tools/get-internal-docs.js.map +1 -1
  611. package/dist/src/tools/get-internal-docs.test.js +4 -4
  612. package/dist/src/tools/get-internal-docs.test.js.map +1 -1
  613. package/dist/src/tools/glob.js +1 -1
  614. package/dist/src/tools/glob.js.map +1 -1
  615. package/dist/src/tools/glob.test.js +16 -16
  616. package/dist/src/tools/glob.test.js.map +1 -1
  617. package/dist/src/tools/grep.js +21 -12
  618. package/dist/src/tools/grep.js.map +1 -1
  619. package/dist/src/tools/grep.test.js +18 -18
  620. package/dist/src/tools/grep.test.js.map +1 -1
  621. package/dist/src/tools/line-endings.test.js +3 -3
  622. package/dist/src/tools/line-endings.test.js.map +1 -1
  623. package/dist/src/tools/list-mcp-resources.d.ts +24 -0
  624. package/dist/src/tools/list-mcp-resources.js +74 -0
  625. package/dist/src/tools/list-mcp-resources.js.map +1 -0
  626. package/dist/src/tools/list-mcp-resources.test.d.ts +6 -0
  627. package/dist/src/tools/list-mcp-resources.test.js +79 -0
  628. package/dist/src/tools/list-mcp-resources.test.js.map +1 -0
  629. package/dist/src/tools/ls.js +2 -2
  630. package/dist/src/tools/ls.js.map +1 -1
  631. package/dist/src/tools/ls.test.js +21 -21
  632. package/dist/src/tools/ls.test.js.map +1 -1
  633. package/dist/src/tools/mcp-client-manager.d.ts +3 -1
  634. package/dist/src/tools/mcp-client-manager.js +24 -1
  635. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  636. package/dist/src/tools/mcp-client-manager.test.js +43 -0
  637. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  638. package/dist/src/tools/mcp-client.js +10 -12
  639. package/dist/src/tools/mcp-client.js.map +1 -1
  640. package/dist/src/tools/mcp-client.test.js +14 -2
  641. package/dist/src/tools/mcp-client.test.js.map +1 -1
  642. package/dist/src/tools/mcp-tool.d.ts +2 -2
  643. package/dist/src/tools/mcp-tool.js +1 -1
  644. package/dist/src/tools/mcp-tool.js.map +1 -1
  645. package/dist/src/tools/mcp-tool.test.js +51 -21
  646. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  647. package/dist/src/tools/memoryTool.d.ts +4 -3
  648. package/dist/src/tools/memoryTool.js +43 -14
  649. package/dist/src/tools/memoryTool.js.map +1 -1
  650. package/dist/src/tools/memoryTool.test.js +29 -9
  651. package/dist/src/tools/memoryTool.test.js.map +1 -1
  652. package/dist/src/tools/read-file.js +1 -1
  653. package/dist/src/tools/read-file.js.map +1 -1
  654. package/dist/src/tools/read-file.test.js +17 -17
  655. package/dist/src/tools/read-file.test.js.map +1 -1
  656. package/dist/src/tools/read-many-files.js +4 -4
  657. package/dist/src/tools/read-many-files.js.map +1 -1
  658. package/dist/src/tools/read-many-files.test.js +70 -24
  659. package/dist/src/tools/read-many-files.test.js.map +1 -1
  660. package/dist/src/tools/read-mcp-resource.d.ts +25 -0
  661. package/dist/src/tools/read-mcp-resource.js +120 -0
  662. package/dist/src/tools/read-mcp-resource.js.map +1 -0
  663. package/dist/src/tools/read-mcp-resource.test.d.ts +6 -0
  664. package/dist/src/tools/read-mcp-resource.test.js +110 -0
  665. package/dist/src/tools/read-mcp-resource.test.js.map +1 -0
  666. package/dist/src/tools/ripGrep.d.ts +3 -2
  667. package/dist/src/tools/ripGrep.js +26 -55
  668. package/dist/src/tools/ripGrep.js.map +1 -1
  669. package/dist/src/tools/ripGrep.test.js +113 -167
  670. package/dist/src/tools/ripGrep.test.js.map +1 -1
  671. package/dist/src/tools/shell.d.ts +2 -2
  672. package/dist/src/tools/shell.js +51 -21
  673. package/dist/src/tools/shell.js.map +1 -1
  674. package/dist/src/tools/shell.test.js +479 -76
  675. package/dist/src/tools/shell.test.js.map +1 -1
  676. package/dist/src/tools/shellBackgroundTools.d.ts +3 -3
  677. package/dist/src/tools/shellBackgroundTools.integration.test.js +6 -2
  678. package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -1
  679. package/dist/src/tools/shellBackgroundTools.js +2 -2
  680. package/dist/src/tools/shellBackgroundTools.js.map +1 -1
  681. package/dist/src/tools/shellBackgroundTools.test.js +30 -10
  682. package/dist/src/tools/shellBackgroundTools.test.js.map +1 -1
  683. package/dist/src/tools/tool-error.d.ts +1 -0
  684. package/dist/src/tools/tool-error.js +1 -0
  685. package/dist/src/tools/tool-error.js.map +1 -1
  686. package/dist/src/tools/tool-names.d.ts +5 -4
  687. package/dist/src/tools/tool-names.js +8 -2
  688. package/dist/src/tools/tool-names.js.map +1 -1
  689. package/dist/src/tools/tool-registry.js +137 -114
  690. package/dist/src/tools/tool-registry.js.map +1 -1
  691. package/dist/src/tools/tool-registry.test.js +3 -1
  692. package/dist/src/tools/tool-registry.test.js.map +1 -1
  693. package/dist/src/tools/tools.d.ts +6 -6
  694. package/dist/src/tools/tools.js +6 -2
  695. package/dist/src/tools/tools.js.map +1 -1
  696. package/dist/src/tools/topicTool.d.ts +2 -2
  697. package/dist/src/tools/topicTool.js +1 -1
  698. package/dist/src/tools/topicTool.js.map +1 -1
  699. package/dist/src/tools/topicTool.test.js +6 -2
  700. package/dist/src/tools/topicTool.test.js.map +1 -1
  701. package/dist/src/tools/trackerTools.d.ts +7 -7
  702. package/dist/src/tools/trackerTools.js +6 -6
  703. package/dist/src/tools/trackerTools.js.map +1 -1
  704. package/dist/src/tools/web-fetch.js +1 -1
  705. package/dist/src/tools/web-fetch.js.map +1 -1
  706. package/dist/src/tools/web-fetch.test.js +59 -23
  707. package/dist/src/tools/web-fetch.test.js.map +1 -1
  708. package/dist/src/tools/web-search.js +1 -1
  709. package/dist/src/tools/web-search.js.map +1 -1
  710. package/dist/src/tools/web-search.test.js +5 -5
  711. package/dist/src/tools/web-search.test.js.map +1 -1
  712. package/dist/src/tools/write-file.js +22 -4
  713. package/dist/src/tools/write-file.js.map +1 -1
  714. package/dist/src/tools/write-file.test.js +29 -11
  715. package/dist/src/tools/write-file.test.js.map +1 -1
  716. package/dist/src/tools/write-todos.js +1 -1
  717. package/dist/src/tools/write-todos.js.map +1 -1
  718. package/dist/src/utils/compatibility.js +6 -1
  719. package/dist/src/utils/compatibility.js.map +1 -1
  720. package/dist/src/utils/compatibility.test.js +23 -0
  721. package/dist/src/utils/compatibility.test.js.map +1 -1
  722. package/dist/src/utils/errors.d.ts +3 -0
  723. package/dist/src/utils/errors.js +6 -0
  724. package/dist/src/utils/errors.js.map +1 -1
  725. package/dist/src/utils/fileUtils.d.ts +1 -2
  726. package/dist/src/utils/fileUtils.js +80 -40
  727. package/dist/src/utils/fileUtils.js.map +1 -1
  728. package/dist/src/utils/fileUtils.test.js +61 -0
  729. package/dist/src/utils/fileUtils.test.js.map +1 -1
  730. package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
  731. package/dist/src/utils/filesearch/fileSearch.js +97 -6
  732. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  733. package/dist/src/utils/filesearch/fileSearch.test.js +54 -0
  734. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  735. package/dist/src/utils/filesearch/fileWatcher.d.ts +25 -0
  736. package/dist/src/utils/filesearch/fileWatcher.js +86 -0
  737. package/dist/src/utils/filesearch/fileWatcher.js.map +1 -0
  738. package/dist/src/utils/filesearch/fileWatcher.test.js +142 -0
  739. package/dist/src/utils/filesearch/fileWatcher.test.js.map +1 -0
  740. package/dist/src/utils/getFolderStructure.js +4 -2
  741. package/dist/src/utils/getFolderStructure.js.map +1 -1
  742. package/dist/src/utils/gitIgnoreParser.js +1 -1
  743. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  744. package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
  745. package/dist/src/utils/googleQuotaErrors.js +30 -35
  746. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  747. package/dist/src/utils/googleQuotaErrors.test.js +24 -0
  748. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  749. package/dist/src/utils/ignoreFileParser.js +1 -1
  750. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  751. package/dist/src/utils/memoryDiscovery.js +15 -5
  752. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  753. package/dist/src/utils/oauth-flow.js +17 -5
  754. package/dist/src/utils/oauth-flow.js.map +1 -1
  755. package/dist/src/utils/oauth-flow.test.js +20 -0
  756. package/dist/src/utils/oauth-flow.test.js.map +1 -1
  757. package/dist/src/utils/paths.d.ts +9 -0
  758. package/dist/src/utils/paths.js +37 -0
  759. package/dist/src/utils/paths.js.map +1 -1
  760. package/dist/src/utils/paths.test.js +45 -1
  761. package/dist/src/utils/paths.test.js.map +1 -1
  762. package/dist/src/utils/planUtils.d.ts +11 -2
  763. package/dist/src/utils/planUtils.js +43 -11
  764. package/dist/src/utils/planUtils.js.map +1 -1
  765. package/dist/src/utils/planUtils.test.js +10 -9
  766. package/dist/src/utils/planUtils.test.js.map +1 -1
  767. package/dist/src/utils/process-utils.d.ts +2 -1
  768. package/dist/src/utils/process-utils.js +64 -33
  769. package/dist/src/utils/process-utils.js.map +1 -1
  770. package/dist/src/utils/process-utils.test.js +9 -0
  771. package/dist/src/utils/process-utils.test.js.map +1 -1
  772. package/dist/src/utils/retry.js +18 -6
  773. package/dist/src/utils/retry.js.map +1 -1
  774. package/dist/src/utils/retry.test.js +30 -0
  775. package/dist/src/utils/retry.test.js.map +1 -1
  776. package/dist/src/utils/sessionOperations.js +3 -2
  777. package/dist/src/utils/sessionOperations.js.map +1 -1
  778. package/dist/src/utils/shell-utils.d.ts +2 -0
  779. package/dist/src/utils/shell-utils.js +237 -107
  780. package/dist/src/utils/shell-utils.js.map +1 -1
  781. package/dist/src/utils/tool-utils.d.ts +1 -29
  782. package/dist/src/utils/tool-utils.js +0 -39
  783. package/dist/src/utils/tool-utils.js.map +1 -1
  784. package/dist/src/utils/tool-utils.test.js +2 -76
  785. package/dist/src/utils/tool-utils.test.js.map +1 -1
  786. package/dist/src/utils/tool-visibility.d.ts +40 -0
  787. package/dist/src/utils/tool-visibility.js +111 -0
  788. package/dist/src/utils/tool-visibility.js.map +1 -0
  789. package/dist/src/utils/tool-visibility.test.d.ts +6 -0
  790. package/dist/src/utils/tool-visibility.test.js +96 -0
  791. package/dist/src/utils/tool-visibility.test.js.map +1 -0
  792. package/dist/src/utils/trust.d.ts +64 -0
  793. package/dist/src/utils/trust.js +276 -0
  794. package/dist/src/utils/trust.js.map +1 -0
  795. package/dist/src/utils/trust.test.d.ts +6 -0
  796. package/dist/src/utils/trust.test.js +159 -0
  797. package/dist/src/utils/trust.test.js.map +1 -0
  798. package/dist/tsconfig.tsbuildinfo +1 -1
  799. package/package.json +5 -4
  800. package/dist/docs/get-started/installation.md +0 -181
  801. package/dist/src/agents/memory-manager-agent.d.ts +0 -25
  802. package/dist/src/agents/memory-manager-agent.js +0 -138
  803. package/dist/src/agents/memory-manager-agent.js.map +0 -1
  804. package/dist/src/agents/memory-manager-agent.test.js +0 -123
  805. package/dist/src/agents/memory-manager-agent.test.js.map +0 -1
  806. package/dist/src/agents/subagent-tool-wrapper.d.ts +0 -38
  807. package/dist/src/agents/subagent-tool-wrapper.js +0 -58
  808. package/dist/src/agents/subagent-tool-wrapper.js.map +0 -1
  809. package/dist/src/agents/subagent-tool-wrapper.test.js +0 -123
  810. package/dist/src/agents/subagent-tool-wrapper.test.js.map +0 -1
  811. package/dist/src/agents/subagent-tool.d.ts +0 -18
  812. package/dist/src/agents/subagent-tool.js +0 -134
  813. package/dist/src/agents/subagent-tool.js.map +0 -1
  814. package/dist/src/agents/subagent-tool.test.js +0 -287
  815. package/dist/src/agents/subagent-tool.test.js.map +0 -1
  816. package/dist/src/policy/policies/tracker.toml +0 -34
  817. package/dist/src/prompts/snippets-memory-manager.test.js +0 -31
  818. package/dist/src/prompts/snippets-memory-manager.test.js.map +0 -1
  819. /package/dist/src/{agents/memory-manager-agent.test.d.ts → agent/tool-display-utils.test.d.ts} +0 -0
  820. /package/dist/src/agents/{subagent-tool.test.d.ts → agent-tool.test.d.ts} +0 -0
  821. /package/dist/src/{prompts/snippets-memory-manager.test.d.ts → agents/skill-extraction-agent.test.d.ts} +0 -0
  822. /package/dist/src/{agents/subagent-tool-wrapper.test.d.ts → utils/filesearch/fileWatcher.test.d.ts} +0 -0
@@ -4,16 +4,46 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { expect, it, describe, vi, beforeEach, afterEach } from 'vitest';
7
- import fs from 'node:fs';
7
+ import * as fs from 'node:fs';
8
8
  import path from 'node:path';
9
9
  import os from 'node:os';
10
- import { ChatRecordingService, } from './chatRecordingService.js';
10
+ vi.mock('node:fs', async (importOriginal) => {
11
+ const actual = await importOriginal();
12
+ const fsModule = {
13
+ ...actual,
14
+ mkdirSync: vi.fn(actual.mkdirSync),
15
+ appendFileSync: vi.fn(actual.appendFileSync),
16
+ writeFileSync: vi.fn(actual.writeFileSync),
17
+ readFileSync: vi.fn(actual.readFileSync),
18
+ unlinkSync: vi.fn(actual.unlinkSync),
19
+ existsSync: vi.fn(actual.existsSync),
20
+ readdirSync: vi.fn(actual.readdirSync),
21
+ promises: {
22
+ ...actual.promises,
23
+ stat: vi.fn(actual.promises.stat),
24
+ readFile: vi.fn(actual.promises.readFile),
25
+ unlink: vi.fn(actual.promises.unlink),
26
+ readdir: vi.fn(actual.promises.readdir),
27
+ open: vi.fn(actual.promises.open),
28
+ rm: vi.fn(actual.promises.rm),
29
+ mkdir: vi.fn(actual.promises.mkdir),
30
+ writeFile: vi.fn(actual.promises.writeFile),
31
+ },
32
+ };
33
+ return {
34
+ ...fsModule,
35
+ default: fsModule,
36
+ };
37
+ });
38
+ import { ChatRecordingService, loadConversationRecord, } from './chatRecordingService.js';
11
39
  import { CoreToolCallStatus } from '../scheduler/types.js';
12
40
  import { getProjectHash } from '../utils/paths.js';
13
41
  vi.mock('../utils/paths.js');
14
- vi.mock('node:crypto', () => {
42
+ vi.mock('node:crypto', async (importOriginal) => {
43
+ const actual = await importOriginal();
15
44
  let count = 0;
16
45
  return {
46
+ ...actual,
17
47
  randomUUID: vi.fn(() => `test-uuid-${count++}`),
18
48
  createHash: vi.fn(() => ({
19
49
  update: vi.fn(() => ({
@@ -26,6 +56,9 @@ describe('ChatRecordingService', () => {
26
56
  let chatRecordingService;
27
57
  let mockConfig;
28
58
  let testTempDir;
59
+ afterEach(() => {
60
+ vi.restoreAllMocks();
61
+ });
29
62
  beforeEach(async () => {
30
63
  testTempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'chat-recording-test-'));
31
64
  mockConfig = {
@@ -70,8 +103,8 @@ describe('ChatRecordingService', () => {
70
103
  }
71
104
  });
72
105
  describe('initialize', () => {
73
- it('should create a new session if none is provided', () => {
74
- chatRecordingService.initialize();
106
+ it('should create a new session if none is provided', async () => {
107
+ await chatRecordingService.initialize();
75
108
  chatRecordingService.recordMessage({
76
109
  type: 'user',
77
110
  content: 'ping',
@@ -81,27 +114,27 @@ describe('ChatRecordingService', () => {
81
114
  expect(fs.existsSync(chatsDir)).toBe(true);
82
115
  const files = fs.readdirSync(chatsDir);
83
116
  expect(files.length).toBeGreaterThan(0);
84
- expect(files[0]).toMatch(/^session-.*-test-ses\.json$/);
117
+ expect(files[0]).toMatch(/^session-.*-test-ses\.jsonl$/);
85
118
  });
86
- it('should include the conversation kind when specified', () => {
87
- chatRecordingService.initialize(undefined, 'subagent');
119
+ it('should include the conversation kind when specified', async () => {
120
+ await chatRecordingService.initialize(undefined, 'subagent');
88
121
  chatRecordingService.recordMessage({
89
122
  type: 'user',
90
123
  content: 'ping',
91
124
  model: 'm',
92
125
  });
93
126
  const sessionFile = chatRecordingService.getConversationFilePath();
94
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
127
+ const conversation = (await loadConversationRecord(sessionFile));
95
128
  expect(conversation.kind).toBe('subagent');
96
129
  });
97
- it('should create a subdirectory for subagents if parentSessionId is present', () => {
130
+ it('should create a subdirectory for subagents if parentSessionId is present', async () => {
98
131
  const parentSessionId = 'test-parent-uuid';
99
132
  Object.defineProperty(mockConfig, 'parentSessionId', {
100
133
  value: parentSessionId,
101
134
  writable: true,
102
135
  configurable: true,
103
136
  });
104
- chatRecordingService.initialize(undefined, 'subagent');
137
+ await chatRecordingService.initialize(undefined, 'subagent');
105
138
  chatRecordingService.recordMessage({
106
139
  type: 'user',
107
140
  content: 'ping',
@@ -112,51 +145,56 @@ describe('ChatRecordingService', () => {
112
145
  expect(fs.existsSync(subagentDir)).toBe(true);
113
146
  const files = fs.readdirSync(subagentDir);
114
147
  expect(files.length).toBeGreaterThan(0);
115
- expect(files[0]).toBe('test-session-id.json');
148
+ expect(files[0]).toBe('test-session-id.jsonl');
116
149
  });
117
- it('should inherit workspace directories for subagents during initialization', () => {
150
+ it('should inherit workspace directories for subagents during initialization', async () => {
118
151
  const mockDirectories = ['/project/dir1', '/project/dir2'];
119
152
  vi.mocked(mockConfig.getWorkspaceContext).mockReturnValue({
120
153
  getDirectories: vi.fn().mockReturnValue(mockDirectories),
121
154
  });
122
155
  // Initialize as a subagent
123
- chatRecordingService.initialize(undefined, 'subagent');
124
- // Recording a message triggers the disk write (deferred until then)
156
+ await chatRecordingService.initialize(undefined, 'subagent');
157
+ // Recording a message triggers the disk write
125
158
  chatRecordingService.recordMessage({
126
159
  type: 'user',
127
160
  content: 'ping',
128
161
  model: 'm',
129
162
  });
130
163
  const sessionFile = chatRecordingService.getConversationFilePath();
131
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
164
+ const conversation = (await loadConversationRecord(sessionFile));
132
165
  expect(conversation.kind).toBe('subagent');
133
166
  expect(conversation.directories).toEqual(mockDirectories);
134
167
  });
135
- it('should resume from an existing session if provided', () => {
168
+ it('should resume from an existing session if provided', async () => {
136
169
  const chatsDir = path.join(testTempDir, 'chats');
137
170
  fs.mkdirSync(chatsDir, { recursive: true });
138
- const sessionFile = path.join(chatsDir, 'session.json');
171
+ const sessionFile = path.join(chatsDir, 'session.jsonl');
139
172
  const initialData = {
140
173
  sessionId: 'old-session-id',
141
174
  projectHash: 'test-project-hash',
142
175
  messages: [],
143
176
  };
144
- fs.writeFileSync(sessionFile, JSON.stringify(initialData));
145
- chatRecordingService.initialize({
177
+ fs.writeFileSync(sessionFile, JSON.stringify({ ...initialData, messages: undefined }) +
178
+ '\n' +
179
+ (initialData.messages || [])
180
+ .map((m) => JSON.stringify(m))
181
+ .join('\n') +
182
+ '\n');
183
+ await chatRecordingService.initialize({
146
184
  filePath: sessionFile,
147
185
  conversation: {
148
186
  sessionId: 'old-session-id',
149
187
  },
150
188
  });
151
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
189
+ const conversation = (await loadConversationRecord(sessionFile));
152
190
  expect(conversation.sessionId).toBe('old-session-id');
153
191
  });
154
192
  });
155
193
  describe('recordMessage', () => {
156
- beforeEach(() => {
157
- chatRecordingService.initialize();
194
+ beforeEach(async () => {
195
+ await chatRecordingService.initialize();
158
196
  });
159
- it('should record a new message', () => {
197
+ it('should record a new message', async () => {
160
198
  chatRecordingService.recordMessage({
161
199
  type: 'user',
162
200
  content: 'Hello',
@@ -164,27 +202,27 @@ describe('ChatRecordingService', () => {
164
202
  model: 'gemini-pro',
165
203
  });
166
204
  const sessionFile = chatRecordingService.getConversationFilePath();
167
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
205
+ const conversation = (await loadConversationRecord(sessionFile));
168
206
  expect(conversation.messages).toHaveLength(1);
169
207
  expect(conversation.messages[0].content).toBe('Hello');
170
208
  expect(conversation.messages[0].displayContent).toBe('User Hello');
171
209
  expect(conversation.messages[0].type).toBe('user');
172
210
  });
173
- it('should create separate messages when recording multiple messages', () => {
211
+ it('should create separate messages when recording multiple messages', async () => {
174
212
  chatRecordingService.recordMessage({
175
213
  type: 'user',
176
214
  content: 'World',
177
215
  model: 'gemini-pro',
178
216
  });
179
217
  const sessionFile = chatRecordingService.getConversationFilePath();
180
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
218
+ const conversation = (await loadConversationRecord(sessionFile));
181
219
  expect(conversation.messages).toHaveLength(1);
182
220
  expect(conversation.messages[0].content).toBe('World');
183
221
  });
184
222
  });
185
223
  describe('recordThought', () => {
186
- it('should queue a thought', () => {
187
- chatRecordingService.initialize();
224
+ it('should queue a thought', async () => {
225
+ await chatRecordingService.initialize();
188
226
  chatRecordingService.recordThought({
189
227
  subject: 'Thinking',
190
228
  description: 'Thinking...',
@@ -196,10 +234,10 @@ describe('ChatRecordingService', () => {
196
234
  });
197
235
  });
198
236
  describe('recordMessageTokens', () => {
199
- beforeEach(() => {
200
- chatRecordingService.initialize();
237
+ beforeEach(async () => {
238
+ await chatRecordingService.initialize();
201
239
  });
202
- it('should update the last message with token info', () => {
240
+ it('should update the last message with token info', async () => {
203
241
  chatRecordingService.recordMessage({
204
242
  type: 'gemini',
205
243
  content: 'Response',
@@ -212,7 +250,7 @@ describe('ChatRecordingService', () => {
212
250
  cachedContentTokenCount: 0,
213
251
  });
214
252
  const sessionFile = chatRecordingService.getConversationFilePath();
215
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
253
+ const conversation = (await loadConversationRecord(sessionFile));
216
254
  const geminiMsg = conversation.messages[0];
217
255
  expect(geminiMsg.tokens).toEqual({
218
256
  input: 1,
@@ -223,7 +261,7 @@ describe('ChatRecordingService', () => {
223
261
  tool: 0,
224
262
  });
225
263
  });
226
- it('should queue token info if the last message already has tokens', () => {
264
+ it('should queue token info if the last message already has tokens', async () => {
227
265
  chatRecordingService.recordMessage({
228
266
  type: 'gemini',
229
267
  content: 'Response',
@@ -251,10 +289,10 @@ describe('ChatRecordingService', () => {
251
289
  tool: 0,
252
290
  });
253
291
  });
254
- it('should not write to disk when queuing tokens (no last gemini message)', () => {
255
- const writeFileSyncSpy = vi.spyOn(fs, 'writeFileSync');
292
+ it('should not write to disk when queuing tokens (no last gemini message)', async () => {
293
+ const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
256
294
  // Clear spy call count after initialize writes the initial file
257
- writeFileSyncSpy.mockClear();
295
+ appendFileSyncSpy.mockClear();
258
296
  // No gemini message recorded yet, so tokens should only be queued
259
297
  chatRecordingService.recordMessageTokens({
260
298
  promptTokenCount: 5,
@@ -263,7 +301,7 @@ describe('ChatRecordingService', () => {
263
301
  cachedContentTokenCount: 0,
264
302
  });
265
303
  // writeFileSync should NOT have been called since we only queued
266
- expect(writeFileSyncSpy).not.toHaveBeenCalled();
304
+ expect(appendFileSyncSpy).not.toHaveBeenCalled();
267
305
  // @ts-expect-error private property
268
306
  expect(chatRecordingService.queuedTokens).toEqual({
269
307
  input: 5,
@@ -273,9 +311,8 @@ describe('ChatRecordingService', () => {
273
311
  thoughts: 0,
274
312
  tool: 0,
275
313
  });
276
- writeFileSyncSpy.mockRestore();
277
314
  });
278
- it('should not write to disk when queuing tokens (last message already has tokens)', () => {
315
+ it('should not write to disk when queuing tokens (last message already has tokens)', async () => {
279
316
  chatRecordingService.recordMessage({
280
317
  type: 'gemini',
281
318
  content: 'Response',
@@ -288,8 +325,8 @@ describe('ChatRecordingService', () => {
288
325
  totalTokenCount: 2,
289
326
  cachedContentTokenCount: 0,
290
327
  });
291
- const writeFileSyncSpy = vi.spyOn(fs, 'writeFileSync');
292
- writeFileSyncSpy.mockClear();
328
+ const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
329
+ appendFileSyncSpy.mockClear();
293
330
  // Second call should only queue, NOT write to disk
294
331
  chatRecordingService.recordMessageTokens({
295
332
  promptTokenCount: 2,
@@ -297,16 +334,15 @@ describe('ChatRecordingService', () => {
297
334
  totalTokenCount: 4,
298
335
  cachedContentTokenCount: 0,
299
336
  });
300
- expect(writeFileSyncSpy).not.toHaveBeenCalled();
301
- writeFileSyncSpy.mockRestore();
337
+ expect(appendFileSyncSpy).not.toHaveBeenCalled();
302
338
  });
303
- it('should use in-memory cache and not re-read from disk on subsequent operations', () => {
339
+ it('should use in-memory cache and not re-read from disk on subsequent operations', async () => {
304
340
  chatRecordingService.recordMessage({
305
341
  type: 'gemini',
306
342
  content: 'Response',
307
343
  model: 'gemini-pro',
308
344
  });
309
- const readFileSyncSpy = vi.spyOn(fs, 'readFileSync');
345
+ const readFileSyncSpy = vi.mocked(fs.readFileSync);
310
346
  readFileSyncSpy.mockClear();
311
347
  // These operations should all use the in-memory cache
312
348
  chatRecordingService.recordMessageTokens({
@@ -323,14 +359,13 @@ describe('ChatRecordingService', () => {
323
359
  chatRecordingService.saveSummary('Test summary');
324
360
  // readFileSync should NOT have been called since we use the in-memory cache
325
361
  expect(readFileSyncSpy).not.toHaveBeenCalled();
326
- readFileSyncSpy.mockRestore();
327
362
  });
328
363
  });
329
364
  describe('recordToolCalls', () => {
330
- beforeEach(() => {
331
- chatRecordingService.initialize();
365
+ beforeEach(async () => {
366
+ await chatRecordingService.initialize();
332
367
  });
333
- it('should add new tool calls to the last message', () => {
368
+ it('should add new tool calls to the last message', async () => {
334
369
  chatRecordingService.recordMessage({
335
370
  type: 'gemini',
336
371
  content: '',
@@ -345,12 +380,12 @@ describe('ChatRecordingService', () => {
345
380
  };
346
381
  chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
347
382
  const sessionFile = chatRecordingService.getConversationFilePath();
348
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
383
+ const conversation = (await loadConversationRecord(sessionFile));
349
384
  const geminiMsg = conversation.messages[0];
350
385
  expect(geminiMsg.toolCalls).toHaveLength(1);
351
386
  expect(geminiMsg.toolCalls[0].name).toBe('testTool');
352
387
  });
353
- it('should preserve dynamic description and NOT overwrite with generic one', () => {
388
+ it('should preserve dynamic description and NOT overwrite with generic one', async () => {
354
389
  chatRecordingService.recordMessage({
355
390
  type: 'gemini',
356
391
  content: '',
@@ -367,11 +402,11 @@ describe('ChatRecordingService', () => {
367
402
  };
368
403
  chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
369
404
  const sessionFile = chatRecordingService.getConversationFilePath();
370
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
405
+ const conversation = (await loadConversationRecord(sessionFile));
371
406
  const geminiMsg = conversation.messages[0];
372
407
  expect(geminiMsg.toolCalls[0].description).toBe(dynamicDescription);
373
408
  });
374
- it('should create a new message if the last message is not from gemini', () => {
409
+ it('should create a new message if the last message is not from gemini', async () => {
375
410
  chatRecordingService.recordMessage({
376
411
  type: 'user',
377
412
  content: 'call a tool',
@@ -386,12 +421,33 @@ describe('ChatRecordingService', () => {
386
421
  };
387
422
  chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
388
423
  const sessionFile = chatRecordingService.getConversationFilePath();
389
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
424
+ const conversation = (await loadConversationRecord(sessionFile));
390
425
  expect(conversation.messages).toHaveLength(2);
391
426
  expect(conversation.messages[1].type).toBe('gemini');
392
427
  expect(conversation.messages[1]
393
428
  .toolCalls).toHaveLength(1);
394
429
  });
430
+ it('should record agentId when provided', async () => {
431
+ chatRecordingService.recordMessage({
432
+ type: 'gemini',
433
+ content: '',
434
+ model: 'gemini-pro',
435
+ });
436
+ const toolCall = {
437
+ id: 'tool-1',
438
+ name: 'testTool',
439
+ args: {},
440
+ status: CoreToolCallStatus.Success,
441
+ timestamp: new Date().toISOString(),
442
+ agentId: 'test-agent-id',
443
+ };
444
+ chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
445
+ const sessionFile = chatRecordingService.getConversationFilePath();
446
+ const conversation = (await loadConversationRecord(sessionFile));
447
+ const geminiMsg = conversation.messages[0];
448
+ expect(geminiMsg.toolCalls).toHaveLength(1);
449
+ expect(geminiMsg.toolCalls[0].agentId).toBe('test-agent-id');
450
+ });
395
451
  });
396
452
  describe('deleteSession', () => {
397
453
  it('should delete the session file, tool outputs, session directory, and logs if they exist', async () => {
@@ -406,8 +462,8 @@ describe('ChatRecordingService', () => {
406
462
  fs.mkdirSync(toolOutputsDir, { recursive: true });
407
463
  fs.mkdirSync(sessionDir, { recursive: true });
408
464
  // Create main session file with timestamp
409
- const sessionFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.json`);
410
- fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }));
465
+ const sessionFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.jsonl`);
466
+ fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }) + '\n');
411
467
  const logFile = path.join(logsDir, `session-${sessionId}.jsonl`);
412
468
  fs.writeFileSync(logFile, '{}');
413
469
  const toolOutputDir = path.join(toolOutputsDir, `session-${sessionId}`);
@@ -430,13 +486,14 @@ describe('ChatRecordingService', () => {
430
486
  fs.mkdirSync(logsDir, { recursive: true });
431
487
  fs.mkdirSync(toolOutputsDir, { recursive: true });
432
488
  // Create parent session file
433
- const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.json`);
434
- fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }));
489
+ const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.jsonl`);
490
+ fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }) + '\n');
435
491
  // Create subagent session file in subdirectory
436
492
  const subagentDir = path.join(chatsDir, parentSessionId);
437
493
  fs.mkdirSync(subagentDir, { recursive: true });
438
- const subagentFile = path.join(subagentDir, `${subagentSessionId}.json`);
439
- fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' }));
494
+ const subagentFile = path.join(subagentDir, `${subagentSessionId}.jsonl`);
495
+ fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' }) +
496
+ '\n');
440
497
  // Create logs for both
441
498
  const parentLog = path.join(logsDir, `session-${parentSessionId}.jsonl`);
442
499
  fs.writeFileSync(parentLog, '{}');
@@ -466,11 +523,12 @@ describe('ChatRecordingService', () => {
466
523
  fs.mkdirSync(chatsDir, { recursive: true });
467
524
  fs.mkdirSync(logsDir, { recursive: true });
468
525
  // Create parent session file
469
- const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.json`);
470
- fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }));
526
+ const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.jsonl`);
527
+ fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }) + '\n');
471
528
  // Create legacy subagent session file (flat in chatsDir)
472
- const subagentFile = path.join(chatsDir, `session-2023-01-01T00-01-${shortId}.json`);
473
- fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' }));
529
+ const subagentFile = path.join(chatsDir, `session-2023-01-01T00-01-${shortId}.jsonl`);
530
+ fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' }) +
531
+ '\n');
474
532
  // Call with parent sessionId
475
533
  await chatRecordingService.deleteSession(parentSessionId);
476
534
  expect(fs.existsSync(parentFile)).toBe(false);
@@ -484,8 +542,8 @@ describe('ChatRecordingService', () => {
484
542
  fs.mkdirSync(chatsDir, { recursive: true });
485
543
  fs.mkdirSync(logsDir, { recursive: true });
486
544
  const basename = `session-2023-01-01T00-00-${shortId}`;
487
- const sessionFile = path.join(chatsDir, `${basename}.json`);
488
- fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }));
545
+ const sessionFile = path.join(chatsDir, `${basename}.jsonl`);
546
+ fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }) + '\n');
489
547
  const logFile = path.join(logsDir, `session-${sessionId}.jsonl`);
490
548
  fs.writeFileSync(logFile, '{}');
491
549
  // Call with basename
@@ -498,10 +556,10 @@ describe('ChatRecordingService', () => {
498
556
  });
499
557
  });
500
558
  describe('recordDirectories', () => {
501
- beforeEach(() => {
502
- chatRecordingService.initialize();
559
+ beforeEach(async () => {
560
+ await chatRecordingService.initialize();
503
561
  });
504
- it('should save directories to the conversation', () => {
562
+ it('should save directories to the conversation', async () => {
505
563
  chatRecordingService.recordMessage({
506
564
  type: 'user',
507
565
  content: 'ping',
@@ -512,13 +570,13 @@ describe('ChatRecordingService', () => {
512
570
  '/path/to/dir2',
513
571
  ]);
514
572
  const sessionFile = chatRecordingService.getConversationFilePath();
515
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
573
+ const conversation = (await loadConversationRecord(sessionFile));
516
574
  expect(conversation.directories).toEqual([
517
575
  '/path/to/dir1',
518
576
  '/path/to/dir2',
519
577
  ]);
520
578
  });
521
- it('should overwrite existing directories', () => {
579
+ it('should overwrite existing directories', async () => {
522
580
  chatRecordingService.recordMessage({
523
581
  type: 'user',
524
582
  content: 'ping',
@@ -527,13 +585,13 @@ describe('ChatRecordingService', () => {
527
585
  chatRecordingService.recordDirectories(['/old/dir']);
528
586
  chatRecordingService.recordDirectories(['/new/dir1', '/new/dir2']);
529
587
  const sessionFile = chatRecordingService.getConversationFilePath();
530
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
588
+ const conversation = (await loadConversationRecord(sessionFile));
531
589
  expect(conversation.directories).toEqual(['/new/dir1', '/new/dir2']);
532
590
  });
533
591
  });
534
592
  describe('rewindTo', () => {
535
- it('should rewind the conversation to a specific message ID', () => {
536
- chatRecordingService.initialize();
593
+ it('should rewind the conversation to a specific message ID', async () => {
594
+ await chatRecordingService.initialize();
537
595
  // Record some messages
538
596
  chatRecordingService.recordMessage({
539
597
  type: 'user',
@@ -551,17 +609,17 @@ describe('ChatRecordingService', () => {
551
609
  model: 'm',
552
610
  });
553
611
  const sessionFile = chatRecordingService.getConversationFilePath();
554
- let conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
612
+ let conversation = (await loadConversationRecord(sessionFile));
555
613
  const secondMsgId = conversation.messages[1].id;
556
614
  const result = chatRecordingService.rewindTo(secondMsgId);
557
615
  expect(result).not.toBeNull();
558
616
  expect(result.messages).toHaveLength(1);
559
617
  expect(result.messages[0].content).toBe('msg1');
560
- conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
618
+ conversation = (await loadConversationRecord(sessionFile));
561
619
  expect(conversation.messages).toHaveLength(1);
562
620
  });
563
- it('should return the original conversation if the message ID is not found', () => {
564
- chatRecordingService.initialize();
621
+ it('should return the original conversation if the message ID is not found', async () => {
622
+ await chatRecordingService.initialize();
565
623
  chatRecordingService.recordMessage({
566
624
  type: 'user',
567
625
  content: 'msg1',
@@ -573,25 +631,23 @@ describe('ChatRecordingService', () => {
573
631
  });
574
632
  });
575
633
  describe('ENOSPC (disk full) graceful degradation - issue #16266', () => {
576
- it('should disable recording and not throw when ENOSPC occurs during initialize', () => {
634
+ it('should disable recording and not throw when ENOSPC occurs during initialize', async () => {
577
635
  const enospcError = new Error('ENOSPC: no space left on device');
578
636
  enospcError.code = 'ENOSPC';
579
- const mkdirSyncSpy = vi.spyOn(fs, 'mkdirSync').mockImplementation(() => {
637
+ const mkdirSyncSpy = vi.mocked(fs.mkdirSync).mockImplementation(() => {
580
638
  throw enospcError;
581
639
  });
582
640
  // Should not throw
583
- expect(() => chatRecordingService.initialize()).not.toThrow();
641
+ await expect(chatRecordingService.initialize()).resolves.not.toThrow();
584
642
  // Recording should be disabled (conversationFile set to null)
585
643
  expect(chatRecordingService.getConversationFilePath()).toBeNull();
586
644
  mkdirSyncSpy.mockRestore();
587
645
  });
588
- it('should disable recording and not throw when ENOSPC occurs during writeConversation', () => {
589
- chatRecordingService.initialize();
646
+ it('should disable recording and not throw when ENOSPC occurs during writeConversation', async () => {
647
+ await chatRecordingService.initialize();
590
648
  const enospcError = new Error('ENOSPC: no space left on device');
591
649
  enospcError.code = 'ENOSPC';
592
- const writeFileSyncSpy = vi
593
- .spyOn(fs, 'writeFileSync')
594
- .mockImplementation(() => {
650
+ vi.mocked(fs.appendFileSync).mockImplementation(() => {
595
651
  throw enospcError;
596
652
  });
597
653
  // Should not throw when recording a message
@@ -602,14 +658,13 @@ describe('ChatRecordingService', () => {
602
658
  })).not.toThrow();
603
659
  // Recording should be disabled (conversationFile set to null)
604
660
  expect(chatRecordingService.getConversationFilePath()).toBeNull();
605
- writeFileSyncSpy.mockRestore();
606
661
  });
607
- it('should skip recording operations when recording is disabled', () => {
608
- chatRecordingService.initialize();
662
+ it('should skip recording operations when recording is disabled', async () => {
663
+ await chatRecordingService.initialize();
609
664
  const enospcError = new Error('ENOSPC: no space left on device');
610
665
  enospcError.code = 'ENOSPC';
611
- const writeFileSyncSpy = vi
612
- .spyOn(fs, 'writeFileSync')
666
+ const appendFileSyncSpy = vi
667
+ .mocked(fs.appendFileSync)
613
668
  .mockImplementationOnce(() => {
614
669
  throw enospcError;
615
670
  });
@@ -619,7 +674,7 @@ describe('ChatRecordingService', () => {
619
674
  model: 'gemini-pro',
620
675
  });
621
676
  // Reset mock to track subsequent calls
622
- writeFileSyncSpy.mockClear();
677
+ appendFileSyncSpy.mockClear();
623
678
  // Subsequent calls should be no-ops (not call writeFileSync)
624
679
  chatRecordingService.recordMessage({
625
680
  type: 'user',
@@ -632,16 +687,13 @@ describe('ChatRecordingService', () => {
632
687
  });
633
688
  chatRecordingService.saveSummary('Test summary');
634
689
  // writeFileSync should not have been called for any of these
635
- expect(writeFileSyncSpy).not.toHaveBeenCalled();
636
- writeFileSyncSpy.mockRestore();
690
+ expect(appendFileSyncSpy).not.toHaveBeenCalled();
637
691
  });
638
- it('should return null from getConversation when recording is disabled', () => {
639
- chatRecordingService.initialize();
692
+ it('should return null from getConversation when recording is disabled', async () => {
693
+ await chatRecordingService.initialize();
640
694
  const enospcError = new Error('ENOSPC: no space left on device');
641
695
  enospcError.code = 'ENOSPC';
642
- const writeFileSyncSpy = vi
643
- .spyOn(fs, 'writeFileSync')
644
- .mockImplementation(() => {
696
+ vi.mocked(fs.appendFileSync).mockImplementation(() => {
645
697
  throw enospcError;
646
698
  });
647
699
  // Trigger ENOSPC
@@ -653,15 +705,12 @@ describe('ChatRecordingService', () => {
653
705
  // getConversation should return null when disabled
654
706
  expect(chatRecordingService.getConversation()).toBeNull();
655
707
  expect(chatRecordingService.getConversationFilePath()).toBeNull();
656
- writeFileSyncSpy.mockRestore();
657
708
  });
658
- it('should still throw for non-ENOSPC errors', () => {
659
- chatRecordingService.initialize();
709
+ it('should still throw for non-ENOSPC errors', async () => {
710
+ await chatRecordingService.initialize();
660
711
  const otherError = new Error('Permission denied');
661
712
  otherError.code = 'EACCES';
662
- const writeFileSyncSpy = vi
663
- .spyOn(fs, 'writeFileSync')
664
- .mockImplementation(() => {
713
+ vi.mocked(fs.appendFileSync).mockImplementation(() => {
665
714
  throw otherError;
666
715
  });
667
716
  // Should throw for non-ENOSPC errors
@@ -672,14 +721,13 @@ describe('ChatRecordingService', () => {
672
721
  })).toThrow('Permission denied');
673
722
  // Recording should NOT be disabled for non-ENOSPC errors (file path still exists)
674
723
  expect(chatRecordingService.getConversationFilePath()).not.toBeNull();
675
- writeFileSyncSpy.mockRestore();
676
724
  });
677
725
  });
678
726
  describe('updateMessagesFromHistory', () => {
679
- beforeEach(() => {
680
- chatRecordingService.initialize();
727
+ beforeEach(async () => {
728
+ await chatRecordingService.initialize();
681
729
  });
682
- it('should update tool results from API history (masking sync)', () => {
730
+ it('should update tool results from API history (masking sync)', async () => {
683
731
  // 1. Record an initial message and tool call
684
732
  chatRecordingService.recordMessage({
685
733
  type: 'gemini',
@@ -724,7 +772,7 @@ describe('ChatRecordingService', () => {
724
772
  chatRecordingService.updateMessagesFromHistory(history);
725
773
  // 4. Verify disk content
726
774
  const sessionFile = chatRecordingService.getConversationFilePath();
727
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
775
+ const conversation = (await loadConversationRecord(sessionFile));
728
776
  const geminiMsg = conversation.messages[0];
729
777
  if (geminiMsg.type !== 'gemini')
730
778
  throw new Error('Expected gemini message');
@@ -741,8 +789,8 @@ describe('ChatRecordingService', () => {
741
789
  output: maskedSnippet,
742
790
  });
743
791
  });
744
- it('should preserve multi-modal sibling parts during sync', () => {
745
- chatRecordingService.initialize();
792
+ it('should preserve multi-modal sibling parts during sync', async () => {
793
+ await chatRecordingService.initialize();
746
794
  const callId = 'multi-modal-call';
747
795
  const originalResult = [
748
796
  {
@@ -787,7 +835,7 @@ describe('ChatRecordingService', () => {
787
835
  ];
788
836
  chatRecordingService.updateMessagesFromHistory(history);
789
837
  const sessionFile = chatRecordingService.getConversationFilePath();
790
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
838
+ const conversation = (await loadConversationRecord(sessionFile));
791
839
  const lastMsg = conversation.messages[0];
792
840
  const result = lastMsg.toolCalls[0].result;
793
841
  expect(result).toHaveLength(2);
@@ -797,8 +845,8 @@ describe('ChatRecordingService', () => {
797
845
  expect(result[1].inlineData).toBeDefined();
798
846
  expect(result[1].inlineData.mimeType).toBe('image/png');
799
847
  });
800
- it('should handle parts appearing BEFORE the functionResponse in a content block', () => {
801
- chatRecordingService.initialize();
848
+ it('should handle parts appearing BEFORE the functionResponse in a content block', async () => {
849
+ await chatRecordingService.initialize();
802
850
  const callId = 'prefix-part-call';
803
851
  chatRecordingService.recordMessage({
804
852
  type: 'gemini',
@@ -832,21 +880,21 @@ describe('ChatRecordingService', () => {
832
880
  ];
833
881
  chatRecordingService.updateMessagesFromHistory(history);
834
882
  const sessionFile = chatRecordingService.getConversationFilePath();
835
- const conversation = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
883
+ const conversation = (await loadConversationRecord(sessionFile));
836
884
  const lastMsg = conversation.messages[0];
837
885
  const result = lastMsg.toolCalls[0].result;
838
886
  expect(result).toHaveLength(2);
839
887
  expect(result[0].text).toBe('Prefix metadata or text');
840
888
  expect(result[1].functionResponse.id).toBe(callId);
841
889
  });
842
- it('should not write to disk when no tool calls match', () => {
890
+ it('should not write to disk when no tool calls match', async () => {
843
891
  chatRecordingService.recordMessage({
844
892
  type: 'gemini',
845
893
  content: 'Response with no tool calls',
846
894
  model: 'gemini-pro',
847
895
  });
848
- const writeFileSyncSpy = vi.spyOn(fs, 'writeFileSync');
849
- writeFileSyncSpy.mockClear();
896
+ const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
897
+ appendFileSyncSpy.mockClear();
850
898
  // History with a tool call ID that doesn't exist in the conversation
851
899
  const history = [
852
900
  {
@@ -864,15 +912,14 @@ describe('ChatRecordingService', () => {
864
912
  ];
865
913
  chatRecordingService.updateMessagesFromHistory(history);
866
914
  // No tool calls matched, so writeFileSync should NOT have been called
867
- expect(writeFileSyncSpy).not.toHaveBeenCalled();
868
- writeFileSyncSpy.mockRestore();
915
+ expect(appendFileSyncSpy).not.toHaveBeenCalled();
869
916
  });
870
917
  });
871
918
  describe('ENOENT (missing directory) handling', () => {
872
- it('should ensure directory exists before writing conversation file', () => {
873
- chatRecordingService.initialize();
874
- const mkdirSyncSpy = vi.spyOn(fs, 'mkdirSync');
875
- const writeFileSyncSpy = vi.spyOn(fs, 'writeFileSync');
919
+ it('should ensure directory exists before writing conversation file', async () => {
920
+ await chatRecordingService.initialize();
921
+ const mkdirSyncSpy = vi.mocked(fs.mkdirSync);
922
+ const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
876
923
  chatRecordingService.recordMessage({
877
924
  type: 'user',
878
925
  content: 'Hello after dir cleanup',
@@ -883,12 +930,11 @@ describe('ChatRecordingService', () => {
883
930
  expect(mkdirSyncSpy).toHaveBeenCalledWith(path.dirname(conversationFile), { recursive: true });
884
931
  // mkdirSync should be called before writeFileSync
885
932
  const mkdirCallOrder = mkdirSyncSpy.mock.invocationCallOrder;
886
- const writeCallOrder = writeFileSyncSpy.mock.invocationCallOrder;
933
+ const writeCallOrder = appendFileSyncSpy.mock.invocationCallOrder;
887
934
  const lastMkdir = mkdirCallOrder[mkdirCallOrder.length - 1];
888
935
  const lastWrite = writeCallOrder[writeCallOrder.length - 1];
889
936
  expect(lastMkdir).toBeLessThan(lastWrite);
890
937
  mkdirSyncSpy.mockRestore();
891
- writeFileSyncSpy.mockRestore();
892
938
  });
893
939
  });
894
940
  });