Commit Graph

1464 Commits

Author SHA1 Message Date
Michael Bolin
7930bb835c merge commit for archive created by Sapling 2025-05-23 09:56:22 -07:00
Michael Bolin
06dc2113a6 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-23 09:56:16 -07:00
Michael Bolin
ee1c53dd85 merge commit for archive created by Sapling 2025-05-23 09:47:09 -07:00
Michael Bolin
24e2180f21 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-23 09:47:02 -07:00
Michael Bolin
0bb7fccc1c merge commit for archive created by Sapling 2025-05-22 23:29:48 -07:00
Michael Bolin
a2cc00b5d1 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 23:29:27 -07:00
Michael Bolin
d1de7bb383 feat: add codex_linux_sandbox_exe: Option<PathBuf> field to Config (#1089)
https://github.com/openai/codex/pull/1086 is a work-in-progress to make
Linux sandboxing work more like Seatbelt where, for the command we want
to sandbox, we build up the command and then hand it, and some sandbox
configuration flags, to another command to set up the sandbox and then
run it.

In the case of Seatbelt, macOS provides this helper binary and provides
it at `/usr/bin/sandbox-exec`. For Linux, we have to build our own and
pass it through (which is what #1086 does), so this makes the new
`codex_linux_sandbox_exe` available on `Config` so that it will later be
available in `exec.rs` when we need it in #1086.
2025-05-22 21:52:28 -07:00
Michael Bolin
f79473c187 merge commit for archive created by Sapling 2025-05-22 21:46:55 -07:00
Michael Bolin
6f7c6142f8 feat: add codex_linux_sandbox_exe: Option<PathBuf> field to Config 2025-05-22 21:46:48 -07:00
Michael Bolin
21fd1581c2 merge commit for archive created by Sapling 2025-05-22 20:39:49 -07:00
Michael Bolin
c11c9ccd09 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 20:39:43 -07:00
Michael Bolin
bbb9d7d8fb merge commit for archive created by Sapling 2025-05-22 19:58:28 -07:00
Michael Bolin
b730b6966a fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 19:58:24 -07:00
Michael Bolin
833ca8de2e merge commit for archive created by Sapling 2025-05-22 16:31:27 -07:00
Michael Bolin
1b90211ab8 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 16:31:18 -07:00
Michael Bolin
3341e0a4a2 merge commit for archive created by Sapling 2025-05-22 16:21:30 -07:00
Michael Bolin
6dbf14e8cb fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 16:21:24 -07:00
Michael Bolin
8f2d6b3c56 merge commit for archive created by Sapling 2025-05-22 15:50:24 -07:00
Michael Bolin
b5ae657fad fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 15:50:18 -07:00
Michael Bolin
f9512fe074 merge commit for archive created by Sapling 2025-05-22 15:37:45 -07:00
Michael Bolin
c992c438d8 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 15:37:39 -07:00
Michael Bolin
468587c9f1 merge commit for archive created by Sapling 2025-05-22 15:30:31 -07:00
Michael Bolin
4fc56ca54b fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 15:30:18 -07:00
Michael Bolin
02702f4495 merge commit for archive created by Sapling 2025-05-22 14:56:53 -07:00
Michael Bolin
7ae2f80bb7 fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 14:56:47 -07:00
Michael Bolin
052d76fcfd merge commit for archive created by Sapling 2025-05-22 14:48:21 -07:00
Michael Bolin
f7004111ae fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 14:48:15 -07:00
Michael Bolin
ae0466b302 Merge 05679ff99a into sapling-pr-archive-bolinfest 2025-05-22 14:47:31 -07:00
Michael Bolin
05679ff99a fix: overhaul how we spawn commands under seccomp/landlock on Linux 2025-05-22 14:47:02 -07:00
Michael Bolin
63deb7c369 fix: for the @native release of the Node module, use the Rust version by default (#1084)
Added logic so that when we run `./scripts/stage_release.sh --native`
(for the `@native` version of the Node module), we drop a `use-native`
file next to `codex.js`. If present, `codex.js` will now run the Rust
CLI.

Ran `./scripts/stage_release.sh --native` and verified that when the
running `codex.js` in the staged folder:

```
$ /var/folders/wm/f209bc1n2bd_r0jncn9s6j_00000gp/T/tmp.efvEvBlSN6/bin/codex.js --version
codex-cli 0.0.2505220956
```

it ran the expected Rust version of the CLI, as desired.

While here, I also updated the Rust version to one that I cut today,
which includes the new shell environment policy config option:
https://github.com/openai/codex/pull/1061. Note this may "break" some
users if the processes spawned by Codex need extra environment
variables. (We are still working to determine what the right defaults
should be for this option.)
2025-05-22 13:42:55 -07:00
Michael Bolin
852513bb14 Merge a93042411d into sapling-pr-archive-bolinfest 2025-05-22 13:37:58 -07:00
Michael Bolin
a93042411d fix: for the @native release of the Node module, use the Rust version by default 2025-05-22 13:37:53 -07:00
Michael Bolin
89766a9629 Merge ba4f2695c0 into sapling-pr-archive-bolinfest 2025-05-22 13:33:57 -07:00
Michael Bolin
ba4f2695c0 fix: for the @native release of the Node module, use the Rust version by default 2025-05-22 13:33:51 -07:00
Michael Bolin
cb379d7797 feat: introduce support for shell_environment_policy in config.toml (#1061)
To date, when handling `shell` and `local_shell` tool calls, we were
spawning new processes using the environment inherited from the Codex
process itself. This means that the sensitive `OPENAI_API_KEY` that
Codex needs to talk to OpenAI models was made available to everything
run by `shell` and `local_shell`. While there are cases where that might
be useful, it does not seem like a good default.

This PR introduces a complex `shell_environment_policy` config option to
control the `env` used with these tool calls. It is inevitably a bit
complex so that it is possible to override individual components of the
policy so without having to restate the entire thing.

Details are in the updated `README.md` in this PR, but here is the
relevant bit that explains the individual fields of
`shell_environment_policy`:

| Field | Type | Default | Description |
| ------------------------- | -------------------------- | ------- |
-----------------------------------------------------------------------------------------------------------------------------------------------
|
| `inherit` | string | `core` | Starting template for the
environment:<br>`core` (`HOME`, `PATH`, `USER`, …), `all` (clone full
parent env), or `none` (start empty). |
| `ignore_default_excludes` | boolean | `false` | When `false`, Codex
removes any var whose **name** contains `KEY`, `SECRET`, or `TOKEN`
(case-insensitive) before other rules run. |
| `exclude` | array&lt;string&gt; | `[]` | Case-insensitive glob
patterns to drop after the default filter.<br>Examples: `"AWS_*"`,
`"AZURE_*"`. |
| `set` | table&lt;string,string&gt; | `{}` | Explicit key/value
overrides or additions – always win over inherited values. |
| `include_only` | array&lt;string&gt; | `[]` | If non-empty, a
whitelist of patterns; only variables that match _one_ pattern survive
the final step. (Generally used with `inherit = "all"`.) |


In particular, note that the default is `inherit = "core"`, so:

* if you have extra env variables that you want to inherit from the
parent process, use `inherit = "all"` and then specify `include_only`
* if you have extra env variables where you want to hardcode the values,
the default `inherit = "core"` will work fine, but then you need to
specify `set`

This configuration is not battle-tested, so we will probably still have
to play with it a bit. `core/src/exec_env.rs` has the critical business
logic as well as unit tests.

Though if nothing else, previous to this change:

```
$ cargo run --bin codex -- debug seatbelt -- printenv OPENAI_API_KEY
# ...prints OPENAI_API_KEY...
```

But after this change it does not print anything (as desired).

One final thing to call out about this PR is that the
`configure_command!` macro we use in `core/src/exec.rs` has to do some
complex logic with respect to how it builds up the `env` for the process
being spawned under Landlock/seccomp. Specifically, doing
`cmd.env_clear()` followed by `cmd.envs(&$env_map)` (which is arguably
the most intuitive way to do it) caused the Landlock unit tests to fail
because the processes spawned by the unit tests started failing in
unexpected ways! If we forgo `env_clear()` in favor of updating env vars
one at a time, the tests still pass. The comment in the code talks about
this a bit, and while I would like to investigate this more, I need to
move on for the moment, but I do plan to come back to it to fully
understand what is going on. For example, this suggests that we might
not be able to spawn a C program that calls `env_clear()`, which would
be...weird. We may still have to fiddle with our Landlock config if that
is the case.
codex-rs-6a77484c94956d5cd319da3f8500b178ec93fc90-1-rust-v0.0.2505220956
2025-05-22 09:51:19 -07:00
Michael Bolin
f3f0a52e11 merge commit for archive created by Sapling 2025-05-22 09:41:49 -07:00
Michael Bolin
cdba9bff41 feat: introduce support for shell_environment_policy in config.toml 2025-05-22 09:41:38 -07:00
Michael Bolin
1cd9cd2757 merge commit for archive created by Sapling 2025-05-22 09:25:36 -07:00
Michael Bolin
25614adc3c feat: introduce support for shell_environment_policy in config.toml 2025-05-22 09:25:30 -07:00
Michael Bolin
b651d0d0a2 Merge e9cb029000 into sapling-pr-archive-bolinfest 2025-05-21 23:04:22 -07:00
Michael Bolin
e9cb029000 feat: introduce support for shell_environment_policy in config.toml 2025-05-21 23:03:52 -07:00
Michael Bolin
ef7208359f feat: show Config overview at start of exec (#1073)
Now the `exec` output starts with something like:

```
--------
workdir:  /Users/mbolin/code/codex/codex-rs
model:  o3
provider:  openai
approval:  Never
sandbox:  SandboxPolicy { permissions: [DiskFullReadAccess, DiskWritePlatformUserTempFolder, DiskWritePlatformGlobalTempFolder, DiskWriteCwd, DiskWriteFolder { folder: "/Users/mbolin/.pyenv/shims" }] }
--------
```

which makes it easier to reason about when looking at logs.
codex-rs-79cb07bf70a9036200aa2b61b211fe47ea13184a-1-rust-v0.0.2505212314
2025-05-21 22:53:02 -07:00
Michael Bolin
3e01e37362 merge commit for archive created by Sapling 2025-05-21 22:45:54 -07:00
Michael Bolin
7cdd8176ed feat: introduce support for shell_environment_policy in config.toml 2025-05-21 22:45:49 -07:00
Michael Bolin
2b5b341446 Merge 52bcd59147 into sapling-pr-archive-bolinfest 2025-05-21 22:42:32 -07:00
Michael Bolin
52bcd59147 feat: introduce support for shell_environment_policy in config.toml 2025-05-21 22:42:28 -07:00
Michael Bolin
516040b382 Merge 7a06b5d318 into sapling-pr-archive-bolinfest 2025-05-21 22:38:07 -07:00
Michael Bolin
7a06b5d318 feat: show Config overview at start of exec 2025-05-21 22:37:59 -07:00
Michael Bolin
b7d987118f merge commit for archive created by Sapling 2025-05-21 22:30:49 -07:00
Michael Bolin
c6069765bc feat: introduce support for shell_environment_policy in config.toml 2025-05-21 22:30:43 -07:00