@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
@@ -5,11 +5,10 @@
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
7
  import { generateSummary, getPreviousSession } from './sessionSummaryUtils.js';
8
+ import * as chatRecordingService from './chatRecordingService.js';
8
9
  import * as fs from 'node:fs/promises';
9
10
  import * as path from 'node:path';
10
- // Mock fs/promises
11
- vi.mock('node:fs/promises');
12
- const mockReaddir = fs.readdir;
11
+ import * as os from 'node:os';
13
12
  // Mock the SessionSummaryService module
14
13
  vi.mock('./sessionSummaryService.js', () => ({
15
14
  SessionSummaryService: vi.fn().mockImplementation(() => ({
@@ -20,118 +19,272 @@ vi.mock('./sessionSummaryService.js', () => ({
20
19
  vi.mock('../core/baseLlmClient.js', () => ({
21
20
  BaseLlmClient: vi.fn(),
22
21
  }));
23
- // Helper to create a session with N user messages
24
- function createSessionWithUserMessages(count, options = {}) {
22
+ vi.mock('./chatRecordingService.js', async () => {
23
+ const actual = await vi.importActual('./chatRecordingService.js');
24
+ return {
25
+ ...actual,
26
+ loadConversationRecord: vi.fn(actual.loadConversationRecord),
27
+ };
28
+ });
29
+ function buildLegacySessionJson(fixture) {
25
30
  return JSON.stringify({
26
- sessionId: options.sessionId ?? 'session-id',
27
- summary: options.summary,
28
- messages: Array.from({ length: count }, (_, i) => ({
31
+ sessionId: fixture.sessionId ?? 'session-id',
32
+ projectHash: 'abc123',
33
+ startTime: fixture.startTime ?? '2024-01-01T00:00:00Z',
34
+ lastUpdated: fixture.lastUpdated ?? '2024-01-01T00:00:00Z',
35
+ summary: fixture.summary,
36
+ messages: Array.from({ length: fixture.userMessageCount }, (_, i) => ({
29
37
  id: String(i + 1),
38
+ timestamp: '2024-01-01T00:00:00Z',
30
39
  type: 'user',
31
40
  content: [{ text: `Message ${i + 1}` }],
32
41
  })),
33
42
  });
34
43
  }
44
+ function buildJsonlSession(fixture) {
45
+ const metadata = {
46
+ sessionId: fixture.sessionId ?? 'session-id',
47
+ projectHash: 'abc123',
48
+ startTime: fixture.startTime ?? '2024-01-01T00:00:00Z',
49
+ lastUpdated: fixture.lastUpdated ?? '2024-01-01T00:00:00Z',
50
+ ...(fixture.summary !== undefined ? { summary: fixture.summary } : {}),
51
+ };
52
+ const lines = [JSON.stringify(metadata)];
53
+ for (let i = 0; i < fixture.userMessageCount; i++) {
54
+ lines.push(JSON.stringify({
55
+ id: String(i + 1),
56
+ timestamp: '2024-01-01T00:00:00Z',
57
+ type: 'user',
58
+ content: [{ text: `Message ${i + 1}` }],
59
+ }));
60
+ }
61
+ return lines.join('\n') + '\n';
62
+ }
63
+ async function writeSession(chatsDir, fileName, contents) {
64
+ const filePath = path.join(chatsDir, fileName);
65
+ await fs.writeFile(filePath, contents);
66
+ return filePath;
67
+ }
68
+ async function setSessionMtime(filePath, timestamp) {
69
+ const date = new Date(timestamp);
70
+ await fs.utimes(filePath, date, date);
71
+ }
35
72
  describe('sessionSummaryUtils', () => {
73
+ let tmpDir;
74
+ let projectTempDir;
75
+ let chatsDir;
36
76
  let mockConfig;
37
77
  let mockContentGenerator;
38
78
  let mockGenerateSummary;
39
79
  beforeEach(async () => {
40
80
  vi.clearAllMocks();
41
- // Setup mock content generator
81
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'session-summary-utils-'));
82
+ projectTempDir = path.join(tmpDir, 'project');
83
+ chatsDir = path.join(projectTempDir, 'chats');
84
+ await fs.mkdir(chatsDir, { recursive: true });
42
85
  mockContentGenerator = {};
43
- // Setup mock config
44
86
  mockConfig = {
45
87
  getContentGenerator: vi.fn().mockReturnValue(mockContentGenerator),
88
+ getSessionId: vi.fn().mockReturnValue('current-session'),
46
89
  storage: {
47
- getProjectTempDir: vi.fn().mockReturnValue('/tmp/project'),
90
+ getProjectTempDir: vi.fn().mockReturnValue(projectTempDir),
48
91
  },
49
92
  };
50
- // Setup mock generateSummary function
51
93
  mockGenerateSummary = vi.fn().mockResolvedValue('Add dark mode to the app');
52
- // Import the mocked module to access the constructor
53
94
  const { SessionSummaryService } = await import('./sessionSummaryService.js');
54
95
  SessionSummaryService.mockImplementation(() => ({
55
96
  generateSummary: mockGenerateSummary,
56
97
  }));
57
98
  });
58
- afterEach(() => {
99
+ afterEach(async () => {
59
100
  vi.restoreAllMocks();
101
+ await fs.rm(tmpDir, { recursive: true, force: true });
60
102
  });
61
103
  describe('getPreviousSession', () => {
62
104
  it('should return null if chats directory does not exist', async () => {
63
- vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
105
+ await fs.rm(chatsDir, { recursive: true, force: true });
64
106
  const result = await getPreviousSession(mockConfig);
65
107
  expect(result).toBeNull();
66
108
  });
67
109
  it('should return null if no session files exist', async () => {
68
- vi.mocked(fs.access).mockResolvedValue(undefined);
69
- mockReaddir.mockResolvedValue([]);
70
110
  const result = await getPreviousSession(mockConfig);
71
111
  expect(result).toBeNull();
72
112
  });
73
113
  it('should return null if most recent session already has summary', async () => {
74
- vi.mocked(fs.access).mockResolvedValue(undefined);
75
- mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
76
- vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(5, { summary: 'Existing summary' }));
114
+ await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.json', buildLegacySessionJson({
115
+ userMessageCount: 5,
116
+ summary: 'Existing summary',
117
+ }));
77
118
  const result = await getPreviousSession(mockConfig);
78
119
  expect(result).toBeNull();
79
120
  });
80
121
  it('should return null if most recent session has 1 or fewer user messages', async () => {
81
- vi.mocked(fs.access).mockResolvedValue(undefined);
82
- mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
83
- vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(1));
122
+ await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.json', buildLegacySessionJson({ userMessageCount: 1 }));
84
123
  const result = await getPreviousSession(mockConfig);
85
124
  expect(result).toBeNull();
86
125
  });
87
126
  it('should return path if most recent session has more than 1 user message and no summary', async () => {
88
- vi.mocked(fs.access).mockResolvedValue(undefined);
89
- mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
90
- vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
127
+ const filePath = await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.json', buildLegacySessionJson({ userMessageCount: 2 }));
91
128
  const result = await getPreviousSession(mockConfig);
92
- expect(result).toBe(path.join('/tmp/project', 'chats', 'session-2024-01-01T10-00-abc12345.json'));
129
+ expect(result).toBe(filePath);
93
130
  });
94
- it('should select most recently created session by filename', async () => {
95
- vi.mocked(fs.access).mockResolvedValue(undefined);
96
- mockReaddir.mockResolvedValue([
97
- 'session-2024-01-01T10-00-older000.json',
98
- 'session-2024-01-02T10-00-newer000.json',
99
- ]);
100
- vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
131
+ it('should select most recently updated session', async () => {
132
+ await writeSession(chatsDir, 'session-2024-01-01T10-00-older000.json', buildLegacySessionJson({
133
+ userMessageCount: 2,
134
+ lastUpdated: '2024-01-01T10:00:00Z',
135
+ }));
136
+ const newerPath = await writeSession(chatsDir, 'session-2024-01-02T10-00-newer000.json', buildLegacySessionJson({
137
+ userMessageCount: 2,
138
+ lastUpdated: '2024-01-02T10:00:00Z',
139
+ }));
101
140
  const result = await getPreviousSession(mockConfig);
102
- expect(result).toBe(path.join('/tmp/project', 'chats', 'session-2024-01-02T10-00-newer000.json'));
141
+ expect(result).toBe(newerPath);
103
142
  });
104
- it('should return null if most recent session file is corrupted', async () => {
105
- vi.mocked(fs.access).mockResolvedValue(undefined);
106
- mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
107
- vi.mocked(fs.readFile).mockResolvedValue('invalid json');
143
+ it('should ignore corrupted session files', async () => {
144
+ await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.json', 'invalid json');
108
145
  const result = await getPreviousSession(mockConfig);
109
146
  expect(result).toBeNull();
110
147
  });
148
+ it('should support JSONL sessions and sort by lastUpdated instead of filename', async () => {
149
+ await writeSession(chatsDir, 'session-2024-01-02T10-00-older000.jsonl', buildJsonlSession({
150
+ userMessageCount: 2,
151
+ lastUpdated: '2024-01-01T10:00:00Z',
152
+ sessionId: 'older-session',
153
+ }));
154
+ const newerPath = await writeSession(chatsDir, 'session-2024-01-01T10-00-newer000.jsonl', buildJsonlSession({
155
+ userMessageCount: 2,
156
+ lastUpdated: '2024-01-03T10:00:00Z',
157
+ sessionId: 'newer-session',
158
+ }));
159
+ const result = await getPreviousSession(mockConfig);
160
+ expect(result).toBe(newerPath);
161
+ });
162
+ it('should stop scanning once older mtimes cannot beat the best lastUpdated', async () => {
163
+ const loadConversationRecord = vi.mocked(chatRecordingService.loadConversationRecord);
164
+ const currentPath = await writeSession(chatsDir, 'session-2024-01-03T10-00-cur00001.jsonl', buildJsonlSession({
165
+ sessionId: 'current-session',
166
+ userMessageCount: 2,
167
+ lastUpdated: '2024-01-03T10:00:00Z',
168
+ }));
169
+ await setSessionMtime(currentPath, '2024-01-03T10:00:00Z');
170
+ const bestPath = await writeSession(chatsDir, 'session-2024-01-02T10-00-best0001.jsonl', buildJsonlSession({
171
+ sessionId: 'best-session',
172
+ userMessageCount: 2,
173
+ lastUpdated: '2024-01-02T10:00:00Z',
174
+ }));
175
+ await setSessionMtime(bestPath, '2024-01-02T10:00:00Z');
176
+ const olderPath = await writeSession(chatsDir, 'session-2024-01-01T10-00-older001.jsonl', buildJsonlSession({
177
+ sessionId: 'older-session',
178
+ userMessageCount: 2,
179
+ lastUpdated: '2024-01-01T10:00:00Z',
180
+ }));
181
+ await setSessionMtime(olderPath, '2024-01-01T10:00:00Z');
182
+ const result = await getPreviousSession(mockConfig);
183
+ expect(result).toBe(bestPath);
184
+ expect(loadConversationRecord).toHaveBeenCalledTimes(2);
185
+ expect(loadConversationRecord).not.toHaveBeenCalledWith(olderPath, {
186
+ metadataOnly: true,
187
+ });
188
+ });
111
189
  });
112
190
  describe('generateSummary', () => {
113
191
  it('should not throw if getPreviousSession returns null', async () => {
114
- vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
192
+ await fs.rm(chatsDir, { recursive: true, force: true });
115
193
  await expect(generateSummary(mockConfig)).resolves.not.toThrow();
116
194
  });
117
- it('should generate and save summary for session needing one', async () => {
118
- const sessionPath = path.join('/tmp/project', 'chats', 'session-2024-01-01T10-00-abc12345.json');
119
- vi.mocked(fs.access).mockResolvedValue(undefined);
120
- mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
121
- vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
122
- vi.mocked(fs.writeFile).mockResolvedValue(undefined);
195
+ it('should generate and save summary for legacy JSON sessions', async () => {
196
+ const lastUpdated = '2024-01-01T10:00:00Z';
197
+ const filePath = await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.json', buildLegacySessionJson({ userMessageCount: 2, lastUpdated }));
123
198
  await generateSummary(mockConfig);
124
199
  expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
125
- expect(fs.writeFile).toHaveBeenCalledTimes(1);
126
- expect(fs.writeFile).toHaveBeenCalledWith(sessionPath, expect.stringContaining('Add dark mode to the app'));
200
+ const written = JSON.parse(await fs.readFile(filePath, 'utf-8'));
201
+ expect(written.summary).toBe('Add dark mode to the app');
202
+ expect(written.lastUpdated).toBe(lastUpdated);
127
203
  });
128
204
  it('should handle errors gracefully without throwing', async () => {
129
- vi.mocked(fs.access).mockResolvedValue(undefined);
130
- mockReaddir.mockResolvedValue(['session-2024-01-01T10-00-abc12345.json']);
131
- vi.mocked(fs.readFile).mockResolvedValue(createSessionWithUserMessages(2));
205
+ await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.json', buildLegacySessionJson({ userMessageCount: 2 }));
132
206
  mockGenerateSummary.mockRejectedValue(new Error('API Error'));
133
207
  await expect(generateSummary(mockConfig)).resolves.not.toThrow();
134
208
  });
209
+ it('should append a metadata update when saving a summary to JSONL', async () => {
210
+ const lastUpdated = '2024-01-01T10:00:00Z';
211
+ const filePath = await writeSession(chatsDir, 'session-2024-01-01T10-00-abc12345.jsonl', buildJsonlSession({ userMessageCount: 2, lastUpdated }));
212
+ await generateSummary(mockConfig);
213
+ expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
214
+ const lines = (await fs.readFile(filePath, 'utf-8'))
215
+ .split('\n')
216
+ .filter(Boolean);
217
+ const lastRecord = JSON.parse(lines[lines.length - 1]);
218
+ expect(lastRecord).toEqual({
219
+ $set: {
220
+ summary: 'Add dark mode to the app',
221
+ },
222
+ });
223
+ });
224
+ it('should preserve a newer JSONL lastUpdated written concurrently', async () => {
225
+ const initialLastUpdated = '2024-01-01T10:00:00Z';
226
+ const newerLastUpdated = '2024-01-02T12:34:56Z';
227
+ const filePath = await writeSession(chatsDir, 'session-2024-01-01T10-00-race.jsonl', buildJsonlSession({
228
+ userMessageCount: 2,
229
+ lastUpdated: initialLastUpdated,
230
+ }));
231
+ const actualChatRecordingService = await vi.importActual('./chatRecordingService.js');
232
+ let injectedConcurrentUpdate = false;
233
+ let sessionReadCount = 0;
234
+ vi.mocked(chatRecordingService.loadConversationRecord).mockImplementation(async (targetPath, options) => {
235
+ const conversation = await actualChatRecordingService.loadConversationRecord(targetPath, options);
236
+ if (targetPath === filePath) {
237
+ sessionReadCount += 1;
238
+ }
239
+ if (!injectedConcurrentUpdate &&
240
+ targetPath === filePath &&
241
+ sessionReadCount === 2) {
242
+ injectedConcurrentUpdate = true;
243
+ await fs.appendFile(filePath, `${JSON.stringify({ $set: { lastUpdated: newerLastUpdated } })}\n`);
244
+ }
245
+ return conversation;
246
+ });
247
+ await generateSummary(mockConfig);
248
+ expect(injectedConcurrentUpdate).toBe(true);
249
+ const savedConversation = await chatRecordingService.loadConversationRecord(filePath);
250
+ expect(savedConversation?.summary).toBe('Add dark mode to the app');
251
+ expect(savedConversation?.lastUpdated).toBe(newerLastUpdated);
252
+ const lines = (await fs.readFile(filePath, 'utf-8'))
253
+ .split('\n')
254
+ .filter(Boolean);
255
+ const lastRecord = JSON.parse(lines[lines.length - 1]);
256
+ expect(lastRecord).toEqual({
257
+ $set: {
258
+ summary: 'Add dark mode to the app',
259
+ },
260
+ });
261
+ });
262
+ it('should skip the active startup session and summarize the previous session', async () => {
263
+ const previousPath = await writeSession(chatsDir, 'session-2024-01-01T10-00-prev0001.jsonl', buildJsonlSession({
264
+ sessionId: 'previous-session',
265
+ userMessageCount: 2,
266
+ lastUpdated: '2024-01-01T10:00:00Z',
267
+ }));
268
+ const currentPath = await writeSession(chatsDir, 'session-2024-01-02T10-00-cur00001.jsonl', buildJsonlSession({
269
+ sessionId: 'current-session',
270
+ userMessageCount: 1,
271
+ lastUpdated: '2024-01-02T10:00:00Z',
272
+ }));
273
+ await generateSummary(mockConfig);
274
+ expect(mockGenerateSummary).toHaveBeenCalledTimes(1);
275
+ const previousLines = (await fs.readFile(previousPath, 'utf-8'))
276
+ .split('\n')
277
+ .filter(Boolean);
278
+ expect(JSON.parse(previousLines[previousLines.length - 1])).toEqual({
279
+ $set: {
280
+ summary: 'Add dark mode to the app',
281
+ },
282
+ });
283
+ const currentLines = (await fs.readFile(currentPath, 'utf-8'))
284
+ .split('\n')
285
+ .filter(Boolean);
286
+ expect(currentLines).toHaveLength(2);
287
+ });
135
288
  });
136
289
  });
137
290
  //# sourceMappingURL=sessionSummaryUtils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessionSummaryUtils.test.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionSummaryUtils.test.js","sourceRoot":"","sources":["../../../src/services/sessionSummaryUtils.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  * Copyright 2026 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import type { IPty } from '@lydell/node-pty';
6
7
  import { type EnvironmentSanitizationConfig } from './environmentSanitization.js';
7
8
  import { type SandboxManager, type SandboxPermissions } from './sandboxManager.js';
8
9
  import type { SandboxConfig } from '../config/config.js';
@@ -44,6 +45,9 @@ export interface ShellExecutionConfig {
44
45
  * Describes a structured event emitted during shell command execution.
45
46
  */
46
47
  export type ShellOutputEvent = ExecutionOutputEvent;
48
+ export type DestroyablePty = IPty & {
49
+ destroy?: () => void;
50
+ };
47
51
  /**
48
52
  * A centralized service for executing shell commands with robust process
49
53
  * management, cross-platform compatibility, and streaming output capabilities.
@@ -85,6 +89,16 @@ export declare class ShellExecutionService {
85
89
  private static appendAndTruncate;
86
90
  private static prepareExecution;
87
91
  private static childProcessFallback;
92
+ /**
93
+ * Destroys a PTY process to release its file descriptors.
94
+ * This is critical to prevent system-wide PTY exhaustion (see #15945).
95
+ */
96
+ private static destroyPtyProcess;
97
+ /**
98
+ * Cleans up all resources associated with a PTY entry:
99
+ * the PTY process (file descriptors) and the headless terminal (memory buffers).
100
+ */
101
+ private static cleanupPtyEntry;
88
102
  private static executeWithPty;
89
103
  /**
90
104
  * Writes a string to the pseudo-terminal (PTY) of a running process.
@@ -133,4 +147,9 @@ export declare class ShellExecutionService {
133
147
  */
134
148
  static scrollPty(pid: number, lines: number): void;
135
149
  static listBackgroundProcesses(sessionId: string): BackgroundProcess[];
150
+ /**
151
+ * Resets the internal state of the ShellExecutionService.
152
+ * This is intended for use in tests to ensure isolation.
153
+ */
154
+ static resetForTest(): void;
136
155
  }
@@ -300,15 +300,24 @@ export class ShellExecutionService {
300
300
  };
301
301
  }
302
302
  static async childProcessFallback(commandToExecute, cwd, onOutputEvent, abortSignal, shellExecutionConfig, isInteractive) {
303
+ let cmdCleanup;
303
304
  try {
304
305
  const isWindows = os.platform() === 'win32';
305
- const { program: finalExecutable, args: finalArgs, env: finalEnv, cwd: finalCwd, cleanup: cmdCleanup, } = await this.prepareExecution(commandToExecute, cwd, shellExecutionConfig, isInteractive);
306
+ const prepared = await this.prepareExecution(commandToExecute, cwd, shellExecutionConfig, isInteractive);
307
+ cmdCleanup = prepared.cleanup;
308
+ const { program: finalExecutable, args: finalArgs, env: finalEnv, cwd: finalCwd, } = prepared;
309
+ // Bun's child_process does not properly call setsid() for detached
310
+ // processes, leaving children in the parent's session without a
311
+ // controlling terminal. They receive SIGHUP immediately. Disable
312
+ // detached mode in Bun; killProcessGroup already falls back to
313
+ // direct-pid kill when the group kill fails.
314
+ const isBun = 'bun' in process.versions;
306
315
  const child = cpSpawn(finalExecutable, finalArgs, {
307
316
  cwd: finalCwd,
308
317
  stdio: ['ignore', 'pipe', 'pipe'],
309
318
  windowsVerbatimArguments: isWindows ? false : undefined,
310
319
  shell: false,
311
- detached: !isWindows,
320
+ detached: !isWindows && !isBun,
312
321
  env: finalEnv,
313
322
  });
314
323
  const state = {
@@ -388,7 +397,7 @@ export class ShellExecutionService {
388
397
  state.binaryBytesReceived += data.length;
389
398
  }
390
399
  if (isStreamingRawContent && sniffedBytes < MAX_SNIFF_SIZE) {
391
- const sniffBuffer = Buffer.concat(state.sniffChunks.slice(0, 20));
400
+ const sniffBuffer = Buffer.concat(state.sniffChunks);
392
401
  sniffedBytes = sniffBuffer.length;
393
402
  if (isBinary(sniffBuffer)) {
394
403
  isStreamingRawContent = false;
@@ -444,7 +453,9 @@ export class ShellExecutionService {
444
453
  }
445
454
  const finalStrippedOutput = stripAnsi(combinedOutput).trim();
446
455
  const exitCode = code;
447
- const exitSignal = signal ? os.constants.signals[signal] : null;
456
+ const exitSignal = signal && os.constants.signals
457
+ ? (os.constants.signals[signal] ?? null)
458
+ : null;
448
459
  const resultPayload = {
449
460
  rawOutput: Buffer.from(''),
450
461
  output: finalStrippedOutput,
@@ -543,6 +554,7 @@ export class ShellExecutionService {
543
554
  catch (e) {
544
555
  // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
545
556
  const error = e;
557
+ cmdCleanup?.();
546
558
  return {
547
559
  pid: undefined,
548
560
  result: Promise.resolve({
@@ -558,16 +570,54 @@ export class ShellExecutionService {
558
570
  };
559
571
  }
560
572
  }
573
+ /**
574
+ * Destroys a PTY process to release its file descriptors.
575
+ * This is critical to prevent system-wide PTY exhaustion (see #15945).
576
+ */
577
+ static destroyPtyProcess(ptyProcess) {
578
+ try {
579
+ if (typeof ptyProcess?.destroy === 'function') {
580
+ ptyProcess.destroy();
581
+ }
582
+ else if (typeof ptyProcess?.kill === 'function') {
583
+ // Fallback: if destroy() is unavailable, kill() may still close FDs
584
+ ptyProcess.kill();
585
+ }
586
+ }
587
+ catch {
588
+ // Ignore errors during PTY cleanup — process may already be dead
589
+ }
590
+ }
591
+ /**
592
+ * Cleans up all resources associated with a PTY entry:
593
+ * the PTY process (file descriptors) and the headless terminal (memory buffers).
594
+ */
595
+ static cleanupPtyEntry(pid) {
596
+ const entry = this.activePtys.get(pid);
597
+ if (!entry)
598
+ return;
599
+ this.destroyPtyProcess(entry.ptyProcess);
600
+ try {
601
+ entry.headlessTerminal.dispose();
602
+ }
603
+ catch {
604
+ // Ignore errors during terminal cleanup
605
+ }
606
+ this.activePtys.delete(pid);
607
+ }
561
608
  static async executeWithPty(commandToExecute, cwd, onOutputEvent, abortSignal, shellExecutionConfig, ptyInfo) {
562
609
  if (!ptyInfo) {
563
610
  // This should not happen, but as a safeguard...
564
611
  throw new Error('PTY implementation not found');
565
612
  }
566
613
  let spawnedPty;
614
+ let cmdCleanup;
567
615
  try {
568
616
  const cols = shellExecutionConfig.terminalWidth ?? 80;
569
617
  const rows = shellExecutionConfig.terminalHeight ?? 30;
570
- const { program: finalExecutable, args: finalArgs, env: finalEnv, cwd: finalCwd, cleanup: cmdCleanup, } = await this.prepareExecution(commandToExecute, cwd, shellExecutionConfig, true);
618
+ const prepared = await this.prepareExecution(commandToExecute, cwd, shellExecutionConfig, true);
619
+ cmdCleanup = prepared.cleanup;
620
+ const { program: finalExecutable, args: finalArgs, env: finalEnv, cwd: finalCwd, } = prepared;
571
621
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
572
622
  const ptyProcess = ptyInfo.module.spawn(finalExecutable, finalArgs, {
573
623
  cwd: finalCwd,
@@ -609,14 +659,6 @@ export class ShellExecutionService {
609
659
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
610
660
  pty: ptyProcess,
611
661
  }).catch(() => { });
612
- try {
613
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
614
- ptyProcess.destroy?.();
615
- }
616
- catch {
617
- // Ignore errors during cleanup
618
- }
619
- this.activePtys.delete(ptyPid);
620
662
  },
621
663
  isActive: () => {
622
664
  try {
@@ -747,7 +789,7 @@ export class ShellExecutionService {
747
789
  binaryBytesReceived += data.length;
748
790
  }
749
791
  if (isStreamingRawContent && sniffedBytes < MAX_SNIFF_SIZE) {
750
- const sniffBuffer = Buffer.concat(sniffChunks.slice(0, 20));
792
+ const sniffBuffer = Buffer.concat(sniffChunks);
751
793
  sniffedBytes = sniffBuffer.length;
752
794
  if (isBinary(sniffBuffer)) {
753
795
  isStreamingRawContent = false;
@@ -792,14 +834,10 @@ export class ShellExecutionService {
792
834
  ptyProcess.onExit(({ exitCode, signal }) => {
793
835
  exited = true;
794
836
  abortSignal.removeEventListener('abort', abortHandler);
795
- // Attempt to destroy the PTY to ensure FD is closed
796
- try {
797
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
798
- ptyProcess.destroy?.();
799
- }
800
- catch {
801
- // Ignore errors during cleanup
802
- }
837
+ // Immediately destroy the PTY to release its master FD.
838
+ // The headless terminal is kept alive until finalize() extracts
839
+ // its buffer contents, then disposed to free memory.
840
+ ShellExecutionService.destroyPtyProcess(ptyProcess);
803
841
  const finalize = () => {
804
842
  render(true);
805
843
  cmdCleanup?.();
@@ -818,16 +856,25 @@ export class ShellExecutionService {
818
856
  historyItem.endTime = Date.now();
819
857
  }
820
858
  onOutputEvent(event);
859
+ const endLine = headlessTerminal.buffer.active.length;
860
+ const startLine = Math.max(0, endLine - (shellExecutionConfig.maxSerializedLines ?? 2000));
861
+ const ansiOutputSnapshot = serializeTerminalToObject(headlessTerminal, startLine, endLine);
862
+ const finalOutput = getFullBufferText(headlessTerminal);
863
+ // Dispose the headless terminal to free scrollback buffers.
864
+ // This must happen after getFullBufferText() extracts the output.
865
+ try {
866
+ headlessTerminal.dispose();
867
+ }
868
+ catch {
869
+ // Ignore errors during terminal cleanup
870
+ }
821
871
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
822
872
  ShellExecutionService.cleanupLogStream(ptyPid).then(() => {
823
873
  ShellExecutionService.activePtys.delete(ptyPid);
824
874
  });
825
- const endLine = headlessTerminal.buffer.active.length;
826
- const startLine = Math.max(0, endLine - (shellExecutionConfig.maxSerializedLines ?? 2000));
827
- const ansiOutputSnapshot = serializeTerminalToObject(headlessTerminal, startLine, endLine);
828
875
  ExecutionLifecycleService.completeWithResult(ptyPid, {
829
876
  rawOutput: Buffer.from(''),
830
- output: getFullBufferText(headlessTerminal),
877
+ output: finalOutput,
831
878
  ansiOutput: ansiOutputSnapshot,
832
879
  exitCode,
833
880
  signal: signal ?? null,
@@ -873,15 +920,11 @@ export class ShellExecutionService {
873
920
  catch (e) {
874
921
  // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
875
922
  const error = e;
923
+ cmdCleanup?.();
876
924
  if (spawnedPty) {
877
- try {
878
- spawnedPty.destroy?.();
879
- }
880
- catch {
881
- // Ignore errors during cleanup
882
- }
925
+ ShellExecutionService.destroyPtyProcess(spawnedPty);
883
926
  }
884
- if (error.message.includes('posix_spawnp failed')) {
927
+ if (error?.message?.includes('posix_spawnp failed')) {
885
928
  onOutputEvent({
886
929
  type: 'data',
887
930
  chunk: '[CELL_CLI_WARNING] PTY execution failed, falling back to child_process. This may be due to sandbox restrictions.\n',
@@ -935,9 +978,9 @@ export class ShellExecutionService {
935
978
  */
936
979
  static async kill(pid) {
937
980
  await this.cleanupLogStream(pid);
938
- this.activePtys.delete(pid);
939
981
  this.activeChildProcesses.delete(pid);
940
982
  ExecutionLifecycleService.kill(pid);
983
+ this.cleanupPtyEntry(pid);
941
984
  }
942
985
  /**
943
986
  * Moves a running shell command to the background.
@@ -1088,5 +1131,16 @@ export class ShellExecutionService {
1088
1131
  signal: info.signal,
1089
1132
  }));
1090
1133
  }
1134
+ /**
1135
+ * Resets the internal state of the ShellExecutionService.
1136
+ * This is intended for use in tests to ensure isolation.
1137
+ */
1138
+ static resetForTest() {
1139
+ this.activePtys.clear();
1140
+ this.activeChildProcesses.clear();
1141
+ this.backgroundLogPids.clear();
1142
+ this.backgroundLogStreams.clear();
1143
+ this.backgroundProcessHistory.clear();
1144
+ }
1091
1145
  }
1092
1146
  //# sourceMappingURL=shellExecutionService.js.map