summaryrefslogtreecommitdiff
path: root/scripts/sandbox_command.js
diff options
context:
space:
mode:
authormatt korwel <[email protected]>2025-06-09 12:19:42 -0700
committerGitHub <[email protected]>2025-06-09 12:19:42 -0700
commit3b943c1582026bdf65feb13a73259ce0e034ab2f (patch)
tree3368aa85053b8599fe1fb1349383736890ea73e0 /scripts/sandbox_command.js
parent2182a1cd2cb83071b9defad2314a689d773363e7 (diff)
Windows: Refactor Shell Scripts to Node.js for Cross-Platform Compatibility (#784)
Diffstat (limited to 'scripts/sandbox_command.js')
-rw-r--r--scripts/sandbox_command.js126
1 files changed, 126 insertions, 0 deletions
diff --git a/scripts/sandbox_command.js b/scripts/sandbox_command.js
new file mode 100644
index 00000000..7f8e8381
--- /dev/null
+++ b/scripts/sandbox_command.js
@@ -0,0 +1,126 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { execSync } from 'child_process';
+import { existsSync, readFileSync } from 'fs';
+import { join, dirname } from 'path';
+import os from 'os';
+import yargs from 'yargs';
+import { hideBin } from 'yargs/helpers';
+import dotenv from 'dotenv';
+
+const argv = yargs(hideBin(process.argv)).option('q', {
+ alias: 'quiet',
+ type: 'boolean',
+ default: false,
+}).argv;
+
+let geminiSandbox = process.env.GEMINI_SANDBOX;
+
+if (!geminiSandbox) {
+ const userSettingsFile = join(os.homedir(), '.gemini', 'settings.json');
+ if (existsSync(userSettingsFile)) {
+ const settings = JSON.parse(readFileSync(userSettingsFile, 'utf-8'));
+ if (settings.sandbox) {
+ geminiSandbox = settings.sandbox;
+ }
+ }
+}
+
+if (!geminiSandbox) {
+ let currentDir = process.cwd();
+ while (currentDir !== '/') {
+ const geminiEnv = join(currentDir, '.gemini', '.env');
+ const regularEnv = join(currentDir, '.env');
+ if (existsSync(geminiEnv)) {
+ dotenv.config({ path: geminiEnv });
+ break;
+ } else if (existsSync(regularEnv)) {
+ dotenv.config({ path: regularEnv });
+ break;
+ }
+ currentDir = dirname(currentDir);
+ }
+ geminiSandbox = process.env.GEMINI_SANDBOX;
+}
+
+if (process.env.GEMINI_CODE_SANDBOX) {
+ console.warn(
+ 'WARNING: GEMINI_CODE_SANDBOX is deprecated. Use GEMINI_SANDBOX instead.',
+ );
+ geminiSandbox = process.env.GEMINI_CODE_SANDBOX;
+}
+
+geminiSandbox = (geminiSandbox || '').toLowerCase();
+
+const commandExists = (cmd) => {
+ const checkCommand = os.platform() === 'win32' ? 'where' : 'command -v';
+ try {
+ execSync(`${checkCommand} ${cmd}`, { stdio: 'ignore' });
+ return true;
+ } catch {
+ if (os.platform() === 'win32') {
+ try {
+ execSync(`${checkCommand} ${cmd}.exe`, { stdio: 'ignore' });
+ return true;
+ } catch {
+ return false;
+ }
+ }
+ return false;
+ }
+};
+
+let command = '';
+if (['1', 'true'].includes(geminiSandbox)) {
+ if (commandExists('docker')) {
+ command = 'docker';
+ } else if (commandExists('podman')) {
+ command = 'podman';
+ } else {
+ console.error(
+ 'ERROR: install docker or podman or specify command in GEMINI_SANDBOX',
+ );
+ process.exit(1);
+ }
+} else if (geminiSandbox && !['0', 'false'].includes(geminiSandbox)) {
+ if (commandExists(geminiSandbox)) {
+ command = geminiSandbox;
+ } else {
+ console.error(
+ `ERROR: missing sandbox command '${geminiSandbox}' (from GEMINI_SANDBOX)`,
+ );
+ process.exit(1);
+ }
+} else {
+ if (os.platform() === 'darwin' && process.env.SEATBELT_PROFILE !== 'none') {
+ if (commandExists('sandbox-exec')) {
+ command = 'sandbox-exec';
+ } else {
+ process.exit(1);
+ }
+ } else {
+ process.exit(1);
+ }
+}
+
+if (!argv.q) {
+ console.log(command);
+}
+process.exit(0);