@google/gemini-cli-core 0.36.0-preview.7 → 0.37.0-preview.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 (472) hide show
  1. package/dist/docs/CONTRIBUTING.md +10 -7
  2. package/dist/docs/assets/theme-tokyonight-dark.png +0 -0
  3. package/dist/docs/changelogs/index.md +24 -0
  4. package/dist/docs/changelogs/latest.md +366 -459
  5. package/dist/docs/changelogs/preview.md +362 -356
  6. package/dist/docs/cli/acp-mode.md +126 -0
  7. package/dist/docs/cli/cli-reference.md +1 -1
  8. package/dist/docs/cli/notifications.md +5 -5
  9. package/dist/docs/cli/plan-mode.md +12 -8
  10. package/dist/docs/cli/sandbox.md +1 -1
  11. package/dist/docs/cli/settings.md +14 -13
  12. package/dist/docs/cli/themes.md +5 -0
  13. package/dist/docs/core/index.md +2 -2
  14. package/dist/docs/core/subagents.md +134 -23
  15. package/dist/docs/get-started/gemini-3.md +1 -1
  16. package/dist/docs/get-started/index.md +127 -1
  17. package/dist/docs/ide-integration/index.md +99 -24
  18. package/dist/docs/index.md +0 -2
  19. package/dist/docs/redirects.json +1 -0
  20. package/dist/docs/reference/commands.md +1 -3
  21. package/dist/docs/reference/configuration.md +183 -92
  22. package/dist/docs/reference/keyboard-shortcuts.md +14 -6
  23. package/dist/docs/reference/policy-engine.md +16 -30
  24. package/dist/docs/reference/tools.md +56 -23
  25. package/dist/docs/resources/quota-and-pricing.md +23 -9
  26. package/dist/docs/sidebar.json +11 -4
  27. package/dist/docs/tools/planning.md +6 -4
  28. package/dist/src/agents/agentLoader.d.ts +12 -12
  29. package/dist/src/agents/agentLoader.js +1 -0
  30. package/dist/src/agents/agentLoader.js.map +1 -1
  31. package/dist/src/agents/browser/automationOverlay.js +2 -10
  32. package/dist/src/agents/browser/automationOverlay.js.map +1 -1
  33. package/dist/src/agents/browser/browserAgentDefinition.js +10 -3
  34. package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -1
  35. package/dist/src/agents/browser/browserAgentFactory.d.ts +4 -4
  36. package/dist/src/agents/browser/browserAgentFactory.js +15 -29
  37. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
  38. package/dist/src/agents/browser/browserAgentFactory.test.js +41 -24
  39. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
  40. package/dist/src/agents/browser/browserAgentInvocation.d.ts +1 -0
  41. package/dist/src/agents/browser/browserAgentInvocation.js +60 -27
  42. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  43. package/dist/src/agents/browser/browserAgentInvocation.test.js +59 -5
  44. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
  45. package/dist/src/agents/browser/browserManager.d.ts +51 -8
  46. package/dist/src/agents/browser/browserManager.js +242 -70
  47. package/dist/src/agents/browser/browserManager.js.map +1 -1
  48. package/dist/src/agents/browser/browserManager.test.js +384 -17
  49. package/dist/src/agents/browser/browserManager.test.js.map +1 -1
  50. package/dist/src/agents/browser/inputBlocker.d.ts +4 -4
  51. package/dist/src/agents/browser/inputBlocker.js +8 -18
  52. package/dist/src/agents/browser/inputBlocker.js.map +1 -1
  53. package/dist/src/agents/browser/inputBlocker.test.js +31 -3
  54. package/dist/src/agents/browser/inputBlocker.test.js.map +1 -1
  55. package/dist/src/agents/browser/mcpToolWrapper.d.ts +1 -1
  56. package/dist/src/agents/browser/mcpToolWrapper.js +9 -6
  57. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
  58. package/dist/src/agents/browser/mcpToolWrapper.test.js +2 -2
  59. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
  60. package/dist/src/agents/browser/snapshotSuperseder.d.ts +31 -0
  61. package/dist/src/agents/browser/snapshotSuperseder.js +101 -0
  62. package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -0
  63. package/dist/src/agents/browser/snapshotSuperseder.test.js +158 -0
  64. package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -0
  65. package/dist/src/agents/local-executor.d.ts +4 -0
  66. package/dist/src/agents/local-executor.js +46 -19
  67. package/dist/src/agents/local-executor.js.map +1 -1
  68. package/dist/src/agents/local-executor.test.js +118 -18
  69. package/dist/src/agents/local-executor.test.js.map +1 -1
  70. package/dist/src/agents/local-invocation.d.ts +1 -0
  71. package/dist/src/agents/local-invocation.js +19 -9
  72. package/dist/src/agents/local-invocation.js.map +1 -1
  73. package/dist/src/agents/local-invocation.test.js +24 -0
  74. package/dist/src/agents/local-invocation.test.js.map +1 -1
  75. package/dist/src/agents/registry.js +16 -1
  76. package/dist/src/agents/registry.js.map +1 -1
  77. package/dist/src/agents/registry.test.js +67 -0
  78. package/dist/src/agents/registry.test.js.map +1 -1
  79. package/dist/src/agents/types.d.ts +9 -0
  80. package/dist/src/agents/types.js.map +1 -1
  81. package/dist/src/code_assist/oauth2.js +8 -3
  82. package/dist/src/code_assist/oauth2.js.map +1 -1
  83. package/dist/src/code_assist/oauth2.test.js +57 -0
  84. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  85. package/dist/src/code_assist/setup.js +5 -2
  86. package/dist/src/code_assist/setup.js.map +1 -1
  87. package/dist/src/code_assist/setup.test.js +27 -1
  88. package/dist/src/code_assist/setup.test.js.map +1 -1
  89. package/dist/src/code_assist/types.d.ts +80 -80
  90. package/dist/src/config/agent-loop-context.d.ts +2 -0
  91. package/dist/src/config/config.d.ts +81 -16
  92. package/dist/src/config/config.js +147 -51
  93. package/dist/src/config/config.js.map +1 -1
  94. package/dist/src/config/config.test.js +89 -2
  95. package/dist/src/config/config.test.js.map +1 -1
  96. package/dist/src/config/defaultModelConfigs.js +9 -0
  97. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  98. package/dist/src/config/memory.d.ts +1 -0
  99. package/dist/src/config/memory.js +6 -0
  100. package/dist/src/config/memory.js.map +1 -1
  101. package/dist/src/config/storage.d.ts +1 -0
  102. package/dist/src/config/storage.js +4 -0
  103. package/dist/src/config/storage.js.map +1 -1
  104. package/dist/src/config/storage.test.js +5 -0
  105. package/dist/src/config/storage.test.js.map +1 -1
  106. package/dist/src/config/topicState.d.ts +21 -0
  107. package/dist/src/config/topicState.js +41 -0
  108. package/dist/src/config/topicState.js.map +1 -0
  109. package/dist/src/confirmation-bus/types.d.ts +9 -2
  110. package/dist/src/confirmation-bus/types.js +1 -0
  111. package/dist/src/confirmation-bus/types.js.map +1 -1
  112. package/dist/src/context/agentHistoryProvider.d.ts +45 -0
  113. package/dist/src/context/agentHistoryProvider.js +298 -0
  114. package/dist/src/context/agentHistoryProvider.js.map +1 -0
  115. package/dist/src/context/agentHistoryProvider.test.d.ts +6 -0
  116. package/dist/src/context/agentHistoryProvider.test.js +394 -0
  117. package/dist/src/context/agentHistoryProvider.test.js.map +1 -0
  118. package/dist/src/context/chatCompressionService.js.map +1 -0
  119. package/dist/src/context/chatCompressionService.test.js.map +1 -0
  120. package/dist/src/{services → context}/contextManager.d.ts +2 -0
  121. package/dist/src/{services → context}/contextManager.js +18 -9
  122. package/dist/src/context/contextManager.js.map +1 -0
  123. package/dist/src/{services → context}/contextManager.test.js +21 -6
  124. package/dist/src/context/contextManager.test.js.map +1 -0
  125. package/dist/src/context/toolDistillationService.d.ts +38 -0
  126. package/dist/src/context/toolDistillationService.js +170 -0
  127. package/dist/src/context/toolDistillationService.js.map +1 -0
  128. package/dist/src/context/toolDistillationService.test.d.ts +6 -0
  129. package/dist/src/context/toolDistillationService.test.js +83 -0
  130. package/dist/src/context/toolDistillationService.test.js.map +1 -0
  131. package/dist/src/{services → context}/toolOutputMaskingService.d.ts +2 -2
  132. package/dist/src/{services → context}/toolOutputMaskingService.js +7 -7
  133. package/dist/src/context/toolOutputMaskingService.js.map +1 -0
  134. package/dist/src/context/toolOutputMaskingService.test.d.ts +6 -0
  135. package/dist/src/{services → context}/toolOutputMaskingService.test.js +4 -5
  136. package/dist/src/context/toolOutputMaskingService.test.js.map +1 -0
  137. package/dist/src/context/truncation.d.ts +26 -0
  138. package/dist/src/context/truncation.js +102 -0
  139. package/dist/src/context/truncation.js.map +1 -0
  140. package/dist/src/core/client.d.ts +3 -1
  141. package/dist/src/core/client.js +23 -13
  142. package/dist/src/core/client.js.map +1 -1
  143. package/dist/src/core/client.test.js +29 -34
  144. package/dist/src/core/client.test.js.map +1 -1
  145. package/dist/src/core/contentGenerator.d.ts +0 -1
  146. package/dist/src/core/contentGenerator.js +2 -28
  147. package/dist/src/core/contentGenerator.js.map +1 -1
  148. package/dist/src/core/contentGenerator.test.js +1 -101
  149. package/dist/src/core/contentGenerator.test.js.map +1 -1
  150. package/dist/src/core/geminiChat.js +4 -5
  151. package/dist/src/core/geminiChat.js.map +1 -1
  152. package/dist/src/core/geminiChat.test.js +71 -18
  153. package/dist/src/core/geminiChat.test.js.map +1 -1
  154. package/dist/src/core/prompts-substitution.test.js +5 -0
  155. package/dist/src/core/prompts-substitution.test.js.map +1 -1
  156. package/dist/src/core/prompts.test.js +3 -0
  157. package/dist/src/core/prompts.test.js.map +1 -1
  158. package/dist/src/generated/git-commit.d.ts +2 -2
  159. package/dist/src/generated/git-commit.js +2 -2
  160. package/dist/src/index.d.ts +7 -3
  161. package/dist/src/index.js +9 -5
  162. package/dist/src/index.js.map +1 -1
  163. package/dist/src/policy/config.d.ts +1 -1
  164. package/dist/src/policy/config.js +5 -2
  165. package/dist/src/policy/config.js.map +1 -1
  166. package/dist/src/policy/policies/discovered.toml +7 -0
  167. package/dist/src/policy/policies/non-interactive.toml +7 -0
  168. package/dist/src/policy/policies/plan.toml +25 -0
  169. package/dist/src/policy/policies/read-only.toml +6 -0
  170. package/dist/src/policy/policies/sandbox-default.toml +3 -2
  171. package/dist/src/policy/policies/write.toml +21 -0
  172. package/dist/src/policy/policies/yolo.toml +1 -1
  173. package/dist/src/policy/policy-engine.d.ts +2 -4
  174. package/dist/src/policy/policy-engine.js +24 -37
  175. package/dist/src/policy/policy-engine.js.map +1 -1
  176. package/dist/src/policy/policy-engine.test.js +107 -29
  177. package/dist/src/policy/policy-engine.test.js.map +1 -1
  178. package/dist/src/policy/topic-policy.test.d.ts +6 -0
  179. package/dist/src/policy/topic-policy.test.js +48 -0
  180. package/dist/src/policy/topic-policy.test.js.map +1 -0
  181. package/dist/src/policy/types.d.ts +3 -6
  182. package/dist/src/policy/types.js.map +1 -1
  183. package/dist/src/prompts/promptProvider.js +20 -4
  184. package/dist/src/prompts/promptProvider.js.map +1 -1
  185. package/dist/src/prompts/promptProvider.test.js +84 -1
  186. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  187. package/dist/src/prompts/snippets-memory-manager.test.js +1 -1
  188. package/dist/src/prompts/snippets-memory-manager.test.js.map +1 -1
  189. package/dist/src/prompts/snippets.d.ts +3 -4
  190. package/dist/src/prompts/snippets.js +33 -51
  191. package/dist/src/prompts/snippets.js.map +1 -1
  192. package/dist/src/prompts/snippets.legacy.d.ts +6 -4
  193. package/dist/src/prompts/snippets.legacy.js +32 -7
  194. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  195. package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +11 -1
  196. package/dist/src/sandbox/linux/LinuxSandboxManager.js +261 -27
  197. package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
  198. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +430 -125
  199. package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
  200. package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +7 -22
  201. package/dist/src/sandbox/macos/MacOsSandboxManager.js +58 -57
  202. package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
  203. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +148 -103
  204. package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
  205. package/dist/src/sandbox/macos/baseProfile.d.ts +1 -1
  206. package/dist/src/sandbox/macos/baseProfile.js +0 -6
  207. package/dist/src/sandbox/macos/baseProfile.js.map +1 -1
  208. package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +10 -10
  209. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +80 -92
  210. package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
  211. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +135 -99
  212. package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
  213. package/dist/src/sandbox/{macos → utils}/commandSafety.d.ts +11 -0
  214. package/dist/src/sandbox/{macos → utils}/commandSafety.js +47 -14
  215. package/dist/src/sandbox/utils/commandSafety.js.map +1 -0
  216. package/dist/src/sandbox/utils/commandUtils.d.ts +9 -0
  217. package/dist/src/sandbox/utils/commandUtils.js +57 -0
  218. package/dist/src/sandbox/utils/commandUtils.js.map +1 -0
  219. package/dist/src/sandbox/utils/fsUtils.d.ts +11 -0
  220. package/dist/src/sandbox/utils/fsUtils.js +82 -0
  221. package/dist/src/sandbox/utils/fsUtils.js.map +1 -0
  222. package/dist/src/sandbox/utils/sandboxDenialUtils.d.ts +12 -0
  223. package/dist/src/sandbox/utils/sandboxDenialUtils.js +68 -0
  224. package/dist/src/sandbox/utils/sandboxDenialUtils.js.map +1 -0
  225. package/dist/src/sandbox/utils/sandboxDenialUtils.test.d.ts +6 -0
  226. package/dist/src/sandbox/utils/sandboxDenialUtils.test.js +37 -0
  227. package/dist/src/sandbox/utils/sandboxDenialUtils.test.js.map +1 -0
  228. package/dist/src/sandbox/utils/sandboxReadWriteUtils.d.ts +5 -0
  229. package/dist/src/sandbox/utils/sandboxReadWriteUtils.js +60 -0
  230. package/dist/src/sandbox/utils/sandboxReadWriteUtils.js.map +1 -0
  231. package/dist/src/sandbox/windows/GeminiSandbox.cs +257 -216
  232. package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +12 -2
  233. package/dist/src/sandbox/windows/WindowsSandboxManager.js +250 -38
  234. package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
  235. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +326 -9
  236. package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
  237. package/dist/src/sandbox/windows/commandSafety.d.ts +19 -0
  238. package/dist/src/sandbox/windows/commandSafety.js +128 -0
  239. package/dist/src/sandbox/windows/commandSafety.js.map +1 -0
  240. package/dist/src/sandbox/windows/commandSafety.test.d.ts +6 -0
  241. package/dist/src/sandbox/windows/commandSafety.test.js +42 -0
  242. package/dist/src/sandbox/windows/commandSafety.test.js.map +1 -0
  243. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.d.ts +12 -0
  244. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js +68 -0
  245. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js.map +1 -0
  246. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.d.ts +6 -0
  247. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js +68 -0
  248. package/dist/src/sandbox/windows/windowsSandboxDenialUtils.test.js.map +1 -0
  249. package/dist/src/scheduler/scheduler.js +12 -2
  250. package/dist/src/scheduler/scheduler.js.map +1 -1
  251. package/dist/src/scheduler/scheduler.test.js +52 -0
  252. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  253. package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
  254. package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
  255. package/dist/src/scheduler/state-manager.js +1 -1
  256. package/dist/src/scheduler/state-manager.js.map +1 -1
  257. package/dist/src/scheduler/state-manager.test.js +10 -0
  258. package/dist/src/scheduler/state-manager.test.js.map +1 -1
  259. package/dist/src/scheduler/tool-executor.js +7 -2
  260. package/dist/src/scheduler/tool-executor.js.map +1 -1
  261. package/dist/src/scheduler/tool-executor.test.js +38 -0
  262. package/dist/src/scheduler/tool-executor.test.js.map +1 -1
  263. package/dist/src/scheduler/types.d.ts +4 -2
  264. package/dist/src/services/chatRecordingService.d.ts +1 -13
  265. package/dist/src/services/chatRecordingService.js +45 -46
  266. package/dist/src/services/chatRecordingService.js.map +1 -1
  267. package/dist/src/services/chatRecordingService.test.js +79 -10
  268. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  269. package/dist/src/services/executionLifecycleService.d.ts +43 -6
  270. package/dist/src/services/executionLifecycleService.js +49 -12
  271. package/dist/src/services/executionLifecycleService.js.map +1 -1
  272. package/dist/src/services/executionLifecycleService.test.js +157 -3
  273. package/dist/src/services/executionLifecycleService.test.js.map +1 -1
  274. package/dist/src/services/fileDiscoveryService.d.ts +17 -2
  275. package/dist/src/services/fileDiscoveryService.js +84 -20
  276. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  277. package/dist/src/services/fileDiscoveryService.test.js +67 -1
  278. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  279. package/dist/src/services/modelConfigService.d.ts +11 -0
  280. package/dist/src/services/modelConfigService.js +67 -0
  281. package/dist/src/services/modelConfigService.js.map +1 -1
  282. package/dist/src/services/modelConfigService.test.js +30 -0
  283. package/dist/src/services/modelConfigService.test.js.map +1 -1
  284. package/dist/src/services/sandboxManager.d.ts +90 -8
  285. package/dist/src/services/sandboxManager.integration.test.js +438 -0
  286. package/dist/src/services/sandboxManager.integration.test.js.map +1 -0
  287. package/dist/src/services/sandboxManager.js +156 -13
  288. package/dist/src/services/sandboxManager.js.map +1 -1
  289. package/dist/src/services/sandboxManager.test.js +373 -117
  290. package/dist/src/services/sandboxManager.test.js.map +1 -1
  291. package/dist/src/services/sandboxManagerFactory.d.ts +2 -3
  292. package/dist/src/services/sandboxManagerFactory.js +10 -17
  293. package/dist/src/services/sandboxManagerFactory.js.map +1 -1
  294. package/dist/src/services/sandboxedFileSystemService.d.ts +1 -0
  295. package/dist/src/services/sandboxedFileSystemService.js +32 -3
  296. package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
  297. package/dist/src/services/sandboxedFileSystemService.test.js +83 -12
  298. package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -1
  299. package/dist/src/services/shellExecutionService.d.ts +2 -0
  300. package/dist/src/services/shellExecutionService.js +45 -16
  301. package/dist/src/services/shellExecutionService.js.map +1 -1
  302. package/dist/src/services/shellExecutionService.test.js +5 -4
  303. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  304. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +4 -0
  305. package/dist/src/services/test-data/resolved-aliases.golden.json +4 -0
  306. package/dist/src/services/types.d.ts +14 -0
  307. package/dist/src/services/types.js +7 -0
  308. package/dist/src/services/types.js.map +1 -0
  309. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +6 -0
  310. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  311. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +5 -1
  312. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  313. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -1
  314. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +3 -1
  315. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  316. package/dist/src/telemetry/loggers.js +1 -1
  317. package/dist/src/telemetry/loggers.js.map +1 -1
  318. package/dist/src/telemetry/loggers.test.js +8 -3
  319. package/dist/src/telemetry/loggers.test.js.map +1 -1
  320. package/dist/src/telemetry/metrics.d.ts +10 -1
  321. package/dist/src/telemetry/metrics.js +19 -4
  322. package/dist/src/telemetry/metrics.js.map +1 -1
  323. package/dist/src/telemetry/metrics.test.js +44 -0
  324. package/dist/src/telemetry/metrics.test.js.map +1 -1
  325. package/dist/src/telemetry/types.d.ts +3 -3
  326. package/dist/src/telemetry/types.js +9 -4
  327. package/dist/src/telemetry/types.js.map +1 -1
  328. package/dist/src/test-utils/mock-message-bus.d.ts +1 -1
  329. package/dist/src/test-utils/mock-message-bus.js +1 -1
  330. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  331. package/dist/src/tools/definitions/base-declarations.d.ts +6 -0
  332. package/dist/src/tools/definitions/base-declarations.js +7 -0
  333. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  334. package/dist/src/tools/definitions/coreTools.d.ts +2 -1
  335. package/dist/src/tools/definitions/coreTools.js +9 -3
  336. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  337. package/dist/src/tools/definitions/dynamic-declaration-helpers.d.ts +4 -0
  338. package/dist/src/tools/definitions/dynamic-declaration-helpers.js +29 -2
  339. package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
  340. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +11 -6
  341. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  342. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +10 -4
  343. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  344. package/dist/src/tools/definitions/trackerTools.js +3 -3
  345. package/dist/src/tools/definitions/trackerTools.js.map +1 -1
  346. package/dist/src/tools/definitions/types.d.ts +1 -0
  347. package/dist/src/tools/enter-plan-mode.js +15 -0
  348. package/dist/src/tools/enter-plan-mode.js.map +1 -1
  349. package/dist/src/tools/enter-plan-mode.test.js +25 -0
  350. package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
  351. package/dist/src/tools/grep-utils.d.ts +2 -1
  352. package/dist/src/tools/grep-utils.js +22 -3
  353. package/dist/src/tools/grep-utils.js.map +1 -1
  354. package/dist/src/tools/grep.js +16 -3
  355. package/dist/src/tools/grep.js.map +1 -1
  356. package/dist/src/tools/grep.test.js +34 -6
  357. package/dist/src/tools/grep.test.js.map +1 -1
  358. package/dist/src/tools/ls.js +6 -4
  359. package/dist/src/tools/ls.js.map +1 -1
  360. package/dist/src/tools/ls.test.js +22 -7
  361. package/dist/src/tools/ls.test.js.map +1 -1
  362. package/dist/src/tools/mcp-client-manager.js +6 -3
  363. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  364. package/dist/src/tools/mcp-client-manager.test.js +35 -0
  365. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  366. package/dist/src/tools/memoryTool.d.ts +9 -2
  367. package/dist/src/tools/memoryTool.js +39 -15
  368. package/dist/src/tools/memoryTool.js.map +1 -1
  369. package/dist/src/tools/memoryTool.test.js +61 -2
  370. package/dist/src/tools/memoryTool.test.js.map +1 -1
  371. package/dist/src/tools/read-many-files.js +12 -4
  372. package/dist/src/tools/read-many-files.js.map +1 -1
  373. package/dist/src/tools/read-many-files.test.js +17 -17
  374. package/dist/src/tools/read-many-files.test.js.map +1 -1
  375. package/dist/src/tools/ripGrep.js +14 -1
  376. package/dist/src/tools/ripGrep.js.map +1 -1
  377. package/dist/src/tools/ripGrep.test.js +9 -9
  378. package/dist/src/tools/ripGrep.test.js.map +1 -1
  379. package/dist/src/tools/shell.d.ts +10 -0
  380. package/dist/src/tools/shell.js +97 -124
  381. package/dist/src/tools/shell.js.map +1 -1
  382. package/dist/src/tools/shell.test.js +22 -3
  383. package/dist/src/tools/shell.test.js.map +1 -1
  384. package/dist/src/tools/tool-names.d.ts +4 -4
  385. package/dist/src/tools/tool-names.js +5 -3
  386. package/dist/src/tools/tool-names.js.map +1 -1
  387. package/dist/src/tools/tool-registry.js +11 -1
  388. package/dist/src/tools/tool-registry.js.map +1 -1
  389. package/dist/src/tools/tool-registry.test.js +43 -1
  390. package/dist/src/tools/tool-registry.test.js.map +1 -1
  391. package/dist/src/tools/tools.d.ts +12 -1
  392. package/dist/src/tools/tools.js +15 -0
  393. package/dist/src/tools/tools.js.map +1 -1
  394. package/dist/src/tools/tools.test.js +42 -1
  395. package/dist/src/tools/tools.test.js.map +1 -1
  396. package/dist/src/tools/topicTool.d.ts +29 -0
  397. package/dist/src/tools/topicTool.js +72 -0
  398. package/dist/src/tools/topicTool.js.map +1 -0
  399. package/dist/src/tools/topicTool.test.d.ts +6 -0
  400. package/dist/src/tools/topicTool.test.js +105 -0
  401. package/dist/src/tools/topicTool.test.js.map +1 -0
  402. package/dist/src/tools/web-fetch.js +38 -20
  403. package/dist/src/tools/web-fetch.js.map +1 -1
  404. package/dist/src/tools/web-fetch.test.js +28 -0
  405. package/dist/src/tools/web-fetch.test.js.map +1 -1
  406. package/dist/src/utils/checkpointUtils.d.ts +4 -4
  407. package/dist/src/utils/errors.d.ts +3 -0
  408. package/dist/src/utils/errors.js +28 -6
  409. package/dist/src/utils/errors.js.map +1 -1
  410. package/dist/src/utils/errors.test.js +23 -0
  411. package/dist/src/utils/errors.test.js.map +1 -1
  412. package/dist/src/utils/getFolderStructure.js +1 -1
  413. package/dist/src/utils/getFolderStructure.js.map +1 -1
  414. package/dist/src/utils/gitIgnoreParser.d.ts +2 -2
  415. package/dist/src/utils/gitIgnoreParser.js +28 -50
  416. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  417. package/dist/src/utils/gitIgnoreParser.test.js +51 -185
  418. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  419. package/dist/src/utils/ignoreFileParser.d.ts +2 -2
  420. package/dist/src/utils/ignoreFileParser.js +6 -17
  421. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  422. package/dist/src/utils/ignoreFileParser.test.js +40 -132
  423. package/dist/src/utils/ignoreFileParser.test.js.map +1 -1
  424. package/dist/src/utils/ignorePathUtils.d.ts +11 -0
  425. package/dist/src/utils/ignorePathUtils.js +39 -0
  426. package/dist/src/utils/ignorePathUtils.js.map +1 -0
  427. package/dist/src/utils/ignorePathUtils.test.d.ts +6 -0
  428. package/dist/src/utils/ignorePathUtils.test.js +70 -0
  429. package/dist/src/utils/ignorePathUtils.test.js.map +1 -0
  430. package/dist/src/utils/memoryDiscovery.d.ts +6 -4
  431. package/dist/src/utils/memoryDiscovery.js +66 -41
  432. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  433. package/dist/src/utils/memoryDiscovery.test.js +40 -0
  434. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  435. package/dist/src/utils/memoryImportProcessor.d.ts +1 -1
  436. package/dist/src/utils/memoryImportProcessor.js +24 -15
  437. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  438. package/dist/src/utils/sessionOperations.d.ts +19 -0
  439. package/dist/src/utils/sessionOperations.js +101 -0
  440. package/dist/src/utils/sessionOperations.js.map +1 -0
  441. package/dist/src/utils/sessionOperations.test.d.ts +6 -0
  442. package/dist/src/utils/sessionOperations.test.js +92 -0
  443. package/dist/src/utils/sessionOperations.test.js.map +1 -0
  444. package/dist/src/utils/shell-utils.d.ts +15 -0
  445. package/dist/src/utils/shell-utils.js +43 -2
  446. package/dist/src/utils/shell-utils.js.map +1 -1
  447. package/dist/src/utils/textUtils.d.ts +8 -0
  448. package/dist/src/utils/textUtils.js +16 -0
  449. package/dist/src/utils/textUtils.js.map +1 -1
  450. package/dist/src/utils/tokenCalculation.d.ts +2 -0
  451. package/dist/src/utils/tokenCalculation.js +2 -2
  452. package/dist/src/utils/tokenCalculation.js.map +1 -1
  453. package/dist/tsconfig.tsbuildinfo +1 -1
  454. package/package.json +1 -1
  455. package/dist/docs/get-started/examples.md +0 -141
  456. package/dist/google-gemini-cli-core-0.36.0-preview.6.tgz +0 -0
  457. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js +0 -164
  458. package/dist/src/sandbox/macos/MacOsSandboxManager.integration.test.js.map +0 -1
  459. package/dist/src/sandbox/macos/commandSafety.js.map +0 -1
  460. package/dist/src/services/chatCompressionService.js.map +0 -1
  461. package/dist/src/services/chatCompressionService.test.js.map +0 -1
  462. package/dist/src/services/contextManager.js.map +0 -1
  463. package/dist/src/services/contextManager.test.js.map +0 -1
  464. package/dist/src/services/toolOutputMaskingService.js.map +0 -1
  465. package/dist/src/services/toolOutputMaskingService.test.js.map +0 -1
  466. /package/dist/src/{services/toolOutputMaskingService.test.d.ts → agents/browser/snapshotSuperseder.test.d.ts} +0 -0
  467. /package/dist/src/{services → context}/chatCompressionService.d.ts +0 -0
  468. /package/dist/src/{services → context}/chatCompressionService.js +0 -0
  469. /package/dist/src/{services → context}/chatCompressionService.test.d.ts +0 -0
  470. /package/dist/src/{services → context}/chatCompressionService.test.js +0 -0
  471. /package/dist/src/{services → context}/contextManager.test.d.ts +0 -0
  472. /package/dist/src/{sandbox/macos/MacOsSandboxManager.integration.test.d.ts → services/sandboxManager.integration.test.d.ts} +0 -0
