Commit Graph
365 Commits
Author SHA1 Message Date
zeekay 7565b2ea62 Merge upstream openai/codex: realtime v2, code mode, plugins, connectors, guardian approvals
Major upstream features merged:
- Realtime v2 event parser and transcription mode
- Code mode with exec tools and yield timeout
- Plugin discovery, installation, and tool_suggest
- Connectors crate for GPT connector management
- Guardian approval MVP with delegated review
- Bubblewrap as default Linux sandbox
- Theme-aware diff rendering
- Multi-agent improvements (spawn metadata, fanout)
- Custom CA certificate support for enterprise proxies
- Request permissions tool
- Cloud requirements enforcement
- Hooks upgraded to HookResult/HookResponse API
2026-03-13 02:39:14 -07:00
Eric TrautandGitHub 07603138f8 Fix codex exec --profile handling (#14524)
PR #14005 introduced a regression whereby `codex exec --profile`
overrides were dropped when starting or resuming a thread. That causes
the thread to miss profile-scoped settings like
`model_instructions_file`.

This PR preserve the active profile in the thread start/resume config
overrides so the
app-server rebuild sees the same profile that exec resolved. 

Fixes #14515
2026-03-12 17:34:25 -06:00
635869dffa Include spawn agent model metadata in app-server items (#14410)
- add model and reasoning effort to app-server collab spawn items and
notifications
- regenerate app-server protocol schemas for the new fields

---------

Co-authored-by: Codex <[email protected]>
2026-03-11 19:25:21 -07:00
f9ad680b28 Show spawned agent model and effort in TUI (#14273)
- include the requested sub-agent model and reasoning effort in the
spawn begin event\n- render that metadata next to the spawned agent name
and role in the TUI transcript

---------

Co-authored-by: Codex <[email protected]>
2026-03-11 12:33:09 -07:00
zeekay d8c9d902c4 Merge upstream openai/main + clean up design doc slop
- Merge 77 commits from openai/codex upstream (hooks engine, code mode,
  agent navigation, plugin uninstall, Python SDK, realtime improvements)
- Remove 6 non-CLI design docs that don't belong in dev repo:
  - OSS_PAYMENT_SYSTEM_DESIGN.md (redundant with HIP-0075)
  - QOS_CHALLENGE_SYSTEM_DESIGN.md (moved to hips as HIP-0095)
  - docs/HIP-AI-COMPUTE-REWARDS.md (moved to hips as HIP-0096)
  - docs/PLATFORM_PHASE1_POOLS_DESIGN.md (platform design, not CLI)
  - docs/PLATFORM_PHASE1_COMPONENTS.md (UI templates, not CLI)
  - docs/PLATFORM_README.md (AI-generated bloat)
- Keep docs/RUST_PYTHON_PARITY.md (internal tool parity tracking)
2026-03-11 10:40:11 -07:00
80cb3cc841 Show spawned agent model and effort in TUI (#14273)
- include the requested sub-agent model and reasoning effort in the
spawn begin event\n- render that metadata next to the spawned agent name
and role in the TUI transcript

---------

Co-authored-by: Codex <[email protected]>
2026-03-11 00:46:25 +00:00
Andrei EternalandGitHub cff2eb705e start of hooks engine (#13276)
(Experimental)

This PR adds a first MVP for hooks, with SessionStart and Stop

The core design is:

- hooks live in a dedicated engine under codex-rs/hooks
- each hook type has its own event-specific file
- hook execution is synchronous and blocks normal turn progression while
running
- matching hooks run in parallel, then their results are aggregated into
a normalized HookRunSummary

On the AppServer side, hooks are exposed as operational metadata rather
than transcript-native items:

- new live notifications: hook/started, hook/completed
- persisted/replayed hook results live on Turn.hookRuns
- we intentionally did not add hook-specific ThreadItem variants

Hooks messages are not persisted, they remain ephemeral. The context
changes they add are (they get appended to the user's prompt)
2026-03-10 04:11:31 +00:00
zeekay 02e12149f9 Merge remote-tracking branch 'openai/main' 2026-03-09 12:07:17 -07:00
zeekay 3247e56e84 Merge remote-tracking branch 'just-every-local/main'
# Conflicts:
#	.github/workflows/Dockerfile.bazel
#	.github/workflows/bazel.yml
#	.github/workflows/ci.yml
#	.github/workflows/issue-deduplicator.yml
#	.github/workflows/rust-ci.yml
#	.github/workflows/rust-release-windows.yml
#	.github/workflows/rust-release.yml
#	.github/workflows/shell-tool-mcp.yml
#	.vscode/settings.json
#	AGENTS.md
#	CHANGELOG.md
#	README.md
#	code-rs/app-server-protocol/schema/json/ClientRequest.json
#	code-rs/app-server-protocol/schema/json/CommandExecutionRequestApprovalParams.json
#	code-rs/app-server-protocol/schema/json/EventMsg.json
#	code-rs/app-server-protocol/schema/json/ExecCommandApprovalParams.json
#	code-rs/app-server-protocol/schema/json/ServerNotification.json
#	code-rs/app-server-protocol/schema/json/ServerRequest.json
#	code-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json
#	code-rs/app-server-protocol/schema/json/v1/ForkConversationParams.json
#	code-rs/app-server-protocol/schema/json/v1/ForkConversationResponse.json
#	code-rs/app-server-protocol/schema/json/v1/GetUserSavedConfigResponse.json
#	code-rs/app-server-protocol/schema/json/v1/NewConversationParams.json
#	code-rs/app-server-protocol/schema/json/v1/ResumeConversationParams.json
#	code-rs/app-server-protocol/schema/json/v1/ResumeConversationResponse.json
#	code-rs/app-server-protocol/schema/json/v1/SendUserTurnParams.json
#	code-rs/app-server-protocol/schema/json/v1/SessionConfiguredNotification.json
#	code-rs/app-server-protocol/schema/json/v2/ConfigReadResponse.json
#	code-rs/app-server-protocol/schema/json/v2/ConfigRequirementsReadResponse.json
#	code-rs/app-server-protocol/schema/json/v2/ModelListResponse.json
#	code-rs/app-server-protocol/schema/json/v2/RawResponseItemCompletedNotification.json
#	code-rs/app-server-protocol/schema/json/v2/ThreadForkParams.json
#	code-rs/app-server-protocol/schema/json/v2/ThreadForkResponse.json
#	code-rs/app-server-protocol/schema/json/v2/ThreadResumeParams.json
#	code-rs/app-server-protocol/schema/json/v2/ThreadResumeResponse.json
#	code-rs/app-server-protocol/schema/json/v2/ThreadStartParams.json
#	code-rs/app-server-protocol/schema/json/v2/ThreadStartResponse.json
#	code-rs/app-server-protocol/schema/json/v2/TurnStartParams.json
#	code-rs/app-server-protocol/schema/typescript/AskForApproval.ts
#	code-rs/app-server-protocol/schema/typescript/ClientRequest.ts
#	code-rs/app-server-protocol/schema/typescript/EventMsg.ts
#	code-rs/app-server-protocol/schema/typescript/ExecApprovalRequestEvent.ts
#	code-rs/app-server-protocol/schema/typescript/ExecCommandApprovalParams.ts
#	code-rs/app-server-protocol/schema/typescript/FunctionCallOutputContentItem.ts
#	code-rs/app-server-protocol/schema/typescript/ResponseItem.ts
#	code-rs/app-server-protocol/schema/typescript/index.ts
#	code-rs/app-server-protocol/schema/typescript/v2/AskForApproval.ts
#	code-rs/app-server-protocol/schema/typescript/v2/CommandExecutionRequestApprovalParams.ts
#	code-rs/app-server-protocol/schema/typescript/v2/Model.ts
#	code-rs/app-server-protocol/schema/typescript/v2/index.ts
#	code-rs/app-server-protocol/src/protocol/common.rs
#	code-rs/app-server-protocol/src/protocol/v1.rs
#	code-rs/app-server-protocol/src/protocol/v2.rs
#	code-rs/app-server/src/code_message_processor.rs
#	code-rs/app-server/src/lib.rs
#	code-rs/app-server/src/message_processor.rs
#	code-rs/protocol/src/approvals.rs
#	code-rs/protocol/src/config_types.rs
#	code-rs/protocol/src/models.rs
#	code-rs/protocol/src/openai_models.rs
#	code-rs/protocol/src/prompts/permissions/approval_policy/on_request_rule.md
#	code-rs/protocol/src/protocol.rs
#	code-rs/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_help_overlay_open.snap
#	code-rs/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_help_overlay_section_open.snap
#	codex-cli/package.json
#	docs/agents.md
#	docs/config.md
#	docs/faq.md
#	docs/install.md
#	docs/release-notes/RELEASE_NOTES.md
#	docs/slash-commands.md
#	hanzo-dev/Cargo.lock
#	hanzo-dev/code-auto-drive-core/src/auto_compact.rs
#	hanzo-dev/code-auto-drive-core/src/auto_drive_history.rs
#	hanzo-dev/core/src/agent_tool.rs
#	hanzo-dev/core/src/chat_completions.rs
#	hanzo-dev/core/src/client.rs
#	hanzo-dev/core/src/client_common.rs
#	hanzo-dev/core/src/codex.rs
#	hanzo-dev/core/src/codex/compact.rs
#	hanzo-dev/core/src/codex/compact_remote.rs
#	hanzo-dev/core/src/codex/session.rs
#	hanzo-dev/core/src/codex/streaming.rs
#	hanzo-dev/core/src/config.rs
#	hanzo-dev/core/src/config/sources.rs
#	hanzo-dev/core/src/config/validation.rs
#	hanzo-dev/core/src/config_profile.rs
#	hanzo-dev/core/src/config_types.rs
#	hanzo-dev/core/src/event_mapping.rs
#	hanzo-dev/core/src/exec_command/exec_command_params.rs
#	hanzo-dev/core/src/external_agent_config.rs
#	hanzo-dev/core/src/memories/citations.rs
#	hanzo-dev/core/src/memories/mod.rs
#	hanzo-dev/core/src/memories/storage.rs
#	hanzo-dev/core/src/model_family.rs
#	hanzo-dev/core/src/openai_tools.rs
#	hanzo-dev/core/src/protocol.rs
#	hanzo-dev/core/src/remote_models/mod.rs
#	hanzo-dev/core/src/rollout/policy.rs
#	hanzo-dev/core/src/slash_commands.rs
#	hanzo-dev/exec/src/lib.rs
#	hanzo-dev/protocol/src/mcp_protocol.rs
#	hanzo-dev/tui/Cargo.toml
#	hanzo-dev/tui/src/app/events.rs
#	hanzo-dev/tui/src/app_event.rs
#	hanzo-dev/tui/src/bottom_pane/chat_composer.rs
#	hanzo-dev/tui/src/bottom_pane/memories_settings_view.rs
#	hanzo-dev/tui/src/bottom_pane/mod.rs
#	hanzo-dev/tui/src/bottom_pane/model_selection_view.rs
#	hanzo-dev/tui/src/bottom_pane/settings_overlay.rs
#	hanzo-dev/tui/src/chatwidget.rs
#	hanzo-dev/tui/src/chatwidget/agent_summary.rs
#	hanzo-dev/tui/src/chatwidget/settings_overlay.rs
#	hanzo-dev/tui/src/history_cell/plain.rs
#	hanzo-dev/tui/src/lib.rs
#	hanzo-dev/tui/src/memory_citation.rs
#	hanzo-dev/tui/src/streaming/controller.rs
#	hanzo-dev/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_help_overlay_closed.snap
#	hanzo-dev/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_help_overlay_section_closed.snap
#	hanzo-dev/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_overlay_overview_layout.snap
#	hanzo-dev/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_overlay_overview_truncates.snap
#	hanzo-dev/tui/tests/snapshots/vt100_chatwidget_snapshot__settings_overview_hints_clean.snap
#	hanzo-dev/tui/tests/ui_smoke.rs
2026-03-09 12:02:13 -07:00
zeekay 2c43ec7ebd Merge remote-tracking branch 'openai/main'
# Conflicts:
#	.github/workflows/Dockerfile.bazel
#	.github/workflows/ci.yml
#	.github/workflows/issue-deduplicator.yml
#	.github/workflows/rust-release-windows.yml
#	.github/workflows/rust-release.yml
#	.vscode/settings.json
#	codex-cli/package.json
#	codex-rs/Cargo.lock
#	codex-rs/core/Cargo.toml
#	codex-rs/core/src/codex.rs
#	codex-rs/core/src/features.rs
#	codex-rs/core/src/features/legacy.rs
#	codex-rs/core/src/mcp_connection_manager.rs
#	codex-rs/core/src/memories/storage.rs
#	codex-rs/core/src/models_manager/manager.rs
#	codex-rs/core/src/tools/handlers/collab.rs
#	codex-rs/core/src/tools/handlers/mod.rs
#	codex-rs/core/src/tools/handlers/search_tool_bm25.rs
#	codex-rs/core/src/tools/runtimes/shell.rs
#	codex-rs/core/src/tools/spec.rs
#	codex-rs/core/tests/common/apps_test_server.rs
#	codex-rs/core/tests/common/context_snapshot.rs
#	codex-rs/core/tests/common/responses.rs
#	codex-rs/core/tests/suite/client.rs
#	codex-rs/core/tests/suite/compact.rs
#	codex-rs/core/tests/suite/compact_remote.rs
#	codex-rs/core/tests/suite/mod.rs
#	codex-rs/core/tests/suite/model_switching.rs
#	codex-rs/core/tests/suite/model_tools.rs
#	codex-rs/core/tests/suite/search_tool.rs
#	codex-rs/core/tests/suite/shell_snapshot.rs
#	codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_with_history_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_without_prev_user_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact__mid_turn_compaction_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_sampling_model_switch_compaction_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_context_window_exceeded_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_with_history_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_without_prev_user_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_context_window_exceeded_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_failure_shapes.snap
#	codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap
#	codex-rs/otel/src/lib.rs
#	codex-rs/skills/src/assets/samples/skill-creator/scripts/package_skill.py
#	codex-rs/skills/src/assets/samples/skill-installer/scripts/list-curated-skills.py
#	codex-rs/tui/src/bottom_pane/chat_composer.rs
#	codex-rs/tui/src/chatwidget.rs
#	codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_begin_restores_working_status.snap
#	codex-rs/tui/src/lib.rs
#	defs.bzl
#	docs/config.md
#	docs/install.md
#	sdk/typescript/package.json
2026-03-09 12:01:27 -07:00
Jack MousseauandGitHub 8da792bb94 Add request permissions tool (#13092)
Adds a built-in `request_permissions` tool and wires it through the
Codex core, protocol, and app-server layers so a running turn can ask
the client for additional permissions instead of relying on a static
session policy.

The new flow emits a `RequestPermissions` event from core, tracks the
pending request by call ID, forwards it through app-server v2 as an
`item/permissions/requestApproval` request, and resumes the tool call
once the client returns an approved subset of the requested permission
profile.
2026-03-08 20:23:06 -07:00
4e1764ed3e Add in-process app server and wire up exec to use it (#14005)
This is a subset of PR #13636. See that PR for a full overview of the
architectural change.

This PR implements the in-process app server and modifies the
non-interactive "exec" entry point to use the app server.

---------

Co-authored-by: Felipe Coury <[email protected]>
2026-03-08 18:43:55 -06:00
James Peter 2f99f6bf1d Refresh codex-rs mirror to upstream/main 2026-03-08 16:54:01 +10:00
Matthew ZengandGitHub be672bc495 [elicitations] Switch to use MCP style elicitation payload for mcp tool approvals. (#13621)
- [x] Switch to use MCP style elicitation payload for mcp tool
approvals.
- [ ] TODO: Update the UI to support the full spec.
2026-03-06 01:50:26 -08:00
Won ParkandGitHub adacc72423 Enabling CWD Saving for Image-Gen (#13607)
Codex now saves the generated image on to your current working
directory.
2026-03-06 00:47:21 -08:00
James Peter a9af53d771 Refresh codex-rs mirror to upstream/main 2026-03-06 06:21:19 +10:00
Owen LinandGitHub 332070c3c5 feat(app-server): support mcp elicitations in v2 api (#13425)
This adds a first-class server request for MCP server elicitations:
`mcpServer/elicitation/request`.

Until now, MCP elicitation requests only showed up as a raw
`codex/event/elicitation_request` event from core. That made it hard for
v2 clients to handle elicitations using the same request/response flow
as other server-driven interactions (like shell and `apply_patch`
tools).

This also updates the underlying MCP elicitation request handling in
core to pass through the full MCP request (including URL and form data)
so we can expose it properly in app-server.

### Why not `item/mcpToolCall/elicitationRequest`?
This is because MCP elicitations are related to MCP servers first, and
only optionally to a specific MCP tool call.

In the MCP protocol, elicitation is a server-to-client capability: the
server sends `elicitation/create`, and the client replies with an
elicitation result. RMCP models it that way as well.

In practice an elicitation is often triggered by an MCP tool call, but
not always.

### What changed
- add `mcpServer/elicitation/request` to the v2 app-server API
- translate core `codex/event/elicitation_request` events into the new
v2 server request
- map client responses back into `Op::ResolveElicitation` so the MCP
server can continue
- update app-server docs and generated protocol schema
- add an end-to-end app-server test that covers the full round trip
through a real RMCP elicitation flow
- The new test exercises a realistic case where an MCP tool call
triggers an elicitation, the app-server emits
mcpServer/elicitation/request, the client accepts it, and the tool call
resumes and completes successfully.

### app-server API flow
- Client starts a thread with `thread/start`.
- Client starts a turn with `turn/start`.
- App-server sends `item/started` for the `mcpToolCall`.
- While that tool call is in progress, app-server sends
`mcpServer/elicitation/request`.
- Client responds to that request with `{ action: "accept" | "decline" |
"cancel" }`.
- App-server sends `serverRequest/resolved`.
- App-server sends `item/completed` for the mcpToolCall.
- App-server sends `turn/completed`.
- If the turn is interrupted while the elicitation is pending,
app-server still sends `serverRequest/resolved` before the turn
finishes.
2026-03-05 07:20:20 -08:00
Won ParkandGitHub cdee825b85 image-gen-event/client_processing (#13512)
enabling client-side to process with image-generation capabilities
(setting app-server)
2026-03-04 16:54:38 -08:00
Owen LinandGitHub 97671b44a7 feat(app-server): propagate app-server trace context into core (#13368)
### Summary
Propagate trace context originating at app-server RPC method handlers ->
codex core submission loop (so this includes spans such as `run_turn`!).
This implements PR 2 of the app-server tracing rollout.

This also removes the old lower-level env-based reparenting in core so
explicit request/submission ancestry wins instead of being overridden by
ambient `TRACEPARENT` state.

### What changed
- Added `trace: Option<W3cTraceContext>` to codex_protocol::Submission
- Taught `Codex::submit()` / `submit_with_id()` to automatically capture
the current span context when constructing or forwarding a submission
- Wrapped the core submission loop in a submission_dispatch span
parented from Submission.trace
- Warn on invalid submission trace carriers and ignore them cleanly
- Removed the old env-based downstream reparenting path in core task
execution
- Stopped OTEL provider init from implicitly attaching env trace context
process-wide
- Updated mcp-server Submission call sites for the new field

Added focused unit tests for:
- capturing trace context into Submission
- preferring `Submission.trace` when building the core dispatch span

### Why
PR 1 gave us consistent inbound request spans in app-server, but that
only covered the transport boundary. For long-running work like turns
and reviews, the important missing piece was preserving ancestry after
the request handler returns and core continues work on a different async
path.

This change makes that handoff explicit and keeps the parentage rules
simple:
- app-server request span sets the current context
- `Submission.trace` snapshots that context
- core restores it once, at the submission boundary
- deeper core spans inherit naturally

That also lets us stop relying on env-based reparenting for this path,
which was too ambient and could override explicit ancestry.
2026-03-04 01:03:45 +00:00
pash-openaiandGitHub 27b94a4d2d app-server service tier plumbing (plus some cleanup) (#13334)
followup to https://github.com/openai/codex/pull/13212 to expose fast
tier controls to app server
(majority of this PR is generated schema jsons - actual code is +69 /
-35 and +24 tests )

- add service tier fields to the app-server protocol surfaces used by
thread lifecycle, turn start, config, and session configured events
- thread service tier through the app-server message processor and core
thread config snapshots
- allow runtime config overrides to carry service tier for app-server
callers

cleanup:
- Removing useless "legacy" code supporting "standard" - we moved to
None | "fast", so "standard" is not needed.
2026-03-03 02:35:09 -08:00
pash-openaiandGitHub f345e543ee add fast mode toggle (#13212)
- add a local Fast mode setting in codex-core (similar to how model id
is currently stored on disk locally)
- send `service_tier=priority` on requests when Fast is enabled
- add `/fast` in the TUI and persist it locally
- feature flag
2026-03-02 20:29:33 -08:00
James Peter de66074777 chore(codex-rs): refresh mirror to upstream/main 2026-02-28 21:58:28 +10:00
Eric TrautandGitHub 090d73a016 Enable analytics in codex exec and codex mcp-server (#13083)
Addresses #12913

`codex exec` was not correctly defaulting to Otel metrics to enabled 
`codex mcp-server` completely lacked an Otel collector

Summary:
- default to enabling analytics when `codex exec` initializes
OpenTelemetry so the CLI actually reports metrics again
- add a regression test that proves the flag remains enabled by default
- added Otel collector to `codex mcp-server`
2026-02-27 19:22:54 -07:00
Eric TrautandGitHub 616334004a Suppress duplicate assistant output on stdout in interactive sessions (#13082)
Addresses #12566

Summary
- stop printing the final assistant message on stdout when the process
is running in a terminal so interactive users only see it once
- add a helper that gates the stdout emission and cover it with unit
tests
2026-02-27 18:31:17 -07:00
pakrym-oaiandGitHub 777708b46b Allow clients not to send summary as an option (#12950)
Summary is a required parameter on UserTurn. Ideally we'd like the core
to decide the appropriate summary level.

Make the summary optional and don't send it when not needed.
2026-02-26 14:37:38 -08:00
a2aaf8fa8e Use model catalog default for reasoning summary fallback (#12873)
## Summary
- make `Config.model_reasoning_summary` optional so unset means use
model default
- resolve the optional config value to a concrete summary when building
`TurnContext`
- add protocol support for `default_reasoning_summary` in model metadata

## Validation
- `cargo test -p codex-core --lib client::tests -- --nocapture`

---------

Co-authored-by: Codex <[email protected]>
2026-02-26 09:31:13 -08:00
James Peter 7a3ef9a97e Refresh codex-rs mirror to upstream/main 2026-02-27 02:48:37 +10:00
Charley CunninghamandGitHub 303f4e5b68 core: bundle settings diff updates into one dev/user envelope (#12417)
## Summary
- bundle contextual prompt injection into at most one developer message
plus one contextual user message in both:
  - per-turn settings updates
  - initial context insertion
- preserve `<model_switch>` across compaction by rebuilding it through
canonical initial-context injection, instead of relying on
strip/reattach hacks
- centralize contextual user fragment detection in one shared definition
table and reuse it for parsing/compaction logic
- keep `AGENTS.md` in its natural serialized format:
  - `# AGENTS.md instructions for {dirname}`
  - `<INSTRUCTIONS>...</INSTRUCTIONS>`
- simplify related tests/helpers and accept the expected snapshot/layout
updates from bundled multi-part messages

## Why
The goal is to converge toward a simpler, more intentional prompt shape
where contextual updates are consistently represented as one developer
envelope plus one contextual user envelope, while keeping parsing and
compaction behavior aligned with that representation.

## Notable details
- the temporary `SettingsUpdateEnvelope` wrapper was removed; these
paths now return `Vec<ResponseItem>` directly
- local/remote compaction no longer rely on model-switch strip/restore
helpers
- contextual user detection is now driven by shared fragment definitions
instead of ad hoc matcher assembly
- AGENTS/user instructions are still the same logical context; only the
synthetic `<user_instructions>` wrapper was replaced by the natural
AGENTS text format

## Testing
- `just fmt`
- `cargo test -p codex-app-server
codex_message_processor::tests::extract_conversation_summary_prefers_plain_user_messages
-- --exact`
- `cargo test -p codex-core
compact::tests::collect_user_messages_filters_session_prefix_entries
--lib -- --exact`
- `cargo test -p codex-core --test all
'suite::compact::snapshot_request_shape_pre_turn_compaction_strips_incoming_model_switch'
-- --exact`
- `cargo test -p codex-core --test all
'suite::compact_remote::snapshot_request_shape_remote_pre_turn_compaction_strips_incoming_model_switch'
-- --exact`
- `cargo test -p codex-core --test all
'suite::client::includes_apps_guidance_as_developer_message_when_enabled'
-- --exact`
- `cargo test -p codex-core --test all
'suite::client::includes_developer_instructions_message_in_request' --
--exact`
- `cargo test -p codex-core --test all
'suite::client::includes_user_instructions_message_in_request' --
--exact`
- `cargo test -p codex-core --test all
'suite::client::resume_includes_initial_messages_and_sends_prior_items'
-- --exact`
- `cargo test -p codex-core --test all
'suite::review::review_input_isolated_from_parent_history' -- --exact`
- `cargo test -p codex-exec --test all
'suite::resume::exec_resume_last_respects_cwd_filter_and_all_flag' --
--exact`
- `cargo test -p core_test_support
context_snapshot::tests::full_text_mode_preserves_unredacted_text --
--exact`

## Notes
- I also ran several targeted `compact`, `compact_remote`,
`prompt_caching`, `model_visible_layout`, and `event_mapping` tests
while iterating on prompt-shape changes.
- I have not claimed a clean full-workspace `cargo test` from this
environment because local sandbox/resource conditions have previously
produced unrelated failures in large workspace runs.
2026-02-26 00:12:08 -08:00
Celia ChenandGitHub 5ab9e02ac5 Revert "Add skill approval event/response (#12633)" (#12811)
This reverts commit https://github.com/openai/codex/pull/12633. We no
longer need this PR, because we favor sending normal exec command
approval server request with `additional_permissions` of skill
permissions instead
2026-02-26 01:02:42 +00:00
Charley CunninghamandGitHub f5a6d53c36 Enable request_user_input in Default mode (#12735)
## Summary
- allow `request_user_input` in Default collaboration mode as well as
Plan
- update the Default-mode instructions to prefer assumptions first and
use `request_user_input` only when a question is unavoidable
- update request_user_input and app-server tests to match the new
Default-mode behavior
- refactor collaboration-mode availability plumbing into
`CollaborationModesConfig` for future mode-related flags

## Codex author
`codex resume 019c9124-ed28-7c13-96c6-b916b1c97d49`
2026-02-25 15:20:46 -08:00
Owen LinandGitHub 9f91c580f7 feat(app-server): add ThreadItem::DynamicToolCall (#12732)
Previously, clients would call `thread/start` with dynamic_tools set,
and when a model invokes a dynamic tool, it would just make the
server->client `item/tool/call` request and wait for the client's
response to complete the tool call. This works, but it doesn't have an
`item/started` or `item/completed` event.

Now we are doing this:
- [new] emit `item/started` with `DynamicToolCall` populated with the
call arguments
- send an `item/tool/call` server request
- [new] once the client responds, emit `item/completed` with
`DynamicToolCall` populated with the response.

Also, with `persistExtendedHistory: true`, dynamic tool calls are now
reconstructable in `thread/read` and `thread/resume` as
`ThreadItem::DynamicToolCall`.
2026-02-25 12:00:10 -08:00
jif-oaiandGitHub 26c486e64b fix: flaky test due to second-resolution for thread ordering (#12692) 2026-02-25 09:59:25 +00:00
Michael BolinandGitHub 1b5b0f4a53 feat: pass helper executable paths via Arg0DispatchPaths (#12719)
## Why

`codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs` previously
located `codex-execve-wrapper` by scanning `PATH` and sibling
directories. That lookup is brittle and can select the wrong binary when
the runtime environment differs from startup assumptions.

We already pass `codex-linux-sandbox` from `codex-arg0`;
`codex-execve-wrapper` should use the same startup-driven path plumbing.

## What changed

- Introduced `Arg0DispatchPaths` in `codex-arg0` to carry both helper
executable paths:
  - `codex_linux_sandbox_exe`
  - `main_execve_wrapper_exe`
- Updated `arg0_dispatch_or_else()` to pass `Arg0DispatchPaths` to
top-level binaries and preserve helper paths created in
`prepend_path_entry_for_codex_aliases()`.
- Threaded `Arg0DispatchPaths` through entrypoints in `cli`, `exec`,
`tui`, `app-server`, and `mcp-server`.
- Added `main_execve_wrapper_exe` to core configuration plumbing
(`Config`, `ConfigOverrides`, and `SessionServices`).
- Updated zsh-fork shell escalation to consume the configured
`main_execve_wrapper_exe` and removed path-sniffing fallback logic.
- Updated app-server config reload paths so reloaded configs keep the
same startup-provided helper executable paths.

## References

- [`Arg0DispatchPaths`
definition](https://github.com/openai/codex/blob/e355b43d5c2a771f045296a6deae10d7c9c36ec6/codex-rs/arg0/src/lib.rs#L20-L24)
- [`arg0_dispatch_or_else()` forwarding both
paths](https://github.com/openai/codex/blob/e355b43d5c2a771f045296a6deae10d7c9c36ec6/codex-rs/arg0/src/lib.rs#L145-L176)
- [zsh-fork escalation using configured wrapper
path](https://github.com/openai/codex/blob/e355b43d5c2a771f045296a6deae10d7c9c36ec6/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs#L109-L150)

## Testing

- `cargo check -p codex-arg0 -p codex-core -p codex-exec -p codex-tui -p
codex-mcp-server -p codex-app-server`
- `cargo test -p codex-arg0`
- `cargo test -p codex-core tools::runtimes::shell::unix_escalation:: --
--nocapture`
2026-02-24 17:44:38 -08:00
daveaitel-openaiandGitHub 8e994125c4 Agent jobs (spawn_agents_on_csv) + progress UI (#10935)
## Summary
- Add agent job support: spawn a batch of sub-agents from CSV, auto-run,
auto-export, and store results in SQLite.
- Simplify workflow: remove run/resume/get-status/export tools; spawn is
deterministic and completes in one call.
- Improve exec UX: stable, single-line progress bar with ETA; suppress
sub-agent chatter in exec.

## Why
Enables map-reduce style workflows over arbitrarily large repos using
the existing Codex orchestrator. This addresses review feedback about
overly complex job controls and non-deterministic monitoring.

## Demo (progress bar)
```
./codex-rs/target/debug/codex exec \
  --enable collab \
  --enable sqlite \
  --full-auto \
  --progress-cursor \
  -c agents.max_threads=16 \
  -C /Users/daveaitel/code/codex \
  - <<'PROMPT'
Create /tmp/agent_job_progress_demo.csv with columns: path,area and 30 rows:
path = item-01..item-30, area = test.

Then call spawn_agents_on_csv with:
- csv_path: /tmp/agent_job_progress_demo.csv
- instruction: "Run `python - <<'PY'` to sleep a random 0.3–1.2s, then output JSON with keys: path, score (int). Set score = 1."
- output_csv_path: /tmp/agent_job_progress_demo_out.csv
PROMPT
```

## Review feedback addressed
- Auto-start jobs on spawn; removed run/resume/status/export tools.
- Auto-export on success.
- More descriptive tool spec + clearer prompts.
- Avoid deadlocks on spawn failure; pending/running handled safely.
- Progress bar no longer scrolls; stable single-line redraw.

## Tests
- `cd codex-rs && cargo test -p codex-exec`
- `cd codex-rs && cargo build -p codex-cli`
2026-02-24 21:00:19 +00:00
pakrym-oaiandGitHub f8e6f6db39 Add skill approval event/response (#12633)
Set the stage for skill-level permission approval in addition to
command-level.

Behind a feature flag.
2026-02-23 22:28:58 -08:00
Dylan HurdandGitHub cbff64da9a fix(exec) Patch resume test race condition (#12648)
## Summary
The test exec_resume_last_respects_cwd_filter_and_all_flag makes one
session “newest” by resuming it, but rollout updated_at is stored/sorted
at second precision. On fast CI (especially Windows), the touch could
land in the same second as initial session creation, making ordering
nondeterministic.

This change adds a short sleep before the recency-touch step so the
resumed session is guaranteed to have a later updated_at, preserving the
intended assertion without changing product behavior.
2026-02-23 21:54:25 -08:00
jif-oaiandGitHub 31498be13a feat: land sqlite (#12141) 2026-02-23 16:12:23 +00:00
Eric TrautandGitHub d6da4f07a8 Allow exec resume to parse output-last-message flag after command (#12541)
Summary
- mark `output-last-message` as a global exec flag so it can follow
subcommands like `resume`
- add regression tests in both `cli` and `exec` crates verifying the
flag order works when invoking `resume`

Fixes #12538
2026-02-23 07:55:37 -08:00
Michael BolinandGitHub 08cd3937c5 fix: codex-arg0 no longer depends on codex-core (#12434)
## Why

`codex-rs/arg0` only needed two things from `codex-core`:

- the `find_codex_home()` wrapper
- the special argv flag used for the internal `apply_patch`
self-invocation path

That made `codex-arg0` depend on `codex-core` for a very small surface
area. This change removes that dependency edge and moves the shared
`apply_patch` invocation flag to a more natural boundary
(`codex-apply-patch`) while keeping the contract explicitly documented.

## What Changed

- Moved the internal `apply_patch` argv[1] flag constant out of
`codex-core` and into `codex-apply-patch`.
- Renamed the constant to `CODEX_CORE_APPLY_PATCH_ARG1` and documented
that it is part of the Codex core process-invocation contract (even
though it now lives in `codex-apply-patch`).
- Updated `arg0`, the core apply-patch runtime, and the `codex-exec`
apply-patch test to import the constant from `codex-apply-patch`.
- Updated `codex-rs/arg0` to call
`codex_utils_home_dir::find_codex_home()` directly instead of
`codex_core::config::find_codex_home()`.
- Removed the `codex-core` dependency from `codex-rs/arg0` and added the
needed direct dependency on `codex-utils-home-dir`.
- Added `codex-apply-patch` as a dev-dependency for `codex-rs/exec`
tests (the apply-patch test now imports the moved constant directly).

## Verification

- `cargo test -p codex-apply-patch`
- `cargo test -p codex-arg0`
- `cargo test -p codex-core --lib apply_patch`
- `cargo test -p codex-exec
test_standalone_exec_cli_can_use_apply_patch`
- `cargo shear`
2026-02-21 00:20:42 -08:00
Michael BolinandGitHub 997c2e1575 chore: remove codex-core public protocol/shell re-exports (#12432)
## Why

`codex-rs/core/src/lib.rs` re-exported a broad set of types and modules
from `codex-protocol` and `codex-shell-command`. That made it easy for
workspace crates to import those APIs through `codex-core`, which in
turn hides dependency edges and makes it harder to reduce compile-time
coupling over time.

This change removes those public re-exports so call sites must import
from the source crates directly. Even when a crate still depends on
`codex-core` today, this makes dependency boundaries explicit and
unblocks future work to drop `codex-core` dependencies where possible.

## What Changed

- Removed public re-exports from `codex-rs/core/src/lib.rs` for:
- `codex_protocol::protocol` and related protocol/model types (including
`InitialHistory`)
  - `codex_protocol::config_types` (`protocol_config_types`)
- `codex_shell_command::{bash, is_dangerous_command, is_safe_command,
parse_command, powershell}`
- Migrated workspace Rust call sites to import directly from:
  - `codex_protocol::protocol`
  - `codex_protocol::config_types`
  - `codex_protocol::models`
  - `codex_shell_command`
- Added explicit `Cargo.toml` dependencies (`codex-protocol` /
`codex-shell-command`) in crates that now import those crates directly.
- Kept `codex-core` internal modules compiling by using `pub(crate)`
aliases in `core/src/lib.rs` (internal-only, not part of the public
API).
- Updated the two utility crates that can already drop a `codex-core`
dependency edge entirely:
  - `codex-utils-approval-presets`
  - `codex-utils-cli`

## Verification

- `cargo test -p codex-utils-approval-presets`
- `cargo test -p codex-utils-cli`
- `cargo check --workspace --all-targets`
- `just clippy`
2026-02-20 23:45:35 -08:00
Ahmed IbrahimandGitHub 099addc670 Wire realtime api to core (#12268)
- Introduce `RealtimeConversationManager` for realtime API management 
- Add `op::conversation` to start conversation, insert audio, insert
text, and close conversation.
- emit conversation lifecycle and realtime events.
- Move shared realtime payload types into codex-protocol and add core
e2e websocket tests for start/replace/transport-close paths.

Things to consider:
- Should we use the same `op::` and `Events` channel to carry audio? I
think we should try this simple approach and later we can create
separate one if the channels got congested.
- Sending text updates to the client: we can start simple and later
restrict that.
- Provider auth isn't wired for now intentionally
2026-02-20 19:06:35 -08:00
James Peter 71e0c242c4 Refresh codex-rs mirror to upstream/main 2026-02-21 11:34:27 +10:00
jif-oaiandGitHub a6d5d3010d feat: cleaner TUI for sub-agents (#12327)
<img width="760" height="496" alt="Screenshot 2026-02-20 at 14 31 25"
src="https://github.com/user-attachments/assets/1983b825-bb47-417e-9925-6f727af56765"
/>
2026-02-20 15:26:33 +00:00
sayan-oaiandGitHub 2ade2d4577 client side modelinfo overrides (#12101)
TL;DR
Add top-level `model_catalog_json` config support so users can supply a
local model catalog override from a JSON file path (including adding new
models) without backend changes.

### Problem
Codex previously had no clean client-side way to replace/overlay model
catalog data for local testing of model metadata and new model entries.

### Fix
- Add top-level `model_catalog_json` config field (JSON file path).
- Apply catalog entries when resolving `ModelInfo`:
  1. Base resolved model metadata (remote/fallback)
  2. Catalog overlay from `model_catalog_json`
3. Existing global top-level overrides (`model_context_window`,
`model_supports_reasoning_summaries`, etc.)

### Note
Will revisit per-field overrides in a follow-up

### Tests
Added tests
2026-02-19 10:38:57 -08:00
Jack MousseauandGitHub c167c1c4dc Restore phase when loading from history (#12244) 2026-02-19 09:56:56 -08:00
zeekay 83b05674ab Merge remote-tracking branch 'openai-upstream/main'
# Conflicts:
#	.github/prompts/issue-labeler.txt
#	.github/workflows/issue-labeler.yml
#	MODULE.bazel.lock
#	codex-rs/core/src/agent/role.rs
#	codex-rs/core/src/memories/storage.rs
#	codex-rs/core/src/models_manager/manager.rs
#	codex-rs/core/src/tools/handlers/collab.rs
#	codex-rs/core/src/tools/registry.rs
#	codex-rs/core/src/tools/spec.rs
#	codex-rs/core/templates/search_tool/tool_description.md
#	codex-rs/core/tests/common/responses.rs
#	codex-rs/core/tests/suite/compact.rs
#	codex-rs/core/tests/suite/compact_remote.rs
#	codex-rs/core/tests/suite/personality.rs
2026-02-18 13:34:51 -08:00
aaronl-openaiandGitHub feb96f2419 [js_repl] paths for node module resolution can be specified for js_repl (#11944)
# External (non-OpenAI) Pull Request Requirements

In `js_repl` mode, module resolution currently starts from
`js_repl_kernel.js`, which is written to a per-kernel temp dir. This
effectively means that bare imports will not resolve.

This PR adds a new config option, `js_repl_node_module_dirs`, which is a
list of dirs that are used (in order) to resolve a bare import. If none
of those work, the current working directory of the thread is used.

For example:
```toml
js_repl_node_module_dirs = [
    "/path/to/node_modules/",
    "/other/path/to/node_modules/",
]
```
2026-02-17 23:29:49 -08:00
Owen LinandGitHub bfbe6e394e feat(core): zsh exec bridge (#12052)
zsh fork PR stack:
- https://github.com/openai/codex/pull/12051 
- https://github.com/openai/codex/pull/12052 👈 

### Summary
This PR introduces a feature-gated native shell runtime path that routes
shell execution through a patched zsh exec bridge, removing MCP-specific
behavior from the shell hot path while preserving existing
CommandExecution lifecycle semantics.

When shell_zsh_fork is enabled, shell commands run via patched zsh with
per-`execve` interception through EXEC_WRAPPER. Core receives wrapper
IPC requests over a Unix socket, applies existing approval policy, and
returns allow/deny before the subcommand executes.

### What’s included
**1) New zsh exec bridge runtime in core**
- Wrapper-mode entrypoint (maybe_run_zsh_exec_wrapper_mode) for
EXEC_WRAPPER invocations.
- Per-execution Unix-socket IPC handling for wrapper requests/responses.
- Approval callback integration using existing core approval
orchestration.
- Streaming stdout/stderr deltas to existing command output event
pipeline.
- Error handling for malformed IPC, denial/abort, and execution
failures.

**2) Session lifecycle integration**
SessionServices now owns a `ZshExecBridge`.
Session startup initializes bridge state; shutdown tears it down
cleanly.

**3) Shell runtime routing (feature-gated)**
When `shell_zsh_fork` is enabled:
- Build execution env/spec as usual.
- Add wrapper socket env wiring.
- Execute via `zsh_exec_bridge.execute_shell_request(...)` instead of
the regular shell path.
- Non-zsh-fork behavior remains unchanged.

**4) Config + feature wiring**
- Added `Feature::ShellZshFork` (under development).
- Added config support for `zsh_path` (optional absolute path to patched
zsh):
- `Config`, `ConfigToml`, `ConfigProfile`, overrides, and schema.
- Session startup validates that `zsh_path` exists/usable when zsh-fork
is enabled.
- Added startup test for missing `zsh_path` failure mode.

**5) Seatbelt/sandbox updates for wrapper IPC**
- Extended seatbelt policy generation to optionally allow outbound
connection to explicitly permitted Unix sockets.
- Wired sandboxing path to pass wrapper socket path through to seatbelt
policy generation.
- Added/updated seatbelt tests for explicit socket allow rule and
argument emission.

**6) Runtime entrypoint hooks**
- This allows the same binary to act as the zsh wrapper subprocess when
invoked via `EXEC_WRAPPER`.

**7) Tool selection behavior**
- ToolsConfig now prefers ShellCommand type when shell_zsh_fork is
enabled.
- Added test coverage for precedence with unified-exec enabled.
2026-02-17 20:19:53 -08:00
sayan-oaiandGitHub 5456931fe3 chore: rm remote models fflag (#11699)
rm `remote_models` feature flag.

We see issues like #11527 when a user has `remote_models` disabled, as
we always use the default fallback `ModelInfo`. This causes issues with
model performance.

Builds on #11690, which helps by warning the user when they are using
the default fallback. This PR will make that happen much less frequently
as an accidental consequence of disabling `remote_models`.
2026-02-17 11:43:16 -08:00
Shijie RaoandGitHub 11f70b01a9 Feat: add model reroute notification (#12001)
### Summary
Builiding off
https://github.com/openai/codex/pull/11964/files/5c75aa7b89a70bc2cc410a6fd238749306ec4c5e#diff-058ae8f109a8b84b4b79bbfa45f522c2233b9d9e139696044ae374d50b6196e0,
we have created a `model/rerouted` notification that captures the event
so that consumers can render as expected. Keep the `EventMsg::Warning`
path in core so that this does not affect TUI rendering.

`model/rerouted` is meant to be generic to account for future usage
including capacity planning etc.
2026-02-17 11:02:23 -08:00