@google/gemini-cli-core 0.37.2 → 0.38.0

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 (449) hide show
  1. package/README.md +58 -50
  2. package/dist/docs/changelogs/index.md +25 -0
  3. package/dist/docs/changelogs/latest.md +353 -362
  4. package/dist/docs/changelogs/preview.md +399 -366
  5. package/dist/docs/cli/plan-mode.md +1 -0
  6. package/dist/docs/cli/sandbox.md +52 -0
  7. package/dist/docs/cli/settings.md +17 -14
  8. package/dist/docs/core/remote-agents.md +14 -18
  9. package/dist/docs/core/subagents.md +63 -27
  10. package/dist/docs/get-started/authentication.md +2 -2
  11. package/dist/docs/get-started/installation.md +7 -0
  12. package/dist/docs/hooks/index.md +6 -6
  13. package/dist/docs/reference/configuration.md +41 -11
  14. package/dist/docs/reference/keyboard-shortcuts.md +14 -9
  15. package/dist/docs/reference/tools.md +4 -4
  16. package/dist/docs/release-confidence.md +0 -6
  17. package/dist/docs/releases.md +4 -0
  18. package/dist/docs/tools/mcp-server.md +3 -3
  19. package/dist/docs/tools/web-fetch.md +3 -0
  20. package/dist/src/agent/agent-session.test.js +14 -6
  21. package/dist/src/agent/agent-session.test.js.map +1 -1
  22. package/dist/src/agent/event-translator.js +2 -1
  23. package/dist/src/agent/event-translator.js.map +1 -1
  24. package/dist/src/agent/event-translator.test.js +1 -0
  25. package/dist/src/agent/event-translator.test.js.map +1 -1
  26. package/dist/src/agent/legacy-agent-session.d.ts +47 -4
  27. package/dist/src/agent/legacy-agent-session.js +38 -15
  28. package/dist/src/agent/legacy-agent-session.js.map +1 -1
  29. package/dist/src/agent/legacy-agent-session.test.js +60 -73
  30. package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
  31. package/dist/src/agent/mock.js +7 -1
  32. package/dist/src/agent/mock.js.map +1 -1
  33. package/dist/src/agent/mock.test.js +1 -1
  34. package/dist/src/agent/mock.test.js.map +1 -1
  35. package/dist/src/agent/types.d.ts +34 -1
  36. package/dist/src/agents/agent-scheduler.js +6 -1
  37. package/dist/src/agents/agent-scheduler.js.map +1 -1
  38. package/dist/src/agents/agent-scheduler.test.js +38 -0
  39. package/dist/src/agents/agent-scheduler.test.js.map +1 -1
  40. package/dist/src/agents/auth-provider/api-key-provider.test.js +18 -2
  41. package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -1
  42. package/dist/src/agents/auth-provider/value-resolver.test.js +30 -0
  43. package/dist/src/agents/auth-provider/value-resolver.test.js.map +1 -1
  44. package/dist/src/agents/browser/analyzeScreenshot.js +36 -6
  45. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
  46. package/dist/src/agents/browser/analyzeScreenshot.test.js +35 -3
  47. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
  48. package/dist/src/agents/browser/browserAgentFactory.d.ts +8 -0
  49. package/dist/src/agents/browser/browserAgentFactory.js +174 -118
  50. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
  51. package/dist/src/agents/browser/browserAgentFactory.test.js +70 -1
  52. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
  53. package/dist/src/agents/browser/browserAgentInvocation.js +29 -2
  54. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  55. package/dist/src/agents/browser/browserAgentInvocation.test.js +51 -5
  56. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
  57. package/dist/src/agents/browser/browserManager.d.ts +38 -0
  58. package/dist/src/agents/browser/browserManager.js +117 -6
  59. package/dist/src/agents/browser/browserManager.js.map +1 -1
  60. package/dist/src/agents/browser/browserManager.test.js +156 -2
  61. package/dist/src/agents/browser/browserManager.test.js.map +1 -1
  62. package/dist/src/agents/browser/modelAvailability.d.ts +5 -0
  63. package/dist/src/agents/browser/modelAvailability.js +12 -0
  64. package/dist/src/agents/browser/modelAvailability.js.map +1 -1
  65. package/dist/src/agents/local-executor.d.ts +5 -0
  66. package/dist/src/agents/local-executor.js +98 -181
  67. package/dist/src/agents/local-executor.js.map +1 -1
  68. package/dist/src/agents/local-executor.test.js +386 -101
  69. package/dist/src/agents/local-executor.test.js.map +1 -1
  70. package/dist/src/agents/memory-manager-agent.js +1 -0
  71. package/dist/src/agents/memory-manager-agent.js.map +1 -1
  72. package/dist/src/agents/memory-manager-agent.test.js +6 -0
  73. package/dist/src/agents/memory-manager-agent.test.js.map +1 -1
  74. package/dist/src/agents/registry.js +3 -10
  75. package/dist/src/agents/registry.js.map +1 -1
  76. package/dist/src/agents/skill-extraction-agent.d.ts +24 -0
  77. package/dist/src/agents/skill-extraction-agent.js +269 -0
  78. package/dist/src/agents/skill-extraction-agent.js.map +1 -0
  79. package/dist/src/agents/types.d.ts +11 -0
  80. package/dist/src/code_assist/admin/admin_controls.js +1 -1
  81. package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
  82. package/dist/src/code_assist/experiments/flagNames.d.ts +1 -0
  83. package/dist/src/code_assist/experiments/flagNames.js +1 -0
  84. package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
  85. package/dist/src/code_assist/server.js +1 -1
  86. package/dist/src/code_assist/server.js.map +1 -1
  87. package/dist/src/commands/memory.js +1 -1
  88. package/dist/src/commands/memory.js.map +1 -1
  89. package/dist/src/config/config.d.ts +34 -31
  90. package/dist/src/config/config.js +101 -38
  91. package/dist/src/config/config.js.map +1 -1
  92. package/dist/src/config/config.test.js +102 -15
  93. package/dist/src/config/config.test.js.map +1 -1
  94. package/dist/src/config/extensions/integrity.js +1 -1
  95. package/dist/src/config/extensions/integrity.js.map +1 -1
  96. package/dist/src/config/projectRegistry.js +5 -3
  97. package/dist/src/config/projectRegistry.js.map +1 -1
  98. package/dist/src/config/scoped-config.d.ts +30 -0
  99. package/dist/src/config/scoped-config.js +69 -0
  100. package/dist/src/config/scoped-config.js.map +1 -0
  101. package/dist/src/config/scoped-config.test.d.ts +6 -0
  102. package/dist/src/config/scoped-config.test.js +161 -0
  103. package/dist/src/config/scoped-config.test.js.map +1 -0
  104. package/dist/src/config/storage.d.ts +2 -0
  105. package/dist/src/config/storage.js +7 -2
  106. package/dist/src/config/storage.js.map +1 -1
  107. package/dist/src/config/storage.test.js +7 -7
  108. package/dist/src/config/storage.test.js.map +1 -1
  109. package/dist/src/confirmation-bus/types.d.ts +2 -2
  110. package/dist/src/context/agentHistoryProvider.d.ts +1 -1
  111. package/dist/src/context/agentHistoryProvider.js +1 -5
  112. package/dist/src/context/agentHistoryProvider.js.map +1 -1
  113. package/dist/src/context/agentHistoryProvider.test.js +2 -39
  114. package/dist/src/context/agentHistoryProvider.test.js.map +1 -1
  115. package/dist/src/context/contextCompressionService.d.ts +30 -0
  116. package/dist/src/context/contextCompressionService.js +405 -0
  117. package/dist/src/context/contextCompressionService.js.map +1 -0
  118. package/dist/src/context/contextCompressionService.test.d.ts +1 -0
  119. package/dist/src/context/contextCompressionService.test.js +253 -0
  120. package/dist/src/context/contextCompressionService.test.js.map +1 -0
  121. package/dist/src/context/{contextManager.d.ts → memoryContextManager.d.ts} +1 -1
  122. package/dist/src/context/{contextManager.js → memoryContextManager.js} +2 -2
  123. package/dist/src/context/memoryContextManager.js.map +1 -0
  124. package/dist/src/context/{contextManager.test.js → memoryContextManager.test.js} +22 -28
  125. package/dist/src/context/memoryContextManager.test.js.map +1 -0
  126. package/dist/src/context/profiles.d.ts +7 -0
  127. package/dist/src/context/profiles.js +21 -0
  128. package/dist/src/context/profiles.js.map +1 -0
  129. package/dist/src/context/toolDistillationService.test.js +3 -0
  130. package/dist/src/context/toolDistillationService.test.js.map +1 -1
  131. package/dist/src/context/types.d.ts +36 -0
  132. package/dist/src/context/types.js.map +1 -0
  133. package/dist/src/core/baseLlmClient.js +1 -1
  134. package/dist/src/core/baseLlmClient.js.map +1 -1
  135. package/dist/src/core/baseLlmClient.test.js +1 -0
  136. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  137. package/dist/src/core/client.js +1 -1
  138. package/dist/src/core/client.js.map +1 -1
  139. package/dist/src/core/client.test.js +7 -6
  140. package/dist/src/core/client.test.js.map +1 -1
  141. package/dist/src/core/geminiChat.js +8 -0
  142. package/dist/src/core/geminiChat.js.map +1 -1
  143. package/dist/src/core/geminiChat.test.js +1 -0
  144. package/dist/src/core/geminiChat.test.js.map +1 -1
  145. package/dist/src/core/geminiChat_network_retry.test.js +1 -0
  146. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  147. package/dist/src/core/logger.js +4 -4
  148. package/dist/src/core/logger.js.map +1 -1
  149. package/dist/src/core/logger.test.js +1 -1
  150. package/dist/src/core/logger.test.js.map +1 -1
  151. package/dist/src/core/loggingContentGenerator.js +1 -1
  152. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  153. package/dist/src/generated/git-commit.d.ts +2 -2
  154. package/dist/src/generated/git-commit.js +2 -2
  155. package/dist/src/hooks/hookEventHandler.js +8 -0
  156. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  157. package/dist/src/hooks/hookRunner.js +9 -5
  158. package/dist/src/hooks/hookRunner.js.map +1 -1
  159. package/dist/src/hooks/hookRunner.test.js +20 -3
  160. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  161. package/dist/src/hooks/hookSystem.d.ts +2 -0
  162. package/dist/src/hooks/hookSystem.js +1 -0
  163. package/dist/src/hooks/hookSystem.js.map +1 -1
  164. package/dist/src/hooks/hookTranslator.js +20 -13
  165. package/dist/src/hooks/hookTranslator.js.map +1 -1
  166. package/dist/src/hooks/hookTranslator.test.js +36 -0
  167. package/dist/src/hooks/hookTranslator.test.js.map +1 -1
  168. package/dist/src/hooks/types.d.ts +2 -0
  169. package/dist/src/ide/ide-client.js +3 -3
  170. package/dist/src/ide/ide-client.js.map +1 -1
  171. package/dist/src/ide/ide-connection-utils.js +1 -1
  172. package/dist/src/ide/ide-connection-utils.js.map +1 -1
  173. package/dist/src/ide/ide-installer.js +3 -3
  174. package/dist/src/ide/ide-installer.js.map +1 -1
  175. package/dist/src/ide/process-utils.js +3 -3
  176. package/dist/src/ide/process-utils.js.map +1 -1
  177. package/dist/src/index.d.ts +4 -1
  178. package/dist/src/index.js +5 -1
  179. package/dist/src/index.js.map +1 -1
  180. package/dist/src/output/json-formatter.js +2 -1
  181. package/dist/src/output/json-formatter.js.map +1 -1
  182. package/dist/src/policy/config.test.js +21 -20
  183. package/dist/src/policy/config.test.js.map +1 -1
  184. package/dist/src/policy/policies/memory-manager.toml +11 -1
  185. package/dist/src/policy/policies/plan.toml +4 -3
  186. package/dist/src/policy/policies/read-only.toml +6 -0
  187. package/dist/src/policy/policies/sandbox-default.toml +2 -3
  188. package/dist/src/policy/policy-engine.js +23 -0
  189. package/dist/src/policy/policy-engine.js.map +1 -1
  190. package/dist/src/policy/policy-engine.test.js +129 -1
  191. package/dist/src/policy/policy-engine.test.js.map +1 -1
  192. package/dist/src/policy/sandboxPolicyManager.d.ts +26 -1
  193. package/dist/src/policy/sandboxPolicyManager.js +41 -12
  194. package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
  195. package/dist/src/policy/sandboxPolicyManager.test.d.ts +6 -0
  196. package/dist/src/policy/sandboxPolicyManager.test.js +61 -0
  197. package/dist/src/policy/sandboxPolicyManager.test.js.map +1 -0
  198. package/dist/src/policy/workspace-policy.test.js +18 -15
  199. package/dist/src/policy/workspace-policy.test.js.map +1 -1
  200. package/dist/src/prompts/snippets.js +6 -3
  201. package/dist/src/prompts/snippets.js.map +1 -1
  202. package/dist/src/prompts/snippets.legacy.js +6 -2
  203. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  204. package/dist/src/prompts/utils.test.js +7 -5
  205. package/dist/src/prompts/utils.test.js.map +1 -1
  206. package/dist/src/safety/built-in.js +1 -1
  207. package/dist/src/safety/built-in.js.map +1 -1
  208. package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +4 -4
  209. package/dist/src/sandbox/linux/LinuxSandboxManager.js +47 -191
  210. package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
  211. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +33 -395
  212. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
  213. package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +24 -0
  214. package/dist/src/sandbox/linux/bwrapArgsBuilder.js +200 -0
  215. package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -0
  216. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.d.ts +6 -0
  217. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +247 -0
  218. package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -0
  219. package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +3 -0
  220. package/dist/src/sandbox/macos/MacOsSandboxManager.js +12 -5
  221. package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
  222. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +20 -0
  223. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
  224. package/dist/src/sandbox/macos/baseProfile.d.ts +1 -1
  225. package/dist/src/sandbox/macos/baseProfile.js +28 -4
  226. package/dist/src/sandbox/macos/baseProfile.js.map +1 -1
  227. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +1 -1
  228. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
  229. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +2 -1
  230. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
  231. package/dist/src/sandbox/utils/fsUtils.js +8 -6
  232. package/dist/src/sandbox/utils/fsUtils.js.map +1 -1
  233. package/dist/src/sandbox/utils/fsUtils.test.d.ts +6 -0
  234. package/dist/src/sandbox/utils/fsUtils.test.js +43 -0
  235. package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -0
  236. package/dist/src/sandbox/utils/proactivePermissions.d.ts +19 -0
  237. package/dist/src/sandbox/utils/proactivePermissions.js +163 -0
  238. package/dist/src/sandbox/utils/proactivePermissions.js.map +1 -0
  239. package/dist/src/sandbox/utils/proactivePermissions.test.d.ts +6 -0
  240. package/dist/src/sandbox/utils/proactivePermissions.test.js +145 -0
  241. package/dist/src/sandbox/utils/proactivePermissions.test.js.map +1 -0
  242. package/dist/src/sandbox/utils/sandboxDenialUtils.d.ts +16 -1
  243. package/dist/src/sandbox/utils/sandboxDenialUtils.js +98 -24
  244. package/dist/src/sandbox/utils/sandboxDenialUtils.js.map +1 -1
  245. package/dist/src/sandbox/utils/sandboxDenialUtils.test.js +152 -1
  246. package/dist/src/sandbox/utils/sandboxDenialUtils.test.js.map +1 -1
  247. package/dist/src/sandbox/utils/sandboxReadWriteUtils.js +4 -0
  248. package/dist/src/sandbox/utils/sandboxReadWriteUtils.js.map +1 -1
  249. package/dist/src/sandbox/windows/GeminiSandbox.cs +90 -42
  250. package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +4 -0
  251. package/dist/src/sandbox/windows/WindowsSandboxManager.js +65 -60
  252. package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
  253. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +99 -54
  254. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
  255. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.d.ts +2 -1
  256. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js +19 -18
  257. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js.map +1 -1
  258. package/dist/src/scheduler/scheduler.js +1 -1
  259. package/dist/src/scheduler/scheduler.js.map +1 -1
  260. package/dist/src/scheduler/scheduler_hooks.test.js +1 -1
  261. package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
  262. package/dist/src/scheduler/tool-executor.js +1 -1
  263. package/dist/src/scheduler/tool-executor.js.map +1 -1
  264. package/dist/src/scheduler/tool-executor.test.js +1 -1
  265. package/dist/src/scheduler/tool-executor.test.js.map +1 -1
  266. package/dist/src/services/executionLifecycleService.d.ts +1 -0
  267. package/dist/src/services/executionLifecycleService.js +3 -0
  268. package/dist/src/services/executionLifecycleService.js.map +1 -1
  269. package/dist/src/services/gitService.js +1 -1
  270. package/dist/src/services/gitService.js.map +1 -1
  271. package/dist/src/services/memoryService.d.ts +65 -0
  272. package/dist/src/services/memoryService.js +511 -0
  273. package/dist/src/services/memoryService.js.map +1 -0
  274. package/dist/src/services/memoryService.test.d.ts +6 -0
  275. package/dist/src/services/memoryService.test.js +563 -0
  276. package/dist/src/services/memoryService.test.js.map +1 -0
  277. package/dist/src/services/sandboxManager.d.ts +17 -0
  278. package/dist/src/services/sandboxManager.integration.test.js +18 -11
  279. package/dist/src/services/sandboxManager.integration.test.js.map +1 -1
  280. package/dist/src/services/sandboxManager.js +20 -0
  281. package/dist/src/services/sandboxManager.js.map +1 -1
  282. package/dist/src/services/sandboxManager.test.js +84 -56
  283. package/dist/src/services/sandboxManager.test.js.map +1 -1
  284. package/dist/src/services/sandboxManagerFactory.js +2 -5
  285. package/dist/src/services/sandboxManagerFactory.js.map +1 -1
  286. package/dist/src/services/sandboxedFileSystemService.js +14 -3
  287. package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
  288. package/dist/src/services/sandboxedFileSystemService.test.js +29 -14
  289. package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -1
  290. package/dist/src/services/shellExecutionService.d.ts +16 -1
  291. package/dist/src/services/shellExecutionService.js +70 -10
  292. package/dist/src/services/shellExecutionService.js.map +1 -1
  293. package/dist/src/services/shellExecutionService.test.js +65 -4
  294. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  295. package/dist/src/services/worktreeService.test.js +7 -7
  296. package/dist/src/services/worktreeService.test.js.map +1 -1
  297. package/dist/src/skills/skillLoader.d.ts +8 -0
  298. package/dist/src/skills/skillLoader.js +1 -1
  299. package/dist/src/skills/skillLoader.js.map +1 -1
  300. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +29 -1
  301. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +101 -0
  302. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  303. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +167 -0
  304. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  305. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +9 -1
  306. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +20 -1
  307. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  308. package/dist/src/telemetry/loggers.d.ts +22 -0
  309. package/dist/src/telemetry/loggers.js +40 -1
  310. package/dist/src/telemetry/loggers.js.map +1 -1
  311. package/dist/src/telemetry/metrics.d.ts +108 -0
  312. package/dist/src/telemetry/metrics.js +177 -0
  313. package/dist/src/telemetry/metrics.js.map +1 -1
  314. package/dist/src/telemetry/metrics.test.js +254 -0
  315. package/dist/src/telemetry/metrics.test.js.map +1 -1
  316. package/dist/src/tools/complete-task.d.ts +29 -0
  317. package/dist/src/tools/complete-task.js +123 -0
  318. package/dist/src/tools/complete-task.js.map +1 -0
  319. package/dist/src/tools/complete-task.test.d.ts +6 -0
  320. package/dist/src/tools/complete-task.test.js +114 -0
  321. package/dist/src/tools/complete-task.test.js.map +1 -0
  322. package/dist/src/tools/definitions/base-declarations.d.ts +2 -0
  323. package/dist/src/tools/definitions/base-declarations.js +3 -0
  324. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  325. package/dist/src/tools/definitions/coreTools.d.ts +1 -1
  326. package/dist/src/tools/definitions/coreTools.js +1 -1
  327. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  328. package/dist/src/tools/definitions/dynamic-declaration-helpers.js +4 -0
  329. package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
  330. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +3 -3
  331. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  332. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +3 -3
  333. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  334. package/dist/src/tools/grep.test.js +2 -2
  335. package/dist/src/tools/grep.test.js.map +1 -1
  336. package/dist/src/tools/jit-context.js +3 -3
  337. package/dist/src/tools/jit-context.js.map +1 -1
  338. package/dist/src/tools/jit-context.test.js +15 -13
  339. package/dist/src/tools/jit-context.test.js.map +1 -1
  340. package/dist/src/tools/mcp-client.js +1 -1
  341. package/dist/src/tools/mcp-client.js.map +1 -1
  342. package/dist/src/tools/mcp-tool.test.js +1 -1
  343. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  344. package/dist/src/tools/ripGrep.test.js +1 -1
  345. package/dist/src/tools/ripGrep.test.js.map +1 -1
  346. package/dist/src/tools/shell.d.ts +7 -4
  347. package/dist/src/tools/shell.js +255 -37
  348. package/dist/src/tools/shell.js.map +1 -1
  349. package/dist/src/tools/shell.test.js +182 -8
  350. package/dist/src/tools/shell.test.js.map +1 -1
  351. package/dist/src/tools/shellBackgroundTools.d.ts +38 -0
  352. package/dist/src/tools/shellBackgroundTools.integration.test.d.ts +6 -0
  353. package/dist/src/tools/shellBackgroundTools.integration.test.js +86 -0
  354. package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -0
  355. package/dist/src/tools/shellBackgroundTools.js +186 -0
  356. package/dist/src/tools/shellBackgroundTools.js.map +1 -0
  357. package/dist/src/tools/shellBackgroundTools.test.d.ts +6 -0
  358. package/dist/src/tools/shellBackgroundTools.test.js +230 -0
  359. package/dist/src/tools/shellBackgroundTools.test.js.map +1 -0
  360. package/dist/src/tools/shell_proactive.test.d.ts +6 -0
  361. package/dist/src/tools/shell_proactive.test.js +122 -0
  362. package/dist/src/tools/shell_proactive.test.js.map +1 -0
  363. package/dist/src/tools/tool-names.d.ts +3 -3
  364. package/dist/src/tools/tool-names.js +3 -2
  365. package/dist/src/tools/tool-names.js.map +1 -1
  366. package/dist/src/tools/tools.js +1 -1
  367. package/dist/src/tools/tools.js.map +1 -1
  368. package/dist/src/tools/web-fetch.js +8 -8
  369. package/dist/src/tools/web-fetch.js.map +1 -1
  370. package/dist/src/tools/web-fetch.test.js +5 -5
  371. package/dist/src/tools/web-fetch.test.js.map +1 -1
  372. package/dist/src/tools/xcode-mcp-fix-transport.js +1 -1
  373. package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
  374. package/dist/src/utils/bfsFileSearch.js +3 -6
  375. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  376. package/dist/src/utils/checkpointUtils.js +11 -8
  377. package/dist/src/utils/checkpointUtils.js.map +1 -1
  378. package/dist/src/utils/compatibility.js +0 -7
  379. package/dist/src/utils/compatibility.js.map +1 -1
  380. package/dist/src/utils/compatibility.test.js +0 -9
  381. package/dist/src/utils/compatibility.test.js.map +1 -1
  382. package/dist/src/utils/editor.js +3 -0
  383. package/dist/src/utils/editor.js.map +1 -1
  384. package/dist/src/utils/errorParsing.js +2 -2
  385. package/dist/src/utils/errorParsing.js.map +1 -1
  386. package/dist/src/utils/events.d.ts +12 -0
  387. package/dist/src/utils/events.js +7 -0
  388. package/dist/src/utils/events.js.map +1 -1
  389. package/dist/src/utils/fetch.d.ts +1 -0
  390. package/dist/src/utils/fetch.js +22 -6
  391. package/dist/src/utils/fetch.js.map +1 -1
  392. package/dist/src/utils/fetch.test.js +26 -1
  393. package/dist/src/utils/fetch.test.js.map +1 -1
  394. package/dist/src/utils/fileUtils.js +1 -1
  395. package/dist/src/utils/fileUtils.js.map +1 -1
  396. package/dist/src/utils/filesearch/crawler.js +1 -1
  397. package/dist/src/utils/filesearch/crawler.js.map +1 -1
  398. package/dist/src/utils/filesearch/fileSearch.test.js +7 -2
  399. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  400. package/dist/src/utils/getPty.js +2 -2
  401. package/dist/src/utils/getPty.js.map +1 -1
  402. package/dist/src/utils/gitIgnoreParser.js +2 -2
  403. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  404. package/dist/src/utils/gitUtils.js +2 -2
  405. package/dist/src/utils/gitUtils.js.map +1 -1
  406. package/dist/src/utils/googleErrors.js +5 -5
  407. package/dist/src/utils/googleErrors.js.map +1 -1
  408. package/dist/src/utils/ignoreFileParser.js +1 -1
  409. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  410. package/dist/src/utils/memoryDiscovery.js +3 -7
  411. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  412. package/dist/src/utils/paths.d.ts +8 -0
  413. package/dist/src/utils/paths.js +37 -6
  414. package/dist/src/utils/paths.js.map +1 -1
  415. package/dist/src/utils/paths.test.js +61 -3
  416. package/dist/src/utils/paths.test.js.map +1 -1
  417. package/dist/src/utils/process-utils.js +2 -2
  418. package/dist/src/utils/process-utils.js.map +1 -1
  419. package/dist/src/utils/retry.js +7 -0
  420. package/dist/src/utils/retry.js.map +1 -1
  421. package/dist/src/utils/retry.test.js +41 -0
  422. package/dist/src/utils/retry.test.js.map +1 -1
  423. package/dist/src/utils/secure-browser-launcher.js +1 -1
  424. package/dist/src/utils/secure-browser-launcher.js.map +1 -1
  425. package/dist/src/utils/shell-utils.d.ts +9 -0
  426. package/dist/src/utils/shell-utils.integration.test.js +1 -1
  427. package/dist/src/utils/shell-utils.integration.test.js.map +1 -1
  428. package/dist/src/utils/shell-utils.js +43 -4
  429. package/dist/src/utils/shell-utils.js.map +1 -1
  430. package/dist/src/utils/shell-utils.test.js +13 -1
  431. package/dist/src/utils/shell-utils.test.js.map +1 -1
  432. package/dist/src/utils/systemEncoding.js +1 -1
  433. package/dist/src/utils/systemEncoding.js.map +1 -1
  434. package/dist/src/utils/terminalSerializer.d.ts +1 -0
  435. package/dist/src/utils/terminalSerializer.js +31 -8
  436. package/dist/src/utils/terminalSerializer.js.map +1 -1
  437. package/dist/src/utils/terminalSerializer.test.js +3 -2
  438. package/dist/src/utils/terminalSerializer.test.js.map +1 -1
  439. package/dist/src/utils/workspaceContext.js +2 -2
  440. package/dist/src/utils/workspaceContext.js.map +1 -1
  441. package/dist/tsconfig.tsbuildinfo +1 -1
  442. package/package.json +1 -1
  443. package/dist/google-gemini-cli-core-0.37.1.tgz +0 -0
  444. package/dist/src/context/contextManager.js.map +0 -1
  445. package/dist/src/context/contextManager.test.js.map +0 -1
  446. package/dist/src/services/types.d.ts +0 -14
  447. package/dist/src/services/types.js.map +0 -1
  448. /package/dist/src/context/{contextManager.test.d.ts → memoryContextManager.test.d.ts} +0 -0
  449. /package/dist/src/{services → context}/types.js +0 -0
