Commit Graph

4710 Commits

  • chore(deps): bump insta from 1.46.2 to 1.46.3 in /codex-rs (#11140)
    Bumps [insta](https://github.com/mitsuhiko/insta) from 1.46.2 to 1.46.3.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    href="https://github.com/mitsuhiko/insta/releases">insta's
    releases</a>.</em></p>
    <blockquote>
    <h2>1.46.3</h2>
    <h2>Release Notes</h2>
    <ul>
    <li>Fix inline escaped snapshots incorrectly stripping leading newlines
    when content contains control characters like carriage returns. The
    escaped format (used for snapshots with control chars) now correctly
    preserves the original content without stripping a non-existent
    formatting newline. <a
    href="https://redirect.github.com/mitsuhiko/insta/issues/865">#865</a></li>
    </ul>
    <h2>Install cargo-insta 1.46.3</h2>
    <h3>Install prebuilt binaries via shell script</h3>
    <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
    https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-installer.sh
    | sh
    </code></pre>
    <h3>Install prebuilt binaries via powershell script</h3>
    <pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c &quot;irm
    https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-installer.ps1
    | iex&quot;
    </code></pre>
    <h2>Download cargo-insta 1.46.3</h2>
    <table>
    <thead>
    <tr>
    <th>File</th>
    <th>Platform</th>
    <th>Checksum</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-aarch64-apple-darwin.tar.xz">cargo-insta-aarch64-apple-darwin.tar.xz</a></td>
    <td>Apple Silicon macOS</td>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-aarch64-apple-darwin.tar.xz.sha256">checksum</a></td>
    </tr>
    <tr>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-apple-darwin.tar.xz">cargo-insta-x86_64-apple-darwin.tar.xz</a></td>
    <td>Intel macOS</td>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-apple-darwin.tar.xz.sha256">checksum</a></td>
    </tr>
    <tr>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-pc-windows-msvc.zip">cargo-insta-x86_64-pc-windows-msvc.zip</a></td>
    <td>x64 Windows</td>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
    </tr>
    <tr>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-gnu.tar.xz">cargo-insta-x86_64-unknown-linux-gnu.tar.xz</a></td>
    <td>x64 Linux</td>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-gnu.tar.xz.sha256">checksum</a></td>
    </tr>
    <tr>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-musl.tar.xz">cargo-insta-x86_64-unknown-linux-musl.tar.xz</a></td>
    <td>x64 MUSL Linux</td>
    <td><a
    href="https://github.com/mitsuhiko/insta/releases/download/1.46.3/cargo-insta-x86_64-unknown-linux-musl.tar.xz.sha256">checksum</a></td>
    </tr>
    </tbody>
    </table>
    </blockquote>
    </details>
    <details>
    <summary>Changelog</summary>
    <p><em>Sourced from <a
    href="https://github.com/mitsuhiko/insta/blob/master/CHANGELOG.md">insta's
    changelog</a>.</em></p>
    <blockquote>
    <h2>1.46.3</h2>
    <ul>
    <li>Fix inline escaped snapshots incorrectly stripping leading newlines
    when content contains control characters like carriage returns. The
    escaped format (used for snapshots with control chars) now correctly
    preserves the original content without stripping a non-existent
    formatting newline. <a
    href="https://redirect.github.com/mitsuhiko/insta/issues/865">#865</a></li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    href="https://github.com/mitsuhiko/insta/commit/13245901751701f45677b9cfe3537c182b47af02"><code>1324590</code></a>
    Release 1.46.3 (<a
    href="https://redirect.github.com/mitsuhiko/insta/issues/870">#870</a>)</li>
    <li><a
    href="https://github.com/mitsuhiko/insta/commit/b26bc7ffe1653d42e274077bb711559f2cd5a553"><code>b26bc7f</code></a>
    Fix escaped format inline snapshots not stripping formatting newline (<a
    href="https://redirect.github.com/mitsuhiko/insta/issues/869">#869</a>)</li>
    <li>See full diff in <a
    href="https://github.com/mitsuhiko/insta/compare/1.46.2...1.46.3">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=insta&package-manager=cargo&previous-version=1.46.2&new-version=1.46.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
    
    Dependabot will resolve any conflicts with this PR as long as you don't
    alter it yourself. You can also trigger a rebase manually by commenting
    `@dependabot rebase`.
    
    [//]: # (dependabot-automerge-start)
    [//]: # (dependabot-automerge-end)
    
    ---
    
    <details>
    <summary>Dependabot commands and options</summary>
    <br />
    
    You can trigger Dependabot actions by commenting on this PR:
    - `@dependabot rebase` will rebase this PR
    - `@dependabot recreate` will recreate this PR, overwriting any edits
    that have been made to it
    - `@dependabot show <dependency name> ignore conditions` will show all
    of the ignore conditions of the specified dependency
    - `@dependabot ignore this major version` will close this PR and stop
    Dependabot creating any more for this major version (unless you reopen
    the PR or upgrade to it yourself)
    - `@dependabot ignore this minor version` will close this PR and stop
    Dependabot creating any more for this minor version (unless you reopen
    the PR or upgrade to it yourself)
    - `@dependabot ignore this dependency` will close this PR and stop
    Dependabot creating any more for this dependency (unless you reopen the
    PR or upgrade to it yourself)
    
    
    </details>
    
    Signed-off-by: dependabot[bot] <support@github.com>
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • fix(app-server): for external auth, replace id_token with chatgpt_acc… (#11240)
    …ount_id and chatgpt_plan_type
    
    ### Summary
    Following up on external auth mode which was introduced here:
    https://github.com/openai/codex/pull/10012
    
    Turns out some clients have a differently shaped ID token and don't have
    a chosen workspace (aka chatgpt_account_id) encoded in their ID token.
    So, let's replace `id_token` param with `chatgpt_account_id` and
    `chatgpt_plan_type` (optional) when initializing the external ChatGPT
    auth mode (`account/login/start` with `chatgptAuthTokens`).
    
    The client was able to test end-to-end with a Codex build from this
    branch and verified it worked!
  • Adjust shell command timeouts for Windows (#11247)
    Summary
    - add platform-aware defaults for shell command timeouts so Windows
    tests get longer waits
    - keep medium timeout longer on Windows to ensure flakiness is reduced
    
    Testing
    - Not run (not requested)
  • test: deflake nextest child-process leak in MCP harnesses (#11263)
    ## Summary
    - add deterministic child-process cleanup to both test `McpProcess`
    helpers
    - keep Tokio `kill_on_drop(true)` but also reap via bounded `try_wait()`
    polling in `Drop`
    - document the failure mode and why this avoids nondeterministic `LEAK`
    flakes
    
    ## Why
    `cargo nextest` leak detection can intermittently report `LEAK` when a
    spawned server outlives test teardown, making CI flaky.
    
    ## Testing
    - `just fmt`
    - `cargo test -p codex-app-server`
    - `cargo test -p codex-mcp-server`
    
    
    ## Failing CI Reference
    - Original failing job:
    https://github.com/openai/codex/actions/runs/21845226299/job/63039443593?pr=11245
  • chore: change ConfigState so it no longer depends on a single config.toml file for reloading (#11262)
    If anything, it should depend on `ConfigLayerStack`.
    
    ---
    [//]: # (BEGIN SAPLING FOOTER)
    Stack created with [Sapling](https://sapling-scm.com). Best reviewed
    with [ReviewStack](https://reviewstack.dev/openai/codex/pull/11262).
    * #11207
    * __->__ #11262
  • deflake linux-sandbox NoNewPrivs timeout (#11245)
    Deflake `codex-linux-sandbox::all
    suite::landlock::test_no_new_privs_is_enabled`.
    
    CI has intermittently failed with `Sandbox(Timeout)` (exit 124) because
    the sandboxed
    `grep '^NoNewPrivs:' /proc/self/status` can run close to the short
    timeout budget.
    
    This updates only this test to use `LONG_TIMEOUT_MS`, which removes the
    near-threshold timeout
    behavior while keeping the rest of the suite unchanged.
    
    Refs (previous failures):
    - PR:
    https://github.com/openai/codex/actions/runs/21836764823/job/63009902779
    - PR:
    https://github.com/openai/codex/actions/runs/21837427251/job/63012470353
    - main:
    https://github.com/openai/codex/actions/runs/21830746538/job/62988079964
    
    Validation:
    - Local: `cd codex-rs && cargo test -p codex-linux-sandbox` (non-Linux
    runs 0 tests)
  • Update models.json (#9739)
    Automated update of models.json.
    
    ---------
    
    Co-authored-by: aibrahim-oai <219906144+aibrahim-oai@users.noreply.github.com>
    Co-authored-by: Ahmed Ibrahim <aibrahim@openai.com>
  • Remove offline fallback for models (#11238)
    # External (non-OpenAI) Pull Request Requirements
    
    Before opening this Pull Request, please read the dedicated
    "Contributing" markdown file or your PR may be closed:
    https://github.com/openai/codex/blob/main/docs/contributing.md
    
    If your PR conforms to our contribution guidelines, replace this text
    with a detailed and high quality description of your changes.
    
    Include a link to a bug report or enhancement request.
  • fix(tui): tab submits when no task running in steer mode (#10035)
    When steer mode is enabled, Tab used to only queue while a task was
    running and otherwise did nothing. Treat Tab as an immediate submit when
    no task is running so input isn't dropped when the inflight turn ends
    mid-typing.
    
    Adds a regression test and updates docs/tooltips.
  • fix: nix build by adding missing dependencies and fix outputHashes (#11185)
    Fixes #11020
    
    I do think think `nix build` should run in CI, I had multiple issues
    trying to build the flake in the past, as it's continuously out of sync
    with the rest of the repo. (like a few days ago I didn't need the
    updated outputHashes, just the missing packages).
    
    Co-authored-by: Eric Traut <etraut@openai.com>
  • fix(feature) UnderDevelopment feature must be off (#11242)
    ## Summary
    1. Bump RemoteModels to Stable
    2. Assert that all UnderDevelopment features are off by default
    
    ## Testing
    - [x] Added unit test
  • Use longest remote model prefix matching (#11228)
    Match model metadata by longest matching remote slug prefix before local
    fallback.
    
    - Update `get_model_info` to prefer the most specific remote slug prefix
    for the requested model.
    - Add an integration test to assert `gpt-5.3-codex-test` resolves to
    `gpt-5.3-codex` over `gpt-5.3`.
  • [apps] Add gated instructions for Apps. (#10924)
    - [x] Add gated instructions for Apps.
  • adding image support for gif and webp (#11237)
    Adds image support for gif and webp images. Tested using webp and gif
    (both single and multi image gif files)
  • fix(tui): keep unified exec summary on working line (#10962)
    ## Problem
    When unified-exec background sessions appear while the status indicator
    is visible, the bottom pane can grow by one row to show a dedicated
    footer line. That row insertion/removal makes the composer jump
    vertically and produces visible jitter/flicker during streaming turns.
    
    ## Mental model
    The bottom pane should expose one canonical background-exec summary
    string, but it should surface that string in only one place at a time:
    - if the status indicator row is visible, show the summary inline on
    that row;
    - if the status indicator row is hidden, show the summary as the
    standalone unified-exec footer row.
    
    This keeps status information visible while preserving a stable pane
    height.
    
    ## Non-goals
    This change does not alter unified-exec lifecycle, process tracking, or
    `/ps` behavior. It does not redesign status text copy, spinner timing,
    or interrupt handling semantics.
    
    ## Tradeoffs
    Inlining the summary preserves layout stability and keeps interrupt
    affordances in a fixed location, but it reduces horizontal space for
    long status/detail text in narrow terminals. We accept that truncation
    risk in exchange for removing vertical jitter and keeping the composer
    anchored.
    
    ## Architecture
    `UnifiedExecFooter` remains the source of truth for background-process
    summary copy via `summary_text()`. `BottomPane` mirrors that text into
    `StatusIndicatorWidget::update_inline_message()` whenever process state
    changes or a status widget is created. Rendering enforces single-surface
    output: the standalone footer row is skipped while status is present,
    and the status row appends the summary after the elapsed/interrupt
    segment.
    
    ## Documentation pass
    Added non-functional docs/comments that make the new invariant explicit:
    - status row owns inline summary when present;
    - unified-exec footer row renders only when status row is absent;
    - summary ordering keeps elapsed/interrupt affordance in a stable
    position.
    
    ## Observability
    No new telemetry or logs are introduced. The behavior is traceable
    through:
    - `BottomPane::set_unified_exec_processes()` for state updates,
    - `BottomPane::sync_status_inline_message()` for status-row
    synchronization,
    - `StatusIndicatorWidget::render()` for final inline ordering.
    
    ## Tests
    - Added
    `bottom_pane::tests::unified_exec_summary_does_not_increase_height_when_status_visible`
    to lock the no-height-growth invariant.
    - Updated the unified-exec status restoration snapshot to match inline
    rendering order.
    - Validated with:
      - `just fmt`
      - `cargo test -p codex-tui --lib`
    
    ---------
    
    Co-authored-by: Sayan Sisodiya <sayan@openai.com>
  • feat: tie shell snapshot to cwd (#11231)
    Fix for this: https://github.com/openai/codex/issues/11223
    
    Basically we tie the shell snapshot to a `cwd` to handle `cwd`-based env
    setups
  • skill-creator: Remove invalid reference. (#10960)
    Remove references to two files that do not exist.
  • state: add memory consolidation lock primitives (#11199)
    ## Summary
    - add a migration for memory_consolidation_locks
    - add acquire/release lock primitives to codex-state runtime
    - add core/state_db wrappers and cwd normalization for memory queries
    and lock keys
    
    ## Testing
    - cargo test -p codex-state memory_consolidation_lock_
    - cargo test -p codex-core --lib state_db::
  • feat: search_tool (#10657)
    **Why We Did This**
    - The goal is to reduce MCP tool context pollution by not exposing the
    full MCP tool list up front
    - It forces an explicit discovery step (`search_tool_bm25`) so the model
    narrows tool scope before making MCP calls, which helps relevance and
    lowers prompt/tool clutter.
    
    **What It Changed**
    - Added a new experimental feature flag `search_tool` in
    `core/src/features.rs:90` and `core/src/features.rs:430`.
    - Added config/schema support for that flag in
    `core/config.schema.json:214` and `core/config.schema.json:1235`.
    - Added BM25 dependency (`bm25`) in `Cargo.toml:129` and
    `core/Cargo.toml:23`.
    - Added new tool handler `search_tool_bm25` in
    `core/src/tools/handlers/search_tool_bm25.rs:18`.
    - Registered the handler and tool spec in
    `core/src/tools/handlers/mod.rs:11` and `core/src/tools/spec.rs:780` and
    `core/src/tools/spec.rs:1344`.
    - Extended `ToolsConfig` to carry `search_tool` enablement in
    `core/src/tools/spec.rs:32` and `core/src/tools/spec.rs:56`.
    - Injected dedicated developer instructions for tool-discovery workflow
    in `core/src/codex.rs:483` and `core/src/codex.rs:1976`, using
    `core/templates/search_tool/developer_instructions.md:1`.
    - Added session state to store one-shot selected MCP tools in
    `core/src/state/session.rs:27` and `core/src/state/session.rs:131`.
    - Added filtering so when feature is enabled, only selected MCP tools
    are exposed on the next request (then consumed) in
    `core/src/codex.rs:3800` and `core/src/codex.rs:3843`.
    - Added E2E suite coverage for
    enablement/instructions/hide-until-search/one-turn-selection in
    `core/tests/suite/search_tool.rs:72`,
    `core/tests/suite/search_tool.rs:109`,
    `core/tests/suite/search_tool.rs:147`, and
    `core/tests/suite/search_tool.rs:218`.
    - Refactored test helper utilities to support config-driven tool
    collection in `core/tests/suite/tools.rs:281`.
    
    **Net Behavioral Effect**
    - With `search_tool` **off**: existing MCP behavior (tools exposed
    normally).
    - With `search_tool` **on**: MCP tools start hidden, model must call
    `search_tool_bm25`, and only returned `selected_tools` are available for
    the next model call.
  • core: add focused diagnostics for remote compaction overflows (#11133)
    ## Summary
    - add targeted remote-compaction failure diagnostics in compact_remote
    logging
    - log the specific values needed to explain overflow timing:
      - last_api_response_total_tokens
      - estimated_tokens_of_items_added_since_last_successful_api_response
      - estimated_bytes_of_items_added_since_last_successful_api_response
      - failing_compaction_request_body_bytes
    - simplify breakdown naming and remove
    last_api_response_total_bytes_estimate (it was an approximation and not
    useful for debugging)
    
    ## Why
    When compaction fails with context_length_exceeded, we need concrete,
    low-ambiguity numbers that map directly to:
    1) what the API most recently reported, and
    2) what local history added since then.
    
    This keeps the failure logs actionable without adding broad, noisy
    metrics.
    
    ## Testing
    - just fmt
    - cargo test -p codex-core
  • TUI: fix request_user_input wrapping for long option labels (#11123)
    ## Summary
    
    This PR fixes long-text rendering in the `request_user_input` TUI
    overlay while preserving a clear two-column option layout. (Issue
    https://github.com/openai/codex/issues/11093)
    
    Before:
    - very long option labels could push description text into a narrow
    right-edge strip
    - option labels were effectively single-line when descriptions were
    present, causing truncation/poor readability
    - label and description wrapping interacted in one combined wrapped line
    
    <img width="504" height="409" alt="Screenshot 2026-02-08 at 2 27 25 PM"
    src="https://github.com/user-attachments/assets/a9afd108-d792-4522-bce1-e43b3cce882b"
    />
    
    After:
    - option labels wrap inside the left column
    - descriptions wrap independently inside the right column
    - row measurement and row rendering use the same wrapping path, so
    layout stays stable
    
    <img width="582" height="211" alt="Screenshot 2026-02-09 at 10 28 02 AM"
    src="https://github.com/user-attachments/assets/47885a1c-07e5-4b0f-b992-032b149f1b0d"
    />
    
    ## Problem
    
    `request_user_input` needs to handle verbose prompts/options. With
    oversized labels:
    - descriptions could collapse into a thin, hard-to-read column
    - important label context was lost
    
    ## Root Cause
    
    In shared row rendering (`selection_popup_common`):
    - rows were wrapped as a single combined line
    - auto column sizing could still place `desc_col` too far right for long
    labels
    - `request_user_input` rows did not provide wrap metadata to align
    continuation lines after the option prefix
    
    ## What Changed
    
    ### 1) `request_user_input` rows opt into wrapped labels
    File: `codex-rs/tui/src/bottom_pane/request_user_input/mod.rs`
    
    - In `option_rows()`, compute the rendered option prefix (`› 1. ` / ` 2.
    `) and set `wrap_indent` from its display width.
    - Apply the same behavior to the synthetic “None of the above” row.
    - Add long-text snapshot test coverage
    (`question_with_very_long_option_text` +
    `request_user_input_long_option_text_snapshot`).
    
    ### 2) Shared renderer now has an opt-in two-column wrapping path
    File: `codex-rs/tui/src/bottom_pane/selection_popup_common.rs`
    
    - Add focused helpers:
      - `should_wrap_name_in_column`
      - `wrap_two_column_row`
      - `wrap_standard_row`
      - `wrap_row_lines`
      - `apply_row_state_style`
    - For opted-in rows (plain option rows with `wrap_indent` +
    description), wrap label and description independently in their own
    columns.
    - Keep the legacy standard wrapping path for non-opted rows.
    - Use the same `wrap_row_lines` function in both rendering and height
    measurement to keep them in sync.
    
    ### 3) Keep column sizing simple and derived from existing fixed split
    constants
    File: `codex-rs/tui/src/bottom_pane/selection_popup_common.rs`
    
    - Keep fixed mode at `3/10` left column (`30/70` split).
    - In auto modes, cap label width using those same fixed constants (max
    70% label, min 30% description), instead of extra special-case
    constants/branches.
    - Add/keep narrow-width safety guard in `wrap_two_column_row` so
    extremely small widths do not panic.
    
    ### 4) Snapshot coverage
    File: `codex-rs/tui/src/bottom_pane/request_user_input/snapshots/
    
    codex_tui__bottom_pane__request_user_input__tests__request_user_input_long_option_text.snap`
    
    - Add snapshot for long-label/long-description two-column rendering
    behavior.
  • chore: remove network-proxy-cli crate (#11158)
    ## Summary
    - remove `network-proxy-cli` from the Rust workspace members
    - delete the dedicated `codex-network-proxy-cli` crate files
    - remove the stale `codex-network-proxy-cli` package entry from
    `Cargo.lock`
    
    ## Testing
    - just fmt
    - cargo test -p codex-network-proxy
  • Move warmup to the task level (#11216)
    Instead of storing a special connection on the client level make the
    regular task responsible for establishing a normal client session and
    open a connection on it.
    
    Then when the turn is started we pass in a pre-established session.
  • Move warmup to the task level (#11216)
    Instead of storing a special connection on the client level make the
    regular task responsible for establishing a normal client session and
    open a connection on it.
    
    Then when the turn is started we pass in a pre-established session.
  • Fixed bug in file watcher that results in spurious skills update events and large log files (#11217)
    On some platforms, the "notify" file watcher library emits events for
    file opens and reads, not just file modifications or deletes. The
    previous implementation didn't take this into account.
    
    Furthermore, the `tracing.info!` call that I previously added was
    emitting a lot of logs. I had assumed incorrectly that `info` level
    logging was disabled by default, but it's apparently enabled for this
    crate. This is resulting in large logs (hundreds of MB) for some users.
  • Translate websocket errors (#10937)
    When getting errors over a websocket connection, translate the error
    into our regular API error format
  • tools: remove get_memory tool and tests (#11198)
    Drop this memory tool as the design changed
  • core: account for all post-response items in auto-compact token checks (#11132)
    ## Summary
    - change compaction pre-check accounting to include all items added
    after the last model-generated item, not only trailing codex-generated
    outputs
    - use that boundary consistently in get_total_token_usage() and
    get_total_token_usage_breakdown()
    - update history tests to cover user/tool-output items after the last
    model item
    
    ## Why
    last_token_usage.total_tokens is API-reported for the last successful
    model response. After that point, local history may gain additional
    items (user messages, injected context, tool outputs). Compaction
    triggering must account for all of those items to avoid late compaction
    attempts that can overflow context.
    
    ## Testing
    - just fmt
    - cargo test -p codex-core
  • Load requirements on windows (#10770)
    We support requirements on Unix, loading from
    `/etc/codex/requirements.toml`. On MacOS, we also support MDM.
    
    Now, on Windows, we'll load requirements from
    `%ProgramData%\OpenAI\Codex\requirements.toml`
  • Deflake mixed parallel tools timing test (#11193)
    ```
            FAIL [   1.903s] (1926/3311) codex-core::all suite::tool_parallelism::mixed_parallel_tools_run_in_parallel
      stdout ───
    
        running 1 test
        test suite::tool_parallelism::mixed_parallel_tools_run_in_parallel ... FAILED
    
        failures:
    
        failures:
            suite::tool_parallelism::mixed_parallel_tools_run_in_parallel
    
        test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 684 filtered out; finished in 1.86s
        
      stderr ───
    
        thread 'suite::tool_parallelism::mixed_parallel_tools_run_in_parallel' (205083) panicked at core/tests/suite/tool_parallelism.rs:74:5:
        expected parallel execution to finish quickly, got 1.406255993s
        stack backtrace:
           0: __rustc::rust_begin_unwind
                     at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/std/src/panicking.rs:689:5
           1: core::panicking::panic_fmt
                     at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/panicking.rs:80:14
           2: all::suite::tool_parallelism::assert_parallel_duration
                     at ./tests/suite/tool_parallelism.rs:74:5
           3: all::suite::tool_parallelism::mixed_parallel_tools_run_in_parallel::{{closure}}
                     at ./tests/suite/tool_parallelism.rs:206:5
           4: <core::pin::Pin<P> as core::future::future::Future>::poll
                     at /home/runner/.rustup/toolchains/1.93.0-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:133:9
           5: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/park.rs:284:71
           6: tokio::task::coop::with_budget
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:167:5
           7: tokio::task::coop::budget
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/task/coop/mod.rs:133:5
           8: tokio::runtime::park::CachedParkThread::block_on
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/park.rs:284:31
           9: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context/blocking.rs:66:14
          10: tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/multi_thread/mod.rs:89:22
          11: tokio::runtime::context::runtime::enter_runtime
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/context/runtime.rs:65:16
          12: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/scheduler/multi_thread/mod.rs:88:9
          13: tokio::runtime::runtime::Runtime::block_on_inner
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:370:50
          14: tokio::runtime::runtime::Runtime::block_on
                     at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.49.0/src/runtime/runtime.rs:342:18
          15: all::suite::tool_parallelism::mixed_parallel_tools_run_in_parallel
                     at ./tests/suite/tool_parallelism.rs:208:7
          16: all::suite::tool_parallelism::mixed_parallel_tools_run_in_parallel::{{closure}}
                     at ./tests/suite/tool_parallelism.rs:178:52
          17: core::ops::function::FnOnce::call_once
                     at /home/runner/.rustup/toolchains/1.93.0-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
          18: core::ops::function::FnOnce::call_once
                     at /rustc/254b59607d4417e9dffbc307138ae5c86280fe4c/library/core/src/ops/function.rs:250:5
        note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
    ```
  • feat: do not close unified exec processes across turns (#10799)
    With this PR we do not close the unified exec processes (i.e. background
    terminals) at the end of a turn unless:
    * The user interrupt the turn
    * The user decide to clean the processes through `app-server` or
    `/clean`
    
    I made sure that `codex exec` correctly kill all the processes
  • tui: avoid no-op status-line redraws (#11155)
    Rate-limit snapshots are polled every 60s, which causes unconditional
    redraws.
    This causes spurious "tab changed" indicators in terminal apps.
  • feat: include NetworkConfig through ExecParams (#11105)
    This PR adds the following field to `Config`:
    
    ```rust
    pub network: Option<NetworkProxy>,
    ```
    
    Though for the moment, it will always be initialized as `None` (this
    will be addressed in a subsequent PR).
    
    This PR does the work to thread `network` through to `execute_exec_env()`, `process_exec_tool_call()`, and `UnifiedExecRuntime.run()` to ensure it is available whenever we span a process.
  • [apps] Improve app loading. (#10994)
    There are two concepts of apps that we load in the harness:
    
    - Directory apps, which is all the apps that the user can install.
    - Accessible apps, which is what the user actually installed and can be
    $ inserted and be used by the model. These are extracted from the tools
    that are loaded through the gateway MCP.
    
    Previously we wait for both sets of apps before returning the full apps
    list. Which causes many issues because accessible apps won't be
    available to the UI or the model if directory apps aren't loaded or
    failed to load.
    
    In this PR we are separating them so that accessible apps can be loaded
    separately and are instantly available to be shown in the UI and to be
    provided in model context. We also added an app-server event so that
    clients can subscribe to also get accessible apps without being blocked
    on the full app list.
    
    - [x] Separate accessible apps and directory apps loading.
    - [x] `app/list` request will also emit `app/list/updated` notifications
    that app-server clients can subscribe. Which allows clients to get
    accessible apps list to render in the $ menu without being blocked by
    directory apps.
    - [x] Cache both accessible and directory apps with 1 hour TTL to avoid
    reloading them when creating new threads.
    - [x] TUI improvements to redraw $ menu and /apps menu when app list is
    updated.
  • feat: include [experimental_network] in <environment_context> (#11044)
    If `NetworkConstraints` is set, then include the relevant settings on `<environment_context>`. Example:
    
    ```xml
    <environment_context>
      <cwd>/repo</cwd>
      <shell>bash</shell>
      <network enabled="true">
        <allowed>api.example.com</allowed>
        <allowed>*.openai.com</allowed>
        <denied>blocked.example.com</denied>
      </network>
    </environment_context>
    ```
  • Upgrade rmcp to 0.14 (#10718)
    - [x] Upgrade rmcp to 0.14
  • chore: refactor network-proxy so that ConfigReloader is injectable behavior (#11114)
    Currently, `codex-network-proxy` depends on `codex-core`, but this
    should be the other way around. As a first step, refactor out
    `ConfigReloader`, which should make it easier to move
    `codex-rs/network-proxy/src/state.rs` to `codex-core` in a subsequent
    commit.