diff --git a/src/providers/codex.test.ts b/src/providers/codex.test.ts index a5acf5bd..b9070d60 100644 --- a/src/providers/codex.test.ts +++ b/src/providers/codex.test.ts @@ -906,6 +906,7 @@ Deno.test("codex provider skips sandbox config when yolo env is enabled", () => cwd: "/tmp/test-cwd", }); const joined = args.join(" "); + assertEquals(joined.includes("--yolo"), true); assertEquals(joined.includes('approval_policy="never"'), true); assertEquals(joined.includes('sandbox_mode="workspace-write"'), false); assertEquals( @@ -921,6 +922,27 @@ Deno.test("codex provider skips sandbox config when yolo env is enabled", () => } }); +Deno.test("codex provider skips sandbox config when additionalParams.codex.skip_sandbox_config is true", () => { + const args = parseCodexArgsForTest({ + model: "codex-cli/default", + messages: [{ role: "user", content: "hi" }], + cwd: "/tmp/test-cwd", + params: { + codex: { + skip_sandbox_config: true, + }, + }, + }); + const joined = args.join(" "); + assertEquals(joined.includes("--yolo"), true); + assertEquals(joined.includes('approval_policy="never"'), true); + assertEquals(joined.includes('sandbox_mode="workspace-write"'), false); + assertEquals( + joined.includes("sandbox_workspace_write.writable_roots"), + false, + ); +}); + Deno.test("codex provider omits MCP root deck env when deck path is absent", () => { const args = parseCodexArgsForTest({ model: "codex-cli/default", diff --git a/src/providers/codex.ts b/src/providers/codex.ts index 42be1821..23ff40c3 100644 --- a/src/providers/codex.ts +++ b/src/providers/codex.ts @@ -120,6 +120,11 @@ function shouldSkipCodexSandboxConfig( ): boolean { const yolo = params?.gambitYolo; if (typeof yolo === "boolean") return yolo; + const codex = asRecord(params?.codex); + const codexSkipSandboxConfig = codex.skip_sandbox_config; + if (typeof codexSkipSandboxConfig === "boolean") { + return codexSkipSandboxConfig; + } const envRaw = Deno.env.get(CODEX_SKIP_SANDBOX_CONFIG_ENV); return Boolean(envRaw && parseTruthy(envRaw)); } @@ -1154,6 +1159,7 @@ export function createCodexProvider(opts?: { priorThreadId, }); const cwd = runCwd(); + const skipSandboxConfig = shouldSkipCodexSandboxConfig(input.params); const args = priorThreadId ? [ "exec", @@ -1162,6 +1168,9 @@ export function createCodexProvider(opts?: { "--json", ] : ["exec", "--skip-git-repo-check", "--json"]; + if (skipSandboxConfig) { + args.push("--yolo"); + } args.push( ...codexConfigArgs({ cwd, @@ -1410,9 +1419,13 @@ export function parseCodexArgsForTest(input: { messages: input.messages, priorThreadId, }); + const skipSandboxConfig = shouldSkipCodexSandboxConfig(input.params); const args = priorThreadId ? ["exec", "resume", "--skip-git-repo-check", "--json"] : ["exec", "--skip-git-repo-check", "--json"]; + if (skipSandboxConfig) { + args.push("--yolo"); + } args.push( ...codexConfigArgs({ cwd: input.cwd ?? runCwd(),