@@ -0,0 +1,563 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ import * as os from 'node:os';
10
+ import { SESSION_FILE_PREFIX, } from './chatRecordingService.js';
11
+ // Mock external modules used by startMemoryService
12
+ vi.mock('../agents/local-executor.js', () => ({
13
+ LocalAgentExecutor: {
14
+ create: vi.fn().mockResolvedValue({
15
+ run: vi.fn().mockResolvedValue(undefined),
16
+ }),
17
+ },
18
+ }));
19
+ vi.mock('../agents/skill-extraction-agent.js', () => ({
20
+ SkillExtractionAgent: vi.fn().mockReturnValue({
21
+ name: 'skill-extraction',
22
+ promptConfig: { systemPrompt: 'test' },
23
+ tools: [],
24
+ outputSchema: {},
25
+ }),
26
+ }));
27
+ vi.mock('./executionLifecycleService.js', () => ({
28
+ ExecutionLifecycleService: {
29
+ createExecution: vi.fn().mockReturnValue({ pid: 42, result: {} }),
30
+ completeExecution: vi.fn(),
31
+ },
32
+ }));
33
+ vi.mock('../tools/tool-registry.js', () => ({
34
+ ToolRegistry: vi.fn(),
35
+ }));
36
+ vi.mock('../prompts/prompt-registry.js', () => ({
37
+ PromptRegistry: vi.fn(),
38
+ }));
39
+ vi.mock('../resources/resource-registry.js', () => ({
40
+ ResourceRegistry: vi.fn(),
41
+ }));
42
+ vi.mock('../utils/debugLogger.js', () => ({
43
+ debugLogger: {
44
+ debug: vi.fn(),
45
+ log: vi.fn(),
46
+ warn: vi.fn(),
47
+ },
48
+ }));
49
+ // Helper to create a minimal ConversationRecord
50
+ function createConversation(overrides = {}) {
51
+ const { messageCount = 4, ...rest } = overrides;
52
+ const messages = Array.from({ length: messageCount }, (_, i) => ({
53
+ id: String(i + 1),
54
+ timestamp: new Date().toISOString(),
55
+ content: [{ text: `Message ${i + 1}` }],
56
+ type: i % 2 === 0 ? 'user' : 'gemini',
57
+ }));
58
+ return {
59
+ sessionId: rest.sessionId ?? `session-${Date.now()}`,
60
+ projectHash: 'abc123',
61
+ startTime: '2025-01-01T00:00:00Z',
62
+ lastUpdated: '2025-01-01T01:00:00Z',
63
+ messages,
64
+ ...rest,
65
+ };
66
+ }
67
+ describe('memoryService', () => {
68
+ let tmpDir;
69
+ beforeEach(async () => {
70
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'skill-extract-test-'));
71
+ });
72
+ afterEach(async () => {
73
+ vi.clearAllMocks();
74
+ vi.unstubAllEnvs();
75
+ await fs.rm(tmpDir, { recursive: true, force: true });
76
+ });
77
+ describe('tryAcquireLock', () => {
78
+ it('successfully acquires lock when none exists', async () => {
79
+ const { tryAcquireLock } = await import('./memoryService.js');
80
+ const lockPath = path.join(tmpDir, '.extraction.lock');
81
+ const result = await tryAcquireLock(lockPath);
82
+ expect(result).toBe(true);
83
+ const content = JSON.parse(await fs.readFile(lockPath, 'utf-8'));
84
+ expect(content.pid).toBe(process.pid);
85
+ expect(content.startedAt).toBeDefined();
86
+ });
87
+ it('returns false when lock is held by a live process', async () => {
88
+ const { tryAcquireLock } = await import('./memoryService.js');
89
+ const lockPath = path.join(tmpDir, '.extraction.lock');
90
+ // Write a lock with the current PID (which is alive)
91
+ const lockInfo = {
92
+ pid: process.pid,
93
+ startedAt: new Date().toISOString(),
94
+ };
95
+ await fs.writeFile(lockPath, JSON.stringify(lockInfo));
96
+ const result = await tryAcquireLock(lockPath);
97
+ expect(result).toBe(false);
98
+ });
99
+ it('cleans up and re-acquires stale lock (dead PID)', async () => {
100
+ const { tryAcquireLock } = await import('./memoryService.js');
101
+ const lockPath = path.join(tmpDir, '.extraction.lock');
102
+ // Use a PID that almost certainly doesn't exist
103
+ const lockInfo = {
104
+ pid: 2147483646,
105
+ startedAt: new Date().toISOString(),
106
+ };
107
+ await fs.writeFile(lockPath, JSON.stringify(lockInfo));
108
+ const result = await tryAcquireLock(lockPath);
109
+ expect(result).toBe(true);
110
+ const content = JSON.parse(await fs.readFile(lockPath, 'utf-8'));
111
+ expect(content.pid).toBe(process.pid);
112
+ });
113
+ it('cleans up and re-acquires stale lock (too old)', async () => {
114
+ const { tryAcquireLock } = await import('./memoryService.js');
115
+ const lockPath = path.join(tmpDir, '.extraction.lock');
116
+ // Lock from 40 minutes ago with current PID — old enough to be stale (>35min)
117
+ const oldDate = new Date(Date.now() - 40 * 60 * 1000).toISOString();
118
+ const lockInfo = {
119
+ pid: process.pid,
120
+ startedAt: oldDate,
121
+ };
122
+ await fs.writeFile(lockPath, JSON.stringify(lockInfo));
123
+ const result = await tryAcquireLock(lockPath);
124
+ expect(result).toBe(true);
125
+ const content = JSON.parse(await fs.readFile(lockPath, 'utf-8'));
126
+ expect(content.pid).toBe(process.pid);
127
+ // The new lock should have a recent timestamp
128
+ const newLockAge = Date.now() - new Date(content.startedAt).getTime();
129
+ expect(newLockAge).toBeLessThan(5000);
130
+ });
131
+ });
132
+ describe('isLockStale', () => {
133
+ it('returns true when PID is dead', async () => {
134
+ const { isLockStale } = await import('./memoryService.js');
135
+ const lockPath = path.join(tmpDir, '.extraction.lock');
136
+ const lockInfo = {
137
+ pid: 2147483646,
138
+ startedAt: new Date().toISOString(),
139
+ };
140
+ await fs.writeFile(lockPath, JSON.stringify(lockInfo));
141
+ expect(await isLockStale(lockPath)).toBe(true);
142
+ });
143
+ it('returns true when lock is too old (>35 min)', async () => {
144
+ const { isLockStale } = await import('./memoryService.js');
145
+ const lockPath = path.join(tmpDir, '.extraction.lock');
146
+ const oldDate = new Date(Date.now() - 40 * 60 * 1000).toISOString();
147
+ const lockInfo = {
148
+ pid: process.pid,
149
+ startedAt: oldDate,
150
+ };
151
+ await fs.writeFile(lockPath, JSON.stringify(lockInfo));
152
+ expect(await isLockStale(lockPath)).toBe(true);
153
+ });
154
+ it('returns false when PID is alive and lock is fresh', async () => {
155
+ const { isLockStale } = await import('./memoryService.js');
156
+ const lockPath = path.join(tmpDir, '.extraction.lock');
157
+ const lockInfo = {
158
+ pid: process.pid,
159
+ startedAt: new Date().toISOString(),
160
+ };
161
+ await fs.writeFile(lockPath, JSON.stringify(lockInfo));
162
+ expect(await isLockStale(lockPath)).toBe(false);
163
+ });
164
+ it('returns true when file cannot be read', async () => {
165
+ const { isLockStale } = await import('./memoryService.js');
166
+ const lockPath = path.join(tmpDir, 'nonexistent.lock');
167
+ expect(await isLockStale(lockPath)).toBe(true);
168
+ });
169
+ });
170
+ describe('releaseLock', () => {
171
+ it('deletes the lock file', async () => {
172
+ const { releaseLock } = await import('./memoryService.js');
173
+ const lockPath = path.join(tmpDir, '.extraction.lock');
174
+ await fs.writeFile(lockPath, '{}');
175
+ await releaseLock(lockPath);
176
+ await expect(fs.access(lockPath)).rejects.toThrow();
177
+ });
178
+ it('does not throw when file is already gone', async () => {
179
+ const { releaseLock } = await import('./memoryService.js');
180
+ const lockPath = path.join(tmpDir, 'nonexistent.lock');
181
+ await expect(releaseLock(lockPath)).resolves.not.toThrow();
182
+ });
183
+ });
184
+ describe('readExtractionState / writeExtractionState', () => {
185
+ it('returns default state when file does not exist', async () => {
186
+ const { readExtractionState } = await import('./memoryService.js');
187
+ const statePath = path.join(tmpDir, 'nonexistent-state.json');
188
+ const state = await readExtractionState(statePath);
189
+ expect(state).toEqual({ runs: [] });
190
+ });
191
+ it('reads existing state file', async () => {
192
+ const { readExtractionState } = await import('./memoryService.js');
193
+ const statePath = path.join(tmpDir, '.extraction-state.json');
194
+ const existingState = {
195
+ runs: [
196
+ {
197
+ runAt: '2025-01-01T00:00:00Z',
198
+ sessionIds: ['session-1', 'session-2'],
199
+ skillsCreated: [],
200
+ },
201
+ ],
202
+ };
203
+ await fs.writeFile(statePath, JSON.stringify(existingState));
204
+ const state = await readExtractionState(statePath);
205
+ expect(state).toEqual(existingState);
206
+ });
207
+ it('writes state atomically via temp file + rename', async () => {
208
+ const { writeExtractionState, readExtractionState } = await import('./memoryService.js');
209
+ const statePath = path.join(tmpDir, '.extraction-state.json');
210
+ const state = {
211
+ runs: [
212
+ {
213
+ runAt: '2025-01-01T00:00:00Z',
214
+ sessionIds: ['session-abc'],
215
+ skillsCreated: [],
216
+ },
217
+ ],
218
+ };
219
+ await writeExtractionState(statePath, state);
220
+ // Verify the temp file does not linger
221
+ const files = await fs.readdir(tmpDir);
222
+ expect(files).not.toContain('.extraction-state.json.tmp');
223
+ // Verify the final file is readable
224
+ const readBack = await readExtractionState(statePath);
225
+ expect(readBack).toEqual(state);
226
+ });
227
+ });
228
+ describe('startMemoryService', () => {
229
+ it('skips when lock is held by another instance', async () => {
230
+ const { startMemoryService } = await import('./memoryService.js');
231
+ const { LocalAgentExecutor } = await import('../agents/local-executor.js');
232
+ const memoryDir = path.join(tmpDir, 'memory');
233
+ const skillsDir = path.join(tmpDir, 'skills');
234
+ const projectTempDir = path.join(tmpDir, 'temp');
235
+ await fs.mkdir(memoryDir, { recursive: true });
236
+ // Pre-acquire the lock with current PID
237
+ const lockPath = path.join(memoryDir, '.extraction.lock');
238
+ await fs.writeFile(lockPath, JSON.stringify({
239
+ pid: process.pid,
240
+ startedAt: new Date().toISOString(),
241
+ }));
242
+ const mockConfig = {
243
+ storage: {
244
+ getProjectMemoryDir: vi.fn().mockReturnValue(memoryDir),
245
+ getProjectMemoryTempDir: vi.fn().mockReturnValue(memoryDir),
246
+ getProjectSkillsMemoryDir: vi.fn().mockReturnValue(skillsDir),
247
+ getProjectTempDir: vi.fn().mockReturnValue(projectTempDir),
248
+ },
249
+ getToolRegistry: vi.fn(),
250
+ getMessageBus: vi.fn(),
251
+ getGeminiClient: vi.fn(),
252
+ sandboxManager: undefined,
253
+ };
254
+ await startMemoryService(mockConfig);
255
+ // Agent should never have been created
256
+ expect(LocalAgentExecutor.create).not.toHaveBeenCalled();
257
+ });
258
+ it('skips when no unprocessed sessions exist', async () => {
259
+ const { startMemoryService } = await import('./memoryService.js');
260
+ const { LocalAgentExecutor } = await import('../agents/local-executor.js');
261
+ const memoryDir = path.join(tmpDir, 'memory2');
262
+ const skillsDir = path.join(tmpDir, 'skills2');
263
+ const projectTempDir = path.join(tmpDir, 'temp2');
264
+ await fs.mkdir(memoryDir, { recursive: true });
265
+ // Create an empty chats directory
266
+ await fs.mkdir(path.join(projectTempDir, 'chats'), { recursive: true });
267
+ const mockConfig = {
268
+ storage: {
269
+ getProjectMemoryDir: vi.fn().mockReturnValue(memoryDir),
270
+ getProjectMemoryTempDir: vi.fn().mockReturnValue(memoryDir),
271
+ getProjectSkillsMemoryDir: vi.fn().mockReturnValue(skillsDir),
272
+ getProjectTempDir: vi.fn().mockReturnValue(projectTempDir),
273
+ },
274
+ getToolRegistry: vi.fn(),
275
+ getMessageBus: vi.fn(),
276
+ getGeminiClient: vi.fn(),
277
+ sandboxManager: undefined,
278
+ };
279
+ await startMemoryService(mockConfig);
280
+ expect(LocalAgentExecutor.create).not.toHaveBeenCalled();
281
+ // Lock should be released
282
+ const lockPath = path.join(memoryDir, '.extraction.lock');
283
+ await expect(fs.access(lockPath)).rejects.toThrow();
284
+ });
285
+ it('releases lock on error', async () => {
286
+ const { startMemoryService } = await import('./memoryService.js');
287
+ const { LocalAgentExecutor } = await import('../agents/local-executor.js');
288
+ const { ExecutionLifecycleService } = await import('./executionLifecycleService.js');
289
+ const memoryDir = path.join(tmpDir, 'memory3');
290
+ const skillsDir = path.join(tmpDir, 'skills3');
291
+ const projectTempDir = path.join(tmpDir, 'temp3');
292
+ const chatsDir = path.join(projectTempDir, 'chats');
293
+ await fs.mkdir(memoryDir, { recursive: true });
294
+ await fs.mkdir(chatsDir, { recursive: true });
295
+ // Write a valid session that will pass all filters
296
+ const conversation = createConversation({
297
+ sessionId: 'error-session',
298
+ messageCount: 20,
299
+ });
300
+ await fs.writeFile(path.join(chatsDir, 'session-2025-01-01T00-00-err00001.json'), JSON.stringify(conversation));
301
+ // Make LocalAgentExecutor.create throw
302
+ vi.mocked(LocalAgentExecutor.create).mockRejectedValueOnce(new Error('Agent creation failed'));
303
+ const mockConfig = {
304
+ storage: {
305
+ getProjectMemoryDir: vi.fn().mockReturnValue(memoryDir),
306
+ getProjectMemoryTempDir: vi.fn().mockReturnValue(memoryDir),
307
+ getProjectSkillsMemoryDir: vi.fn().mockReturnValue(skillsDir),
308
+ getProjectTempDir: vi.fn().mockReturnValue(projectTempDir),
309
+ },
310
+ getToolRegistry: vi.fn(),
311
+ getMessageBus: vi.fn(),
312
+ getGeminiClient: vi.fn(),
313
+ sandboxManager: undefined,
314
+ };
315
+ await startMemoryService(mockConfig);
316
+ // Lock should be released despite the error
317
+ const lockPath = path.join(memoryDir, '.extraction.lock');
318
+ await expect(fs.access(lockPath)).rejects.toThrow();
319
+ // ExecutionLifecycleService.completeExecution should have been called with error
320
+ expect(ExecutionLifecycleService.completeExecution).toHaveBeenCalledWith(42, expect.objectContaining({
321
+ error: expect.any(Error),
322
+ }));
323
+ });
324
+ });
325
+ describe('getProcessedSessionIds', () => {
326
+ it('returns empty set for empty state', async () => {
327
+ const { getProcessedSessionIds } = await import('./memoryService.js');
328
+ const result = getProcessedSessionIds({ runs: [] });
329
+ expect(result).toBeInstanceOf(Set);
330
+ expect(result.size).toBe(0);
331
+ });
332
+ it('collects session IDs across multiple runs', async () => {
333
+ const { getProcessedSessionIds } = await import('./memoryService.js');
334
+ const state = {
335
+ runs: [
336
+ {
337
+ runAt: '2025-01-01T00:00:00Z',
338
+ sessionIds: ['s1', 's2'],
339
+ skillsCreated: [],
340
+ },
341
+ {
342
+ runAt: '2025-01-02T00:00:00Z',
343
+ sessionIds: ['s3'],
344
+ skillsCreated: [],
345
+ },
346
+ ],
347
+ };
348
+ const result = getProcessedSessionIds(state);
349
+ expect(result).toEqual(new Set(['s1', 's2', 's3']));
350
+ });
351
+ it('deduplicates IDs that appear in multiple runs', async () => {
352
+ const { getProcessedSessionIds } = await import('./memoryService.js');
353
+ const state = {
354
+ runs: [
355
+ {
356
+ runAt: '2025-01-01T00:00:00Z',
357
+ sessionIds: ['s1', 's2'],
358
+ skillsCreated: [],
359
+ },
360
+ {
361
+ runAt: '2025-01-02T00:00:00Z',
362
+ sessionIds: ['s2', 's3'],
363
+ skillsCreated: [],
364
+ },
365
+ ],
366
+ };
367
+ const result = getProcessedSessionIds(state);
368
+ expect(result.size).toBe(3);
369
+ expect(result).toEqual(new Set(['s1', 's2', 's3']));
370
+ });
371
+ });
372
+ describe('buildSessionIndex', () => {
373
+ let chatsDir;
374
+ beforeEach(async () => {
375
+ chatsDir = path.join(tmpDir, 'chats');
376
+ await fs.mkdir(chatsDir, { recursive: true });
377
+ });
378
+ it('returns empty index and no new IDs when chats dir is empty', async () => {
379
+ const { buildSessionIndex } = await import('./memoryService.js');
380
+ const result = await buildSessionIndex(chatsDir, { runs: [] });
381
+ expect(result.sessionIndex).toBe('');
382
+ expect(result.newSessionIds).toEqual([]);
383
+ });
384
+ it('returns empty index when chats dir does not exist', async () => {
385
+ const { buildSessionIndex } = await import('./memoryService.js');
386
+ const nonexistentDir = path.join(tmpDir, 'no-such-dir');
387
+ const result = await buildSessionIndex(nonexistentDir, { runs: [] });
388
+ expect(result.sessionIndex).toBe('');
389
+ expect(result.newSessionIds).toEqual([]);
390
+ });
391
+ it('marks sessions as [NEW] when not in any previous run', async () => {
392
+ const { buildSessionIndex } = await import('./memoryService.js');
393
+ const conversation = createConversation({
394
+ sessionId: 'brand-new',
395
+ summary: 'A brand new session',
396
+ messageCount: 20,
397
+ });
398
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-01T00-00-brandnew.json`), JSON.stringify(conversation));
399
+ const result = await buildSessionIndex(chatsDir, { runs: [] });
400
+ expect(result.sessionIndex).toContain('[NEW]');
401
+ expect(result.sessionIndex).not.toContain('[old]');
402
+ });
403
+ it('marks sessions as [old] when already in a previous run', async () => {
404
+ const { buildSessionIndex } = await import('./memoryService.js');
405
+ const conversation = createConversation({
406
+ sessionId: 'old-session',
407
+ summary: 'An old session',
408
+ messageCount: 20,
409
+ });
410
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-01T00-00-oldsess1.json`), JSON.stringify(conversation));
411
+ const state = {
412
+ runs: [
413
+ {
414
+ runAt: '2025-01-01T00:00:00Z',
415
+ sessionIds: ['old-session'],
416
+ skillsCreated: [],
417
+ },
418
+ ],
419
+ };
420
+ const result = await buildSessionIndex(chatsDir, state);
421
+ expect(result.sessionIndex).toContain('[old]');
422
+ expect(result.sessionIndex).not.toContain('[NEW]');
423
+ });
424
+ it('includes file path and summary in each line', async () => {
425
+ const { buildSessionIndex } = await import('./memoryService.js');
426
+ const conversation = createConversation({
427
+ sessionId: 'detailed-session',
428
+ summary: 'Debugging the login flow',
429
+ messageCount: 20,
430
+ });
431
+ const fileName = `${SESSION_FILE_PREFIX}2025-01-01T00-00-detail01.json`;
432
+ await fs.writeFile(path.join(chatsDir, fileName), JSON.stringify(conversation));
433
+ const result = await buildSessionIndex(chatsDir, { runs: [] });
434
+ expect(result.sessionIndex).toContain('Debugging the login flow');
435
+ expect(result.sessionIndex).toContain(path.join(chatsDir, fileName));
436
+ });
437
+ it('filters out subagent sessions', async () => {
438
+ const { buildSessionIndex } = await import('./memoryService.js');
439
+ const conversation = createConversation({
440
+ sessionId: 'sub-session',
441
+ kind: 'subagent',
442
+ messageCount: 20,
443
+ });
444
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-01T00-00-sub00001.json`), JSON.stringify(conversation));
445
+ const result = await buildSessionIndex(chatsDir, { runs: [] });
446
+ expect(result.sessionIndex).toBe('');
447
+ expect(result.newSessionIds).toEqual([]);
448
+ });
449
+ it('filters out sessions with fewer than 10 user messages', async () => {
450
+ const { buildSessionIndex } = await import('./memoryService.js');
451
+ // 2 messages total: 1 user (index 0) + 1 gemini (index 1)
452
+ const conversation = createConversation({
453
+ sessionId: 'short-session',
454
+ messageCount: 2,
455
+ });
456
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-01T00-00-short001.json`), JSON.stringify(conversation));
457
+ const result = await buildSessionIndex(chatsDir, { runs: [] });
458
+ expect(result.sessionIndex).toBe('');
459
+ expect(result.newSessionIds).toEqual([]);
460
+ });
461
+ it('caps at MAX_SESSION_INDEX_SIZE (50)', async () => {
462
+ const { buildSessionIndex } = await import('./memoryService.js');
463
+ // Create 3 eligible sessions, verify all 3 appear (well under cap)
464
+ for (let i = 0; i < 3; i++) {
465
+ const conversation = createConversation({
466
+ sessionId: `capped-session-${i}`,
467
+ summary: `Summary ${i}`,
468
+ messageCount: 20,
469
+ });
470
+ const paddedIndex = String(i).padStart(4, '0');
471
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-0${i + 1}T00-00-cap${paddedIndex}.json`), JSON.stringify(conversation));
472
+ }
473
+ const result = await buildSessionIndex(chatsDir, { runs: [] });
474
+ const lines = result.sessionIndex.split('\n').filter((l) => l.length > 0);
475
+ expect(lines).toHaveLength(3);
476
+ expect(result.newSessionIds).toHaveLength(3);
477
+ });
478
+ it('returns newSessionIds only for unprocessed sessions', async () => {
479
+ const { buildSessionIndex } = await import('./memoryService.js');
480
+ // Write two sessions: one already processed, one new
481
+ const oldConv = createConversation({
482
+ sessionId: 'processed-one',
483
+ summary: 'Old',
484
+ messageCount: 20,
485
+ });
486
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-01T00-00-proc0001.json`), JSON.stringify(oldConv));
487
+ const newConv = createConversation({
488
+ sessionId: 'fresh-one',
489
+ summary: 'New',
490
+ messageCount: 20,
491
+ });
492
+ await fs.writeFile(path.join(chatsDir, `${SESSION_FILE_PREFIX}2025-01-02T00-00-fres0001.json`), JSON.stringify(newConv));
493
+ const state = {
494
+ runs: [
495
+ {
496
+ runAt: '2025-01-01T00:00:00Z',
497
+ sessionIds: ['processed-one'],
498
+ skillsCreated: [],
499
+ },
500
+ ],
501
+ };
502
+ const result = await buildSessionIndex(chatsDir, state);
503
+ expect(result.newSessionIds).toEqual(['fresh-one']);
504
+ expect(result.newSessionIds).not.toContain('processed-one');
505
+ // Both sessions should still appear in the index
506
+ expect(result.sessionIndex).toContain('[NEW]');
507
+ expect(result.sessionIndex).toContain('[old]');
508
+ });
509
+ });
510
+ describe('ExtractionState runs tracking', () => {
511
+ it('readExtractionState parses runs array with skillsCreated', async () => {
512
+ const { readExtractionState } = await import('./memoryService.js');
513
+ const statePath = path.join(tmpDir, 'state-with-skills.json');
514
+ const state = {
515
+ runs: [
516
+ {
517
+ runAt: '2025-06-01T00:00:00Z',
518
+ sessionIds: ['s1'],
519
+ skillsCreated: ['debug-helper', 'test-gen'],
520
+ },
521
+ ],
522
+ };
523
+ await fs.writeFile(statePath, JSON.stringify(state));
524
+ const result = await readExtractionState(statePath);
525
+ expect(result.runs).toHaveLength(1);
526
+ expect(result.runs[0].skillsCreated).toEqual([
527
+ 'debug-helper',
528
+ 'test-gen',
529
+ ]);
530
+ expect(result.runs[0].sessionIds).toEqual(['s1']);
531
+ expect(result.runs[0].runAt).toBe('2025-06-01T00:00:00Z');
532
+ });
533
+ it('writeExtractionState + readExtractionState roundtrips runs correctly', async () => {
534
+ const { writeExtractionState, readExtractionState } = await import('./memoryService.js');
535
+ const statePath = path.join(tmpDir, 'roundtrip-state.json');
536
+ const runs = [
537
+ {
538
+ runAt: '2025-01-01T00:00:00Z',
539
+ sessionIds: ['a', 'b'],
540
+ skillsCreated: ['skill-x'],
541
+ },
542
+ {
543
+ runAt: '2025-01-02T00:00:00Z',
544
+ sessionIds: ['c'],
545
+ skillsCreated: [],
546
+ },
547
+ ];
548
+ const state = { runs };
549
+ await writeExtractionState(statePath, state);
550
+ const result = await readExtractionState(statePath);
551
+ expect(result).toEqual(state);
552
+ });
553
+ it('readExtractionState handles old format without runs', async () => {
554
+ const { readExtractionState } = await import('./memoryService.js');
555
+ const statePath = path.join(tmpDir, 'old-format-state.json');
556
+ // Old format: an object without a runs array
557
+ await fs.writeFile(statePath, JSON.stringify({ lastProcessed: '2025-01-01' }));
558
+ const result = await readExtractionState(statePath);
559
+ expect(result).toEqual({ runs: [] });
560
+ });
561
+ });
562
+ });
563
+ //# sourceMappingURL=memoryService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryService.test.js","sourceRoot":"","sources":["../../../src/services/memoryService.test.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ export interface SandboxModeConfig {
38
38
  network?: boolean;
