New Features
- Added an experimental code mode for more isolated coding workflows. (#13418)
- Added an experimental hooks engine with
SessionStartandStophook events. (#13276) - WebSocket app-server deployments now expose
GET /readyzandGET /healthzon the same listener for easier health checks. (#13782) - Added a config switch to disable bundled system skills entirely. (#13792)
- Handoffs now carry realtime transcript context, which improves continuity when work is transferred between turns. (#14132)
- Improved the
$mention picker by clearly labeling Skills, Apps, and Plugins, and by surfacing plugins first. (#14147, [#14163])
Bug Fixes
- Fixed a Linux
tmuxcrash caused by concurrent user-shell lookups. (#13900) - Fixed apps being enabled in unsupported sessions by tightening the enablement check. (#14011)
- Fixed reopened threads getting stuck as in-progress after quitting mid-run and then resuming later. (#14125)
- Fixed permission handling so legacy
workspace-writebehavior is preserved and newer permission profiles degrade more safely on older builds. (#13957, [#14107]) - Fixed approval flows so granted permissions persist across turns, work with reject-style configs, and are honored by
apply_patch. (#14009, [#14055], [#14118], [#14165])
Chores
- Laid the groundwork for the Python SDK’s generated v2 schema types and pinned platform-specific runtime binaries. (#13953)
Changelog
Full Changelog: https://github.com/openai/codex/compare/rust-v0.113.0...rust-v0.114.0
- [#14009] feat(core) Persist request_permission data across turns @dylan-hurd-oai
- [#14136] fix(core): use dedicated types for responsesapi web search tool config @owenlin0
- [#13782] codex-rs/app-server: add health endpoints for --listen websocket server @maxj-oai
- [#14055] fix(core) RequestPermissions + ApplyPatch @dylan-hurd-oai
- [#14118] feat(approvals) RejectConfig for request_permissions @dylan-hurd-oai
- [#13957] fix(protocol): preserve legacy workspace-write semantics @viyatb-oai
- [#14107] fix: keep permissions profiles forward compatible @viyatb-oai
- [#14147] make dollar-mention always clarify item category (skill, app, plugin) @sayan-oai
- [#14152] Refactor tool output into trait implementations @pakrym-oai
- [#14163] sort plugins first in menu @sayan-oai
- [#13418] Add code_mode experimental feature @pakrym-oai
- [#13276] start of hooks engine @eternal-openai
- [#14135] tui: only show fast status for gpt-5.4 @pash-openai
- [#14157] Enforce single tool output type in codex handlers @pakrym-oai
- [#14165] fix(core) default RejectConfig.request_permissions @dylan-hurd-oai
- [#14167] Export tools module into code mode runner @pakrym-oai
- [#13792] feat: support disabling bundled system skills @xl-openai
- [#14169] Move exec command truncation into ExecCommandToolOutput @pakrym-oai
- [#14011] [apps] Fix apps enablement condition. @mzeng-openai
- [#14000] Delay pending cleanup until task aborts @aibrahim-oai
- [#12296] Implemented thread-level atomic elicitation counter for stopwatch pausing @cconger
- [#14132] Use realtime transcript for handoff context @aibrahim-oai
- [#13879] Stabilize incomplete SSE retry test @aibrahim-oai
- [#14184] Fix unified exec test output assertion @aibrahim-oai
- [#14002] Stabilize websocket test server binding @aibrahim-oai
- [#13939] Stabilize app-server notify initialize test @aibrahim-oai
- [#13953] python-sdk: generated type foundation (all v2 schemas) @shaqayeq-oai
- [#13603] Fix release-mode integration test compiler failure @etraut-openai
- [#13900] Fix Linux tmux segfault in user shell lookup @etraut-openai
- [#13901] Log ChatGPT user ID for feedback tags @etraut-openai
- [#14183] Expose strongly-typed result for exec_command @pakrym-oai
- [#14003] Stabilize split PTY output on Windows @aibrahim-oai
- [#14229] Reuse McpToolOutput in McpHandler @pakrym-oai
- [#14125] Mark incomplete resumed turns interrupted when idle @guinness-oai