@google/gemini-cli-core 0.35.0-preview.2 → 0.36.0-nightly.20260321.fc03891a1

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 (366) hide show
  1. package/README.md +0 -1
  2. package/dist/docs/CONTRIBUTING.md +0 -15
  3. package/dist/docs/admin/enterprise-controls.md +61 -0
  4. package/dist/docs/changelogs/index.md +11 -0
  5. package/dist/docs/changelogs/latest.md +459 -209
  6. package/dist/docs/changelogs/preview.md +355 -454
  7. package/dist/docs/cli/checkpointing.md +3 -1
  8. package/dist/docs/cli/cli-reference.md +1 -0
  9. package/dist/docs/cli/custom-commands.md +7 -5
  10. package/dist/docs/cli/enterprise.md +15 -9
  11. package/dist/docs/cli/git-worktrees.md +107 -0
  12. package/dist/docs/cli/model-steering.md +4 -3
  13. package/dist/docs/cli/model.md +3 -1
  14. package/dist/docs/cli/notifications.md +4 -3
  15. package/dist/docs/cli/plan-mode.md +28 -8
  16. package/dist/docs/cli/sandbox.md +24 -4
  17. package/dist/docs/cli/session-management.md +6 -0
  18. package/dist/docs/cli/settings.md +14 -1
  19. package/dist/docs/cli/skills.md +4 -2
  20. package/dist/docs/cli/system-prompt.md +3 -1
  21. package/dist/docs/cli/telemetry.md +6 -3
  22. package/dist/docs/cli/themes.md +12 -8
  23. package/dist/docs/cli/tutorials/file-management.md +8 -6
  24. package/dist/docs/cli/tutorials/mcp-setup.md +5 -3
  25. package/dist/docs/cli/tutorials/memory-management.md +6 -6
  26. package/dist/docs/cli/tutorials/plan-mode-steering.md +4 -3
  27. package/dist/docs/cli/tutorials/shell-commands.md +3 -3
  28. package/dist/docs/core/remote-agents.md +8 -3
  29. package/dist/docs/core/subagents.md +21 -13
  30. package/dist/docs/extensions/reference.md +8 -3
  31. package/dist/docs/get-started/authentication.md +60 -50
  32. package/dist/docs/get-started/examples.md +3 -1
  33. package/dist/docs/get-started/gemini-3.md +11 -5
  34. package/dist/docs/hooks/index.md +3 -1
  35. package/dist/docs/hooks/writing-hooks.md +2 -2
  36. package/dist/docs/ide-integration/ide-companion-spec.md +5 -3
  37. package/dist/docs/ide-integration/index.md +8 -4
  38. package/dist/docs/issue-and-pr-automation.md +3 -1
  39. package/dist/docs/local-development.md +3 -1
  40. package/dist/docs/reference/commands.md +2 -2
  41. package/dist/docs/reference/configuration.md +410 -16
  42. package/dist/docs/reference/policy-engine.md +47 -19
  43. package/dist/docs/reference/tools.md +3 -1
  44. package/dist/docs/release-confidence.md +7 -3
  45. package/dist/docs/releases.md +11 -7
  46. package/dist/docs/resources/faq.md +13 -0
  47. package/dist/docs/resources/tos-privacy.md +4 -2
  48. package/dist/docs/resources/troubleshooting.md +3 -1
  49. package/dist/docs/sidebar.json +5 -0
  50. package/dist/docs/tools/mcp-server.md +17 -9
  51. package/dist/docs/tools/planning.md +3 -1
  52. package/dist/docs/tools/shell.md +4 -4
  53. package/dist/docs/tools/todos.md +2 -1
  54. package/dist/{google-gemini-cli-core-0.35.0-preview.1.tgz → google-gemini-cli-core-0.36.0-nightly.20260317.2f90b4653.tgz} +0 -0
  55. package/dist/src/agent/agent-session.d.ts +37 -0
  56. package/dist/src/agent/agent-session.js +168 -0
  57. package/dist/src/agent/agent-session.js.map +1 -0
  58. package/dist/src/agent/agent-session.test.d.ts +6 -0
  59. package/dist/src/agent/agent-session.test.js +217 -0
  60. package/dist/src/agent/agent-session.test.js.map +1 -0
  61. package/dist/src/agent/content-utils.d.ts +33 -0
  62. package/dist/src/agent/content-utils.js +135 -0
  63. package/dist/src/agent/content-utils.js.map +1 -0
  64. package/dist/src/agent/content-utils.test.d.ts +6 -0
  65. package/dist/src/agent/content-utils.test.js +223 -0
  66. package/dist/src/agent/content-utils.test.js.map +1 -0
  67. package/dist/src/agent/mock.d.ts +9 -12
  68. package/dist/src/agent/mock.js +88 -129
  69. package/dist/src/agent/mock.js.map +1 -1
  70. package/dist/src/agent/mock.test.js +114 -144
  71. package/dist/src/agent/mock.test.js.map +1 -1
  72. package/dist/src/agent/types.d.ts +21 -21
  73. package/dist/src/agents/a2a-client-manager.d.ts +2 -11
  74. package/dist/src/agents/a2a-client-manager.js +3 -19
  75. package/dist/src/agents/a2a-client-manager.js.map +1 -1
  76. package/dist/src/agents/a2a-client-manager.test.js +6 -10
  77. package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
  78. package/dist/src/agents/agent-scheduler.d.ts +6 -0
  79. package/dist/src/agents/agent-scheduler.js +3 -2
  80. package/dist/src/agents/agent-scheduler.js.map +1 -1
  81. package/dist/src/agents/agent-scheduler.test.js +6 -0
  82. package/dist/src/agents/agent-scheduler.test.js.map +1 -1
  83. package/dist/src/agents/browser/browserAgentDefinition.js +10 -1
  84. package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
  85. package/dist/src/agents/browser/browserAgentFactory.js +62 -1
  86. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
  87. package/dist/src/agents/browser/browserAgentFactory.test.js +73 -0
  88. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
  89. package/dist/src/agents/browser/browserAgentInvocation.js +2 -97
  90. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  91. package/dist/src/agents/browser/browserAgentInvocation.test.js +30 -0
  92. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
  93. package/dist/src/agents/browser/browserManager.js +11 -0
  94. package/dist/src/agents/browser/browserManager.js.map +1 -1
  95. package/dist/src/agents/browser/browserManager.test.js +37 -0
  96. package/dist/src/agents/browser/browserManager.test.js.map +1 -1
  97. package/dist/src/agents/browser/mcpToolWrapper.d.ts +4 -2
  98. package/dist/src/agents/browser/mcpToolWrapper.js +30 -8
  99. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
  100. package/dist/src/agents/browser/mcpToolWrapper.test.js +30 -0
  101. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
  102. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +3 -3
  103. package/dist/src/agents/codebase-investigator.js +3 -3
  104. package/dist/src/agents/codebase-investigator.js.map +1 -1
  105. package/dist/src/agents/local-executor.d.ts +3 -1
  106. package/dist/src/agents/local-executor.js +138 -39
  107. package/dist/src/agents/local-executor.js.map +1 -1
  108. package/dist/src/agents/local-executor.test.js +305 -12
  109. package/dist/src/agents/local-executor.test.js.map +1 -1
  110. package/dist/src/agents/local-invocation.js +43 -24
  111. package/dist/src/agents/local-invocation.js.map +1 -1
  112. package/dist/src/agents/local-invocation.test.js +89 -14
  113. package/dist/src/agents/local-invocation.test.js.map +1 -1
  114. package/dist/src/agents/memory-manager-agent.d.ts +25 -0
  115. package/dist/src/agents/memory-manager-agent.js +137 -0
  116. package/dist/src/agents/memory-manager-agent.js.map +1 -0
  117. package/dist/src/agents/memory-manager-agent.test.d.ts +6 -0
  118. package/dist/src/agents/memory-manager-agent.test.js +117 -0
  119. package/dist/src/agents/memory-manager-agent.test.js.map +1 -0
  120. package/dist/src/agents/registry.js +21 -3
  121. package/dist/src/agents/registry.js.map +1 -1
  122. package/dist/src/agents/registry.test.js +23 -24
  123. package/dist/src/agents/registry.test.js.map +1 -1
  124. package/dist/src/agents/remote-invocation.d.ts +3 -1
  125. package/dist/src/agents/remote-invocation.js +10 -5
  126. package/dist/src/agents/remote-invocation.js.map +1 -1
  127. package/dist/src/agents/remote-invocation.test.js +64 -41
  128. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  129. package/dist/src/agents/subagent-tool-wrapper.js +1 -1
  130. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  131. package/dist/src/agents/types.d.ts +12 -0
  132. package/dist/src/agents/types.js +14 -0
  133. package/dist/src/agents/types.js.map +1 -1
  134. package/dist/src/availability/policyHelpers.js +41 -1
  135. package/dist/src/availability/policyHelpers.js.map +1 -1
  136. package/dist/src/availability/policyHelpers.test.js +47 -0
  137. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  138. package/dist/src/code_assist/admin/admin_controls.js +11 -0
  139. package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
  140. package/dist/src/code_assist/admin/admin_controls.test.js +68 -0
  141. package/dist/src/code_assist/admin/admin_controls.test.js.map +1 -1
  142. package/dist/src/code_assist/admin/mcpUtils.d.ts +16 -1
  143. package/dist/src/code_assist/admin/mcpUtils.js +43 -0
  144. package/dist/src/code_assist/admin/mcpUtils.js.map +1 -1
  145. package/dist/src/code_assist/admin/mcpUtils.test.js +130 -1
  146. package/dist/src/code_assist/admin/mcpUtils.test.js.map +1 -1
  147. package/dist/src/code_assist/types.d.ts +458 -0
  148. package/dist/src/code_assist/types.js +26 -0
  149. package/dist/src/code_assist/types.js.map +1 -1
  150. package/dist/src/config/agent-loop-context.d.ts +6 -0
  151. package/dist/src/config/config.d.ts +41 -10
  152. package/dist/src/config/config.js +96 -19
  153. package/dist/src/config/config.js.map +1 -1
  154. package/dist/src/config/config.test.js +29 -1
  155. package/dist/src/config/config.test.js.map +1 -1
  156. package/dist/src/config/defaultModelConfigs.js +265 -9
  157. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  158. package/dist/src/config/models.d.ts +13 -2
  159. package/dist/src/config/models.js +31 -3
  160. package/dist/src/config/models.js.map +1 -1
  161. package/dist/src/config/models.test.js +52 -7
  162. package/dist/src/config/models.test.js.map +1 -1
  163. package/dist/src/config/path-validation.test.d.ts +6 -0
  164. package/dist/src/config/path-validation.test.js +59 -0
  165. package/dist/src/config/path-validation.test.js.map +1 -0
  166. package/dist/src/core/client.d.ts +1 -0
  167. package/dist/src/core/client.js +6 -1
  168. package/dist/src/core/client.js.map +1 -1
  169. package/dist/src/core/client.test.js +9 -1
  170. package/dist/src/core/client.test.js.map +1 -1
  171. package/dist/src/core/contentGenerator.js +36 -6
  172. package/dist/src/core/contentGenerator.js.map +1 -1
  173. package/dist/src/core/contentGenerator.test.js +97 -3
  174. package/dist/src/core/contentGenerator.test.js.map +1 -1
  175. package/dist/src/core/geminiChat.js +2 -2
  176. package/dist/src/core/geminiChat.js.map +1 -1
  177. package/dist/src/core/prompts.test.js +10 -0
  178. package/dist/src/core/prompts.test.js.map +1 -1
  179. package/dist/src/generated/git-commit.d.ts +2 -2
  180. package/dist/src/generated/git-commit.js +2 -2
  181. package/dist/src/generated/git-commit.js.map +1 -1
  182. package/dist/src/ide/ide-connection-utils.js +2 -7
  183. package/dist/src/ide/ide-connection-utils.js.map +1 -1
  184. package/dist/src/ide/ide-connection-utils.test.js +7 -0
  185. package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
  186. package/dist/src/index.d.ts +4 -0
  187. package/dist/src/index.js +4 -0
  188. package/dist/src/index.js.map +1 -1
  189. package/dist/src/policy/config.js +2 -0
  190. package/dist/src/policy/config.js.map +1 -1
  191. package/dist/src/policy/config.test.js +15 -0
  192. package/dist/src/policy/config.test.js.map +1 -1
  193. package/dist/src/policy/memory-manager-policy.test.d.ts +6 -0
  194. package/dist/src/policy/memory-manager-policy.test.js +80 -0
  195. package/dist/src/policy/memory-manager-policy.test.js.map +1 -0
  196. package/dist/src/policy/policies/memory-manager.toml +10 -0
  197. package/dist/src/policy/policies/plan.toml +14 -0
  198. package/dist/src/policy/policies/yolo.toml +1 -0
  199. package/dist/src/policy/policy-engine.js +33 -6
  200. package/dist/src/policy/policy-engine.js.map +1 -1
  201. package/dist/src/policy/policy-engine.test.js +85 -3
  202. package/dist/src/policy/policy-engine.test.js.map +1 -1
  203. package/dist/src/policy/policy-updater.test.js +44 -0
  204. package/dist/src/policy/policy-updater.test.js.map +1 -1
  205. package/dist/src/policy/toml-loader.js +2 -0
  206. package/dist/src/policy/toml-loader.js.map +1 -1
  207. package/dist/src/policy/types.d.ts +11 -0
  208. package/dist/src/policy/types.js +5 -0
  209. package/dist/src/policy/types.js.map +1 -1
  210. package/dist/src/prompts/promptProvider.js +5 -3
  211. package/dist/src/prompts/promptProvider.js.map +1 -1
  212. package/dist/src/prompts/promptProvider.test.js +1 -0
  213. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  214. package/dist/src/prompts/snippets-memory-manager.test.d.ts +6 -0
  215. package/dist/src/prompts/snippets-memory-manager.test.js +31 -0
  216. package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -0
  217. package/dist/src/prompts/snippets.d.ts +2 -0
  218. package/dist/src/prompts/snippets.js +7 -3
  219. package/dist/src/prompts/snippets.js.map +1 -1
  220. package/dist/src/prompts/snippets.legacy.d.ts +5 -0
  221. package/dist/src/prompts/snippets.legacy.js +30 -2
  222. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  223. package/dist/src/routing/strategies/classifierStrategy.js +1 -1
  224. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  225. package/dist/src/routing/strategies/defaultStrategy.js +1 -1
  226. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -1
  227. package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
  228. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  229. package/dist/src/routing/strategies/numericalClassifierStrategy.js +1 -1
  230. package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
  231. package/dist/src/routing/strategies/overrideStrategy.js +1 -1
  232. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  233. package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +28 -0
  234. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.d.ts +1 -0
  235. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +160 -0
  236. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +1 -0
  237. package/dist/src/sandbox/macos/MacOsSandboxManager.js +33 -0
  238. package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -0
  239. package/dist/src/sandbox/macos/MacOsSandboxManager.test.d.ts +1 -0
  240. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +87 -0
  241. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -0
  242. package/dist/src/sandbox/macos/baseProfile.d.ts +20 -0
  243. package/dist/src/sandbox/macos/baseProfile.js +93 -0
  244. package/dist/src/sandbox/macos/baseProfile.js.map +1 -0
  245. package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +25 -0
  246. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +58 -0
  247. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -0
  248. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.d.ts +1 -0
  249. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +80 -0
  250. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -0
  251. package/dist/src/scheduler/scheduler.js +2 -0
  252. package/dist/src/scheduler/scheduler.js.map +1 -1
  253. package/dist/src/services/contextManager.js +2 -3
  254. package/dist/src/services/contextManager.js.map +1 -1
  255. package/dist/src/services/contextManager.test.js +1 -1
  256. package/dist/src/services/contextManager.test.js.map +1 -1
  257. package/dist/src/services/modelConfigService.d.ts +36 -1
  258. package/dist/src/services/modelConfigService.js +66 -0
  259. package/dist/src/services/modelConfigService.js.map +1 -1
  260. package/dist/src/services/sandboxManager.d.ts +3 -4
  261. package/dist/src/services/sandboxManager.js +1 -14
  262. package/dist/src/services/sandboxManager.js.map +1 -1
  263. package/dist/src/services/sandboxManager.test.js +13 -16
  264. package/dist/src/services/sandboxManager.test.js.map +1 -1
  265. package/dist/src/services/sandboxManagerFactory.d.ts +11 -0
  266. package/dist/src/services/sandboxManagerFactory.js +31 -0
  267. package/dist/src/services/sandboxManagerFactory.js.map +1 -0
  268. package/dist/src/services/sandboxedFileSystemService.d.ts +17 -0
  269. package/dist/src/services/sandboxedFileSystemService.js +95 -0
  270. package/dist/src/services/sandboxedFileSystemService.js.map +1 -0
  271. package/dist/src/services/sandboxedFileSystemService.test.d.ts +6 -0
  272. package/dist/src/services/sandboxedFileSystemService.test.js +87 -0
  273. package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -0
  274. package/dist/src/services/scripts/GeminiSandbox.cs +370 -0
  275. package/dist/src/services/shellExecutionService.d.ts +2 -0
  276. package/dist/src/services/shellExecutionService.js +79 -75
  277. package/dist/src/services/shellExecutionService.js.map +1 -1
  278. package/dist/src/services/trackerTypes.d.ts +1 -0
  279. package/dist/src/services/trackerTypes.js +1 -0
  280. package/dist/src/services/trackerTypes.js.map +1 -1
  281. package/dist/src/services/windowsSandboxManager.d.ts +27 -0
  282. package/dist/src/services/windowsSandboxManager.js +148 -0
  283. package/dist/src/services/windowsSandboxManager.js.map +1 -0
  284. package/dist/src/services/windowsSandboxManager.test.d.ts +6 -0
  285. package/dist/src/services/windowsSandboxManager.test.js +59 -0
  286. package/dist/src/services/windowsSandboxManager.test.js.map +1 -0
  287. package/dist/src/services/worktreeService.d.ts +33 -0
  288. package/dist/src/services/worktreeService.js +174 -0
  289. package/dist/src/services/worktreeService.js.map +1 -0
  290. package/dist/src/services/worktreeService.test.d.ts +6 -0
  291. package/dist/src/services/worktreeService.test.js +200 -0
  292. package/dist/src/services/worktreeService.test.js.map +1 -0
  293. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +4 -0
  294. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  295. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +1 -0
  296. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +2 -0
  297. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  298. package/dist/src/telemetry/loggers.test.js +62 -40
  299. package/dist/src/telemetry/loggers.test.js.map +1 -1
  300. package/dist/src/telemetry/types.d.ts +1 -0
  301. package/dist/src/telemetry/types.js +3 -0
  302. package/dist/src/telemetry/types.js.map +1 -1
  303. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +8 -1
  304. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  305. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +8 -1
  306. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  307. package/dist/src/tools/exit-plan-mode.d.ts +6 -1
  308. package/dist/src/tools/exit-plan-mode.js +17 -6
  309. package/dist/src/tools/exit-plan-mode.js.map +1 -1
  310. package/dist/src/tools/exit-plan-mode.test.js +22 -1
  311. package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
  312. package/dist/src/tools/mcp-client-manager.d.ts +22 -3
  313. package/dist/src/tools/mcp-client-manager.js +84 -32
  314. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  315. package/dist/src/tools/mcp-client-manager.test.js +76 -56
  316. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  317. package/dist/src/tools/mcp-client.d.ts +15 -6
  318. package/dist/src/tools/mcp-client.js +85 -71
  319. package/dist/src/tools/mcp-client.js.map +1 -1
  320. package/dist/src/tools/mcp-client.test.js +195 -88
  321. package/dist/src/tools/mcp-client.test.js.map +1 -1
  322. package/dist/src/tools/tool-registry.d.ts +2 -1
  323. package/dist/src/tools/tool-registry.js +12 -1
  324. package/dist/src/tools/tool-registry.js.map +1 -1
  325. package/dist/src/tools/tool-registry.test.js +15 -0
  326. package/dist/src/tools/tool-registry.test.js.map +1 -1
  327. package/dist/src/tools/tools.d.ts +1 -1
  328. package/dist/src/tools/tools.js.map +1 -1
  329. package/dist/src/tools/trackerTools.js +6 -1
  330. package/dist/src/tools/trackerTools.js.map +1 -1
  331. package/dist/src/tools/trackerTools.test.js +9 -1
  332. package/dist/src/tools/trackerTools.test.js.map +1 -1
  333. package/dist/src/tools/write-todos.js +1 -0
  334. package/dist/src/tools/write-todos.js.map +1 -1
  335. package/dist/src/tools/write-todos.test.js +4 -1
  336. package/dist/src/tools/write-todos.test.js.map +1 -1
  337. package/dist/src/utils/agent-sanitization-utils.d.ts +23 -0
  338. package/dist/src/utils/agent-sanitization-utils.js +123 -0
  339. package/dist/src/utils/agent-sanitization-utils.js.map +1 -0
  340. package/dist/src/utils/agent-sanitization-utils.test.d.ts +6 -0
  341. package/dist/src/utils/agent-sanitization-utils.test.js +83 -0
  342. package/dist/src/utils/agent-sanitization-utils.test.js.map +1 -0
  343. package/dist/src/utils/browserConsent.d.ts +17 -0
  344. package/dist/src/utils/browserConsent.js +78 -0
  345. package/dist/src/utils/browserConsent.js.map +1 -0
  346. package/dist/src/utils/browserConsent.test.d.ts +6 -0
  347. package/dist/src/utils/browserConsent.test.js +93 -0
  348. package/dist/src/utils/browserConsent.test.js.map +1 -0
  349. package/dist/src/utils/compatibility.d.ts +16 -0
  350. package/dist/src/utils/compatibility.js +58 -9
  351. package/dist/src/utils/compatibility.js.map +1 -1
  352. package/dist/src/utils/compatibility.test.js +127 -29
  353. package/dist/src/utils/compatibility.test.js.map +1 -1
  354. package/dist/src/utils/memoryDiscovery.d.ts +2 -2
  355. package/dist/src/utils/memoryDiscovery.js +5 -10
  356. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  357. package/dist/src/utils/memoryDiscovery.test.js +37 -37
  358. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  359. package/dist/src/utils/memoryImportProcessor.js +5 -5
  360. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  361. package/dist/src/utils/surface.js +4 -3
  362. package/dist/src/utils/surface.js.map +1 -1
  363. package/dist/src/utils/toolCallContext.d.ts +2 -0
  364. package/dist/src/utils/toolCallContext.js.map +1 -1
  365. package/dist/tsconfig.tsbuildinfo +1 -1
  366. package/package.json +2 -1
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface WorktreeInfo {
7
+ name: string;
8
+ path: string;
9
+ baseSha: string;
10
+ }
11
+ /**
12
+ * Service for managing Git worktrees within Gemini CLI.
13
+ * Handles creation, cleanup, and environment setup for isolated sessions.
14
+ */
15
+ export declare class WorktreeService {
16
+ private readonly projectRoot;
17
+ constructor(projectRoot: string);
18
+ /**
19
+ * Creates a new worktree and prepares the environment.
20
+ */
21
+ setup(name?: string): Promise<WorktreeInfo>;
22
+ /**
23
+ * Checks if a worktree has changes and cleans it up if it's unmodified.
24
+ */
25
+ maybeCleanup(info: WorktreeInfo): Promise<boolean>;
26
+ }
27
+ export declare function createWorktreeService(cwd: string): Promise<WorktreeService>;
28
+ export declare function getProjectRootForWorktree(cwd: string): Promise<string>;
29
+ export declare function getWorktreePath(projectRoot: string, name: string): string;
30
+ export declare function createWorktree(projectRoot: string, name: string): Promise<string>;
31
+ export declare function isGeminiWorktree(dirPath: string, projectRoot: string): boolean;
32
+ export declare function hasWorktreeChanges(dirPath: string, baseSha?: string): Promise<boolean>;
33
+ export declare function cleanupWorktree(dirPath: string, projectRoot: string): Promise<void>;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as path from 'node:path';
7
+ import * as fs from 'node:fs/promises';
8
+ import { realpathSync } from 'node:fs';
9
+ import { execa } from 'execa';
10
+ import { debugLogger } from '../utils/debugLogger.js';
11
+ /**
12
+ * Service for managing Git worktrees within Gemini CLI.
13
+ * Handles creation, cleanup, and environment setup for isolated sessions.
14
+ */
15
+ export class WorktreeService {
16
+ projectRoot;
17
+ constructor(projectRoot) {
18
+ this.projectRoot = projectRoot;
19
+ }
20
+ /**
21
+ * Creates a new worktree and prepares the environment.
22
+ */
23
+ async setup(name) {
24
+ let worktreeName = name?.trim();
25
+ if (!worktreeName) {
26
+ const now = new Date();
27
+ const timestamp = now
28
+ .toISOString()
29
+ .replace(/[:.]/g, '-')
30
+ .replace('T', '-')
31
+ .replace('Z', '');
32
+ const randomSuffix = Math.random().toString(36).substring(2, 6);
33
+ worktreeName = `${timestamp}-${randomSuffix}`;
34
+ }
35
+ // Capture the base commit before creating the worktree
36
+ const { stdout: baseSha } = await execa('git', ['rev-parse', 'HEAD'], {
37
+ cwd: this.projectRoot,
38
+ });
39
+ const worktreePath = await createWorktree(this.projectRoot, worktreeName);
40
+ return {
41
+ name: worktreeName,
42
+ path: worktreePath,
43
+ baseSha: baseSha.trim(),
44
+ };
45
+ }
46
+ /**
47
+ * Checks if a worktree has changes and cleans it up if it's unmodified.
48
+ */
49
+ async maybeCleanup(info) {
50
+ const hasChanges = await hasWorktreeChanges(info.path, info.baseSha);
51
+ if (!hasChanges) {
52
+ try {
53
+ await cleanupWorktree(info.path, this.projectRoot);
54
+ debugLogger.log(`Automatically cleaned up unmodified worktree: ${info.path}`);
55
+ return true;
56
+ }
57
+ catch (error) {
58
+ debugLogger.error(`Failed to clean up worktree ${info.path}: ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ }
61
+ else {
62
+ debugLogger.debug(`Preserving worktree ${info.path} because it has changes.`);
63
+ }
64
+ return false;
65
+ }
66
+ }
67
+ export async function createWorktreeService(cwd) {
68
+ const projectRoot = await getProjectRootForWorktree(cwd);
69
+ return new WorktreeService(projectRoot);
70
+ }
71
+ // Low-level worktree utilities
72
+ export async function getProjectRootForWorktree(cwd) {
73
+ try {
74
+ const { stdout } = await execa('git', ['rev-parse', '--git-common-dir'], {
75
+ cwd,
76
+ });
77
+ const gitCommonDir = stdout.trim();
78
+ const absoluteGitDir = path.isAbsolute(gitCommonDir)
79
+ ? gitCommonDir
80
+ : path.resolve(cwd, gitCommonDir);
81
+ // The project root is the parent of the .git directory/file
82
+ return path.dirname(absoluteGitDir);
83
+ }
84
+ catch (e) {
85
+ debugLogger.debug(`Failed to get project root for worktree at ${cwd}: ${e instanceof Error ? e.message : String(e)}`);
86
+ return cwd;
87
+ }
88
+ }
89
+ export function getWorktreePath(projectRoot, name) {
90
+ return path.join(projectRoot, '.gemini', 'worktrees', name);
91
+ }
92
+ export async function createWorktree(projectRoot, name) {
93
+ const worktreePath = getWorktreePath(projectRoot, name);
94
+ const branchName = `worktree-${name}`;
95
+ await execa('git', ['worktree', 'add', worktreePath, '-b', branchName], {
96
+ cwd: projectRoot,
97
+ });
98
+ return worktreePath;
99
+ }
100
+ export function isGeminiWorktree(dirPath, projectRoot) {
101
+ try {
102
+ const realDirPath = realpathSync(dirPath);
103
+ const realProjectRoot = realpathSync(projectRoot);
104
+ const worktreesBaseDir = path.join(realProjectRoot, '.gemini', 'worktrees');
105
+ const relative = path.relative(worktreesBaseDir, realDirPath);
106
+ return !relative.startsWith('..') && !path.isAbsolute(relative);
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ export async function hasWorktreeChanges(dirPath, baseSha) {
113
+ try {
114
+ // 1. Check for uncommitted changes (index or working tree)
115
+ const { stdout: status } = await execa('git', ['status', '--porcelain'], {
116
+ cwd: dirPath,
117
+ });
118
+ if (status.trim() !== '') {
119
+ return true;
120
+ }
121
+ // 2. Check if the current commit has moved from the base
122
+ if (baseSha) {
123
+ const { stdout: currentSha } = await execa('git', ['rev-parse', 'HEAD'], {
124
+ cwd: dirPath,
125
+ });
126
+ if (currentSha.trim() !== baseSha) {
127
+ return true;
128
+ }
129
+ }
130
+ return false;
131
+ }
132
+ catch (e) {
133
+ debugLogger.debug(`Failed to check worktree changes at ${dirPath}: ${e instanceof Error ? e.message : String(e)}`);
134
+ // If any git command fails, assume the worktree is dirty to be safe.
135
+ return true;
136
+ }
137
+ }
138
+ export async function cleanupWorktree(dirPath, projectRoot) {
139
+ try {
140
+ await fs.access(dirPath);
141
+ }
142
+ catch {
143
+ return; // Worktree already gone
144
+ }
145
+ let branchName;
146
+ try {
147
+ // 1. Discover the branch name associated with this worktree path
148
+ const { stdout } = await execa('git', ['-C', dirPath, 'branch', '--show-current'], {
149
+ cwd: projectRoot,
150
+ });
151
+ branchName = stdout.trim() || undefined;
152
+ // 2. Remove the worktree
153
+ await execa('git', ['worktree', 'remove', dirPath, '--force'], {
154
+ cwd: projectRoot,
155
+ });
156
+ }
157
+ catch (e) {
158
+ debugLogger.debug(`Failed to remove worktree ${dirPath}: ${e instanceof Error ? e.message : String(e)}`);
159
+ }
160
+ finally {
161
+ // 3. Delete the branch if we found it
162
+ if (branchName) {
163
+ try {
164
+ await execa('git', ['branch', '-D', branchName], {
165
+ cwd: projectRoot,
166
+ });
167
+ }
168
+ catch (e) {
169
+ debugLogger.debug(`Failed to delete branch ${branchName}: ${e instanceof Error ? e.message : String(e)}`);
170
+ }
171
+ }
172
+ }
173
+ }
174
+ //# sourceMappingURL=worktreeService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeService.js","sourceRoot":"","sources":["../../../src/services/worktreeService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import * as path from 'node:path';
8
+ import * as fs from 'node:fs/promises';
9
+ import { getProjectRootForWorktree, createWorktree, isGeminiWorktree, hasWorktreeChanges, cleanupWorktree, getWorktreePath, WorktreeService, } from './worktreeService.js';
10
+ import { execa } from 'execa';
11
+ vi.mock('execa');
12
+ vi.mock('node:fs/promises');
13
+ vi.mock('node:fs', async (importOriginal) => {
14
+ const actual = await importOriginal();
15
+ return {
16
+ ...actual,
17
+ realpathSync: vi.fn((p) => p),
18
+ };
19
+ });
20
+ describe('worktree utilities', () => {
21
+ const projectRoot = '/mock/project';
22
+ const worktreeName = 'test-feature';
23
+ const expectedPath = path.join(projectRoot, '.gemini', 'worktrees', worktreeName);
24
+ beforeEach(() => {
25
+ vi.clearAllMocks();
26
+ });
27
+ describe('getProjectRootForWorktree', () => {
28
+ it('should return the project root from git common dir', async () => {
29
+ // In main repo, git-common-dir is often just ".git"
30
+ vi.mocked(execa).mockResolvedValue({
31
+ stdout: '.git\n',
32
+ });
33
+ const result = await getProjectRootForWorktree('/mock/project');
34
+ expect(result).toBe('/mock/project');
35
+ expect(execa).toHaveBeenCalledWith('git', ['rev-parse', '--git-common-dir'], { cwd: '/mock/project' });
36
+ });
37
+ it('should resolve absolute git common dir paths (as seen in worktrees)', async () => {
38
+ // Inside a worktree, git-common-dir is usually an absolute path to the main .git folder
39
+ vi.mocked(execa).mockResolvedValue({
40
+ stdout: '/mock/project/.git\n',
41
+ });
42
+ const result = await getProjectRootForWorktree('/mock/project/.gemini/worktrees/my-feature');
43
+ expect(result).toBe('/mock/project');
44
+ });
45
+ it('should fallback to cwd if git command fails', async () => {
46
+ vi.mocked(execa).mockRejectedValue(new Error('not a git repo'));
47
+ const result = await getProjectRootForWorktree('/mock/non-git/src');
48
+ expect(result).toBe('/mock/non-git/src');
49
+ });
50
+ });
51
+ describe('getWorktreePath', () => {
52
+ it('should return the correct path for a given name', () => {
53
+ expect(getWorktreePath(projectRoot, worktreeName)).toBe(expectedPath);
54
+ });
55
+ });
56
+ describe('createWorktree', () => {
57
+ it('should execute git worktree add with correct branch and path', async () => {
58
+ vi.mocked(execa).mockResolvedValue({ stdout: '' });
59
+ const resultPath = await createWorktree(projectRoot, worktreeName);
60
+ expect(resultPath).toBe(expectedPath);
61
+ expect(execa).toHaveBeenCalledWith('git', ['worktree', 'add', expectedPath, '-b', `worktree-${worktreeName}`], { cwd: projectRoot });
62
+ });
63
+ it('should throw an error if git worktree add fails', async () => {
64
+ vi.mocked(execa).mockRejectedValue(new Error('git failed'));
65
+ await expect(createWorktree(projectRoot, worktreeName)).rejects.toThrow('git failed');
66
+ });
67
+ });
68
+ describe('isGeminiWorktree', () => {
69
+ it('should return true for a valid gemini worktree path', () => {
70
+ expect(isGeminiWorktree(expectedPath, projectRoot)).toBe(true);
71
+ expect(isGeminiWorktree(path.join(expectedPath, 'src'), projectRoot)).toBe(true);
72
+ });
73
+ it('should return false for a path outside gemini worktrees', () => {
74
+ expect(isGeminiWorktree(path.join(projectRoot, 'src'), projectRoot)).toBe(false);
75
+ expect(isGeminiWorktree('/some/other/path', projectRoot)).toBe(false);
76
+ });
77
+ });
78
+ describe('hasWorktreeChanges', () => {
79
+ it('should return true if git status --porcelain has output', async () => {
80
+ vi.mocked(execa).mockResolvedValue({
81
+ stdout: ' M somefile.txt\n?? newfile.txt',
82
+ });
83
+ const hasChanges = await hasWorktreeChanges(expectedPath);
84
+ expect(hasChanges).toBe(true);
85
+ expect(execa).toHaveBeenCalledWith('git', ['status', '--porcelain'], {
86
+ cwd: expectedPath,
87
+ });
88
+ });
89
+ it('should return true if there are untracked files', async () => {
90
+ vi.mocked(execa).mockResolvedValue({
91
+ stdout: '?? untracked-file.txt\n',
92
+ });
93
+ const hasChanges = await hasWorktreeChanges(expectedPath);
94
+ expect(hasChanges).toBe(true);
95
+ });
96
+ it('should return true if HEAD differs from baseSha', async () => {
97
+ vi.mocked(execa)
98
+ .mockResolvedValueOnce({ stdout: '' }) // status clean
99
+ .mockResolvedValueOnce({ stdout: 'different-sha' }); // HEAD moved
100
+ const hasChanges = await hasWorktreeChanges(expectedPath, 'base-sha');
101
+ expect(hasChanges).toBe(true);
102
+ });
103
+ it('should return false if status is clean and HEAD matches baseSha', async () => {
104
+ vi.mocked(execa)
105
+ .mockResolvedValueOnce({ stdout: '' }) // status clean
106
+ .mockResolvedValueOnce({ stdout: 'base-sha' }); // HEAD same
107
+ const hasChanges = await hasWorktreeChanges(expectedPath, 'base-sha');
108
+ expect(hasChanges).toBe(false);
109
+ });
110
+ it('should return true if any git command fails', async () => {
111
+ vi.mocked(execa).mockRejectedValue(new Error('git error'));
112
+ const hasChanges = await hasWorktreeChanges(expectedPath);
113
+ expect(hasChanges).toBe(true);
114
+ });
115
+ });
116
+ describe('cleanupWorktree', () => {
117
+ it('should remove the worktree and delete the branch', async () => {
118
+ vi.mocked(fs.access).mockResolvedValue(undefined);
119
+ vi.mocked(execa)
120
+ .mockResolvedValueOnce({
121
+ stdout: `worktree-${worktreeName}\n`,
122
+ }) // branch --show-current
123
+ .mockResolvedValueOnce({ stdout: '' }) // remove
124
+ .mockResolvedValueOnce({ stdout: '' }); // branch -D
125
+ await cleanupWorktree(expectedPath, projectRoot);
126
+ expect(execa).toHaveBeenCalledTimes(3);
127
+ expect(execa).toHaveBeenNthCalledWith(1, 'git', ['-C', expectedPath, 'branch', '--show-current'], { cwd: projectRoot });
128
+ expect(execa).toHaveBeenNthCalledWith(2, 'git', ['worktree', 'remove', expectedPath, '--force'], { cwd: projectRoot });
129
+ expect(execa).toHaveBeenNthCalledWith(3, 'git', ['branch', '-D', `worktree-${worktreeName}`], { cwd: projectRoot });
130
+ });
131
+ it('should handle branch discovery failure gracefully', async () => {
132
+ vi.mocked(fs.access).mockResolvedValue(undefined);
133
+ vi.mocked(execa)
134
+ .mockResolvedValueOnce({ stdout: '' }) // no branch found
135
+ .mockResolvedValueOnce({ stdout: '' }); // remove
136
+ await cleanupWorktree(expectedPath, projectRoot);
137
+ expect(execa).toHaveBeenCalledTimes(2);
138
+ expect(execa).toHaveBeenNthCalledWith(2, 'git', ['worktree', 'remove', expectedPath, '--force'], { cwd: projectRoot });
139
+ });
140
+ });
141
+ });
142
+ describe('WorktreeService', () => {
143
+ const projectRoot = '/mock/project';
144
+ const service = new WorktreeService(projectRoot);
145
+ beforeEach(() => {
146
+ vi.clearAllMocks();
147
+ });
148
+ describe('setup', () => {
149
+ it('should capture baseSha and create a worktree', async () => {
150
+ vi.mocked(execa).mockResolvedValue({
151
+ stdout: 'current-sha\n',
152
+ });
153
+ const info = await service.setup('feature-x');
154
+ expect(execa).toHaveBeenCalledWith('git', ['rev-parse', 'HEAD'], {
155
+ cwd: projectRoot,
156
+ });
157
+ expect(info.name).toBe('feature-x');
158
+ expect(info.baseSha).toBe('current-sha');
159
+ expect(info.path).toContain('feature-x');
160
+ });
161
+ it('should generate a timestamped name if none provided', async () => {
162
+ vi.mocked(execa).mockResolvedValue({
163
+ stdout: 'current-sha\n',
164
+ });
165
+ const info = await service.setup();
166
+ expect(info.name).toMatch(/^\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}-\w+/);
167
+ expect(info.path).toContain(info.name);
168
+ });
169
+ });
170
+ describe('maybeCleanup', () => {
171
+ const info = {
172
+ name: 'feature-x',
173
+ path: '/mock/project/.gemini/worktrees/feature-x',
174
+ baseSha: 'base-sha',
175
+ };
176
+ it('should cleanup unmodified worktrees', async () => {
177
+ // Mock hasWorktreeChanges -> false (no changes)
178
+ vi.mocked(execa)
179
+ .mockResolvedValueOnce({ stdout: '' }) // status check
180
+ .mockResolvedValueOnce({ stdout: 'base-sha' }); // SHA check
181
+ vi.mocked(fs.access).mockResolvedValue(undefined);
182
+ vi.mocked(execa).mockResolvedValue({ stdout: '' }); // cleanup calls
183
+ const cleanedUp = await service.maybeCleanup(info);
184
+ expect(cleanedUp).toBe(true);
185
+ // Verify cleanupWorktree utilities were called (execa calls inside cleanupWorktree)
186
+ expect(execa).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(['worktree', 'remove', info.path, '--force']), expect.anything());
187
+ });
188
+ it('should preserve modified worktrees', async () => {
189
+ // Mock hasWorktreeChanges -> true (changes detected)
190
+ vi.mocked(execa).mockResolvedValue({
191
+ stdout: ' M modified-file.ts',
192
+ });
193
+ const cleanedUp = await service.maybeCleanup(info);
194
+ expect(cleanedUp).toBe(false);
195
+ // Ensure cleanupWorktree was NOT called
196
+ expect(execa).not.toHaveBeenCalledWith(expect.anything(), expect.arrayContaining(['worktree', 'remove']), expect.anything());
197
+ });
198
+ });
199
+ });
200
+ //# sourceMappingURL=worktreeService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeService.test.js","sourceRoot":"","sources":["../../../src/services/worktreeService.test.ts"],"names":[],"mappings":"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"}
@@ -520,6 +520,10 @@ export class ClearcutLogger {
520
520
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EXTENSION_IDS,
521
521
  value: event.extension_ids.toString(),
522
522
  },
523
+ {
524
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_WORKTREE_ACTIVE,
525
+ value: event.worktree_active.toString(),
526
+ },
523
527
  ];
524
528
  // Add hardware information only to the start session event
525
529
  const cpus = os.cpus();