39
39
  approvedTools?: string[];
40
40
  allowOverrides?: boolean;
41
+ yolo?: boolean;
41
42
  }
42
43
  /**
43
44
  * Global configuration options used to initialize a SandboxManager.
@@ -113,6 +114,14 @@ export interface SandboxManager {
113
114
  * Parses the output of a command to detect sandbox denials.
114
115
  */
115
116
  parseDenials(result: ShellExecutionResult): ParsedSandboxDenial | undefined;
117
+ /**
118
+ * Returns the primary workspace directory for this sandbox.
119
+ */
120
+ getWorkspace(): string;
121
+ /**
122
+ * Returns the global sandbox options for this sandbox.
123
+ */
124
+ getOptions(): GlobalSandboxOptions | undefined;
116
125
  }
117
126
  /**
118
127
  * Files that represent the governance or "constitution" of the repository
@@ -155,6 +164,8 @@ export declare function findSecretFiles(baseDir: string, maxDepth?: number): Pro
155
164
  * through while applying environment sanitization.
156
165
  */
157
166
  export declare class NoopSandboxManager implements SandboxManager {
167
+ private options?;
168
+ constructor(options?: GlobalSandboxOptions | undefined);
158
169
  /**
159
170
  * Prepares a command by sanitizing the environment and passing through
160
171
  * the original program and arguments.
@@ -163,15 +174,21 @@ export declare class NoopSandboxManager implements SandboxManager {
163
174
  isKnownSafeCommand(args: string[]): boolean;
164
175
  isDangerousCommand(args: string[]): boolean;
165
176
  parseDenials(): undefined;
177
+ getWorkspace(): string;
178
+ getOptions(): GlobalSandboxOptions | undefined;
166
179
  }
167
180
  /**
168
181
  * A SandboxManager implementation that just runs locally (no sandboxing yet).
169
182
  */
170
183
  export declare class LocalSandboxManager implements SandboxManager {
184
+ private options?;
185
+ constructor(options?: GlobalSandboxOptions | undefined);
171
186
  prepareCommand(_req: SandboxRequest): Promise<SandboxedCommand>;
172
187
  isKnownSafeCommand(_args: string[]): boolean;
173
188
  isDangerousCommand(_args: string[]): boolean;
174
189
  parseDenials(): undefined;
190
+ getWorkspace(): string;
191
+ getOptions(): GlobalSandboxOptions | undefined;
175
192
  }
176
193
  /**
177
194
  * Resolves sanitized allowed and forbidden paths for a request.