New Features
- Plugins are now a first-class workflow: Codex can sync product-scoped plugins at startup, browse them in
/plugins, and install or remove them with clearer auth/setup handling. (#15041, [#15042], [#15195], [#15215], [#15217], [#15264], [#15275], [#15342], [#15580], [#15606], [#15802]) - Sub-agents now use readable path-based addresses like
/root/agent_a, with structured inter-agent messaging and agent listing for multi-agent v2 workflows. (#15313, [#15515], [#15556], [#15570], [#15621], [#15647]) - The
/titleterminal-title picker now works in both the classic TUI and the app-server TUI, making parallel sessions easier to tell apart. (#12334, [#15860]) - App-server clients can now send
!shell commands, watch filesystem changes, and connect to remote websocket servers with bearer-token auth. (#14988, [#14533], [#14847], [#14853]) - Image workflows got smoother:
view_imagenow returns image URLs for code mode, generated images are reopenable from the TUI, and image-generation history survives resume. (#15072, [#15154], [#15223]) - Prompt history recall now works in the app-server TUI, including across sessions. (#14945)
Bug Fixes
tui_app_serverno longer duplicates live reasoning summaries or/reviewoutput, and it preserves transcript text instead of dropping it under backpressure. (#15758, [#15839], [#15759])- ChatGPT login in
tui_app_servernow opens the local browser again, cancels cleanly onCtrl+C, and no longer fails startup when you're logged out. (#15672, [#15673], [#15670]) - Early exits now restore terminal state reliably, avoiding broken shell state after quitting; tmux users also get a working queued-message edit shortcut on
Shift+Left. (#15671, [#15480]) - Linux sandboxed tool calls are more reliable on older distributions with older
bubblewrap, and Windows restricted-token sandboxing now supports more split-policy carveout layouts. (#15693, [#14172]) - Remote multi-agent sessions now show agent names instead of raw IDs and recover more gracefully from stale turn-steering races. (#15513, [#15714], [#15163])
- Plugin-backed mentions and product gating now behave more predictably, fixing cases where explicit mentions lost context or plugins were filtered incorrectly. (#15372, [#15263], [#15279])
Documentation
- Expanded the app-server and exec-server docs/schema fixtures to cover exec-server setup, filesystem watch RPCs, realtime transcript notifications, and the new Python
thread.run(...)quickstart flow. (#15089, [#14533], [#15344], [#15088])
Chores
- The app-server-backed TUI is now enabled by default, and the plugin/app rollout flags have been flipped on in normal builds. (#15661, [#15713], [#15719], [#15820])
- Removed the legacy artifact tool and retired the old
read_fileandgrep_fileshandlers as part of ongoing tool-surface cleanup. (#15851, [#15864], [#15773], [#15775])
Changelog
Full Changelog: https://github.com/openai/codex/compare/rust-v0.116.0...rust-v0.117.0
- [#14945] feat(tui): restore composer history in app-server tui @fcoury
- [#15092] fix: try to fix "Stage npm package" step in ci.yml @bolinfest
- [#15075] Propagate tool errors to code mode @pakrym-oai
- [#15072] Return image URL from view_image tool @pakrym-oai
- [#15076] Add a startup deprecation warning for custom prompts @etraut-openai
- [#15102] Revert "fix: harden plugin feature gating" @xl-openai
- [#15077] Add final message prefix to realtime handoff output @aibrahim-oai
- [#13494] Align SQLite feedback logs with feedback formatter @charley-oai
- [#14888] Feat: reuse persisted model and reasoning effort on thread resume @shijie-oai
- [#15111] don't add transcript for v2 realtime @aibrahim-oai
- [#15103] Add update_plan code mode result @pakrym-oai
- [#15100] Add apply_patch code mode result @pakrym-oai
- [#15104] fix: harden plugin feature gating @xl-openai
- [#15089] Add exec-server stub server and protocol docs @starr-openai
- [#15042] Support featured plugins @alexsong-oai
- [#15088] Add Python SDK thread.run convenience methods @shaqayeq-oai
- [#15119] Remove stdio transport from exec server @pakrym-oai
- [#14632] feat(core, tracing): create turn spans over websockets @owenlin0
- [#15011] Forward session and turn headers to MCP HTTP requests @nicholasclark-openai
- [#15118] [hooks] turn_id extension for Stop & UserPromptSubmit @eternal-openai
- [#14970] Simple directory mentions @canvrno-oai
- [#14988] Add thread/shellCommand to app server API surface @etraut-openai
- [#15041] feat: support product-scoped plugins. @xl-openai
- [#15056] feat: add graph representation of agent network @jif-oai
- [#15163] fix: case where agent is already closed @jif-oai
- [#15125] Move environment abstraction into exec server @pakrym-oai
- [#15180] chore: add metrics for profile @jif-oai
- [#15175] chore: morpheus does not generate memories @jif-oai
- [#15185] Revert "Forward session and turn headers to MCP HTTP requests" @nicholasclark-openai
- [#14867] [hooks] use a user message > developer message for prompt continuation @eternal-openai
- [#15196] Add experimental exec server URL handling @pakrym-oai
- [#15198] Publish runnable DotSlash package for argument-comment lint @bolinfest
- [#15090] Add exec-server process and filesystem RPCs @starr-openai
- [#15201] Log automated reviewer approval sources distinctly @gabec-openai
- [#12334] feat(tui): add /title terminal title configuration @yvolovich-cyber
- [#15206] feat(tracing): tag app-server turn spans with turn_id @owenlin0
- [#15216] Move terminal module to terminal-detection crate @aibrahim-oai
- [#15207] add specific tool guidance for Windows destructive commands @iceweasel-oai
- [#15154] adding full imagepath to tui @won-openai
- [#15217] feat: expose needs_auth for plugin/read. @xl-openai
- [#15190] Plumb MCP turn metadata through _meta @nicholasclark-openai
- [#15220] feat(app-server): add mcpServer/startupStatus/updated notification @owenlin0
- [#15222] changed save directory to codex_home @won-openai
- [#15232] Refactor ExecServer filesystem split between local and remote @pakrym-oai
- [#15021] V8 Bazel Build @cconger
- [#15150] Move auth code into login crate @aibrahim-oai
- [#15195] [plugins] Install MCPs when calling plugin/install @mzeng-openai
- [#15254] core: add a full-buffer exec capture policy @bolinfest
- [#15263] fix: Distinguish missing and empty plugin products @xl-openai
- [#15253] Split features into codex-features crate @aibrahim-oai
- [#15233] Split exec process into local and remote implementations @starr-openai
- [#15199] Use released DotSlash package for argument-comment lint @bolinfest
- [#15215] Initial plugins TUI menu - list and read only. tui + tui_app_server @canvrno-oai
- [#15252] Disable hooks on windows for now @eternal-openai
- [#15264] feat: Add One-Time Startup Remote Plugin Sync @xl-openai
- [#15262] Add guardian follow-up reminder @charley-oai
- [#15223] Feat/restore image generation history @won-openai
- [#15275] feat: prefer git for curated plugin sync @xl-openai
- [#14869] Add remote env CI matrix and integration test @pakrym-oai
- [#15218] Add temporary app-server originator fallback for codex-tui @etraut-openai
- [#15328] try to fix bazel @jif-oai
- [#15324] Add remote test skill @pakrym-oai
- [#15313] feat: change multi-agent to use path-like system instead of uuids @jif-oai
- [#15244] Pin Python SDK app-server stdio to UTF-8 on Windows @shaqayeq-oai
- [#15337] Bump aws-lc-rs @cconger
- [#15203] Add v8-poc consumer of our new built v8 @cconger
- [#15273] [apps] Use ARC for yolo mode. @mzeng-openai
- [#15128] chore(core) Remove Feature::PowershellUtf8 @dylan-hurd-oai
- [#15344] Add realtime transcript notification in v2 @aibrahim-oai
- [#15285] Gate tui /plugins menu behind flag @canvrno-oai
- [#15114] fix: allow restricted filesystem profiles to read helper executables @celia-oai
- [#15231] chore(core) update prefix_rule guidance @dylan-hurd-oai
- [#15036] fix(core) disable command_might_be_dangerous when unsandboxed @dylan-hurd-oai
- [#15348] Pass platform param to featured plugins @alexsong-oai
- [#15276] Code mode on v8 @cconger
- [#15372] [plugins] Fix plugin explicit mention context management. @mzeng-openai
- [#15366] chore(context) Include guardian approval context @dylan-hurd-oai
- [#15390] Remove legacy app-server notification handling from tui_app_server @etraut-openai
- [#15409] Add JIT entitlement for macosx @cconger
- [#15414] Remove legacy auth and notification handling from tui_app_server @etraut-openai
- [#15376] [apps] Improve app tools loading for TUI. @mzeng-openai
- [#15415] chore(exec_policy) ExecPolicyRequirementScenario tests @dylan-hurd-oai
- [#15464] Remove smart_approvals alias migration @charley-oai
- [#15443] core: snapshot fork startup context injection @charley-oai
- [#15480] Use Shift+Left to edit queued messages in tmux @charley-oai
- [#15317] nit: guard -> registry @jif-oai
- [#15338] fix: fall back to vendored bubblewrap when system bwrap lacks --argv0 @bolinfest
- [#15520] fix: cargo deny @jif-oai
- [#15279] Label plugins as plugins, and hide skills/apps for given plugin @canvrno-oai
- [#15259] tui: queue follow-ups during manual /compact @charley-oai
- [#15515] feat: structured multi-agent output @jif-oai
- [#15357] Fix: proactive auth refresh to reload guarded disk state first @celia-oai
- [#15342] Plugins TUI install/uninstall @canvrno-oai
- [#15540] chore: split sub-agent v2 implementation @jif-oai
- [#15516] Thread guardian Responses API errors into denial rationale @charley-oai
- [#15378] feat: support disable skills by name. @xl-openai
- [#15529] Unify realtime stop handling in TUI @aibrahim-oai
- [#15557] fix: main tui @jif-oai
- [#15556] feat: new op type for sub-agents communication @jif-oai
- [#15211] [hooks] add non-streaming (non-stdin style) shell-only PreToolUse support @eternal-openai
- [#15560] feat: use serde to differenciate inter agent communication @jif-oai
- [#15426] chore(core) Add approvals reviewer to UserTurn @dylan-hurd-oai
- [#15562] [codex] Add rollback context duplication snapshot @charley-oai
- [#15570] feat: custom watcher for multi-agent v2 @jif-oai
- [#15575] feat: custom watcher for multi-agent v2 @jif-oai
- [#15576] feat: custom watcher for multi-agent v2 @jif-oai
- [#15360] fix: build PATH env var using OsString instead of String @bolinfest
- [#15239] Add fork snapshot modes @charley-oai
- [#15554] Add plugin-creator as system skill @alexsong-oai
- [#15592] Extract landlock helpers into codex-sandboxing @pakrym-oai
- [#15593] Move macOS sandbox builders into codex-sandboxing @pakrym-oai
- [#15478] [codex-cli][app-server] Update self-serve business usage limit copy in error returned @dhruvgupta-oai
- [#15600] move imagegen skill into system skills @dkundel-openai
- [#15599] Move sandbox policy transforms into codex-sandboxing @pakrym-oai
- [#15580] Remove filter from plugins/list result @canvrno-oai
- [#15581] Stabilize macOS CI test timeouts @dylan-hurd-oai
- [#15613] nit: split v2 wait @jif-oai
- [#15614] fix: flaky test @jif-oai
- [#15621] feat: list agents for sub-agent v2 @jif-oai
- [#15623] nit: optim on list agents @jif-oai
- [#15549] Allow global network allowlist wildcard @rreichel3-oai
- [#15424] Finish moving codex exec to app-server @etraut-openai
- [#15603] Extract sandbox manager and transforms into codex-sandboxing @pakrym-oai
- [#15484] chore(deps): bump pnpm/action-setup from 4 to 5 @dependabot
- [#14777] Bump vedantmgoyal9/winget-releaser from [19e706] to [7bd472] @dependabot
- [#15558] [Codex TUI] - Sort /plugins TUI menu by installed status first, alpha second @canvrno-oai
- [#15598] Refresh mentions list after plugin install/uninstall @canvrno-oai
- [#15624] feat: disable notifier v2 and start turn on agent interaction @jif-oai
- [#15605] [codex] Stabilize compact resume and fork snapshot flaky tests @charley-oai
- [#15658] try to fix git glitch @jif-oai
- [#15657] try to fix git glitch @jif-oai
- [#15656] try to fix git glitch @jif-oai
- [#15655] try to fix git glitch @jif-oai
- [#15654] try to fix git glitch @jif-oai
- [#15653] try to fix git glitch @jif-oai
- [#15652] try to fix git glitch @jif-oai
- [#15651] try to fix git glitch @jif-oai
- [#15650] try to fix git glitch @jif-oai
- [#15606] Pretty plugin labels, preserve plugin app provenance during MCP tool refresh @canvrno-oai
- [#15579] Increase voice space hold timeout to 1s @aibrahim-oai
- [#15093] core: Make FileWatcher reusable @euroelessar
- [#15547] app-server: Add back pressure and batching to
command/exec@euroelessar - [#15647] feat: communication pattern v2 @jif-oai
- [#15438] feat: include marketplace loading error in plugin/list @xl-openai
- [#15545] chore: use access token expiration for proactive auth refresh @celia-oai
- [#15530] chore: stop app-server auth refresh storms after permanent token failure @celia-oai
- [#15577] Trim pre-turn context updates during rollback @charley-oai
- [#15660] Hide numeric prefixes on disabled TUI list rows @canvrno-oai
- [#15644] fix: keep zsh-fork release assets after removing shell-tool-mcp @bolinfest
- [#15670] tui_app_server: tolerate missing rate limits while logged out @etraut-openai
- [#15564] Move git utilities into a dedicated crate @aibrahim-oai
- [#15669] Clean up TUI /plugins row allignment @canvrno-oai
- [#15671] tui: always restore the terminal on early exit @etraut-openai
- [#15672] tui_app_server: open ChatGPT login in the local browser @etraut-openai
- [#15673] tui_app_server: cancel active login before Ctrl+C exit @etraut-openai
- [#15676] Tweak /plugin menu wording @canvrno-oai
- [#15666] Suppress plugin-install MCP OAuth URL console spam @canvrno-oai
- [#15573] [plugins] Additional gating for tool suggest and apps. @mzeng-openai
- [#15665] Drop sandbox_permissions from sandbox exec requests @pakrym-oai
- [#15572] Move string truncation helpers into codex-utils-string @aibrahim-oai
- [#14533] app-server: add filesystem watch support @euroelessar
- [#15674] Use delayed shimmer for plugin loading headers in tui and tui_app_server @canvrno-oai
- [#15689] app-server: Return codex home in initialize response @euroelessar
- [#15363] fix: keep rmcp-client env vars as OsString @bolinfest
- [#15700] Remove provenance filtering in $mentions for apps and skills from plugins @canvrno-oai
- [#15692] Add legal link to TUI /plugin details @canvrno-oai
- [#15351] Expand ~ in MDM workspace write roots @evawong-oai
- [#15548] Extract rollout into its own crate @aibrahim-oai
- [#15699] [codex] Defer fork context injection until first turn @charley-oai
- [#15601] [app-server] Add a method to override feature flags. @mzeng-openai
- [#15708] TUI plugin menu cleanup - hide app ID @canvrno-oai
- [#15677] Fix stale quickstart integration assertion @shaqayeq-oai
- [#15713] [plugins] Flip the flags. @mzeng-openai
- [#15719] [plugins] Flip on additional flags. @mzeng-openai
- [#14172] fix: support split carveouts in windows restricted-token sandbox @viyatb-oai
- [#15714] Fix stale turn steering fallback in tui_app_server @etraut-openai
- [#15722] [plugins] Add a flag for tool search. @mzeng-openai
- [#15734] Update plugin creator skill. @xl-openai
- [#15766] chore: tty metric @jif-oai
- [#15519] fix(core): default approval behavior for mcp missing annotations @fouad-openai
- [#15775] chore: remove grep_files handler @jif-oai
- [#15710] Use AbsolutePathBuf for cwd state @pakrym-oai
- [#15778] feat: rendering library v1 @jif-oai
- [#15758] fix(tui): avoid duplicate live reasoning summaries @fcoury
- [#15773] chore: remove read_file handler @jif-oai
- [#15776] feat: add multi-thread log query @jif-oai
- [#15744] Extract codex-instructions crate @aibrahim-oai
- [#15339] Add non-interactive resume filter option @nornagon-openai
- [#15746] Extract codex-utils-plugins crate @aibrahim-oai
- [#15747] Extract codex-plugin crate @aibrahim-oai
- [#15748] Extract codex-analytics crate @aibrahim-oai
- [#15707] Clarify codex_home base for MDM path resolution @evawong-oai
- [#15513] fix(tui_app_server): fix remote subagent switching and agent names @fcoury
- [#14856] [apps][tool_suggest] Remove tool_suggest's dependency on tool search. @mzeng-openai
- [#14847] feat: add websocket auth for app-server @viyatb-oai
- [#15759] fix(tui_app_server): preserve transcript events under backpressure @fcoury
- [#15749] Extract codex-core-skills crate @aibrahim-oai
- [#15798] Avoid duplicate auth refreshes in
getAuthStatus@etraut-openai - [#15659] Add MCP tool call spans @nicholasclark-openai
- [#15789] Treat ChatGPT
hcplan as Enterprise @arnavdugar-openai - [#15802] TUI plugin menu polish @canvrno-oai
- [#15785] Add cached environment manager for exec server URL @pakrym-oai
- [#15806] Add ReloadUserConfig to tui_app_server @canvrno-oai
- [#15810] app-server: Organize app-server to allow more transports @euroelessar
- [#15800] [mcp] Improve custom MCP elicitation @mzeng-openai
- [#15531] [hooks] add non-streaming (non-stdin style) shell-only PostToolUse support @eternal-openai
- [#15820] [plugins] Flip flags on. @mzeng-openai
- [#15825] Fix quoted command rendering in tui_app_server @etraut-openai
- [#14853] Wire remote app-server auth through the client @etraut-openai
- [#15817] Expand home-relative paths on Windows @tiffanycitra
- [#15693] fix: fix old system bubblewrap compatibility without falling back to vendored bwrap @viyatb-oai
- [#15784] feat: replace askama by custom lib @jif-oai
- [#15851] feat: drop artifact tool and feature @jif-oai
- [#15861] feat: clean spawn v1 @jif-oai
- [#15691] feat: exec-server prep for unified exec @jif-oai
- [#15864] chore: drop artifacts lib @jif-oai
- [#15812] core: remove special execve handling for skill scripts @bolinfest
- [#15869] fix: flaky @jif-oai
- [#15877] chore: ask agents md not to play with PIDs @jif-oai
- [#15866] feat: use
ProcessIdinexec-server@jif-oai - [#15829] [plugins] Update the suggestable plugins list. @mzeng-openai
- [#15880] fix: max depth agent still has v2 tools @jif-oai
- [#15839] Fix duplicate /review messages in app-server TUI @etraut-openai
- [#15805] Add MCP connector metrics @nicholasclark-openai
- [#15661] Enable
tui_app_serverfeature by default @etraut-openai - [#15835] fix: box apply_patch test harness futures @bolinfest
- [#15796] [codex] Block unsafe git global options from safe allowlist @adrian-openai
- [#15813] Add wildcard in the middle test coverage @evawong-oai
- [#15881] fix: root as std agent @jif-oai
- [#15860] feat(tui): add terminal title support to tui app server @fcoury
- [#15885] [mcp] Fix legacy_tools @mzeng-openai