@google/gemini-cli 0.60.0-nightly.20260908.g85aca163f → 0.60.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 (66) hide show
  1. package/bundle/{chunk-G4V32KTT.js → chunk-2CNCBL5E.js} +1 -1
  2. package/bundle/{chunk-3QU7MFQ7.js → chunk-2VRC3EDT.js} +8 -9
  3. package/bundle/{chunk-3CDPEGVA.js → chunk-32DXU4EF.js} +1 -1
  4. package/bundle/{chunk-TVCSMCKT.js → chunk-4IIDTAFR.js} +1 -1
  5. package/bundle/{chunk-FX53IMQ4.js → chunk-7QC7KWAE.js} +1 -1
  6. package/bundle/{chunk-L5DTYBPR.js → chunk-CMLALLX3.js} +7 -7
  7. package/bundle/{chunk-OSSPFBB5.js → chunk-D3BC6B5F.js} +1 -1
  8. package/bundle/{chunk-ACSEKHMC.js → chunk-E62PES2E.js} +2 -2
  9. package/bundle/{chunk-YMZA4EO3.js → chunk-GFHSA4BE.js} +1 -1
  10. package/bundle/{chunk-A6IXIFRW.js → chunk-GNCCSIBA.js} +7 -7
  11. package/bundle/{chunk-FYCX7S2H.js → chunk-JJLODN2F.js} +1 -1
  12. package/bundle/{chunk-VIXOL23X.js → chunk-KAXMFUK5.js} +1 -1
  13. package/bundle/{chunk-AXAX7FSE.js → chunk-M6NSK26M.js} +123 -104
  14. package/bundle/{chunk-FIESYQDV.js → chunk-MOYC3UGL.js} +127 -106
  15. package/bundle/{chunk-BOGYC66X.js → chunk-OCLZG6C5.js} +1 -1
  16. package/bundle/{chunk-OI5WY42W.js → chunk-P3SNRA43.js} +2 -2
  17. package/bundle/{chunk-XTLORUWQ.js → chunk-PJREBWY3.js} +2 -2
  18. package/bundle/{chunk-N7PUYZ2C.js → chunk-QRYVAS35.js} +3 -3
  19. package/bundle/{chunk-4YTSRQAI.js → chunk-RZALYEQN.js} +1 -1
  20. package/bundle/{chunk-J5XD2NH2.js → chunk-S7PDUHJI.js} +3 -3
  21. package/bundle/{chunk-JE7V5AAP.js → chunk-UEQMLKXK.js} +3 -3
  22. package/bundle/{chunk-GD2JGMGI.js → chunk-VCAJDPDX.js} +14699 -7842
  23. package/bundle/{chunk-CYA6LLPT.js → chunk-WRNJPSJG.js} +5 -8
  24. package/bundle/{chunk-AL25HEEO.js → chunk-XRNOQZLR.js} +54 -67
  25. package/bundle/{cleanup-4FION7X5.js → cleanup-HEQUL3UY.js} +2 -2
  26. package/bundle/{cleanup-GWIY2YES.js → cleanup-THNE7RD2.js} +2 -2
  27. package/bundle/{cleanup-SXOQFKSA.js → cleanup-XYVEFB7E.js} +2 -2
  28. package/bundle/{core-T6ZA3RPN.js → core-A6JH6DY6.js} +5 -1
  29. package/bundle/{dist-CUTV6FXO.js → core-PCNYIQML.js} +5 -1
  30. package/bundle/{devtoolsService-FPEN37GX.js → devtoolsService-J7SM2WQQ.js} +2 -2
  31. package/bundle/{devtoolsService-J5IMHON6.js → devtoolsService-TEWMGXKI.js} +2 -2
  32. package/bundle/{devtoolsService-HJR727UG.js → devtoolsService-YPPCMYGQ.js} +3 -4
  33. package/bundle/{dist-IYMU3MAT.js → dist-PD4ABRTS.js} +5 -1
  34. package/bundle/{gemini-RLSAAMB2.js → gemini-7INSUCPB.js} +318 -272
  35. package/bundle/{gemini-FPHQ6YA6.js → gemini-LUNNHKPJ.js} +134 -72
  36. package/bundle/{gemini-DM7UHG5I.js → gemini-ZTU7EMI3.js} +134 -72
  37. package/bundle/gemini.js +7 -7
  38. package/bundle/{interactiveCli-BNCDBJK2.js → interactiveCli-COQJBPC2.js} +8 -8
  39. package/bundle/{interactiveCli-NC7ZBX74.js → interactiveCli-NQE3X2WY.js} +8 -8
  40. package/bundle/{interactiveCli-SWGF5F7W.js → interactiveCli-X63QLGIH.js} +296 -315
  41. package/bundle/{liteRtServerManager-6VWY6OO6.js → liteRtServerManager-5YXPHG3Q.js} +4 -4
  42. package/bundle/{liteRtServerManager-HE2FE4FH.js → liteRtServerManager-7W4APCRB.js} +4 -4
  43. package/bundle/{liteRtServerManager-JSW26OPJ.js → liteRtServerManager-PEAZFGHW.js} +4 -4
  44. package/bundle/{oauth2-provider-IGJGMQ4U.js → oauth2-provider-H2X6UMUS.js} +1 -1
  45. package/bundle/{oauth2-provider-I665TJQN.js → oauth2-provider-M3PIKLLI.js} +1 -1
  46. package/bundle/{oauth2-provider-T2HJJ7SP.js → oauth2-provider-WINJTB44.js} +72 -38
  47. package/bundle/{start-AA23VJDL.js → start-AH7HKN5D.js} +6 -6
  48. package/bundle/{start-EQIIZYZY.js → start-J5DOY6JW.js} +6 -6
  49. package/bundle/{start-QHU4R4ZE.js → start-QYNDA2U4.js} +6 -6
  50. package/package.json +1 -1
  51. package/bundle/chunk-5AXHFT2M.js +0 -512
  52. package/bundle/chunk-JIOJKKRV.js +0 -1571
  53. package/bundle/chunk-JIXDRDKL.js +0 -17353
  54. package/bundle/chunk-M24MUPYL.js +0 -398992
  55. package/bundle/chunk-MI66NSWG.js +0 -154
  56. package/bundle/chunk-R55JHECT.js +0 -102670
  57. package/bundle/chunk-RRTGK7KM.js +0 -118
  58. package/bundle/chunk-WET7Q2Z2.js +0 -398
  59. package/bundle/cleanup-XSTC4XRT.js +0 -32
  60. package/bundle/devtoolsService-R3332TAT.js +0 -4359
  61. package/bundle/dist-VMLS7TDS.js +0 -2212
  62. package/bundle/gemini-ZT27CSNJ.js +0 -17370
  63. package/bundle/interactiveCli-WG2TABNS.js +0 -34983
  64. package/bundle/liteRtServerManager-Y7KT37QX.js +0 -65
  65. package/bundle/oauth2-provider-WUYROQ6O.js +0 -235
  66. package/bundle/start-WLQTESZU.js +0 -18
