Commit Graph

3718 Commits

  • Improve handling of config and rules errors for app server clients (#9182)
    When an invalid config.toml key or value is detected, the CLI currently
    just quits. This leaves the VSCE in a dead state.
    
    This PR changes the behavior to not quit and bubble up the config error
    to users to make it actionable. It also surfaces errors related to
    "rules" parsing.
    
    This allows us to surface these errors to users in the VSCE, like this:
    
    <img width="342" height="129" alt="Screenshot 2026-01-13 at 4 29 22 PM"
    src="https://github.com/user-attachments/assets/a79ffbe7-7604-400c-a304-c5165b6eebc4"
    />
    
    <img width="346" height="244" alt="Screenshot 2026-01-13 at 4 45 06 PM"
    src="https://github.com/user-attachments/assets/de874f7c-16a2-4a95-8c6d-15f10482e67b"
    />
  • fix(tui): harden paste-burst state transitions (#9124)
    User-facing symptom: On terminals that deliver pastes as rapid
    KeyCode::Char/Enter streams (notably Windows), paste-burst transient
    state
    can leak into the next input. Users can see Enter insert a newline when
    they meant to submit, or see characters appear late / handled through
    the
    wrong path.
    
    System problem: PasteBurst is time-based. Clearing only the
    classification window (e.g. via clear_window_after_non_char()) can erase
    last_plain_char_time without emitting buffered text. If a buffer is
    still
    non-empty after that, flush_if_due() no longer has a timeout clock to
    flush against, so the buffer can get "stuck" until another plain char
    arrives.
    
    This was surfaced while adding deterministic regression tests for
    paste-burst behavior.
    
    Fix: when disabling burst detection, defuse any in-flight burst state:
    flush held/buffered text through handle_paste() (so it follows normal
    paste integration), then clear timing and Enter suppression.
    
    Document the rationale inline and update docs/tui-chat-composer.md so
    "disable_paste_burst" matches the actual behavior.
  • Renew cache ttl on etag match (#9174)
    so we don't do unnecessary fetches
  • [CODEX-4427] improve parsed commands (#8933)
    **make command summaries more accurate by distinguishing
    list/search/read operations across common CLI tools.**
    - Added parsing helpers to centralize operand/flag handling (cd_target,
    sed_read_path, first_non_flag_operand, single_non_flag_operand,
    parse_grep_like, awk_data_file_operand, python_walks_files,
    is_python_command) and reused them in summarize_main_tokens/shell
    parsing.
    - Newly parsed list-files commands: git ls-files, rg --files (incl.
    rga/ripgrep-all), eza/exa, tree, du, python -c file-walks, plus fd/find
    map to ListFiles when no query.
    - Newly parsed search commands: git grep, grep/egrep/fgrep, ag/ack/pt,
    rg/rga files-with-matches flags (-l/-L, --files-with-matches,
    --files-without-match), with improved flag skipping to avoid
    misclassifying args as paths.
    - Newly parsed read commands: bat/batcat, less, more, awk <file>, and
    more flexible sed -n range + file detection.
    - refine “small formatting command” detection for awk/sed, handle cd
    with -- or multiple operands, keep pipeline summaries focused on primary
    command.
  • clean models manager (#9168)
    Have only the following Methods:
    - `list_models`: getting current available models
    - `try_list_models`: sync version no refresh for tui use
    - `get_default_model`: get the default model (should be tightened to
    core and received on session configuration)
    - `get_model_info`: get `ModelInfo` for a specific model (should be
    tightened to core but used in tests)
    - `refresh_if_new_etag`: trigger refresh on different etags
    
    Also move the cache to its own struct
  • Update models.json (#9136)
    Automated update of models.json.
    
    Co-authored-by: aibrahim-oai <219906144+aibrahim-oai@users.noreply.github.com>
  • WebSocket test server script (#9175)
    Very simple test server to test Responses API WebSocket transport
    integration.
  • feat: add bazel-codex entry to justfile (#9177)
    This is less straightforward than I realized, so created an entry for
    this in our `justfile`.
    
    Verified that running `just bazel-codex` from anywhere in the repo uses
    the user's `$PWD` as the one to run Codex.
    
    While here, updated the `MODULE.bazel.lock`, though it looks like I need
    to add a CI job that runs `bazel mod deps --lockfile_mode=error` or
    something.
  • fix: integration test for #9011 (#9166)
    Adds an integration test for the new behavior introduced in
    https://github.com/openai/codex/pull/9011. The work to create the test
    setup was substantial enough that I thought it merited a separate PR.
    
    This integration test spawns `codex` in TUI mode, which requires
    spawning a PTY to run successfully, so I had to introduce quite a bit of
    scaffolding in `run_codex_cli()`. I was surprised to discover that we
    have not done this in our codebase before, so perhaps this should get
    moved to a common location so it can be reused.
    
    The test itself verifies that a malformed `rules` in `$CODEX_HOME`
    prints a human-readable error message and exits nonzero.
  • fix: report an appropriate error in the TUI for malformed rules (#9011)
    The underlying issue is that when we encountered an error starting a
    conversation (any sort of error, though making `$CODEX_HOME/rules` a
    file rather than folder was the example in #8803), then we were writing
    the message to stderr, but this could be printed over by our UI
    framework so the user would not see it. In general, we disallow the use
    of `eprintln!()` in this part of the code for exactly this reason,
    though this was suppressed by an `#[allow(clippy::print_stderr)]`.
    
    This attempts to clean things up by changing `handle_event()` and
    `handle_tui_event()` to return a `Result<AppRunControl>` instead of a
    `Result<bool>`, which is a new type introduced in this PR (and depends
    on `ExitReason`, also a new type):
    
    ```rust
    #[derive(Debug)]
    pub(crate) enum AppRunControl {
        Continue,
        Exit(ExitReason),
    }
    
    #[derive(Debug, Clone)]
    pub enum ExitReason {
        UserRequested,
        Fatal(String),
    }
    ```
    
    This makes it possible to exit the primary control flow of the TUI with
    richer information. This PR adds `ExitReason` to the existing
    `AppExitInfo` struct and updates `handle_app_exit()` to print the error
    and exit code `1` in the event of `ExitReason::Fatal`.
    
    I tried to create an integration test for this, but it was a bit
    involved, so I published it as a separate PR:
    https://github.com/openai/codex/pull/9166. For this PR, please have
    faith in my manual testing!
    
    Fixes https://github.com/openai/codex/issues/8803.
    
    
    
    
    ---
    [//]: # (BEGIN SAPLING FOOTER)
    Stack created with [Sapling](https://sapling-scm.com). Best reviewed
    with [ReviewStack](https://reviewstack.dev/openai/codex/pull/9011).
    * #9166
    * __->__ #9011
  • Fix flakiness in WebSocket tests (#9169)
    The connection was being added to the list after the WebSocket response
    was sent.
    
    So the test can sometimes race and observe connections before the list
    was updated.
    
    After this change, connection and request is added to the list before
    the response is sent.
  • Allow close skill popup with esc. (#9165)
    <img width="398" height="133" alt="image"
    src="https://github.com/user-attachments/assets/3084e793-ce5b-4f92-ad60-4c73e65c21c5"
    />
    <img width="242" height="86" alt="image"
    src="https://github.com/user-attachments/assets/57dd5587-0aea-4a55-91b8-273702939cb2"
    />
    
    You can now esc to quit the skill popup and submit the input as it is.
  • Fix spinner/Esc interrupt when MCP startup completes mid-turn (#8661)
    ## **Problem**
    
    Codex’s TUI uses a single “task running” indicator (spinner + Esc interrupt hint)
    to communicate “the UI is busy”. In practice, “busy” can mean two different
    things: an agent turn is running, or MCP servers are still starting up. Without a
    clear contract, those lifecycles can interfere: startup completion can clear the
    spinner while a turn is still in progress, or the UI can appear idle while MCP is
    still booting. This is user-visible confusion during the most important moments
    (startup and the first turn), so it was worth making the contract explicit and
    guarding it.
    
    ## **Mental model**
    
    `ChatWidget` is the UI-side adapter for the `codex_core::protocol` event stream.
    It receives `EventMsg` events and updates two major UI surfaces: the transcript
    (history/streaming cells) and the bottom pane (composer + status indicator).
    
    The key concept after this change is that the bottom pane’s “task running”
    indicator is treated as **derived UI-busy state**, not “agent is running”. It is
    considered active while either:
    - an agent turn is in progress (`TurnStarted` → completion/abort), or
    - MCP startup is in progress (`McpStartupUpdate` → `McpStartupComplete`).
    
    Those lifecycles are tracked independently, and the bottom-pane indicator is
    defined as their union.
    
    ## **Non-goals**
    
    - This does not introduce separate UI indicators for “turn busy” vs “MCP busy”.
    - This does not change MCP startup behavior, ordering guarantees, or core
      protocol semantics.
    - This does not rework unrelated status/header rendering or transcript layout.
    
    ## **Tradeoffs**
    
    - The “one flag represents multiple lifecycles” approach remains lossy: it
      preserves correct “busy vs idle” semantics but cannot express *which* kind of
      busy is happening without further UI changes.
    - The design keeps complexity low by keeping a single derived boolean, rather
      than adding a more expressive bottom-pane state machine. That’s chosen because
      it matches existing UX and minimizes churn while fixing the confusion.
    
    ## **Architecture**
    
    - `codex-core` owns the actual lifecycles and emits `codex_core::protocol`
      events.
    - `ChatWidget` owns the UI interpretation of those lifecycles. It is responsible
      for keeping the bottom pane’s derived “busy” state consistent with the event
      stream, and for updating the status header when MCP progress updates arrive.
    - The bottom pane remains a dumb renderer of the single “task running” flag; it
      does not learn about MCP or agent turns directly.
    
    ## **Observability**
    
    - When working: the spinner/Esc hint stays visible during MCP startup and does
      not disappear mid-turn when `McpStartupComplete` arrives; startup status
      headers can update without clearing “busy” for an active turn.
    - When broken: you’ll see the spinner/hint flicker off while output is still
      streaming, or the UI appears idle while MCP startup status is still changing.
    
    ## **Tests**
    
    - Adds/strengthens a regression test that asserts MCP startup completion does
      not clear the “task running” indicator for an active turn (in both `tui` and
      `tui2` variants).
    - These tests prove the **contract** (“busy is the union of turn + startup”) at
      the UI boundary; they do not attempt to validate MCP startup ordering,
      real-world startup timing, or backend integration behavior.
    
    Fixes #7017
    
    Signed-off-by: 2mawi2 <2mawi2@users.noreply.github.com>
    Co-authored-by: 2mawi2 <2mawi2@users.noreply.github.com>
    Co-authored-by: Josh McKinney <joshka@openai.com>
  • test(tui): add deterministic paste-burst tests (#9121)
    Replace the old timing-dependent non-ASCII paste test with deterministic
    coverage by forcing an active `PasteBurst` and asserting the exact flush
    payload.
    
    Add focused unit tests for `PasteBurst` transitions, and add short
    "Behavior:" rustdoc notes on chat composer tests to make the state
    machine contracts explicit.
  • fix(windows-sandbox-rs) bump SETUP_VERSION (#9134)
    ## Summary
    Bumps the windows setup version, to re-trigger windows sandbox setup for
    users in the experimental sandbox. We've seen some drift in the ACL
    controls, amongst a few other changes. Hopefully this should fix #9062.
    
    ## Testing
    - [x] Tested locally
  • Fresh tooltips (#9130)
    Fresh tooltips
  • feat(app-server): add an --analytics-default-enabled flag (#9118)
    Add a new `codex app-server --analytics-default-enabled` CLI flag that
    controls whether analytics are enabled by default.
    
    Analytics are disabled by default for app-server. Users have to
    explicitly opt in
    via the `analytics` section in the config.toml file.
    
    However, for first-party use cases like the VSCode IDE extension, we
    default analytics
    to be enabled by default by setting this flag. Users can still opt out
    by setting this
    in their config.toml:
    
    ```toml
    [analytics]
    enabled = false
    ```
    
    See https://developers.openai.com/codex/config-advanced/#metrics for
    more details.
  • fix(tui): document paste-burst state machine (#9020)
    Add a narrative doc and inline rustdoc explaining how `ChatComposer`
    and `PasteBurst` compose into a single state machine on terminals that
    lack reliable bracketed paste (notably Windows).
    
    This documents the key states, invariants, and integration points
    (`handle_input_basic`, `handle_non_ascii_char`, tick-driven flush) so
    future changes are easier to reason about.
  • Restrict MCP servers from requirements.toml (#9101)
    Enterprises want to restrict the MCP servers their users can use.
    
    Admins can now specify an allowlist of MCPs in `requirements.toml`. The
    MCP servers are matched on both Name and Transport (local path or HTTP
    URL) -- both must match to allow the MCP server. This prevents
    circumventing the allowlist by renaming MCP servers in user config. (It
    is still possible to replace the local path e.g. rewrite say
    `/usr/local/github-mcp` with a nefarious MCP. We could allow hash
    pinning in the future, but that would break updates. I also think this
    represents a broader, out-of-scope problem.)
    
    We introduce a new field to Constrained: "normalizer". In general, it is
    a fn(T) -> T and applies when `Constrained<T>.set()` is called. In this
    particular case, it disables MCP servers which do not match the
    allowlist. An alternative solution would remove this and instead throw a
    ConstraintError. That would stop Codex launching if any MCP server was
    configured which didn't match. I think this is bad.
    
    We currently reuse the enabled flag on MCP servers to disable them, but
    don't propagate any information about why they are disabled. I'd like to
    add that in a follow up PR, possibly by switching out enabled with an
    enum.
    
    In action:
    
    ```
    # MCP server config has two MCPs. We are going to allowlist one of them.
    ➜  codex git:(gt/restrict-mcps) ✗ cat ~/.codex/config.toml | grep mcp_servers -A1
    [mcp_servers.hello_world]
    command = "hello-world-mcp"
    --
    [mcp_servers.docs]
    command = "docs-mcp"
    
    # Restrict the MCPs to the hello_world MCP.
    ➜  codex git:(gt/restrict-mcps) ✗ defaults read com.openai.codex requirements_toml_base64 | base64 -d
    [mcp_server_allowlist.hello_world]
    command = "hello-world-mcp"
    
    # List the MCPs, observe hello_world is enabled and docs is disabled.
    ➜  codex git:(gt/restrict-mcps) ✗ just codex mcp list
    cargo run --bin codex -- "$@"
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
         Running `target/debug/codex mcp list`
    Name         Command          Args  Env  Cwd  Status    Auth
    docs         docs-mcp         -     -    -    disabled  Unsupported
    hello_world  hello-world-mcp  -     -    -    enabled   Unsupported
    
    # Remove the restrictions.
    ➜  codex git:(gt/restrict-mcps) ✗ defaults delete com.openai.codex requirements_toml_base64
    
    # Observe both MCPs are enabled.
    ➜  codex git:(gt/restrict-mcps) ✗ just codex mcp list
    cargo run --bin codex -- "$@"
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
         Running `target/debug/codex mcp list`
    Name         Command          Args  Env  Cwd  Status   Auth
    docs         docs-mcp         -     -    -    enabled  Unsupported
    hello_world  hello-world-mcp  -     -    -    enabled  Unsupported
    
    # A new requirements that updates the command to one that does not match.
    ➜  codex git:(gt/restrict-mcps) ✗ cat ~/requirements.toml
    [mcp_server_allowlist.hello_world]
    command = "hello-world-mcp-v2"
    
    # Use those requirements.
    ➜  codex git:(gt/restrict-mcps) ✗ defaults write com.openai.codex requirements_toml_base64 "$(base64 -i /Users/gt/requirements.toml)"
    
    # Observe both MCPs are disabled.
    ➜  codex git:(gt/restrict-mcps) ✗ just codex mcp list
    cargo run --bin codex -- "$@"
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.75s
         Running `target/debug/codex mcp list`
    Name         Command          Args  Env  Cwd  Status    Auth
    docs         docs-mcp         -     -    -    disabled  Unsupported
    hello_world  hello-world-mcp  -     -    -    disabled  Unsupported
    ```
  • Fix queued messages during /review (#9122)
    Sending a message during /review interrupts the review, whereas during
    normal operation, sending a message while the agent is running will
    queue the message. This is unexpected behavior, and since /review
    usually takes a while, it takes away a potentially useful operation.
    
    Summary
    - Treat review mode as an active task for message queuing so inputs
    don’t inject into the running review turn.
    - Prevents user submissions from rendering immediately in the transcript
    while the review continues streaming.
    - Keeps review UX consistent with normal “task running” behavior and
    avoids accidental interrupt/replacement.
    
    Notes
    - This change only affects UI queuing logic; core review flow and task
    lifecycle remain unchanged.
  • add generated jsonschema for config.toml (#8956)
    ### What
    Add JSON Schema generation for `config.toml`, with checked‑in
    `docs/config.schema.json`. We can move the schema elsewhere if preferred
    (and host it if there's demand).
    
    Add fixture test to prevent drift and `just write-config-schema` to
    regenerate on schema changes.
    
    Generate MCP config schema from `RawMcpServerConfig` instead of
    `McpServerConfig` because that is the runtime type used for
    deserialization.
    
    Populate feature flag values into generated schema so they can be
    autocompleted.
    
    ### Tests
    Added tests + regenerate script to prevent drift. Tested autocompletions
    using generated jsonschema locally with Even Better TOML.
    
    
    
    https://github.com/user-attachments/assets/5aa7cd39-520c-4a63-96fb-63798183d0bc
  • ollama: default to Responses API for built-ins (#8798)
    This is an alternate PR to solving the same problem as
    <https://github.com/openai/codex/pull/8227>.
    
    In this PR, when Ollama is used via `--oss` (or via `model_provider =
    "ollama"`), we default it to use the Responses format. At runtime, we do
    an Ollama version check, and if the version is older than when Responses
    support was added to Ollama, we print out a warning.
    
    Because there's no way of configuring the wire api for a built-in
    provider, we temporarily add a new `oss_provider`/`model_provider`
    called `"ollama-chat"` that will force the chat format.
    
    Once the `"chat"` format is fully removed (see
    <https://github.com/openai/codex/discussions/7782>), `ollama-chat` can
    be removed as well
    
    ---------
    
    Co-authored-by: Eric Traut <etraut@openai.com>
    Co-authored-by: Michael Bolin <mbolin@openai.com>
  • Support response.done and add integration tests (#9129)
    The agent loop using a persistent incremental web socket connection.
  • Use thread rollback for Esc backtrack (#9140)
    - Swap Esc backtrack to roll back the current thread instead of forking
  • Show tab queue hint in footer (#9138)
    - show the Tab queue hint in the footer when a task is running with
    Steer enabled
    - drop the history queue hint and add footer snapshots
  • Use markdown for migration screen (#8952)
    Next steps will be routing this to model info
  • Handle image paste from empty paste events (#9049)
    Handle image paste on empty paste events.
    
    - Intent: make image paste work in terminals that emit empty paste
    events.
    - Approach: route paste events through an image-aware handler and read
    the clipboard when text is empty.
    - That's best effort to detect it. Some terminals don't send the empty
    signal.
  • Websocket append support (#9128)
    Support an incremental append request in websocket transport.
  • Reuse websocket connection (#9127)
    Reuses the connection but still sends full requests.
  • fix(tui): show in-flight coalesced tool calls in transcript overlay (#8246)
    ### Problem
    Ctrl+T transcript overlay can omit in-flight coalesced tool calls because it
    renders only committed transcript cells while the main viewport can render the
    current in-flight ChatWidget.active_cell immediately.
    
    ### Mental model
    The UI has both committed transcript cells (finalized HistoryCell entries) and
    an in-flight active cell that can mutate in place while streaming, often
    representing a coalesced exec/tool group. The transcript overlay renders
    committed cells plus a render-only live tail derived from the current active
    cell. The live tail is cached and only recomputed when its cache key changes,
    which is derived from terminal width (wrapping), active-cell revision
    (in-place mutations), stream continuation (spacing), and animation tick
    (time-based visuals).
    
    ### Non-goals
    This does not change coalescing rules, flush boundaries, or when active cells
    become committed. It does not change tool-call semantics or transcript
    persistence; it is a rendering-only improvement for the overlay.
    
    ### Tradeoffs
    This adds cache invalidation complexity: correctness depends on bumping an
    active-cell revision (and/or providing an animation tick) when the active cell
    mutates in place. The mechanism is implemented in both codex-tui and codex-tui2,
    which keeps behavior consistent but risks drift if future changes are not
    applied in lockstep.
    
    ### Architecture
    App special-cases transcript overlay draws to sync a live tail from ChatWidget
    into TranscriptOverlay. TranscriptOverlay remains the owner of committed
    transcript cells; the live tail is an optional appended renderable.
    HistoryCell::transcript_animation_tick() allows time-dependent transcript output
    (spinner/shimmer) to invalidate the cached tail without requiring data mutation.
    
    ### Observability
    Manual verification is to open Ctrl+T while an exploring/coalesced active cell
    is still in-flight and confirm the overlay includes the same in-flight tool-call
    group the main viewport shows. The overlay is kept in sync by App passing an
    active-cell key and transcript lines into TranscriptOverlay::sync_live_tail; the
    key must change when the active cell mutates or animates.
    
    ### Tests
    Snapshot tests validate that the transcript overlay renders a live tail appended
    after committed cells and that identical keys short-circuit recomputation. Unit
    tests validate that active-cell revision bumps occur on specific in-place
    mutations (e.g. unified exec wait cell command display becoming known late) so
    cached tails are invalidated.
    
    ## Documentation patches (module, type, function)
    
    ### Module-level docs (invariants + mechanisms)
    - codex-rs/tui/src/app_backtrack.rs:1
    - codex-rs/tui/src/chatwidget.rs:1
    - codex-rs/tui/src/pager_overlay.rs:1
    - codex-rs/tui/src/history_cell.rs:1
    - codex-rs/tui2/src/app_backtrack.rs:1
    - codex-rs/tui2/src/chatwidget.rs:1
    - codex-rs/tui2/src/pager_overlay.rs:1
    - codex-rs/tui2/src/history_cell.rs:1
    
    ### Type-level docs (cache key + invariants)
    - codex-rs/tui/src/chatwidget.rs (ChatWidget.active_cell_revision, ActiveCellTranscriptKey)
    - codex-rs/tui/src/pager_overlay.rs (TranscriptOverlay live tail storage model)
    - codex-rs/tui/src/history_cell.rs (HistoryCell::transcript_animation_tick, UnifiedExecWaitCell::update_command_display)
    - Mirrored in codex-rs/tui2/src/chatwidget.rs, codex-rs/tui2/src/pager_overlay.rs, codex-rs/tui2/src/history_cell.rs
    
    ### Function-level docs (why/when/guarantees/pitfalls)
    - codex-rs/tui/src/app_backtrack.rs (overlay_forward_event)
    - codex-rs/tui/src/chatwidget.rs (active_cell_transcript_key, active_cell_transcript_lines)
    - codex-rs/tui/src/pager_overlay.rs (sync_live_tail, take_live_tail_renderable)
    - codex-rs/tui/src/history_cell.rs (transcript_animation_tick, UnifiedExecWaitCell::update_command_display)
    - Mirrored in codex-rs/tui2 equivalents where present
    
    ### Validation performed
    - cd codex-rs && just fmt
    - cd codex-rs && cargo test -p codex-tui
    - cd codex-rs && cargo test -p codex-tui2
    
    ## Design inconsistencies / risks
    
    - Cache invalidation is a distributed responsibility: any future in-place active
      cell transcript mutation that forgets to bump active_cell_revision (or expose
      an animation tick) can leave the transcript overlay live tail out of sync with
      the main viewport.
    - TranscriptOverlay tail handling assumes a structural invariant that the live
      tail, when present, is exactly one trailing renderable after the committed cell
      renderables; if renderable construction changes in a way that violates that
      assumption, tail insertion/removal logic becomes incorrect.
    - codex-tui and codex-tui2 duplicate the live-tail mechanism; the documentation
      is aligned, but the implementation can still drift unless changes continue to
      be applied in lockstep.
  • Add model client sessions (#9102)
    Maintain a long-running session.
  • Assemble sandbox/approval/network prompts dynamically (#8961)
    - Add a single builder for developer permissions messaging that accepts
    SandboxPolicy and approval policy. This builder now drives the developer
    “permissions” message that’s injected at session start and any time
    sandbox/approval settings change.
    - Trim EnvironmentContext to only include cwd, writable roots, and
    shell; removed sandbox/approval/network duplication and adjusted XML
    serialization and tests accordingly.
    
    Follow-up: adding a config value to replace the developer permissions
    message for custom sandboxes.
  • Extract single responses SSE event parsing (#9114)
    To be reused in WebSockets parsing.
  • Remove unused conversation_id header (#9107)
    It's an exact copy of session_id
  • feat: hot reload mcp servers (#8957)
    ### Summary
    * Added `mcpServer/refresh` command to inform app servers and active
    threads to refresh mcpServer on next turn event.
    * Added `pending_mcp_server_refresh_config` to codex core so that if the
    value is populated, we reinitialize the mcp server manager on the thread
    level.
    * The config is updated on `mcpServer/refresh` command which we iterate
    through threads and provide with the latest config value after last
    write.
  • chore(deps): bump tokio-util from 0.7.16 to 0.7.18 in /codex-rs (#9076)
    Bumps [tokio-util](https://github.com/tokio-rs/tokio) from 0.7.16 to
    0.7.18.
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/9cc02cc88d083113cd9889a74b382e39e430e180"><code>9cc02cc</code></a>
    chore: prepare tokio-util 0.7.18 (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7829">#7829</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/d2799d791b10388e60a2a5fe5e4a33b3336e1465"><code>d2799d7</code></a>
    task: improve the docs of <code>Builder::spawn_local</code> (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7828">#7828</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/4d4870f291b69e2426232440e03c9e66fe77b525"><code>4d4870f</code></a>
    task: doc that task drops before JoinHandle completion (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7825">#7825</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/fdb150901afb0456037c6232eab8ce80116ccd02"><code>fdb1509</code></a>
    fs: check for io-uring opcode support (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7815">#7815</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/426a56278017c30e7da7b4c9365a2610f4695f76"><code>426a562</code></a>
    rt: remove <code>allow(dead_code)</code> after <code>JoinSet</code>
    stabilization (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7826">#7826</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/e3b89bbefa7564e2eba2fb9f849ef7bf87d60fad"><code>e3b89bb</code></a>
    chore: prepare Tokio v1.49.0 (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7824">#7824</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/4f577b84e939c8d427d79fdc73919842d8735de2"><code>4f577b8</code></a>
    Merge 'tokio-1.47.3' into 'master'</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/f320197693ee09e28f1fca0e55418081adcdfc25"><code>f320197</code></a>
    chore: prepare Tokio v1.47.3 (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7823">#7823</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/ea6b144cd1042d6841a7830b18f2df77c3db904b"><code>ea6b144</code></a>
    ci: freeze rustc on nightly-2025-01-25 in <code>netlify.toml</code> (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7652">#7652</a>)</li>
    <li><a
    href="https://github.com/tokio-rs/tokio/commit/264e703296bccd6783a438815d91055d4517099b"><code>264e703</code></a>
    Merge <code>tokio-1.43.4</code> into <code>tokio-1.47.x</code> (<a
    href="https://redirect.github.com/tokio-rs/tokio/issues/7822">#7822</a>)</li>
    <li>Additional commits viewable in <a
    href="https://github.com/tokio-rs/tokio/compare/tokio-util-0.7.16...tokio-util-0.7.18">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio-util&package-manager=cargo&previous-version=0.7.16&new-version=0.7.18)](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 merge` will merge this PR after your CI passes on it
    - `@dependabot squash and merge` will squash and merge this PR after
    your CI passes on it
    - `@dependabot cancel merge` will cancel a previously requested merge
    and block automerging
    - `@dependabot reopen` will reopen this PR if it is closed
    - `@dependabot close` will close this PR and stop Dependabot recreating
    it. You can achieve the same result by closing it manually
    - `@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>
  • chore(deps): bump clap from 4.5.53 to 4.5.54 in /codex-rs (#9075)
    Bumps [clap](https://github.com/clap-rs/clap) from 4.5.53 to 4.5.54.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    href="https://github.com/clap-rs/clap/releases">clap's
    releases</a>.</em></p>
    <blockquote>
    <h2>v4.5.54</h2>
    <h2>[4.5.54] - 2026-01-02</h2>
    <h3>Fixes</h3>
    <ul>
    <li><em>(help)</em> Move <code>[default]</code> to its own paragraph
    when <code>PossibleValue::help</code> is present in
    <code>--help</code></li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Changelog</summary>
    <p><em>Sourced from <a
    href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
    changelog</a>.</em></p>
    <blockquote>
    <h2>[4.5.54] - 2026-01-02</h2>
    <h3>Fixes</h3>
    <ul>
    <li><em>(help)</em> Move <code>[default]</code> to its own paragraph
    when <code>PossibleValue::help</code> is present in
    <code>--help</code></li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    href="https://github.com/clap-rs/clap/commit/194c676f60b916506f94f70decdbf319af5d1ec6"><code>194c676</code></a>
    chore: Release</li>
    <li><a
    href="https://github.com/clap-rs/clap/commit/44838f6606fa015140c65a2d35971c1e9b269e26"><code>44838f6</code></a>
    docs: Update changelog</li>
    <li><a
    href="https://github.com/clap-rs/clap/commit/0f59d55ff6b132cd59cd252442ce47078494be07"><code>0f59d55</code></a>
    Merge pull request <a
    href="https://redirect.github.com/clap-rs/clap/issues/6027">#6027</a>
    from Alpha1337k/master</li>
    <li><a
    href="https://github.com/clap-rs/clap/commit/e2aa2f07d1cd50412de51b51a7cc897e80e0b92f"><code>e2aa2f0</code></a>
    Feat: Add catch-all on external subcommands for zsh</li>
    <li><a
    href="https://github.com/clap-rs/clap/commit/b9c0aee9f28c5ad72932225bd730260f9bbe1fc6"><code>b9c0aee</code></a>
    Feat: Add external subcommands test to suite</li>
    <li>See full diff in <a
    href="https://github.com/clap-rs/clap/compare/clap_complete-v4.5.53...clap_complete-v4.5.54">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.53&new-version=4.5.54)](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 merge` will merge this PR after your CI passes on it
    - `@dependabot squash and merge` will squash and merge this PR after
    your CI passes on it
    - `@dependabot cancel merge` will cancel a previously requested merge
    and block automerging
    - `@dependabot reopen` will reopen this PR if it is closed
    - `@dependabot close` will close this PR and stop Dependabot recreating
    it. You can achieve the same result by closing it manually
    - `@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>
  • chore(deps): bump which from 6.0.3 to 8.0.0 in /codex-rs (#9074)
    Bumps [which](https://github.com/harryfei/which-rs) from 6.0.3 to 8.0.0.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    href="https://github.com/harryfei/which-rs/releases">which's
    releases</a>.</em></p>
    <blockquote>
    <h2>8.0.0</h2>
    <h2>What's Changed</h2>
    <ul>
    <li>Add new <code>Sys</code> trait to allow abstracting over the
    underlying filesystem. Particularly useful for
    <code>wasm32-unknown-unknown</code> targets. Thanks <a
    href="https://github.com/dsherret"><code>@​dsherret</code></a> for this
    contribution to which!</li>
    <li>Add more debug level tracing for otherwise silent I/O errors.</li>
    <li>Call the <code>NonFatalHandler</code> in more places to catch
    previously ignored I/O errors.</li>
    <li>Remove use of the <code>either</code> dependency.</li>
    </ul>
    <h2>New Contributors</h2>
    <ul>
    <li><a href="https://github.com/dsherret"><code>@​dsherret</code></a>
    made their first contribution in <a
    href="https://redirect.github.com/harryfei/which-rs/pull/109">harryfei/which-rs#109</a></li>
    </ul>
    <h2>7.0.3</h2>
    <ul>
    <li>Update rustix to version 1.0. Congrats to rustix on this milestone,
    and thanks <a href="https://github.com/mhils"><code>@​mhils</code></a>
    for this contribution to which!</li>
    </ul>
    <h2>7.0.2</h2>
    <ul>
    <li>Don't return paths containing the single dot <code>.</code>
    reference to the current directory, even if the original request was
    given in terms of the current directory. Thanks <a
    href="https://github.com/jakobhellermann"><code>@​jakobhellermann</code></a>
    for this contribution!</li>
    </ul>
    <h2>7.0.1</h2>
    <h2>What's Changed</h2>
    <ul>
    <li>Switch to <code>env_home</code> crate by <a
    href="https://github.com/micolous"><code>@​micolous</code></a> in <a
    href="https://redirect.github.com/harryfei/which-rs/pull/105">harryfei/which-rs#105</a></li>
    <li>fixes <a
    href="https://redirect.github.com/harryfei/which-rs/issues/106">#106</a>,
    bump patch version by <a
    href="https://github.com/Xaeroxe"><code>@​Xaeroxe</code></a> in <a
    href="https://redirect.github.com/harryfei/which-rs/pull/107">harryfei/which-rs#107</a></li>
    </ul>
    <h2>New Contributors</h2>
    <ul>
    <li><a href="https://github.com/micolous"><code>@​micolous</code></a>
    made their first contribution in <a
    href="https://redirect.github.com/harryfei/which-rs/pull/105">harryfei/which-rs#105</a></li>
    </ul>
    <p><strong>Full Changelog</strong>: <a
    href="https://github.com/harryfei/which-rs/compare/7.0.0...7.0.1">https://github.com/harryfei/which-rs/compare/7.0.0...7.0.1</a></p>
    <h2>7.0.0</h2>
    <ul>
    <li>Add support to <code>WhichConfig</code> for a user provided closure
    that will be called whenever a nonfatal error occurs.
    This technically breaks a few APIs due to the need to add more generics
    and lifetimes. Most code will compile
    without changes.</li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Changelog</summary>
    <p><em>Sourced from <a
    href="https://github.com/harryfei/which-rs/blob/master/CHANGELOG.md">which's
    changelog</a>.</em></p>
    <blockquote>
    <h2>8.0.0</h2>
    <ul>
    <li>Add new <code>Sys</code> trait to allow abstracting over the
    underlying filesystem. Particularly useful for
    <code>wasm32-unknown-unknown</code> targets. Thanks <a
    href="https://github.com/dsherret"><code>@​dsherret</code></a> for this
    contribution to which!</li>
    <li>Add more debug level tracing for otherwise silent I/O errors.</li>
    <li>Call the <code>NonFatalHandler</code> in more places to catch
    previously ignored I/O errors.</li>
    <li>Remove use of the <code>either</code> dependency.</li>
    </ul>
    <h2>7.0.3</h2>
    <ul>
    <li>Update rustix to version 1.0. Congrats to rustix on this milestone,
    and thanks <a href="https://github.com/mhils"><code>@​mhils</code></a>
    for this contribution to which!</li>
    </ul>
    <h2>7.0.2</h2>
    <ul>
    <li>Don't return paths containing the single dot <code>.</code>
    reference to the current directory, even if the original request was
    given in
    terms of the current directory. Thanks <a
    href="https://github.com/jakobhellermann"><code>@​jakobhellermann</code></a>
    for this contribution!</li>
    </ul>
    <h2>7.0.1</h2>
    <ul>
    <li>Get user home directory from <code>env_home</code> instead of
    <code>home</code>. Thanks <a
    href="https://github.com/micolous"><code>@​micolous</code></a> for this
    contribution!</li>
    <li>If home directory is unavailable, do not expand the tilde to an
    empty string. Leave it as is.</li>
    </ul>
    <h2>7.0.0</h2>
    <ul>
    <li>Add support to <code>WhichConfig</code> for a user provided closure
    that will be called whenever a nonfatal error occurs.
    This technically breaks a few APIs due to the need to add more generics
    and lifetimes. Most code will compile
    without changes.</li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/adac2cdae7eaef4d5ce4cb2984ba43a0559adf06"><code>adac2cd</code></a>
    bump version, update changelog</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/84e152ec23f3471eeefb278a55f8fdb818088866"><code>84e152e</code></a>
    reduce sys::Sys requirements, add some tracing for otherwise silent
    errors (#...</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/a0a6daf199c15b0d2af07b91b0cb2f3054727311"><code>a0a6daf</code></a>
    feat: add Sys trait for swapping out system (<a
    href="https://redirect.github.com/harryfei/which-rs/issues/109">#109</a>)</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/eef199824a0cf1596e8afbe9e7a5e6a793486cad"><code>eef1998</code></a>
    Add actively maintained badge</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/1d145deef8aaaa1a493a9f33fbb7b7031233284e"><code>1d145de</code></a>
    release version 7.0.3</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/f5e529223445cdd0fa9a9c190a92276d7de4eb32"><code>f5e5292</code></a>
    fix unrelated lint error</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/4dcefa6fe96f8cd87e1dcdc23146a5d404277cd6"><code>4dcefa6</code></a>
    bump rustix</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/bd868818bdb55923acfd2a63468335f6600a6cf9"><code>bd86881</code></a>
    bump version, add to changelog</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/cf37760ea1840a87d69d5eb18fc56a5b871e6d53"><code>cf37760</code></a>
    don't run relative dot test on macos</li>
    <li><a
    href="https://github.com/harryfei/which-rs/commit/f2c4bd6e8be4c74006b303108aeb4977fbe684e2"><code>f2c4bd6</code></a>
    update target to new name for wasm32-wasip1</li>
    <li>Additional commits viewable in <a
    href="https://github.com/harryfei/which-rs/compare/6.0.3...8.0.0">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=which&package-manager=cargo&previous-version=6.0.3&new-version=8.0.0)](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 merge` will merge this PR after your CI passes on it
    - `@dependabot squash and merge` will squash and merge this PR after
    your CI passes on it
    - `@dependabot cancel merge` will cancel a previously requested merge
    and block automerging
    - `@dependabot reopen` will reopen this PR if it is closed
    - `@dependabot close` will close this PR and stop Dependabot recreating
    it. You can achieve the same result by closing it manually
    - `@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>
  • chore(deps): bump ts-rs from 11.0.1 to 11.1.0 in /codex-rs (#9072)
    [//]: # (dependabot-start)
    ⚠️  **Dependabot is rebasing this PR** ⚠️ 
    
    Rebasing might not happen immediately, so don't worry if this takes some
    time.
    
    Note: if you make any changes to this PR yourself, they will take
    precedence over the rebase.
    
    ---
    
    [//]: # (dependabot-end)
    
    Bumps [ts-rs](https://github.com/Aleph-Alpha/ts-rs) from 11.0.1 to
    11.1.0.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    href="https://github.com/Aleph-Alpha/ts-rs/releases">ts-rs's
    releases</a>.</em></p>
    <blockquote>
    <h2>v11.1.0</h2>
    <p>Today, we're happy to publish a small follow-up to v11.0.1!</p>
    <p>This release fixes a nasty build failure when using the
    <code>format</code> feature.
    <strong>Note:</strong> For those that use the <code>format</code>
    feature, this release bumps the MSRV to 1.88. We'd have preferred to do
    this in a major release, but felt this was acceptable since the build
    was broken by one of the dependencies anyway.</p>
    <h1>New features</h1>
    <h2>TypeScript enums with <code>#[ts(repr(enum))</code></h2>
    <p><code>#[ts(repr(enum))</code> instructs ts-rs to generate an
    <code>enum</code>, instead of a <code>type</code> for your rust
    enum.</p>
    <pre lang="rust"><code>#[derive(TS)]
    #[ts(repr(enum))]
    enum Role {
        User,
        Admin,
    }
    // will generate `export enum Role { &quot;User&quot;, &quot;Admin&quot;
    }`
    </code></pre>
    <p>Discriminants are preserved, and you can use the variant's name as
    discriminant instead using <code>#[ts(repr(enum = name))]</code></p>
    <h2><code>#[ts(optional_fields)]</code> in enums</h2>
    <p>The <code>#[ts(optional_fields)]</code> attribute can now be applied
    directly to enums, or even to individual enum variants.</p>
    <h2>Control over file extensions in imports</h2>
    <p>Normally, we generate <code>import { Type } from
    &quot;file&quot;</code> statements. In some scenarios though, it might
    be necessary to use a <code>.ts</code> or even <code>.js</code>
    extension instead.<br />
    This is now possible by setting the <code>TS_RS_IMPORT_EXTENSION</code>
    environment variable.</p>
    <blockquote>
    <p>Note: With the introduction of this feature, we deprecate the
    <code>import-esm</code> cargo feature. It will be removed in a future
    major release.</p>
    </blockquote>
    <h2>Full changelog</h2>
    <ul>
    <li>Regression: <code>#[ts(optional)]</code> with
    <code>#[ts(type)]</code> by <a
    href="https://github.com/NyxCode"><code>@​NyxCode</code></a> in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/416">Aleph-Alpha/ts-rs#416</a></li>
    <li>release v11.0.1 by <a
    href="https://github.com/NyxCode"><code>@​NyxCode</code></a> in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/417">Aleph-Alpha/ts-rs#417</a></li>
    <li>Make <code>rename_all</code> compatible with tuple and unit structs
    as a no-op attribute by <a
    href="https://github.com/gustavo-shigueo"><code>@​gustavo-shigueo</code></a>
    in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/422">Aleph-Alpha/ts-rs#422</a></li>
    <li>Replace <code>import-esm</code> with
    <code>TS_RS_IMPORT_EXTENSION</code> by <a
    href="https://github.com/gustavo-shigueo"><code>@​gustavo-shigueo</code></a>
    in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/423">Aleph-Alpha/ts-rs#423</a></li>
    <li>Updated chrono Duration emitted type by <a
    href="https://github.com/fxf8"><code>@​fxf8</code></a> in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/434">Aleph-Alpha/ts-rs#434</a></li>
    <li>Add optional_fields to enum by <a
    href="https://github.com/gustavo-shigueo"><code>@​gustavo-shigueo</code></a>
    in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/432">Aleph-Alpha/ts-rs#432</a></li>
    <li>Add <code>#[ts(repr(enum)]</code> attribute by <a
    href="https://github.com/gustavo-shigueo"><code>@​gustavo-shigueo</code></a>
    in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/425">Aleph-Alpha/ts-rs#425</a></li>
    <li>Fix build with <code>format</code> feature by <a
    href="https://github.com/gustavo-shigueo"><code>@​gustavo-shigueo</code></a>
    in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/438">Aleph-Alpha/ts-rs#438</a></li>
    </ul>
    <h2>New Contributors</h2>
    <ul>
    <li><a href="https://github.com/fxf8"><code>@​fxf8</code></a> made their
    first contribution in <a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/434">Aleph-Alpha/ts-rs#434</a></li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Changelog</summary>
    <p><em>Sourced from <a
    href="https://github.com/Aleph-Alpha/ts-rs/blob/main/CHANGELOG.md">ts-rs's
    changelog</a>.</em></p>
    <blockquote>
    <h1>11.1.0</h1>
    <h3>Features</h3>
    <ul>
    <li>Add <code>#[ts(repr(enum))]</code> attribute (<a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/425">#425</a>)</li>
    <li>Add support for <code>#[ts(optional_fields)]</code> in enums and
    enum variants (<a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/432">#432</a>)</li>
    <li>Deprecate <code>import-esm</code> cargo feature in favour of
    <code>RS_RS_IMPORT_EXTENSION</code> (<a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/423">#423</a>)</li>
    </ul>
    <h3>Fixes</h3>
    <ul>
    <li>Fix bindings for <code>chrono::Duration</code> (<a
    href="https://redirect.github.com/Aleph-Alpha/ts-rs/pull/434">#434</a>)</li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li>See full diff in <a
    href="https://github.com/Aleph-Alpha/ts-rs/commits/v11.1.0">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ts-rs&package-manager=cargo&previous-version=11.0.1&new-version=11.1.0)](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 merge` will merge this PR after your CI passes on it
    - `@dependabot squash and merge` will squash and merge this PR after
    your CI passes on it
    - `@dependabot cancel merge` will cancel a previously requested merge
    and block automerging
    - `@dependabot reopen` will reopen this PR if it is closed
    - `@dependabot close` will close this PR and stop Dependabot recreating
    it. You can achieve the same result by closing it manually
    - `@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>
  • chore(deps): bump tui-scrollbar from 0.2.1 to 0.2.2 in /codex-rs (#9071)
    Bumps [tui-scrollbar](https://github.com/joshka/tui-widgets) from 0.2.1
    to 0.2.2.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    href="https://github.com/joshka/tui-widgets/releases">tui-scrollbar's
    releases</a>.</em></p>
    <blockquote>
    <h2>tui-scrollbar-v0.2.2</h2>
    <h3>🚀 Features</h3>
    <ul>
    <li><em>(scrollbar)</em> Support crossterm 0.28 (<a
    href="https://redirect.github.com/joshka/tui-widgets/issues/172">#172</a>)
    <blockquote>
    <p>Add versioned crossterm feature flags and re-export the selected
    version
    as <code>tui_scrollbar::crossterm</code>.</p>
    <p>Add CI checks for the feature matrix and a docs.rs-style build.</p>
    <hr />
    </blockquote>
    </li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Changelog</summary>
    <p><em>Sourced from <a
    href="https://github.com/joshka/tui-widgets/blob/main/CHANGELOG.md">tui-scrollbar's
    changelog</a>.</em></p>
    <blockquote>
    <h2>[0.2.2] - 2024-07-25</h2>
    <h3>⚙️ Miscellaneous Tasks</h3>
    <ul>
    <li>Updated the following local packages: tui-big-text</li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    href="https://github.com/joshka/tui-widgets/commit/5c7acc5d2c71e077dc5b098c04e3abe26eef6939"><code>5c7acc5</code></a>
    chore(tui-scrollbar): release v0.2.2 (<a
    href="https://redirect.github.com/joshka/tui-widgets/issues/173">#173</a>)</li>
    <li><a
    href="https://github.com/joshka/tui-widgets/commit/24b14c25cb4030b041b3b1d16b39e274b8a4fe23"><code>24b14c2</code></a>
    feat(scrollbar): support crossterm 0.28 (<a
    href="https://redirect.github.com/joshka/tui-widgets/issues/172">#172</a>)</li>
    <li>See full diff in <a
    href="https://github.com/joshka/tui-widgets/compare/tui-scrollbar-v0.2.1...tui-scrollbar-v0.2.2">compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tui-scrollbar&package-manager=cargo&previous-version=0.2.1&new-version=0.2.2)](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 merge` will merge this PR after your CI passes on it
    - `@dependabot squash and merge` will squash and merge this PR after
    your CI passes on it
    - `@dependabot cancel merge` will cancel a previously requested merge
    and block automerging
    - `@dependabot reopen` will reopen this PR if it is closed
    - `@dependabot close` will close this PR and stop Dependabot recreating
    it. You can achieve the same result by closing it manually
    - `@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>
  • feat: wire fork to codex cli (#8994)
    ## Summary
    - add `codex fork` subcommand and `/fork` slash command mirroring resume
    - extend session picker to support fork/resume actions with dynamic
    labels in tui/tui2
    - wire fork selection flow through tui bootstraps and add fork-related
    tests
  • nit: add docstring (#9099)
    Add docstring on `ToolHandler` trait