@@ -0,0 +1,438 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
7
+ import { createSandboxManager } from './sandboxManagerFactory.js';
8
+ import { ShellExecutionService } from './shellExecutionService.js';
9
+ import { getSecureSanitizationConfig } from './environmentSanitization.js';
10
+ import { NoopSandboxManager, LocalSandboxManager, } from './sandboxManager.js';
11
+ import { execFile, execSync } from 'node:child_process';
12
+ import { promisify } from 'node:util';
13
+ import os from 'node:os';
14
+ import fs from 'node:fs';
15
+ import path from 'node:path';
16
+ import http from 'node:http';
17
+ /**
18
+ * Abstracts platform-specific shell commands for integration testing.
19
+ */
20
+ const Platform = {
21
+ isWindows: os.platform() === 'win32',
22
+ /** Returns a command to create an empty file. */
23
+ touch(filePath) {
24
+ return this.isWindows
25
+ ? { command: 'cmd.exe', args: ['/c', `type nul > "${filePath}"`] }
26
+ : { command: 'touch', args: [filePath] };
27
+ },
28
+ /** Returns a command to read a file's content. */
29
+ cat(filePath) {
30
+ return this.isWindows
31
+ ? { command: 'cmd.exe', args: ['/c', `type "${filePath}"`] }
32
+ : { command: 'cat', args: [filePath] };
33
+ },
34
+ /** Returns a command to echo a string. */
35
+ echo(text) {
36
+ return this.isWindows
37
+ ? { command: 'cmd.exe', args: ['/c', `echo ${text}`] }
38
+ : { command: 'echo', args: [text] };
39
+ },
40
+ /** Returns a command to perform a network request. */
41
+ curl(url) {
42
+ return this.isWindows
43
+ ? {
44
+ command: 'powershell.exe',
45
+ args: ['-Command', `Invoke-WebRequest -Uri ${url} -TimeoutSec 1`],
46
+ }
47
+ : { command: 'curl', args: ['-s', '--connect-timeout', '1', url] };
48
+ },
49
+ /** Returns a command that checks if the current terminal is interactive. */
50
+ isPty() {
51
+ return this.isWindows
52
+ ? 'cmd.exe /c echo True'
53
+ : 'bash -c "if [ -t 1 ]; then echo True; else echo False; fi"';
54
+ },
55
+ /** Returns a path that is strictly outside the workspace and likely blocked. */
56
+ getExternalBlockedPath() {
57
+ return this.isWindows
58
+ ? 'C:\\Windows\\System32\\drivers\\etc\\hosts'
59
+ : '/Users/Shared/.gemini_test_blocked';
60
+ },
61
+ };
62
+ async function runCommand(command) {
63
+ try {
64
+ const { stdout, stderr } = await promisify(execFile)(command.program, command.args, {
65
+ cwd: command.cwd,
66
+ env: command.env,
67
+ encoding: 'utf-8',
68
+ });
69
+ return { status: 0, stdout, stderr };
70
+ }
71
+ catch (error) {
72
+ const err = error;
73
+ return {
74
+ status: err.code ?? 1,
75
+ stdout: err.stdout ?? '',
76
+ stderr: err.stderr ?? '',
77
+ };
78
+ }
79
+ }
80
+ /**
81
+ * Determines if the system has the necessary binaries to run the sandbox.
82
+ * Throws an error if a supported platform is missing its required tools.
83
+ */
84
+ function ensureSandboxAvailable() {
85
+ const platform = os.platform();
86
+ if (platform === 'win32') {
87
+ // Windows sandboxing relies on icacls, which is a core system utility and
88
+ // always available.
89
+ return true;
90
+ }
91
+ if (platform === 'darwin') {
92
+ if (fs.existsSync('/usr/bin/sandbox-exec')) {
93
+ try {
94
+ execSync('sandbox-exec -p "(version 1)(allow default)" echo test', {
95
+ stdio: 'ignore',
96
+ });
97
+ return true;
98
+ }
99
+ catch {
100
+ // eslint-disable-next-line no-console
101
+ console.warn('sandbox-exec is present but cannot be used (likely running inside a sandbox already). Skipping sandbox tests.');
102
+ return false;
103
+ }
104
+ }
105
+ throw new Error('Sandboxing tests on macOS require /usr/bin/sandbox-exec to be present.');
106
+ }
107
+ if (platform === 'linux') {
108
+ try {
109
+ execSync('which bwrap', { stdio: 'ignore' });
110
+ return true;
111
+ }
112
+ catch {
113
+ throw new Error('Sandboxing tests on Linux require bubblewrap (bwrap) to be installed.');
114
+ }
115
+ }
116
+ return false;
117
+ }
118
+ describe('SandboxManager Integration', () => {
119
+ const workspace = process.cwd();
120
+ const manager = createSandboxManager({ enabled: true }, { workspace });
121
+ // Skip if we are on an unsupported platform or if it's a NoopSandboxManager
122
+ const shouldSkip = manager instanceof NoopSandboxManager ||
123
+ manager instanceof LocalSandboxManager ||
124
+ !ensureSandboxAvailable();
125
+ describe.skipIf(shouldSkip)('Cross-platform Sandbox Behavior', () => {
126
+ describe('Basic Execution', () => {
127
+ it('executes commands within the workspace', async () => {
128
+ const { command, args } = Platform.echo('sandbox test');
129
+ const sandboxed = await manager.prepareCommand({
130
+ command,
131
+ args,
132
+ cwd: workspace,
133
+ env: process.env,
134
+ });
135
+ const result = await runCommand(sandboxed);
136
+ expect(result.status).toBe(0);
137
+ expect(result.stdout.trim()).toBe('sandbox test');
138
+ });
139
+ it('supports interactive pseudo-terminals (node-pty)', async () => {
140
+ const handle = await ShellExecutionService.execute(Platform.isPty(), workspace, () => { }, new AbortController().signal, true, {
141
+ sanitizationConfig: getSecureSanitizationConfig(),
142
+ sandboxManager: manager,
143
+ });
144
+ const result = await handle.result;
145
+ expect(result.exitCode).toBe(0);
146
+ expect(result.output).toContain('True');
147
+ });
148
+ });
149
+ describe('File System Access', () => {
150
+ it('blocks access outside the workspace', async () => {
151
+ const blockedPath = Platform.getExternalBlockedPath();
152
+ const { command, args } = Platform.touch(blockedPath);
153
+ const sandboxed = await manager.prepareCommand({
154
+ command,
155
+ args,
156
+ cwd: workspace,
157
+ env: process.env,
158
+ });
159
+ const result = await runCommand(sandboxed);
160
+ expect(result.status).not.toBe(0);
161
+ });
162
+ it('allows dynamic expansion of permissions after a failure', async () => {
163
+ const tempDir = fs.mkdtempSync(path.join(workspace, '..', 'expansion-'));
164
+ const testFile = path.join(tempDir, 'test.txt');
165
+ try {
166
+ const { command, args } = Platform.touch(testFile);
167
+ // First attempt: fails due to sandbox restrictions
168
+ const sandboxed1 = await manager.prepareCommand({
169
+ command,
170
+ args,
171
+ cwd: workspace,
172
+ env: process.env,
173
+ });
174
+ const result1 = await runCommand(sandboxed1);
175
+ expect(result1.status).not.toBe(0);
176
+ expect(fs.existsSync(testFile)).toBe(false);
177
+ // Second attempt: succeeds with additional permissions
178
+ const sandboxed2 = await manager.prepareCommand({
179
+ command,
180
+ args,
181
+ cwd: workspace,
182
+ env: process.env,
183
+ policy: { allowedPaths: [tempDir] },
184
+ });
185
+ const result2 = await runCommand(sandboxed2);
186
+ expect(result2.status).toBe(0);
187
+ expect(fs.existsSync(testFile)).toBe(true);
188
+ }
189
+ finally {
190
+ if (fs.existsSync(testFile))
191
+ fs.unlinkSync(testFile);
192
+ fs.rmSync(tempDir, { recursive: true, force: true });
193
+ }
194
+ });
195
+ it('grants access to explicitly allowed paths', async () => {
196
+ const allowedDir = fs.mkdtempSync(path.join(workspace, '..', 'allowed-'));
197
+ const testFile = path.join(allowedDir, 'test.txt');
198
+ try {
199
+ const { command, args } = Platform.touch(testFile);
200
+ const sandboxed = await manager.prepareCommand({
201
+ command,
202
+ args,
203
+ cwd: workspace,
204
+ env: process.env,
205
+ policy: { allowedPaths: [allowedDir] },
206
+ });
207
+ const result = await runCommand(sandboxed);
208
+ expect(result.status).toBe(0);
209
+ expect(fs.existsSync(testFile)).toBe(true);
210
+ }
211
+ finally {
212
+ if (fs.existsSync(testFile))
213
+ fs.unlinkSync(testFile);
214
+ fs.rmSync(allowedDir, { recursive: true, force: true });
215
+ }
216
+ });
217
+ it('blocks access to forbidden paths within the workspace', async () => {
218
+ const tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-'));
219
+ const forbiddenDir = path.join(tempWorkspace, 'forbidden');
220
+ const testFile = path.join(forbiddenDir, 'test.txt');
221
+ fs.mkdirSync(forbiddenDir);
222
+ try {
223
+ const osManager = createSandboxManager({ enabled: true }, {
224
+ workspace: tempWorkspace,
225
+ forbiddenPaths: async () => [forbiddenDir],
226
+ });
227
+ const { command, args } = Platform.touch(testFile);
228
+ const sandboxed = await osManager.prepareCommand({
229
+ command,
230
+ args,
231
+ cwd: tempWorkspace,
232
+ env: process.env,
233
+ });
234
+ const result = await runCommand(sandboxed);
235
+ expect(result.status).not.toBe(0);
236
+ }
237
+ finally {
238
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
239
+ }
240
+ });
241
+ it('blocks access to files inside forbidden directories recursively', async () => {
242
+ const tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-'));
243
+ const forbiddenDir = path.join(tempWorkspace, 'forbidden');
244
+ const nestedDir = path.join(forbiddenDir, 'nested');
245
+ const nestedFile = path.join(nestedDir, 'test.txt');
246
+ fs.mkdirSync(nestedDir, { recursive: true });
247
+ fs.writeFileSync(nestedFile, 'secret');
248
+ try {
249
+ const osManager = createSandboxManager({ enabled: true }, {
250
+ workspace: tempWorkspace,
251
+ forbiddenPaths: async () => [forbiddenDir],
252
+ });
253
+ const { command, args } = Platform.cat(nestedFile);
254
+ const sandboxed = await osManager.prepareCommand({
255
+ command,
256
+ args,
257
+ cwd: tempWorkspace,
258
+ env: process.env,
259
+ });
260
+ const result = await runCommand(sandboxed);
261
+ expect(result.status).not.toBe(0);
262
+ }
263
+ finally {
264
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
265
+ }
266
+ });
267
+ it('prioritizes forbiddenPaths over allowedPaths', async () => {
268
+ const tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-'));
269
+ const conflictDir = path.join(tempWorkspace, 'conflict');
270
+ const testFile = path.join(conflictDir, 'test.txt');
271
+ fs.mkdirSync(conflictDir);
272
+ try {
273
+ const osManager = createSandboxManager({ enabled: true }, {
274
+ workspace: tempWorkspace,
275
+ forbiddenPaths: async () => [conflictDir],
276
+ });
277
+ const { command, args } = Platform.touch(testFile);
278
+ const sandboxed = await osManager.prepareCommand({
279
+ command,
280
+ args,
281
+ cwd: tempWorkspace,
282
+ env: process.env,
283
+ policy: {
284
+ allowedPaths: [conflictDir],
285
+ },
286
+ });
287
+ const result = await runCommand(sandboxed);
288
+ expect(result.status).not.toBe(0);
289
+ }
290
+ finally {
291
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
292
+ }
293
+ });
294
+ it('gracefully ignores non-existent paths in allowedPaths and forbiddenPaths', async () => {
295
+ const tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-'));
296
+ const nonExistentPath = path.join(tempWorkspace, 'does-not-exist');
297
+ try {
298
+ const osManager = createSandboxManager({ enabled: true }, {
299
+ workspace: tempWorkspace,
300
+ forbiddenPaths: async () => [nonExistentPath],
301
+ });
302
+ const { command, args } = Platform.echo('survived');
303
+ const sandboxed = await osManager.prepareCommand({
304
+ command,
305
+ args,
306
+ cwd: tempWorkspace,
307
+ env: process.env,
308
+ policy: {
309
+ allowedPaths: [nonExistentPath],
310
+ },
311
+ });
312
+ const result = await runCommand(sandboxed);
313
+ expect(result.status).toBe(0);
314
+ expect(result.stdout.trim()).toBe('survived');
315
+ }
316
+ finally {
317
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
318
+ }
319
+ });
320
+ it('prevents creation of non-existent forbidden paths', async () => {
321
+ // Windows icacls cannot explicitly protect paths that have not yet been created.
322
+ if (Platform.isWindows)
323
+ return;
324
+ const tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-'));
325
+ const nonExistentFile = path.join(tempWorkspace, 'never-created.txt');
326
+ try {
327
+ const osManager = createSandboxManager({ enabled: true }, {
328
+ workspace: tempWorkspace,
329
+ forbiddenPaths: async () => [nonExistentFile],
330
+ });
331
+ // We use touch to attempt creation of the file
332
+ const { command: cmdTouch, args: argsTouch } = Platform.touch(nonExistentFile);
333
+ const sandboxedCmd = await osManager.prepareCommand({
334
+ command: cmdTouch,
335
+ args: argsTouch,
336
+ cwd: tempWorkspace,
337
+ env: process.env,
338
+ });
339
+ // Execute the command, we expect it to fail (permission denied or read-only file system)
340
+ const result = await runCommand(sandboxedCmd);
341
+ expect(result.status).not.toBe(0);
342
+ expect(fs.existsSync(nonExistentFile)).toBe(false);
343
+ }
344
+ finally {
345
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
346
+ }
347
+ });
348
+ it('blocks access to both a symlink and its target when the symlink is forbidden', async () => {
349
+ if (Platform.isWindows)
350
+ return;
351
+ const tempWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workspace-'));
352
+ const targetFile = path.join(tempWorkspace, 'target.txt');
353
+ const symlinkFile = path.join(tempWorkspace, 'link.txt');
354
+ fs.writeFileSync(targetFile, 'secret data');
355
+ fs.symlinkSync(targetFile, symlinkFile);
356
+ try {
357
+ const osManager = createSandboxManager({ enabled: true }, {
358
+ workspace: tempWorkspace,
359
+ forbiddenPaths: async () => [symlinkFile],
360
+ });
361
+ // Attempt to read the target file directly
362
+ const { command: cmdTarget, args: argsTarget } = Platform.cat(targetFile);
363
+ const commandTarget = await osManager.prepareCommand({
364
+ command: cmdTarget,
365
+ args: argsTarget,
366
+ cwd: tempWorkspace,
367
+ env: process.env,
368
+ });
369
+ const resultTarget = await runCommand(commandTarget);
370
+ expect(resultTarget.status).not.toBe(0);
371
+ // Attempt to read via the symlink
372
+ const { command: cmdLink, args: argsLink } = Platform.cat(symlinkFile);
373
+ const commandLink = await osManager.prepareCommand({
374
+ command: cmdLink,
375
+ args: argsLink,
376
+ cwd: tempWorkspace,
377
+ env: process.env,
378
+ });
379
+ const resultLink = await runCommand(commandLink);
380
+ expect(resultLink.status).not.toBe(0);
381
+ }
382
+ finally {
383
+ fs.rmSync(tempWorkspace, { recursive: true, force: true });
384
+ }
385
+ });
386
+ });
387
+ describe('Network Access', () => {
388
+ let server;
389
+ let url;
390
+ beforeAll(async () => {
391
+ server = http.createServer((_, res) => {
392
+ res.setHeader('Connection', 'close');
393
+ res.writeHead(200);
394
+ res.end('ok');
395
+ });
396
+ await new Promise((resolve, reject) => {
397
+ server.on('error', reject);
398
+ server.listen(0, '127.0.0.1', () => {
399
+ const addr = server.address();
400
+ url = `http://127.0.0.1:${addr.port}`;
401
+ resolve();
402
+ });
403
+ });
404
+ });
405
+ afterAll(async () => {
406
+ if (server)
407
+ await new Promise((res) => server.close(() => res()));
408
+ });
409
+ it('blocks network access by default', async () => {
410
+ const { command, args } = Platform.curl(url);
411
+ const sandboxed = await manager.prepareCommand({
412
+ command,
413
+ args,
414
+ cwd: workspace,
415
+ env: process.env,
416
+ });
417
+ const result = await runCommand(sandboxed);
418
+ expect(result.status).not.toBe(0);
419
+ });
420
+ it('grants network access when explicitly allowed', async () => {
421
+ const { command, args } = Platform.curl(url);
422
+ const sandboxed = await manager.prepareCommand({
423
+ command,
424
+ args,
425
+ cwd: workspace,
426
+ env: process.env,
427
+ policy: { networkAccess: true },
428
+ });
429
+ const result = await runCommand(sandboxed);
430
+ expect(result.status).toBe(0);
431
+ if (!Platform.isWindows) {
432
+ expect(result.stdout.trim()).toBe('ok');
433
+ }
434
+ });
435
+ });
436
+ });
437
+ });
438
+ //# sourceMappingURL=sandboxManager.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandboxManager.integration.test.js","sourceRoot":"","sources":["../../../src/services/sandboxManager.integration.test.ts"],"names":[],"mappings":"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"}