@@ -2,7 +2,7 @@ const require = (await import('node:module')).createRequire(import.meta.url); co
2
2
  import {
3
3
  startCommand,
4
4
  startServer
5
- } from "./chunk-JE7V5AAP.js";
5
+ } from "./chunk-UEQMLKXK.js";
6
6
  import {
7
7
  BuiltinCommandLoader,
8
8
  CommandService,
@@ -46,11 +46,11 @@ import {
46
46
  updateExtension,
47
47
  validateAuthMethod,
48
48
  validateContextFilePath
49
- } from "./chunk-L5DTYBPR.js";
49
+ } from "./chunk-CMLALLX3.js";
50
50
  import {
51
51
  exitCli,
52
52
  require_source
53
- } from "./chunk-FX53IMQ4.js";
53
+ } from "./chunk-7QC7KWAE.js";
54
54
  import {
55
55
  appEvents
56
56
  } from "./chunk-5PS3AYFU.js";
@@ -88,11 +88,11 @@ import {
88
88
  resolveGemmaConfig,
89
89
  saveModelChange,
90
90
  stripAnsi
91
- } from "./chunk-VIXOL23X.js";
91
+ } from "./chunk-WRNJPSJG.js";
92
92
  import {
93
93
  RELAUNCH_EXIT_CODE
94
- } from "./chunk-XTLORUWQ.js";
95
- import "./chunk-G4V32KTT.js";
94
+ } from "./chunk-P3SNRA43.js";
95
+ import "./chunk-2CNCBL5E.js";
96
96
  import {
97
97
  cleanupCheckpoints,
98
98
  registerCleanup,
@@ -101,7 +101,7 @@ import {
101
101
  runExitCleanup,
102
102
  runSyncCleanup,
103
103
  setupSignalHandlers
104
- } from "./chunk-3CDPEGVA.js";
104
+ } from "./chunk-32DXU4EF.js";
105
105
  import {
106
106
  ASK_USER_TOOL_NAME,
107
107
  AuthType,
@@ -239,7 +239,7 @@ import {
239
239
  updatePolicy,
240
240
  writeToStderr,
241
241
  writeToStdout
242
- } from "./chunk-FIESYQDV.js";
242
+ } from "./chunk-VCAJDPDX.js";
243
243
  import "./chunk-664ZODQF.js";
244
244
  import "./chunk-IUUIT4SU.js";
245
245
  import "./chunk-TUDYL3X4.js";
