OpenAI Codex CLI rust-v0.105.0

New Features - The TUI now syntax-highlights fenced code blocks and diffs, adds a /theme picker with live preview, and uses better theme-aware diff colors for light and dark terminals. (11447, 1258...

New Features - The TUI now syntax-highlights fenced code blocks and diffs, adds a /theme picker with live preview, and uses better theme-aware diff colors for light and dark terminals. (11447, 12581) - You can now dictate prompts by holding the spacebar to record and transcribe voice input directly in the TUI. (3381) - Multi-agent workflows are easier to run and track: spawnagentsoncsv can fan out work from a CSV with built-in progress/ETA, and sub-agents are easier to follow with nicknames, a cleaner picker, and visible child-thread approval prompts. (10935, 12320, 12327, 12332, 12570, 12767) - The TUI picked up new convenience commands: /copy copies the latest complete assistant reply, while /clear and Ctrl-L clear the screen without losing thread context, with /clear also able to start a fresh chat. (12444, 12520, 12613, 12628) - Approval controls are more flexible: Codex can now ask for extra sandbox permissions for a command, and you can auto-reject specific approval prompt types without turning approvals off entirely. (11871, 12087) - App-server clients can do more with threads: thread/list can search by title, thread status is exposed in read/list responses and notifications, and thread/resume returns the latest turn inline so reconnects are less lossy. (11776, 11786, 12578) Bug Fixes - Long links in the TUI stay clickable when wrapped, which also fixes related clipping and layout issues in several views. (12067) - Several TUI interaction edge cases were fixed: queued-message editing now works in more terminals, follow-up prompts no longer get stuck if you press Enter while a final answer is still streaming, and approval dialogs now respond with the correct request id. (12240, 12569, 12746) - @ parsing in the chat composer is more reliable, so commands like npx -y @scope/pkg@latest no longer accidentally open the file picker or block submission. (12643) - App-server websocket handling is more robust: thread listeners survive disconnects, Ctrl-C waits for in-flight turns before restarting, and websocket clients that send permessage-deflate can connect successfully. (12373, 12517, 12629) - Linux sandboxed commands now get a minimal /dev, fixing failures in tools that need entropy or other standard device nodes. (12081) - jsrepl now reports uncaught kernel failures more clearly, recovers cleanly afterward, and correctly attaches viewimage results from nested tool calls. (12636, 12725) Documentation - Added a public security policy with Bugcrowd reporting guidance. (12193) - Updated install and local workflow docs to use cargo install --locked cargo-nextest and to avoid routine --all-features builds unless you specifically need full feature coverage. (12377, 12429) Changelog Full Changelog: https://github.com/openai/codex/compare/rust-v0.104.0...rust-v0.105.0 - 12071 Use V2 websockets if feature enabled @pakrym-oai - 12052 feat(core): zsh exec bridge @owenlin0 - 12072 Add message phase to agent message thread item @mousseau-oai - 12077 got rid of experimentalmode for configtoml @won-openai - 12036 codex-api: realtime websocket session.create + typed inbound events @aibrahim-oai - 12073 Add model-visible context layout snapshot tests @charley-oai - 12096 Updated issue labeler script to include safety-check label @etraut-openai - 11944 [jsrepl] paths for node module resolution can be specified for jsrepl @aaronl-openai - 11798 fix: Restricted Read: /System is too permissive for macOS platform de… @leoshimo-oai - 12015 Enable default status line indicators in TUI config @jif-oai - 12124 feat: phase 1 and phase 2 e2e latencies @jif-oai - 12121 feat: phase 2 usage @jif-oai - 12120 feat: memory usage metrics @jif-oai - 12133 feat: validate agent config file paths @jif-oai - 12137 nit: change model for phase 1 @jif-oai - 12069 Stop filtering model tools in jsrepltoolsonly mode @fjord-oai - 12135 feat: better slug for rollout summaries @jif-oai - 12157 Disable collab tools during review delegation @jif-oai - 11802 Fixed a hole in token refresh logic for app server @etraut-openai - 12105 fix: file watcher @jif-oai - 12167 memories: bump rollout summary slug cap to 60 @zuxin-oai - 12177 jsrepl: canonicalize paths for nodemodules boundary checks @fjord-oai - 12025 app-server support for Windows sandbox setup. @iceweasel-oai - 12187 fix: Remove citation @zuxin-oai - 12180 [apps] Temporary app block. @mzeng-openai - 11786 app-server: expose loaded thread status via read/list and notifications @euroelessar - 12038 state: enforce 10 MiB log caps for thread and threadless process logs @charley-oai - 12203 Stabilize app-server detached review and running-resume tests @charley-oai - 12211 [apps] Update apps allowlist. @mzeng-openai - 12081 fix(linux-sandbox): mount /dev in bwrap sandbox @viyatb-oai - 12164 Update docs links for feature flag notice @etraut-openai - 12231 Adjust memories rollout defaults @jif-oai - 12152 feat: sub-agent injection @jif-oai - 12233 feat: add shell snapshot failure reason @jif-oai - 12193 docs: add codex security policy @viyatb-oai - 12228 feat: add configurable writestdin timeout @jif-oai - 11787 Adjust MCP tool approval handling for custom servers @colby-oai - 12179 Move previous turn context tracking into ContextManager history @charley-oai - 12244 Restore phase when loading from history @mousseau-oai - 12101 client side modelinfo overrides @sayan-oai - 12251 Add configurable agent spawn depth @jif-oai - 12254 chore: increase stack size for everyone @jif-oai - 12250 feat: no timeout mode on ue @jif-oai - 12255 chore: consolidate new() and initialize() for McpConnectionManager @bolinfest - 12256 Revert "feat: no timeout mode on ue" @jif-oai - 12258 Undo stack size Bazel test hack @charley-oai - 12264 Fix flaky test @jif-oai - 12087 feat: add Reject approval policy with granular prompt rejection controls @bolinfest - 12253 Skip removed features during metrics emission @jif-oai - 12265 Clarify cumulative proposedplan behavior in Plan mode @charley-oai - 12266 app-server tests: reduce intermittent nextest LEAK via graceful child shutdown @bolinfest - 11953 ws turn metadata via clientmetadata @pash-openai - 11778 fix(bazel): replace askama templates with includestr! in memories @rupurt - 11382 Add configurable MCP OAuth callback URL for MCP login @dkumar-oai - 12274 [bazel] Fix procmacrodep libs @zbarsky-openai - 12054 feat(config): add permissions.network proxy config wiring @viyatb-oai - 12269 tests(threadresume): interrupt running turns in resume error-path tests @bolinfest - 12009 Update pnpm versions to fix cve-2026-24842 @mjr-openai - 12080 skill-creator: lazy-load PyYAML in frontmatter parsing @xl-openai - 12271 tests: centralize in-flight turn cleanup helper @bolinfest - 12286 app-server: fix flaky listappsreturnsconnectorswithaccessibleflags test @bolinfest - 11776 app-server: improve thread resume rejoin flow @maxj-oai - 11822 [apps] Store apps tool cache in disk to reduce startup time. @mzeng-openai - 12221 memories: add rolloutsummaryfile header to raw memories and tune prompts @zuxin-oai - 12309 Set memories phase reasoning effort constants @jif-oai - 12315 chore: nit explorer @jif-oai - 12320 feat: add nick name to sub-agents @jif-oai - 12328 chore: better agent names @jif-oai - 12326 disable collab for phase 2 @jif-oai - 12267 Add MCP server context to otel toolresult logs @colby-oai - 12327 feat: cleaner TUI for sub-agents @jif-oai - 12332 feat: better agent picker in TUI @jif-oai - 12344 feat: do not enqueue phase 2 if not necessary @jif-oai - 12340 fix: simplify macOS sleep inhibitor FFI @yvolovich-cyber - 12347 fix: nick name at thread/read @jif-oai - 12294 Reuse connection between turns @pakrym-oai - 12287 app-server: add JSON tracing logs @maxj-oai - 12140 Refactor network approvals to host/protocol/port scope @viyatb-oai - 12300 jsrepl: block wrapped payload prefixes in grammar @fjord-oai - 11368 fix(network-proxy): add unix socket allow-all and update seatbelt rules @viyatb-oai - 12275 jsrepl: remove codex.state helper references @fjord-oai - 12289 CODEX-4927: Surface local login entitlement denials in browser @daniel-oai - 12205 ci(bazel): install Node from node-version.txt in remote image @fjord-oai - 12312 feat: add config allowloginshell @jif-oai - 12086 [apps] Implement apps configs. @mzeng-openai - 12353 fix(core): require approval for destructive MCP tool calls @colby-oai - 12218 app-server: harden disconnect cleanup paths @maxj-oai - 12291 core tests: use hermetic mock server in review suite @viyatb-oai - 12374 [apps] Enforce simple logo url format. @mzeng-openai - 12377 docs: use --locked when installing cargo-nextest @derekf-oai - 12370 Add ability to attach extra files to feedback @pakrym-oai - 12306 Move sanitizer into codex-secrets @viyatb-oai - 12379 clarify modelcatalogjson only applied on startup @sayan-oai - 12307 Show model/reasoning hint when switching modes @charley-oai - 12403 [apps] Fix gateway url. @mzeng-openai - 12240 fix(tui): queued-message edit shortcut unreachable in some terminals @fcoury - 12405 [apps] Bump MCP tool call timeout. @mzeng-openai - 12406 fix: explicitly list name collisions in JSON schema generation @bolinfest - 12301 Add field to Thread object for the latest rename set for a given thread @natea-oai - 12268 Wire realtime api to core @aibrahim-oai - 12415 fix(nix): include libcap dependency on linux builds @rgodha24 - 12416 Add experimental realtime websocket URL override @aibrahim-oai - 12303 Improve Plan mode reasoning selection flow @charley-oai - 12418 Add experimental realtime websocket overrides and text mirroring @aibrahim-oai - 12381 fix: address flakiness in threadresumerejoinsrunningthreadevenwithoverridemismatch @bolinfest - 12422 feat: use OAI Responses API MessagePhase type directly in App Server v2 @bolinfest - 12376 test(app-server): wait for turn/completed in turnstart tests @yvolovich-cyber - 12408 ignore v1 in JSON schema codegen @bolinfest - 12314 fix(core) Filter non-matching prefix rules @dylan-hurd-oai - 12429 feat: discourage the use of the --all-features flag @bolinfest - 12252 Fix compaction context reinjection and model baselines @charley-oai - 12427 chore: move config diagnostics out of codex-core @bolinfest - 12430 Collapse waited message @pakrym-oai - 12432 chore: remove codex-core public protocol/shell re-exports @bolinfest - 12434 fix: codex-arg0 no longer depends on codex-core @bolinfest - 12435 refactor(core): move embedded system skills into codex-skills crate @bolinfest - 12440 chore: delete empty codex-rs/code file @bolinfest - 12441 Delete AggregatedStream @pakrym-oai - 11293 feat(linux-sandbox): implement proxy-only egress via TCP-UDS-TCP bridge @viyatb-oai - 12410 profile-level modelcatalogjson overrie @sayan-oai - 12420 Prevent replayed runtime events from forcing active status @etraut-openai - 12428 Prefer v2 websockets if available @pakrym-oai - 12419 Improve token usage estimate for images @etraut-openai - 12474 fix: make skills loader tests hermetic with ~/.agents skills @bolinfest - 12473 core: preserve constrained approval/sandbox policies in TurnContext @bolinfest - 12067 fix(tui): preserve URL clickability across all TUI views @fcoury - 12469 Route inbound realtime text into turn start or steer @aibrahim-oai - 12479 Revert "Route inbound realtime text into turn start or steer" @aibrahim-oai - 12475 fix: make realtime conversation flake test order-insensitive @bolinfest - 12476 Make shell detection tests robust to Nix shell paths @rupurt - 11447 feat(tui): syntax highlighting via syntect with theme picker @fcoury - 12373 app-server: retain thread listener across disconnects @maxj-oai - 12444 feat(tui) /clear @won-openai - 12485 fix(core) exec policy parsing 3 @dylan-hurd-oai - 12423 Send events to realtime api @aibrahim-oai - 12364 feat: monitor role @jif-oai - 12313 Handle orphan exec ends without clobbering active exploring cell @jif-oai - 12455 feat(tui): support Alt-d delete-forward-word @dougEfresh - 12480 Revert "Revert "Route inbound realtime text into turn start or steer"" @aibrahim-oai - 12509 Sort themes case-insensitively in picker @etraut-openai - 12511 Add C syntax option to highlight selections @etraut-openai - 12513 Add PR babysitting skill for this repo @etraut-openai - 12518 test: vendor zsh fork via DotSlash and stabilize zsh-fork tests @bolinfest - 12553 Return image content from viewimage @pakrym-oai - 12555 refactor: decouple MCP policy construction from escalate server @bolinfest - 12559 chore: nit name @jif-oai - 12562 chore: awaiter @jif-oai - 12565 chore: add doc to memories @jif-oai - 12568 chore: phase 2 name @jif-oai - 12571 fix: TUI constraint @jif-oai - 12570 feat: keep dead agents in the agent picker @jif-oai - 12575 feat: agent nick names to model @jif-oai - 12500 feat: add uuid helper @jif-oai - 12580 chore: rename memory feature flag @jif-oai - 12541 Allow exec resume to parse output-last-message flag after command @etraut-openai - 12579 feat: role metrics multi-agent @jif-oai - 12141 feat: land sqlite @jif-oai - 12576 chore: better bazel test logs @jif-oai - 12028 remove feature flag collaboration modes @aibrahim-oai - 12520 tweaked /clear to support clear + new chat, also fix minor bug for macos terminal @won-openai - 12556 refactor: normalize unix module layout for exec-server and shell-escalation @bolinfest - 12421 app-server: box request dispatch future to reduce stack pressure @charley-oai - 12528 chore(deps): bump libc from 0.2.180 to 0.2.182 in /codex-rs @dependabot - 12529 chore(deps): bump syn from 2.0.114 to 2.0.117 in /codex-rs @dependabot - 12583 Use Arc-based ToolCtx in tool runtimes @bolinfest - 12540 fix: add ellipsis for truncated status indicator @sayan-oai - 12609 fix(tui): recover on owned wrap mapping mismatch @fcoury - 12569 fix(tui): queue steer Enter while final answer is still streaming to prevent dead state @guidedways - 12530 chore(deps): bump owo-colors from 4.2.3 to 4.3.0 in /codex-rs @dependabot - 12549 fix: show command running in background terminal in details under status indicator @sayan-oai - 3381 voice transcription @nornagon-openai - 12619 Handle realtime spawntranscript delegation @aibrahim-oai - 11408 Update models.json @github-actions - 12629 app-server: fix connecting via websockets with Sec-WebSocket-Extensions: permessage-deflate @JaviSoto - 12632 refactor: delete exec-server and move execve wrapper into shell-escalation @bolinfest - 12638 refactor: decouple shell-escalation from codex-core @bolinfest - 12357 feat(core): persist network approvals in execpolicy @viyatb-oai - 12648 fix(exec) Patch resume test race condition @dylan-hurd-oai - 12049 Support implicit skill invocation analytics events @alexsong-oai - 12647 Avoid AbsolutePathBuf::parent() panic under EMFILE by skipping re-absolutization @etraut-openai - 12633 Add skill approval event/response @pakrym-oai - 12650 chore: rm hardcoded PRESETS list @sayan-oai - 12652 Simplify skill tracking @pakrym-oai - 12653 memories: tighten consolidation prompt schema and indexing guidance @zuxin-oai - 12667 feat: mutli agents persist config overrides @jif-oai - 12635 memories: tighten memory lookup guidance and citation requirements @zuxin-oai - 12663 fix: replay after /agent @jif-oai - 11258 Send warmup request @pakrym-oai - 12688 feat: use process group to kill the PTY @jif-oai - 11871 feat(core) Introduce Feature::RequestPermissions @dylan-hurd-oai - 12628 ctrl-L (clears terminal but does not start a new chat) @won-openai - 9859 feat(network-proxy): add MITM support and gate limited-mode CONNECT @viyatb-oai - 12649 feat: run zsh fork shell tool via shell-escalation @bolinfest - 12643 Fix @mention token parsing in chat composer @etraut-openai - 12658 fix: also try matching namespaced prefix for modelinfo candidate @sayan-oai - 11766 feat(sleep-inhibitor): add Linux and Windows idle-sleep prevention @yvolovich-cyber - 12581 feat(tui): add theme-aware diff backgrounds with capability-graded palettes @fcoury - 12697 Ensure shell command skills trigger approval @pakrym-oai - 12707 refactor: remove unused seatbelt unix socket arg @bolinfest - 12687 Add TUI realtime conversation mode @aibrahim-oai - 12639 Honor projectrootmarkers when discovering AGENTS.md @etraut-openai - 10935 Agent jobs (spawnagentsoncsv) + progress UI @daveaitel-openai - 12700 revert audio scope @nornagon-openai - 12711 fix: temp remove citation @zuxin-oai - 12613 feat(tui) - /copy @won-openai - 12695 Add app-server event tracing @pakrym-oai - 12717 Raise image byte estimate for compaction token accounting @etraut-openai - 12724 fix: make EscalateServer public and remove shell escalation wrappers @bolinfest - 12517 codex-rs/app-server: graceful websocket restart on Ctrl-C @maxj-oai - 12636 fix(jsrepl): surface uncaught kernel errors and reset cleanly @fjord-oai - 12729 fix: clarify the value of SkillMetadata.path @bolinfest - 12719 feat: pass helper executable paths via Arg0DispatchPaths @bolinfest - 12720 add AWSLCSYSNOJITTERENTROPY=1 to release musl build step to unblock releases @sayan-oai - 12725 Fix jsrepl viewimage attachments in nested tool calls @fjord-oai - 12656 chore: change catalog mode to enum @sayan-oai - 12731 chore: migrate additional permissions to PermissionProfile @celia-oai - 12407 tests(jsrepl): stabilize CI runtime test execution @fjord-oai - 12737 feat: add experimental additionalPermissions to v2 command execution approval requests @celia-oai - 12372 feat: update Docker image digest to reflect 12205 @fjord-oai - 12746 fix: chatwidget was not honoring approvalid for an ExecApprovalRequestEvent @bolinfest - 12185 tests(jsrepl): remove node-related skip paths from jsrepl tests @fjord-oai - 12358 feat(ui): add network approval persistence plumbing @viyatb-oai - 12730 feat: zsh-fork forces scripts// for skills to trigger a prompt @bolinfest - 12750 fix: keep shell escalation exec paths absolute @bolinfest - 12753 Surface skill permission profiles in zsh-fork exec approvals @celia-oai - 12319 feat: add service name to app-server @jif-oai - 12692 fix: flaky test due to second-resolution for thread ordering @jif-oai - 12578 feat: add search term to thread list @jif-oai - 12660 Support external agent config detect and import @alexsong-oai - 12756 feat: record whether a skill script is approved for the session @bolinfest - 12767 Display pending child-thread approvals in TUI @jif-oai - 12768 feat: add large stack test macro @jif-oai - 12666 feat: adding stream parser @jif-oai - 12761 feat: record memory usage @jif-oai - 12772 nit: migration @jif-oai - 12352 otel: add host.name resource attribute to logs/traces via gethostname @mcgrew-oai - 12770 chore: unify max depth parameter @jif-oai - 12787 feat: fix sqlite home @jif-oai