- Supported models can now request full-resolution image inspection through both `view_image` and `codex.emitImage(..., detail: "original")`, which helps with precision visual tasks. (#14175) - `js_repl` now exposes `codex.cwd` and `codex.homeDir`, and saved `codex.tool(...)` / `codex.emitImage(...)` references keep working across cells. (#14385, #14503) - Realtime websocket sessions gained a dedicated transcription mode, plus v2 handoff support through the `codex` tool, with a unified `[realtime]` session config. (#14554, #14556, #14606) - The v2 app-server now exposes filesystem RPCs for file reads, writes, copies, directory operations, and path watching, and there is a new Python SDK for integrating with that API. (#14245, #14435) - Smart Approvals can now route review requests through a guardian subagent in core, app-server, and TUI, reducing repeated setup work on follow-up approvals. (#13860, #14668) - App integrations now use the Responses API tool-search flow, can suggest missing tools, and fall back cleanly when the active model does not support search-based lookup. (#14274, #14287, #14732) ## Bug Fixes - Spawned subagents now inherit sandbox and network rules more reliably, including project-profile layering, persisted host approvals, and symlinked writable roots. (#14619, #14650, #14674, #14807) - `js_repl` no longer hangs when dynamic tool responses contain literal U+2028 or U+2029 characters. (#14421) - The TUI no longer stalls on exit after creating subagents, and interrupting a turn no longer tears down background terminals by default. (#14816, #14602) - `codex exec --profile` once again preserves profile-scoped settings when starting or resuming a thread. (#14524) - MCP and elicitation flows are more robust, with safer tool-name normalization and preserved `tool_params` in approval prompts. (#14491, #14605, #14769) - The local network proxy now serves CONNECT traffic as explicit HTTP/1, improving compatibility with HTTP proxy clients. (#14395) ## Chores - The subagent wait tool is now consistently named `wait_agent`, aligning it with `spawn_agent` and `send_input`. (#14631) ## Changelog Full Changelog: https://github.com/openai/codex/compare/rust-v0.114.0...rust-v0.115.0 - #14395 fix(network-proxy): serve HTTP proxy listener as HTTP/1 @viyatb-oai - #14385 Add js_repl cwd and homeDir helpers @fjord-oai - #14376 Keep agent-switch word-motion keys out of draft editing @joshka-oai - #14175 Let models opt into original image detail @fjord-oai - #14382 check for large binaries in CI @owenlin0 - #14392 chore(app-server): stop emitting codex/event/ notifications @owenlin0 - #14274 feat: search_tool migrate to bring you own tool of Responses API @apanasenko-oai - #14174 refactor: centralize filesystem permissions precedence @viyatb-oai - #14394 chore(app-server): delete unused rpc methods from v1.rs @owenlin0 - #14171 fix: align core approvals with split sandbox policies @viyatb-oai - #14410 Make collab model metadata accurate on completion @aibrahim-oai - #14387 feat(app-server): propagate traces across tasks and core ops @owenlin0 - #14407 chore: use AVAILABLE and ON_INSTALL as default plugin install and auth policies @sayan-oai - #14287 [apps] Add tool_suggest tool. @mzeng-openai - #14432 Clarify spawn agent authorization @aibrahim-oai - #14295 Support waiting for code_mode sessions @pakrym-oai - #14427 feat: refactor on openai-curated plugins. @xl-openai - #13996 refactor: make bubblewrap the default Linux sandbox @viyatb-oai - #14440 fix: follow up on linux sandbox review nits @viyatb-oai - #14431 Handle pre-approved permissions in zsh fork @mousseau-oai - #14403 [elicitation] User-friendly tool call messages. @mzeng-openai - #14429 Use granted permissions when invoking apply_patch @mousseau-oai - #14471 Updated out-of-date tip about availability on free and go plans @etraut-openai - #14444 fix: move inline codex-rs/core unit tests into sibling files @bolinfest - #14437 Dispatch tools when code mode is not awaited directly @pakrym-oai - #14435 Add Python app-server SDK @shaqayeq-oai - #14473 fix(cli): support legacy use_linux_sandbox_bwrap flag @viyatb-oai - #13882 Fix stdio-to-uds peer-close flake @aibrahim-oai - #14476 Move code mode tool files under tools/code_mode and split functionality @pakrym-oai - #14475 rename spawn_csv feature flag to enable_fanout @daveaitel-openai - #14173 fix: preserve split filesystem semantics in linux sandbox @viyatb-oai - #14480 Cleanup code_mode tool descriptions @pakrym-oai - #14488 Handle malformed agent role definitions nonfatally @gabec-openai - #14398 Do not allow unified_exec for sandboxed scenarios on Windows @iceweasel-oai - #14419 use scopes_supported for OAuth when present on MCP servers @jgershen-oai - #14484 Add default code-mode yield timeout @pakrym-oai - #14494 Add parallel tool call test @pakrym-oai - #14478 chore(app-server): stop exporting EventMsg schemas @owenlin0 - #14490 fix turn_start_jsonrpc_span_parents_core_turn_spans flakiness @owenlin0 - #14496 Reuse tool runtime for code mode worker @pakrym-oai - #14421 Fix js_repl hangs on U+2028/U+2029 dynamic tool responses @aaronl-openai - #14505 Skip nested tool call parallel test on Windows @pakrym-oai - #14491 Fix MCP tool calling @pakrym-oai - #14493 memories: focus write prompts on user preferences @andi-oai - #14510 Rename exec session IDs to cell IDs @pakrym-oai - #14500 Update tool search prompts @mzeng-openai - #14426 Decouple request permissions feature and tool @mousseau-oai - #14503 Persist js_repl codex helpers across cells @fjord-oai - #14517 Expose code-mode tools through globals @pakrym-oai - #14502 feat(search_tool): gate search_tool on model supports_search_tool field @apanasenko-oai - #14521 Reapply "Pass more params to compaction" (#14298) @rasmusrygaard - #14524 Fix `codex exec --profile` handling @etraut-openai - #14516 Rename reject approval policy to granular @mousseau-oai - #14445 feat: add plugin/read. @xl-openai - #14178 login: add custom CA support for login flows @joshka-oai - #14535 Split multi-agent handlers per tool @pakrym-oai - #13329 [js_repl] Hard-stop active js_repl execs on explicit user interrupts @aaronl-openai - #14239 client: extend custom CA handling across HTTPS and websocket clients @joshka-oai - #14536 Add typed multi-agent tool outputs @pakrym-oai - #14514 fix: reopen writable linux carveouts under denied parents @viyatb-oai - #14531 Add plugin usage telemetry @alexsong-oai - #14511 code_mode: Move exec params from runtime declarations to @pragma @cconger - #14504 Refactor cloud requirements error and surface in JSON-RPC error @alexsong-oai - #14537 Add realtime v2 event parser behind feature flag @aibrahim-oai - #14529 Simplify permissions available in request permissions tool @mousseau-oai - #14522 feat: support skill-scoped managed network domain overrides in skill config @celia-oai - #14554 Add codex tool support for realtime v2 handoff @aibrahim-oai - #14556 Add realtime transcription mode for websocket sessions @aibrahim-oai - #14518 Add diagnostics for read_only_unless_trusted timeout flake @aibrahim-oai - #14603 Split multi-agent handler into dedicated files @pakrym-oai - #14526 code mode: single line tool declarations @pakrym-oai - #14400 Use a private desktop for Windows sandbox instead of Winsta0\Default @iceweasel-oai - #14558 sending back imagaegencall response back to responseapi @won-openai - #14553 Improve granular approval policy prompt @mousseau-oai - #14541 chore: clarify plugin + app copy in model instructions @sayan-oai - #14542 [bazel] Bump up cc and rust toolchains @zbarsky-openai - #14512 Start TUI on embedded app server @etraut-openai - #14606 Unify realtime v1/v2 session config @aibrahim-oai - #14527 app-server: Add platform os and family to init response @euroelessar - #14618 Use subagents naming in the TUI @aibrahim-oai - #14304 Override local apps settings with requirements.toml settings @canvrno-oai - #14479 feat(app-server, core): add more spans @owenlin0 - #13644 fix: preserve zsh-fork escalation fds across unified-exec spawn paths @bolinfest - #14617 Add code_mode_only feature @pakrym-oai - #13201 Slash copy osc52 wsl support @won-openai - #14631 Rename multi-agent wait tool to wait_agent @aibrahim-oai - #14622 Stabilize multi-agent feature flag @aibrahim-oai - #14245 app-server: add v2 filesystem APIs @euroelessar - #14605 Normalize MCP tool names to code-mode safe form @pakrym-oai - #14637 Fix wait_agent expectations in core tests @charley-oai - #13860 Add Smart Approvals guardian review across core, app-server, and TUI @charley-oai - #14639 Fix stale create_wait_tool reference @charley-oai - #14532 [hooks] stop continuation & stop_hook_active mechanics @eternal-openai - #14635 Fix realtime transcription session.update tools payload @aibrahim-oai - #14636 Use parser-specific realtime voice enum @aibrahim-oai - #14633 refactor: make unified-exec zsh-fork state explicit @bolinfest - #12031 Add openai_base_url config override for built-in provider @etraut-openai - #14645 Fix Windows CI assertions for guardian and Smart Approvals @aibrahim-oai - #14616 Fix turn context reconstruction after backtracking @charley-oai - #14619 fix: persist future network host approvals across sessions @viyatb-oai - #14650 fix: sync split sandbox policies for spawned subagents @viyatb-oai - #14609 move plugin/skill instructions into dev msg and reorder @sayan-oai - #12024 Enforce errors on overriding built-in model providers @etraut-openai - #14646 Refresh Python SDK generated types @sayan-oai - #14649 make defaultPrompt an array, keep backcompat @sayan-oai - #14501 dynamic tool calls: add param `exposeToContext` to optionally hide tool @cconger - #14651 Add argument-comment Dylint runner @bolinfest - #14674 fix: fix symlinked writable roots in sandbox policies @viyatb-oai - #14611 Add auth 401 recovery observability to client bug reports @ccy-oai - #14647 [apps] Add tool call meta. @mzeng-openai - #14732 [apps] Improve search tool fallback. @mzeng-openai - #14602 Preserve background terminals on interrupt and rename cleanup command to /stop @friel-openai - #14668 Reuse guardian session across approvals @charley-oai - #14769 fix(core): preserve tool_params for elicitations @mzeng-openai - #14807 fix: sub-agent role when using profiles @jif-oai - #14806 feat: improve skills cache key to take into account config layering @jif-oai - #13850 feat: make interrupt state not final for multi-agents @jif-oai - #14816 fix: tui freeze when sub-agents are present @jif-oai
Codex CLI (Rust Implementation)
We provide Codex CLI as a standalone, native executable to ensure a zero-dependency install.
Installing Codex
Today, the easiest way to install Codex is via npm:
npm i -g @openai/codex
codex
You can also install via Homebrew (brew install --cask codex) or download a platform-specific release directly from our GitHub Releases.
Documentation quickstart
- First run with Codex? Start with
docs/getting-started.md(links to the walkthrough for prompts, keyboard shortcuts, and session management). - Want deeper control? See
docs/config.mdanddocs/install.md.
What's new in the Rust CLI
The Rust implementation is now the maintained Codex CLI and serves as the default experience. It includes a number of features that the legacy TypeScript CLI never supported.
Config
Codex supports a rich set of configuration options. Note that the Rust CLI uses config.toml instead of config.json. See docs/config.md for details.
Model Context Protocol Support
MCP client
Codex CLI functions as an MCP client that allows the Codex CLI and IDE extension to connect to MCP servers on startup. See the configuration documentation for details.
MCP server (experimental)
Codex can be launched as an MCP server by running codex mcp-server. This allows other MCP clients to use Codex as a tool for another agent.
Use the @modelcontextprotocol/inspector to try it out:
npx @modelcontextprotocol/inspector codex mcp-server
Use codex mcp to add/list/get/remove MCP server launchers defined in config.toml, and codex mcp-server to run the MCP server directly.
Notifications
You can enable notifications by configuring a script that is run whenever the agent finishes a turn. The notify documentation includes a detailed example that explains how to get desktop notifications via terminal-notifier on macOS. When Codex detects that it is running under WSL 2 inside Windows Terminal (WT_SESSION is set), the TUI automatically falls back to native Windows toast notifications so approval prompts and completed turns surface even though Windows Terminal does not implement OSC 9.
codex exec to run Codex programmatically/non-interactively
To run Codex non-interactively, run codex exec PROMPT (you can also pass the prompt via stdin) and Codex will work on your task until it decides that it is done and exits. Output is printed to the terminal directly. You can set the RUST_LOG environment variable to see more about what's going on.
Use codex exec --ephemeral ... to run without persisting session rollout files to disk.
Experimenting with the Codex Sandbox
To test to see what happens when a command is run under the sandbox provided by Codex, we provide the following subcommands in Codex CLI:
# macOS
codex sandbox macos [--full-auto] [--log-denials] [COMMAND]...
# Linux
codex sandbox linux [--full-auto] [COMMAND]...
# Windows
codex sandbox windows [--full-auto] [COMMAND]...
# Legacy aliases
codex debug seatbelt [--full-auto] [--log-denials] [COMMAND]...
codex debug landlock [--full-auto] [COMMAND]...
Selecting a sandbox policy via --sandbox
The Rust CLI exposes a dedicated --sandbox (-s) flag that lets you pick the sandbox policy without having to reach for the generic -c/--config option:
# Run Codex with the default, read-only sandbox
codex --sandbox read-only
# Allow the agent to write within the current workspace while still blocking network access
codex --sandbox workspace-write
# Danger! Disable sandboxing entirely (only do this if you are already running in a container or other isolated env)
codex --sandbox danger-full-access
The same setting can be persisted in ~/.codex/config.toml via the top-level sandbox_mode = "MODE" key, e.g. sandbox_mode = "workspace-write".
In workspace-write, Codex also includes ~/.codex/memories in its writable roots so memory maintenance does not require an extra approval.
Code Organization
This folder is the root of a Cargo workspace. It contains quite a bit of experimental code, but here are the key crates:
core/contains the business logic for Codex. Ultimately, we hope this to be a library crate that is generally useful for building other Rust/native applications that use Codex.exec/"headless" CLI for use in automation.tui/CLI that launches a fullscreen TUI built with Ratatui.cli/CLI multitool that provides the aforementioned CLIs via subcommands.
If you want to contribute or inspect behavior in detail, start by reading the module-level README.md files under each crate and run the project workspace from the top-level codex-rs directory so shared config, features, and build scripts stay aligned.