@@ -1524,11 +1524,11 @@ var parser = new YargsParser({
1524
1524
  resolve: resolve2,
1525
1525
  // TODO: figure out a way to combine ESM and CJS coverage, such that
1526
1526
  // we can exercise all the lines below:
1527
- require: (path16) => {
1527
+ require: (path17) => {
1528
1528
  if (typeof __require !== "undefined") {
1529
- return __require(path16);
1530
- } else if (path16.match(/\.json$/)) {
1531
- return JSON.parse(readFileSync(path16, "utf8"));
1529
+ return __require(path17);
1530
+ } else if (path17.match(/\.json$/)) {
1531
+ return JSON.parse(readFileSync(path17, "utf8"));
1532
1532
  } else {
1533
1533
  throw Error("only .json config files are supported in ESM");
1534
1534
  }
@@ -6313,27 +6313,27 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
6313
6313
  var __filename = fileURLToPath2(import.meta.url);
6314
6314
  var __dirname2 = dirname3(__filename);
6315
6315
  var EXAMPLES_PATH = join(__dirname2, "examples");
6316
- async function pathExists(path16) {
6316
+ async function pathExists(path17) {
6317
6317
  try {
6318
- await access(path16);
6318
+ await access(path17);
6319
6319
  return true;
6320
6320
  } catch {
6321
6321
  return false;
6322
6322
  }
6323
6323
  }
6324
- async function createDirectory(path16) {
6325
- if (await pathExists(path16)) {
6326
- throw new Error(`Path already exists: ${path16}`);
6324
+ async function createDirectory(path17) {
6325
+ if (await pathExists(path17)) {
6326
+ throw new Error(`Path already exists: ${path17}`);
6327
6327
  }
6328
- await mkdir(path16, { recursive: true });
6328
+ await mkdir(path17, { recursive: true });
6329
6329
  }
6330
- async function copyDirectory(template, path16) {
6331
- await createDirectory(path16);
6330
+ async function copyDirectory(template, path17) {
6331
+ await createDirectory(path17);
6332
6332
  const examplePath = join(EXAMPLES_PATH, template);
6333
6333
  const entries = await readdir(examplePath, { withFileTypes: true });
6334
6334
  for (const entry of entries) {
6335
6335
  const srcPath = join(examplePath, entry.name);
6336
- const destPath = join(path16, entry.name);
6336
+ const destPath = join(path17, entry.name);
6337
6337
  await cp(srcPath, destPath, { recursive: true });
6338
6338
  }
6339
6339
  }
@@ -6614,7 +6614,7 @@ async function handleEnable3(args) {
6614
6614
  const result = enableSkill(settings, name);
6615
6615
  const feedback = renderSkillActionFeedback(
6616
6616
  result,
6617
- (label, path16) => `${import_chalk5.default.bold(label)} (${import_chalk5.default.dim(path16)})`
6617
+ (label, path17) => `${import_chalk5.default.bold(label)} (${import_chalk5.default.dim(path17)})`
6618
6618
  );
6619
6619
  debugLogger.log(feedback);
6620
6620
  }
@@ -6644,7 +6644,7 @@ async function handleDisable3(args) {
6644
6644
  const result = disableSkill(settings, name, scope);
6645
6645
  const feedback = renderSkillActionFeedback(
6646
6646
  result,
6647
- (label, path16) => `${import_chalk6.default.bold(label)} (${import_chalk6.default.dim(path16)})`
6647
+ (label, path17) => `${import_chalk6.default.bold(label)} (${import_chalk6.default.dim(path17)})`
6648
6648
  );
6649
6649
  debugLogger.log(feedback);
6650
6650
  }
@@ -7839,7 +7839,7 @@ async function loadSandboxConfig(settings, argv) {
7839
7839
  }
7840
7840
  const command2 = getSandboxCommand(sandboxValue);
7841
7841
  const packageJson = await getPackageJson(__dirname3);
7842
- const image = process.env["GEMINI_SANDBOX_IMAGE"] ?? "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.60.0-nightly.20260901.g0bd1d4397" ?? customImage ?? packageJson?.config?.sandboxImageUri;
7842
+ const image = process.env["GEMINI_SANDBOX_IMAGE"] ?? "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.60.0" ?? customImage ?? packageJson?.config?.sandboxImageUri;
7843
7843
  const isNative = command2 === "windows-native" || command2 === "sandbox-exec" || command2 === "lxc";
7844
7844
  return command2 && (image || isNative) ? { enabled: true, allowedPaths, networkAccess, command: command2, image } : void 0;
7845
7845
  }
@@ -8774,7 +8774,7 @@ import { createHash as createHash2 } from "node:crypto";
8774
8774
  import v8 from "node:v8";
8775
8775
  import os6 from "node:os";
8776
8776
  import dns from "node:dns";
8777
- import * as path15 from "node:path";
8777
+ import * as path16 from "node:path";
8778
8778
  import * as fsPromises from "node:fs/promises";
8779
8779
 
8780
8780
  // packages/cli/src/utils/sandbox.ts
@@ -8786,7 +8786,7 @@ import {
8786
8786
  spawn as spawn2,
8787
8787
  spawnSync
8788
8788
  } from "node:child_process";
8789
- import path8 from "node:path";
8789
+ import path9 from "node:path";
8790
8790
  import fs7 from "node:fs";
8791
8791
  import os3 from "node:os";
8792
8792
  import { fileURLToPath as fileURLToPath4 } from "node:url";
@@ -8797,6 +8797,7 @@ import { randomBytes } from "node:crypto";
8797
8797
  var import_shell_quote = __toESM(require_shell_quote(), 1);
8798
8798
  import os2 from "node:os";
8799
8799
  import fs6 from "node:fs";
8800
+ import path8 from "node:path";
8800
8801
  import { readFile } from "node:fs/promises";
8801
8802
  var LOCAL_DEV_SANDBOX_IMAGE_NAME = "gemini-cli-sandbox";
8802
8803
  var SANDBOX_NETWORK_NAME = "gemini-cli-sandbox";
@@ -8811,6 +8812,58 @@ var BUILTIN_SEATBELT_PROFILES = [
8811
8812
  "strict-open",
8812
8813
  "strict-proxied"
8813
8814
  ];
8815
+ var SENSITIVE_SETTINGS_FILENAMES = /* @__PURE__ */ new Set([
8816
+ "oauth_creds.json",
8817
+ "google_accounts.json",
8818
+ "gemini-credentials.json",
8819
+ "mcp-oauth-tokens.json",
8820
+ "a2a-oauth-tokens.json"
8821
+ ]);
8822
+ function isCredentialOrSensitivePath(targetPath, rootDir) {
8823
+ if (rootDir && path8.resolve(targetPath) === path8.resolve(rootDir)) {
8824
+ return false;
8825
+ }
8826
+ const base = path8.basename(targetPath).toLowerCase();
8827
+ if (SENSITIVE_SETTINGS_FILENAMES.has(base)) {
8828
+ return true;
8829
+ }
8830
+ const isRootChild = rootDir ? path8.dirname(path8.resolve(targetPath)) === path8.resolve(rootDir) : true;
8831
+ if (isRootChild && (base === "history" || base === "tmp" || base === "bin")) {
8832
+ return true;
8833
+ }
8834
+ const hasSensitiveSuffix = (s) => {
8835
+ if (base === s) return true;
8836
+ if (base.endsWith(s)) {
8837
+ const charBefore = base.charAt(base.length - s.length - 1);
8838
+ return charBefore === "-" || charBefore === "_" || charBefore === ".";
8839
+ }
8840
+ return false;
8841
+ };
8842
+ if (base.endsWith(".credentials") || hasSensitiveSuffix("credentials") || hasSensitiveSuffix("credentials.json") || hasSensitiveSuffix("tokens.json") || hasSensitiveSuffix("token.json") || hasSensitiveSuffix("token") || hasSensitiveSuffix("creds.json") || hasSensitiveSuffix("cred.json") || base.endsWith(".env") || base.endsWith(".key") || base.endsWith(".pem") || base.endsWith(".p12") || hasSensitiveSuffix("key.json")) {
8843
+ return true;
8844
+ }
8845
+ return false;
8846
+ }
8847
+ function prepareIsolatedSettingsDir(userSettingsDirOnHost) {
8848
+ const baseTmpDir = os2.tmpdir() || "/tmp";
8849
+ const isolatedDir = fs6.mkdtempSync(
8850
+ path8.join(baseTmpDir, "gemini-sandbox-settings-")
8851
+ );
8852
+ fs6.chmodSync(isolatedDir, 448);
8853
+ if (fs6.existsSync(userSettingsDirOnHost)) {
8854
+ try {
8855
+ fs6.cpSync(userSettingsDirOnHost, isolatedDir, {
8856
+ recursive: true,
8857
+ filter: (source) => !isCredentialOrSensitivePath(source, userSettingsDirOnHost)
8858
+ });
8859
+ } catch (err) {
8860
+ debugLogger.warn(
8861
+ `Failed to copy user settings to sandbox directory: ${err instanceof Error ? err.message : String(err)}`
8862
+ );
8863
+ }
8864
+ }
8865
+ return isolatedDir;
8866
+ }
8814
8867
  function getContainerPath(hostPath) {
8815
8868
  if (os2.platform() !== "win32") {
8816
8869
  return hostPath;
@@ -9713,7 +9766,18 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9713
9766
  let stopProxy = void 0;
9714
9767
  let tempProfileFile = null;
9715
9768
  let sandboxTmpDir = null;
9769
+ let isolatedSettingsDir = null;
9716
9770
  const cleanup = () => {
9771
+ if (isolatedSettingsDir) {
9772
+ const dirToDelete = isolatedSettingsDir;
9773
+ isolatedSettingsDir = null;
9774
+ try {
9775
+ if (fs7.existsSync(dirToDelete)) {
9776
+ fs7.rmSync(dirToDelete, { recursive: true, force: true });
9777
+ }
9778
+ } catch {
9779
+ }
9780
+ }
9717
9781
  if (sandboxTmpDir) {
9718
9782
  const dirToDelete = sandboxTmpDir;
9719
9783
  sandboxTmpDir = null;
@@ -9766,10 +9830,10 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9766
9830
  new URL(`sandbox-macos-${profile}.sb`, import.meta.url)
9767
9831
  );
9768
9832
  if (!BUILTIN_SEATBELT_PROFILES.includes(profile)) {
9769
- const safeProfile = path8.basename(profile);
9833
+ const safeProfile = path9.basename(profile);
9770
9834
  const fileName = `sandbox-macos-${safeProfile}.sb`;
9771
- const userProfileFile = path8.join(homedir(), GEMINI_DIR, fileName);
9772
- const projectProfileFile = path8.join(GEMINI_DIR, fileName);
9835
+ const userProfileFile = path9.join(homedir(), GEMINI_DIR, fileName);
9836
+ const projectProfileFile = path9.join(GEMINI_DIR, fileName);
9773
9837
  profileFile = fs7.existsSync(userProfileFile) ? userProfileFile : projectProfileFile;
9774
9838
  } else {
9775
9839
  if (!fs7.existsSync(profileFile)) {
@@ -9778,7 +9842,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9778
9842
  try {
9779
9843
  const tempDir = fs7.realpathSync(os3.tmpdir());
9780
9844
  const rand = randomBytes(8).toString("hex");
9781
- tempProfileFile = path8.join(
9845
+ tempProfileFile = path9.join(
9782
9846
  tempDir,
9783
9847
  `gemini-sandbox-macos-${profile}-${rand}.sb`
9784
9848
  );
@@ -9808,7 +9872,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9808
9872
  ].join(" ");
9809
9873
  const hostTmpDir = fs7.realpathSync(os3.tmpdir());
9810
9874
  const resolvedTmpDir = fs7.mkdtempSync(
9811
- path8.join(hostTmpDir, "gemini-sandbox-")
9875
+ path9.join(hostTmpDir, "gemini-sandbox-")
9812
9876
  );
9813
9877
  sandboxTmpDir = resolvedTmpDir;
9814
9878
  const args2 = [
@@ -9836,7 +9900,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9836
9900
  }
9837
9901
  if (config.allowedPaths) {
9838
9902
  for (const hostPath of config.allowedPaths) {
9839
- if (hostPath && path8.isAbsolute(hostPath) && fs7.existsSync(hostPath)) {
9903
+ if (hostPath && path9.isAbsolute(hostPath) && fs7.existsSync(hostPath)) {
9840
9904
  const realDir = fs7.realpathSync(hostPath);
9841
9905
  if (!includedDirs.includes(realDir) && realDir !== targetDir) {
9842
9906
  includedDirs.push(realDir);
@@ -9942,7 +10006,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9942
10006
  if (!command2) throw new FatalSandboxError("Sandbox command is required");
9943
10007
  debugLogger.log(`hopping into sandbox (command: ${command2}) ...`);
9944
10008
  const gcPath = process.argv[1] ? fs7.realpathSync(process.argv[1]) : "";
9945
- const projectSandboxDockerfile = path8.join(
10009
+ const projectSandboxDockerfile = path9.join(
9946
10010
  GEMINI_DIR,
9947
10011
  "sandbox.Dockerfile"
9948
10012
  );
@@ -9951,7 +10015,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9951
10015
  if (!image) throw new FatalSandboxError("Sandbox image is required");
9952
10016
  if (!/^[a-zA-Z0-9_.:/-]+$/.test(image))
9953
10017
  throw new FatalSandboxError("Invalid sandbox image name");
9954
- const workdir = path8.resolve(process.cwd());
10018
+ const workdir = path9.resolve(process.cwd());
9955
10019
  const containerWorkdir = getContainerPath(workdir);
9956
10020
  if (process.env["BUILD_SANDBOX"]) {
9957
10021
  if (!gcPath.includes("gemini-cli/packages/")) {
@@ -9962,13 +10026,13 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
9962
10026
  debugLogger.log("building sandbox ...");
9963
10027
  const gcRoot = gcPath.split("/packages/")[0];
9964
10028
  let buildArgs = "";
9965
- const projectSandboxDockerfile2 = path8.join(
10029
+ const projectSandboxDockerfile2 = path9.join(
9966
10030
  GEMINI_DIR,
9967
10031
  "sandbox.Dockerfile"
9968
10032
  );
9969
10033
  if (isCustomProjectSandbox) {
9970
10034
  debugLogger.log(`using ${projectSandboxDockerfile2} for sandbox`);
9971
- buildArgs += `-f ${path8.resolve(projectSandboxDockerfile2)} -i ${image}`;
10035
+ buildArgs += `-f ${path9.resolve(projectSandboxDockerfile2)} -i ${image}`;
9972
10036
  }
9973
10037
  execSync(
9974
10038
  `cd ${gcRoot} && node scripts/build_sandbox.js -s ${buildArgs}`,
@@ -10012,18 +10076,16 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10012
10076
  if (!fs7.existsSync(userHomeDirOnHost)) {
10013
10077
  fs7.mkdirSync(userHomeDirOnHost, { recursive: true });
10014
10078
  }
10015
- const userSettingsDirOnHost = path8.join(userHomeDirOnHost, GEMINI_DIR);
10079
+ const userSettingsDirOnHost = path9.join(userHomeDirOnHost, GEMINI_DIR);
10016
10080
  if (!fs7.existsSync(userSettingsDirOnHost)) {
10017
10081
  fs7.mkdirSync(userSettingsDirOnHost, { recursive: true });
10018
10082
  }
10019
- args.push(
10020
- "--volume",
10021
- `${userSettingsDirOnHost}:${userSettingsDirInSandbox}`
10022
- );
10083
+ isolatedSettingsDir = prepareIsolatedSettingsDir(userSettingsDirOnHost);
10084
+ args.push("--volume", `${isolatedSettingsDir}:${userSettingsDirInSandbox}`);
10023
10085
  if (userSettingsDirInSandbox !== getContainerPath(userSettingsDirOnHost)) {
10024
10086
  args.push(
10025
10087
  "--volume",
10026
- `${userSettingsDirOnHost}:${getContainerPath(userSettingsDirOnHost)}`
10088
+ `${isolatedSettingsDir}:${getContainerPath(userSettingsDirOnHost)}`
10027
10089
  );
10028
10090
  }
10029
10091
  args.push("--volume", `${os3.tmpdir()}:${getContainerPath(os3.tmpdir())}`);
@@ -10033,7 +10095,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10033
10095
  `${userHomeDirOnHost}:${getContainerPath(userHomeDirOnHost)}`
10034
10096
  );
10035
10097
  }
10036
- const gcloudConfigDir = path8.join(homedir(), ".config", "gcloud");
10098
+ const gcloudConfigDir = path9.join(homedir(), ".config", "gcloud");
10037
10099
  if (fs7.existsSync(gcloudConfigDir)) {
10038
10100
  args.push(
10039
10101
  "--volume",
@@ -10057,7 +10119,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10057
10119
  to = to || from;
10058
10120
  opts = opts || "ro";
10059
10121
  mount = `${from}:${to}:${opts}`;
10060
- if (!path8.isAbsolute(from)) {
10122
+ if (!path9.isAbsolute(from)) {
10061
10123
  throw new FatalSandboxError(
10062
10124
  `Path '${from}' listed in SANDBOX_MOUNTS must be absolute`
10063
10125
  );
@@ -10074,7 +10136,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10074
10136
  }
10075
10137
  if (config.allowedPaths) {
10076
10138
  for (const hostPath of config.allowedPaths) {
10077
- if (hostPath && path8.isAbsolute(hostPath) && fs7.existsSync(hostPath)) {
10139
+ if (hostPath && path9.isAbsolute(hostPath) && fs7.existsSync(hostPath)) {
10078
10140
  const containerPath = getContainerPath(hostPath);
10079
10141
  debugLogger.log(
10080
10142
  `Config allowedPath: ${hostPath} -> ${containerPath} (ro)`
@@ -10194,7 +10256,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10194
10256
  }
10195
10257
  }
10196
10258
  if (process.env["VIRTUAL_ENV"]?.toLowerCase().startsWith(workdir.toLowerCase())) {
10197
- const sandboxVenvPath = path8.resolve(GEMINI_DIR, "sandbox.venv");
10259
+ const sandboxVenvPath = path9.resolve(GEMINI_DIR, "sandbox.venv");
10198
10260
  if (!fs7.existsSync(sandboxVenvPath)) {
10199
10261
  fs7.mkdirSync(sandboxVenvPath, { recursive: true });
10200
10262
  }
@@ -10231,7 +10293,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10231
10293
  }
10232
10294
  args.push("--env", `SANDBOX=${containerName}`);
10233
10295
  if (command2 === "podman") {
10234
- const emptyAuthFilePath = path8.join(os3.tmpdir(), "empty_auth.json");
10296
+ const emptyAuthFilePath = path9.join(os3.tmpdir(), "empty_auth.json");
10235
10297
  fs7.writeFileSync(emptyAuthFilePath, "{}", "utf-8");
10236
10298
  args.push("--authfile", emptyAuthFilePath);
10237
10299
  }
@@ -10360,7 +10422,7 @@ async function start_sandbox(config, nodeArgs = [], cliConfig, cliArgs = []) {
10360
10422
  }
10361
10423
  async function start_lxc_sandbox(config, nodeArgs = [], cliArgs = []) {
10362
10424
  const containerName = config.image || "gemini-sandbox";
10363
- const workdir = path8.resolve(process.cwd());
10425
+ const workdir = path9.resolve(process.cwd());
10364
10426
  debugLogger.log(
10365
10427
  `starting lxc sandbox (container: ${containerName}, workdir: ${workdir}) ...`
10366
10428
  );
@@ -10441,7 +10503,7 @@ async function start_lxc_sandbox(config, nodeArgs = [], cliArgs = []) {
10441
10503
  }
10442
10504
  if (config.allowedPaths) {
10443
10505
  for (const hostPath of config.allowedPaths) {
10444
- if (hostPath && path8.isAbsolute(hostPath) && fs7.existsSync(hostPath)) {
10506
+ if (hostPath && path9.isAbsolute(hostPath) && fs7.existsSync(hostPath)) {
10445
10507
  const allowedDeviceName = `gemini-allowed-${randomBytes(4).toString(
10446
10508
  "hex"
10447
10509
  )}`;
@@ -10687,7 +10749,7 @@ async function getStartupWarnings() {
10687
10749
  // packages/cli/src/utils/userStartupWarnings.ts
10688
10750
  import fs9 from "node:fs/promises";
10689
10751
  import { homedir as osHomedir } from "node:os";
10690
- import path9 from "node:path";
10752
+ import path10 from "node:path";
10691
10753
  import process4 from "node:process";
10692
10754
  var homeDirectoryCheck = {
10693
10755
  id: "home-directory",
@@ -10701,7 +10763,7 @@ var homeDirectoryCheck = {
10701
10763
  fs9.realpath(workspaceRoot),
10702
10764
  fs9.realpath(osHomedir())
10703
10765
  ]);
10704
- if (path9.resolve(workspaceRealPath) === path9.resolve(homeRealPath)) {
10766
+ if (path10.resolve(workspaceRealPath) === path10.resolve(homeRealPath)) {
10705
10767
  if (isFolderTrustEnabled(settings) && isWorkspaceTrusted(settings).isTrusted) {
10706
10768
  return null;
10707
10769
  }
@@ -10720,7 +10782,7 @@ var rootDirectoryCheck = {
10720
10782
  try {
10721
10783
  const workspaceRealPath = await fs9.realpath(workspaceRoot);
10722
10784
  const errorMessage = "Warning: You are running Gemini CLI in the root directory. Your entire folder structure will be used for context. It is strongly recommended to run in a project-specific directory.";
10723
- if (path9.dirname(workspaceRealPath) === workspaceRealPath) {
10785
+ if (path10.dirname(workspaceRealPath) === workspaceRealPath) {
10724
10786
  return errorMessage;
10725
10787
  }
10726
10788
  return null;
@@ -11118,7 +11180,7 @@ async function runNonInteractive({
11118
11180
  }
11119
11181
  });
11120
11182
  if (process.env["GEMINI_CLI_ACTIVITY_LOG_TARGET"]) {
11121
- const { setupInitialActivityLogger } = await import("./devtoolsService-J5IMHON6.js");
11183
+ const { setupInitialActivityLogger } = await import("./devtoolsService-TEWMGXKI.js");
11122
11184
  setupInitialActivityLogger(config);
11123
11185
  }
11124
11186
  const { stdout: workingStdout } = createWorkingStdio();
@@ -11628,7 +11690,7 @@ async function runNonInteractive2(params) {
11628
11690
  }
11629
11691
  });
11630
11692
  if (process.env["GEMINI_CLI_ACTIVITY_LOG_TARGET"]) {
11631
- const { setupInitialActivityLogger } = await import("./devtoolsService-J5IMHON6.js");
11693
+ const { setupInitialActivityLogger } = await import("./devtoolsService-TEWMGXKI.js");
11632
11694
  setupInitialActivityLogger(config);
11633
11695
  }
11634
11696
  const { stdout: workingStdout } = createWorkingStdio();
@@ -13619,7 +13681,7 @@ import { randomUUID as randomUUID2 } from "node:crypto";
13619
13681
 
13620
13682
  // packages/cli/src/acp/acpSession.ts
13621
13683
  import * as fs12 from "node:fs/promises";
13622
- import * as path12 from "node:path";
13684
+ import * as path13 from "node:path";
13623
13685
  import { randomUUID } from "node:crypto";
13624
13686
 
13625
13687
  // packages/cli/src/acp/commands/commandRegistry.ts
@@ -14061,7 +14123,7 @@ var UpdateExtensionCommand = class {
14061
14123
 
14062
14124
  // packages/cli/src/acp/commands/init.ts
14063
14125
  import * as fs10 from "node:fs";
14064
- import * as path10 from "node:path";
14126
+ import * as path11 from "node:path";
14065
14127
  var InitCommand = class {
14066
14128
  name = "init";
14067
14129
  description = "Analyzes the project and creates a tailored GEMINI.md file";
@@ -14071,7 +14133,7 @@ var InitCommand = class {
14071
14133
  if (!targetDir) {
14072
14134
  throw new Error("Command requires a workspace.");
14073
14135
  }
14074
- const geminiMdPath = path10.join(targetDir, "GEMINI.md");
14136
+ const geminiMdPath = path11.join(targetDir, "GEMINI.md");
14075
14137
  const result = performInit(fs10.existsSync(geminiMdPath));
14076
14138
  switch (result.type) {
14077
14139
  case "message":
@@ -14104,7 +14166,7 @@ ${result.content}`
14104
14166
 
14105
14167
  // packages/cli/src/acp/commands/restore.ts
14106
14168
  import * as fs11 from "node:fs/promises";
14107
- import * as path11 from "node:path";
14169
+ import * as path12 from "node:path";
14108
14170
  var RestoreCommand = class {
14109
14171
  name = "restore";
14110
14172
  description = "Restore to a previous checkpoint, or list available checkpoints to restore. This will reset the conversation and file history to the state it was in when the checkpoint was created";
@@ -14126,7 +14188,7 @@ var RestoreCommand = class {
14126
14188
  }
14127
14189
  const selectedFile = argsStr.endsWith(".json") ? argsStr : `${argsStr}.json`;
14128
14190
  const checkpointDir = config.storage.getProjectTempCheckpointsDir();
14129
- const filePath = path11.join(checkpointDir, selectedFile);
14191
+ const filePath = path12.join(checkpointDir, selectedFile);
14130
14192
  let data;
14131
14193
  try {
14132
14194
  data = await fs11.readFile(filePath, "utf-8");
@@ -14200,7 +14262,7 @@ var ListCheckpointsCommand = class {
14200
14262
  }
14201
14263
  const checkpointFiles = /* @__PURE__ */ new Map();
14202
14264
  for (const file of jsonFiles) {
14203
- const filePath = path11.join(checkpointDir, file);
14265
+ const filePath = path12.join(checkpointDir, file);
14204
14266
  const data = await fs11.readFile(filePath, "utf-8");
14205
14267
  checkpointFiles.set(file, data);
14206
14268
  }
@@ -15462,7 +15524,7 @@ ${event.value.description}`;
15462
15524
  } else if (result.status === "invalid") {
15463
15525
  continue;
15464
15526
  } else {
15465
- absolutePath = path12.resolve(
15527
+ absolutePath = path13.resolve(
15466
15528
  this.context.config.getTargetDir(),
15467
15529
  pathName
15468
15530
  );
@@ -15536,7 +15598,7 @@ ${event.value.description}`;
15536
15598
  }
15537
15599
  try {
15538
15600
  if (!validationError) {
15539
- if ((path12.isAbsolute(pathName) || !isWithinRoot(
15601
+ if ((path13.isAbsolute(pathName) || !isWithinRoot(
15540
15602
  absolutePath,
15541
15603
  this.context.config.getTargetDir()
15542
15604
  )) && !readDirectly) {
@@ -15640,7 +15702,7 @@ ${contentToPush}`;
15640
15702
  const lines = globResult.llmContent.split("\n");
15641
15703
  if (lines.length > 1 && lines[1]) {
15642
15704
  const firstMatchAbsolute = lines[1].trim();
15643
- currentPathSpec = path12.relative(
15705
+ currentPathSpec = path13.relative(
15644
15706
  this.context.config.getTargetDir(),
15645
15707
  firstMatchAbsolute
15646
15708
  );
@@ -15858,7 +15920,7 @@ Content from @${contextPart.uri}:
15858
15920
 
15859
15921
  // packages/cli/src/acp/acpFileSystemService.ts
15860
15922
  import os5 from "node:os";
15861
- import path13 from "node:path";
15923
+ import path14 from "node:path";
15862
15924
  var AcpFileSystemService = class {
15863
15925
  constructor(connection, sessionId, capabilities, fallback, root) {
15864
15926
  this.connection = connection;
@@ -15867,7 +15929,7 @@ var AcpFileSystemService = class {
15867
15929
  this.fallback = fallback;
15868
15930
  this.root = root;
15869
15931
  }
15870
- geminiDir = path13.join(os5.homedir(), ".gemini");
15932
+ geminiDir = path14.join(os5.homedir(), ".gemini");
15871
15933
  shouldUseFallback(filePath) {
15872
15934
  return !isWithinRoot(filePath, this.root) || isWithinRoot(filePath, this.geminiDir);
15873
15935
  }
@@ -16503,7 +16565,7 @@ async function setupTerminalAndTheme(config, settings) {
16503
16565
 
16504
16566
  // packages/cli/src/utils/logCleanup.ts
16505
16567
  import { promises as fs13 } from "node:fs";
16506
- import * as path14 from "node:path";
16568
+ import * as path15 from "node:path";
16507
16569
  var RETENTION_PERIOD_MS = 7 * 24 * 60 * 60 * 1e3;
16508
16570
  async function cleanupBackgroundLogs(debugMode = false) {
16509
16571
  try {
@@ -16518,7 +16580,7 @@ async function cleanupBackgroundLogs(debugMode = false) {
16518
16580
  let deletedCount = 0;
16519
16581
  for (const entry of entries) {
16520
16582
  if (entry.isFile() && entry.name.endsWith(".log")) {
16521
- const filePath = path14.join(logDir, entry.name);
16583
+ const filePath = path15.join(logDir, entry.name);
16522
16584
  try {
16523
16585
  const stats = await fs13.stat(filePath);
16524
16586
  if (now - stats.mtime.getTime() > RETENTION_PERIOD_MS) {
@@ -16769,8 +16831,8 @@ async function resolveSessionId(resumeArg, sessionIdArg, sessionFileArg) {
16769
16831
  sessionData.projectHash = getProjectHash(storage.getProjectRoot());
16770
16832
  sessionData.startTime = isoNow;
16771
16833
  sessionData.lastUpdated = isoNow;
16772
- const chatsDir = path15.join(storage.getProjectTempDir(), "chats");
16773
- const newSessionPath = path15.join(
16834
+ const chatsDir = path16.join(storage.getProjectTempDir(), "chats");
16835
+ const newSessionPath = path16.join(
16774
16836
  chatsDir,
16775
16837
  `session-${now}-${newSessionId.slice(0, 8)}.jsonl`
16776
16838
  );
@@ -16838,7 +16900,7 @@ async function resolveSessionId(resumeArg, sessionIdArg, sessionFileArg) {
16838
16900
  }
16839
16901
  }
16840
16902
  async function startInteractiveUI(config, settings, startupWarnings, workspaceRoot = process.cwd(), resumedSessionData, initializationResult) {
16841
- const { startInteractiveUI: doStartUI } = await import("./interactiveCli-NC7ZBX74.js");
16903
+ const { startInteractiveUI: doStartUI } = await import("./interactiveCli-NQE3X2WY.js");
16842
16904
  await doStartUI(
16843
16905
  config,
16844
16906
  settings,
@@ -17047,7 +17109,7 @@ ${finalArgs[promptIndex + 1]}`;
17047
17109
  await config.storage.initialize();
17048
17110
  adminControlsListner.setConfig(config);
17049
17111
  if (config.isInteractive() && settings.merged.general.devtools) {
17050
- const { setupInitialActivityLogger } = await import("./devtoolsService-J5IMHON6.js");
17112
+ const { setupInitialActivityLogger } = await import("./devtoolsService-TEWMGXKI.js");
17051
17113
  setupInitialActivityLogger(config);
17052
17114
  }
17053
17115
  registerTelemetryConfig(config);
@@ -17106,7 +17168,7 @@ ${finalArgs[promptIndex + 1]}`;
17106
17168
  const initAppHandle = startupProfiler.start("initialize_app");
17107
17169
  const initializationResult = await initializeApp(config, settings);
17108
17170
  initAppHandle?.end();
17109
- import("./liteRtServerManager-JSW26OPJ.js").then(({ LiteRtServerManager }) => {
17171
+ import("./liteRtServerManager-5YXPHG3Q.js").then(({ LiteRtServerManager }) => {
17110
17172
  const mergedGemma = settings.merged.experimental?.gemmaModelRouter;
17111
17173
  if (!mergedGemma) return;
17112
17174
  const userGemma = settings.forScope("User" /* User */).settings.experimental?.gemmaModelRouter;
package/bundle/gemini.js CHANGED
@@ -4,10 +4,10 @@ import {
4
4
  RELAUNCH_EXIT_CODE,
5
5
  getScriptArgs,
6
6
  getSpawnConfig
7
- } from "./chunk-WET7Q2Z2.js";
8
- import "./chunk-3QU7MFQ7.js";
9
- import "./chunk-YMZA4EO3.js";
10
- import "./chunk-M24MUPYL.js";
7
+ } from "./chunk-PJREBWY3.js";
8
+ import "./chunk-4IIDTAFR.js";
9
+ import "./chunk-GFHSA4BE.js";
10
+ import "./chunk-M6NSK26M.js";
11
11
  import "./chunk-664ZODQF.js";
12
12
  import "./chunk-IUUIT4SU.js";
13
13
  import "./chunk-TUDYL3X4.js";
@@ -115,9 +115,9 @@ ${error instanceof Error ? error.stack ?? error.message : String(error)}
115
115
  }
116
116
  }
117
117
  } else {
118
- const { main } = await import("./gemini-RLSAAMB2.js");
119
- const { FatalError, writeToStderr } = await import("./dist-IYMU3MAT.js");
120
- const { runExitCleanup } = await import("./cleanup-GWIY2YES.js");
118
+ const { main } = await import("./gemini-LUNNHKPJ.js");
119
+ const { FatalError, writeToStderr } = await import("./dist-PD4ABRTS.js");
120
+ const { runExitCleanup } = await import("./cleanup-XYVEFB7E.js");
121
121
  main().catch(async (error) => {
122
122
  const cleanupTimeout = setTimeout(() => {
123
123
  writeToStderr("Cleanup timed out, forcing exit...\n");
@@ -157,10 +157,10 @@ import {
157
157
  widestLineFromStyledChars,
158
158
  wordBreakStyledChars,
159
159
  wrapStyledChars
160
- } from "./chunk-A6IXIFRW.js";
160
+ } from "./chunk-GNCCSIBA.js";
161
161
  import {
162
162
  require_source
163
- } from "./chunk-4YTSRQAI.js";
163
+ } from "./chunk-RZALYEQN.js";
164
164
  import {
165
165
  appEvents
166
166
  } from "./chunk-5PS3AYFU.js";
@@ -214,24 +214,24 @@ import {
214
214
  stripAnsi,
215
215
  stripUnsafeCharacters,
216
216
  toCodePoints
217
- } from "./chunk-BOGYC66X.js";
217
+ } from "./chunk-OCLZG6C5.js";
218
218
  import {
219
219
  handleAutoUpdate,
220
220
  isDevelopment,
221
221
  relaunchApp,
222
222
  setUpdateHandler
223
- } from "./chunk-WET7Q2Z2.js";
223
+ } from "./chunk-PJREBWY3.js";
224
224
  import {
225
225
  isTodoList,
226
226
  mapCoreStatusToDisplayStatus,
227
227
  require_react
228
- } from "./chunk-3QU7MFQ7.js";
228
+ } from "./chunk-4IIDTAFR.js";
229
229
  import {
230
230
  registerCleanup,
231
231
  removeCleanup,
232
232
  runExitCleanup,
233
233
  setupTtyCheck
234
- } from "./chunk-YMZA4EO3.js";
234
+ } from "./chunk-GFHSA4BE.js";
235
235
  import {
236
236
  ACTIVATE_SKILL_TOOL_NAME,
237
237
  AGENT_TOOL_NAME,
@@ -437,7 +437,7 @@ import {
437
437
  validatePlanContent,
438
438
  validatePlanPath,
439
439
  writeToStdout
440
- } from "./chunk-M24MUPYL.js";
440
+ } from "./chunk-M6NSK26M.js";
441
441
  import "./chunk-664ZODQF.js";
442
442
  import "./chunk-IUUIT4SU.js";
443
443
  import "./chunk-TUDYL3X4.js";
@@ -33964,7 +33964,7 @@ ${queuedText}` : queuedText;
33964
33964
  if (keyMatchers["app.showErrorDetails" /* SHOW_ERROR_DETAILS */](key)) {
33965
33965
  if (settings.merged.general.devtools) {
33966
33966
  void (async () => {
33967
- const { toggleDevToolsPanel } = await import("./devtoolsService-R3332TAT.js");
33967
+ const { toggleDevToolsPanel } = await import("./devtoolsService-J7SM2WQQ.js");
33968
33968
  await toggleDevToolsPanel(
33969
33969
  config,
33970
33970
  showErrorDetails,