Commit Graph

18 Commits

  • Rename tui_app_server to tui (#16104)
    This is a follow-up to https://github.com/openai/codex/pull/15922. That
    previous PR deleted the old `tui` directory and left the new
    `tui_app_server` directory in place. This PR renames `tui_app_server` to
    `tui` and fixes up all references.
  • Remove the legacy TUI split (#15922)
    This is the part 1 of 2 PRs that will delete the `tui` /
    `tui_app_server` split. This part simply deletes the existing `tui`
    directory and marks the `tui_app_server` feature flag as removed. I left
    the `tui_app_server` feature flag in place for now so its presence
    doesn't result in an error. It is simply ignored.
    
    Part 2 will rename the `tui_app_server` directory `tui`. I did this as
    two parts to reduce visible code churn.
  • Apply argument comment lint across codex-rs (#14652)
    ## Why
    
    Once the repo-local lint exists, `codex-rs` needs to follow the
    checked-in convention and CI needs to keep it from drifting. This commit
    applies the fallback `/*param*/` style consistently across existing
    positional literal call sites without changing those APIs.
    
    The longer-term preference is still to avoid APIs that require comments
    by choosing clearer parameter types and call shapes. This PR is
    intentionally the mechanical follow-through for the places where the
    existing signatures stay in place.
    
    After rebasing onto newer `main`, the rollout also had to cover newly
    introduced `tui_app_server` call sites. That made it clear the first cut
    of the CI job was too expensive for the common path: it was spending
    almost as much time installing `cargo-dylint` and re-testing the lint
    crate as a representative test job spends running product tests. The CI
    update keeps the full workspace enforcement but trims that extra
    overhead from ordinary `codex-rs` PRs.
    
    ## What changed
    
    - keep a dedicated `argument_comment_lint` job in `rust-ci`
    - mechanically annotate remaining opaque positional literals across
    `codex-rs` with exact `/*param*/` comments, including the rebased
    `tui_app_server` call sites that now fall under the lint
    - keep the checked-in style aligned with the lint policy by using
    `/*param*/` and leaving string and char literals uncommented
    - cache `cargo-dylint`, `dylint-link`, and the relevant Cargo
    registry/git metadata in the lint job
    - split changed-path detection so the lint crate's own `cargo test` step
    runs only when `tools/argument-comment-lint/*` or `rust-ci.yml` changes
    - continue to run the repo wrapper over the `codex-rs` workspace, so
    product-code enforcement is unchanged
    
    Most of the code changes in this commit are intentionally mechanical
    comment rewrites or insertions driven by the lint itself.
    
    ## Verification
    
    - `./tools/argument-comment-lint/run.sh --workspace`
    - `cargo test -p codex-tui-app-server -p codex-tui`
    - parsed `.github/workflows/rust-ci.yml` locally with PyYAML
    
    ---
    
    * -> #14652
    * #14651
  • chore: remove codex-core public protocol/shell re-exports (#12432)
    ## Why
    
    `codex-rs/core/src/lib.rs` re-exported a broad set of types and modules
    from `codex-protocol` and `codex-shell-command`. That made it easy for
    workspace crates to import those APIs through `codex-core`, which in
    turn hides dependency edges and makes it harder to reduce compile-time
    coupling over time.
    
    This change removes those public re-exports so call sites must import
    from the source crates directly. Even when a crate still depends on
    `codex-core` today, this makes dependency boundaries explicit and
    unblocks future work to drop `codex-core` dependencies where possible.
    
    ## What Changed
    
    - Removed public re-exports from `codex-rs/core/src/lib.rs` for:
    - `codex_protocol::protocol` and related protocol/model types (including
    `InitialHistory`)
      - `codex_protocol::config_types` (`protocol_config_types`)
    - `codex_shell_command::{bash, is_dangerous_command, is_safe_command,
    parse_command, powershell}`
    - Migrated workspace Rust call sites to import directly from:
      - `codex_protocol::protocol`
      - `codex_protocol::config_types`
      - `codex_protocol::models`
      - `codex_shell_command`
    - Added explicit `Cargo.toml` dependencies (`codex-protocol` /
    `codex-shell-command`) in crates that now import those crates directly.
    - Kept `codex-core` internal modules compiling by using `pub(crate)`
    aliases in `core/src/lib.rs` (internal-only, not part of the public
    API).
    - Updated the two utility crates that can already drop a `codex-core`
    dependency edge entirely:
      - `codex-utils-approval-presets`
      - `codex-utils-cli`
    
    ## Verification
    
    - `cargo test -p codex-utils-approval-presets`
    - `cargo test -p codex-utils-cli`
    - `cargo check --workspace --all-targets`
    - `just clippy`
  • 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.
  • Show left/right arrows to navigate in tui request_user_input (#10921)
    <img width="785" height="185" alt="Screenshot 2026-02-06 at 10 25 13 AM"
    src="https://github.com/user-attachments/assets/402a6e79-4626-4df9-b3da-bc2f28e64611"
    />
    
    <img width="784" height="213" alt="Screenshot 2026-02-06 at 10 26 37 AM"
    src="https://github.com/user-attachments/assets/cf9614b2-aa1e-4c61-8579-1d2c7e1c7dc1"
    />
    
    "left/right to navigate questions" in request_user_input footer
  • tui: make Esc clear request_user_input notes while notes are shown (#10569)
    ## Summary
    
    This PR updates the `request_user_input` TUI overlay so `Esc` is
    context-aware:
    
    - When notes are visible for an option question, `Esc` now clears notes
    and exits notes mode.
    - When notes are not visible (normal option selection UI), `Esc` still
    interrupts as before.
    
    It also updates footer guidance text to match behavior.
    
    ## Changes
    
    - Added a shared notes-clear path for option questions:
    - `Tab` and `Esc` now both clear notes and return focus to options when
    notes are visible.
    - Updated footer hint text in notes-visible state:
      - from: `tab to clear notes | ... | esc to interrupt`
      - to: `tab or esc to clear notes | ...`
    - Hid `esc to interrupt` hint while notes are visible for option
    questions.
    - Kept `esc to interrupt` visible and functional in normal
    option-selection mode.
    - Updated tests to assert the new `Esc` behavior in notes mode.
    - Updated snapshot output for the notes-visible footer row.
    - Updated docs in `docs/tui-request-user-input.md` to reflect
    mode-specific `Esc` behavior.
  • TUI: Render request_user_input results in history and simplify interrupt handling (#10064)
    ## Summary
    This PR improves the TUI experience for `request_user_input` by
    rendering submitted question/answer sets directly in conversation
    history with clear, structured formatting.
    
    It also intentionally simplifies interrupt behavior for now: on `Esc` /
    `Ctrl+C`, the questions overlay interrupts the turn without attempting
    to submit partial answers.
    
    <img width="1344" height="573" alt="Screenshot 2026-02-02 at 4 51 40 PM"
    src="https://github.com/user-attachments/assets/ff752131-7060-44c1-9ded-af061969a533"
    />
    
    ## Scope
    - TUI-only changes.
    - No core/protocol/app-server behavior changes in this PR.
    - Resume reconstruction of interrupted question sets is out of scope for
    this PR.
    
    ## What Changed
    - Added a new history cell: `RequestUserInputResultCell` in
    `codex-rs/tui/src/history_cell.rs`.
    - On normal `request_user_input` submission, TUI now inserts that
    history cell immediately after sending `Op::UserInputAnswer`.
    - Rendering includes a `Questions` header with `answered/total` count.
    - Rendering shows each question as a bullet item.
    - Rendering styles submitted answer lines in cyan.
    - Rendering styles notes (for option questions) as `note:` lines in
    cyan.
    - Rendering styles freeform text (for no-option questions) as `answer:`
    lines in cyan.
    - Rendering dims only the `(unanswered)` suffix.
    - Rendering can include an interrupted suffix and summary text when the
    cell is marked interrupted.
    - Rendering redacts secret questions as `••••••` instead of showing raw
    values.
    - Added `wrap_with_prefix(...)` in `history_cell.rs` for wrapped
    prefixed lines.
    - Added `split_request_user_input_answer(...)` in `history_cell.rs` for
    decoding `"user_note: ..."` entries.
    
    ## Interrupt Behavior (Intentional for this PR)
    - `Esc` / `Ctrl+C` in the questions overlay now performs `Op::Interrupt`
    and exits the overlay.
    - It does **not** submit partial/committed answers on interrupt.
    - Added TODO comments in `request_user_input` overlay interrupt paths
    indicating where interrupted partial result emission should be
    reintroduced once core support is finalized.
    - Queued `request_user_input` overlays are discarded on interrupt in the
    current behavior.
    
    ## Tests Updated
    - Updated/added overlay tests in
    `codex-rs/tui/src/bottom_pane/request_user_input/mod.rs` to reflect
    interrupt-only behavior.
    - Added helper assertion for interrupt-only event expectation.
    - Existing submission-path tests now validate history insertion behavior
    and expected answer maps.
    
    ## Behavior Notes
    - Completed question flows now produce a readable `Questions` block in
    transcript history.
    - Interrupted flows currently do not persist partial answers to
    model-visible tool output.
    
    ## Follow-ups
    - Reintroduce partial-answer-on-interrupt semantics once core can
    persist/sequence interrupted `request_user_input` outputs safely.
    - Optionally add replay/resume rendering for interrupted question sets
    as a separate PR.
    
    ## Codex author
    `codex fork 019bfb8d-2a65-7313-9be2-ea7100d19a61`
  • Better handling skill depdenencies on ENV VAR. (#9017)
    An experimental flow for env var skill dependencies. Skills can now
    declare required env vars in SKILL.md; if missing, the CLI prompts the
    user to get the value, and Core will store it in memory (eventually to a
    local persistent store)
    <img width="790" height="169" alt="image"
    src="https://github.com/user-attachments/assets/cd928918-9403-43cb-a7e7-b8d59bcccd9a"
    />
  • Refine request_user_input TUI interactions and option UX (#10025)
    ## Summary
    Overhaul the ask‑user‑questions TUI to support “Other/None” answers,
    better notes handling, improved option selection
    UX, and a safer submission flow with confirmation for unanswered
    questions.
    
    Multiple choice (number keys for quick selection, up/down or jk for
    cycling through options):
    <img width="856" height="169" alt="Screenshot 2026-01-27 at 7 22 29 PM"
    src="https://github.com/user-attachments/assets/cabd1b0e-25e0-4859-bd8f-9941192ca274"
    />
    
    Tab to add notes:
    <img width="856" height="197" alt="Screenshot 2026-01-27 at 7 22 45 PM"
    src="https://github.com/user-attachments/assets/a807db5e-e966-412c-af91-6edc60062f35"
    />
    
    Freeform (also note enter tooltip is highlighted on last question to
    indicate questions UI will be exited upon submission):
    <img width="854" height="112" alt="Screenshot 2026-01-27 at 7 23 13 PM"
    src="https://github.com/user-attachments/assets/2e7b88bf-062b-4b9f-a9da-c9d8c8a59643"
    />
    
    Confirmation dialogue (submitting with unanswered questions):
    <img width="854" height="126" alt="Screenshot 2026-01-27 at 7 23 29 PM"
    src="https://github.com/user-attachments/assets/93965c8f-54ac-45bc-a660-9625bcd101f8"
    />
    
    ## Key Changes
    - **Options UI refresh**
    - Render options as numbered entries; allow number keys to select &
    submit.
    - Remove “Option X/Y” header and allow the question UI height to expand
    naturally.
    - Keep spacing between question, options, and notes even when notes are
    visible.
    - Hide the title line and render the question prompt in cyan **only when
    uncommitted**.
    
    - **“Other / None of the above” support**
      - Wire `isOther` to add “None of the above”.
      - Add guidance text: “Optionally, add details in notes (tab).”
    
    - **Notes composer UX**
    - Remove “Notes” heading; place composer directly under the selected
    option.
    - Preserve pending paste placeholders across question navigation and
    after submission.
      - Ctrl+C clears notes **only when the notes composer has focus**.
      - Ctrl+C now triggers an immediate redraw so the clear is visible.
    
    - **Committed vs uncommitted state**
      - Introduce a unified `answer_committed` flag per question.
    - Editing notes (including adding text or pastes) marks the answer
    uncommitted.
    - Changing the option highlight (j/k, up/down) marks the answer
    uncommitted.
      - Clearing options (Backspace/Delete) also clears pending notes.
      - Question prompt turns cyan only when the answer is uncommitted.
    
    - **Submission safety & confirmation**
      - Only submit notes/freeform text once explicitly committed.
    - Last-question submit with unanswered questions shows a confirmation
    dialog.
      - Confirmation options:
        1. **Proceed** (default)
        2. **Go back**
      - Description reflects count: “Submit with N unanswered question(s).”
      - Esc/Backspace in confirmation returns to first unanswered question.
      - Ctrl+C in confirmation interrupts and exits the overlay.
    
    - **Footer hints**
    - Cyan highlight restored for “enter to submit answer” / “enter to
    submit all”.
    
    ## Codex author
    `codex fork 019c00ed-323a-7000-bdb5-9f9c5a635bd9`
  • Ask user question UI footer improvements (#9949)
    ## Summary
    
    Polishes the `request_user_input` TUI overlay
    
    Question 1 (unanswered)
    <img width="853" height="167" alt="Screenshot 2026-01-27 at 1 30 09 PM"
    src="https://github.com/user-attachments/assets/3c305644-449e-4e8d-a47b-d689ebd8702c"
    />
    
    Tab to add notes
    <img width="856" height="198" alt="Screenshot 2026-01-27 at 1 30 25 PM"
    src="https://github.com/user-attachments/assets/0d2801b0-df0c-49ae-85af-e6d56fc2c67c"
    />
    
    Question 2 (unanswered)
    <img width="854" height="168" alt="Screenshot 2026-01-27 at 1 30 55 PM"
    src="https://github.com/user-attachments/assets/b3723062-51f9-49c9-a9ab-bb1b32964542"
    />
    
    Ctrl+p or h to go back to q1 (answered)
    <img width="853" height="195" alt="Screenshot 2026-01-27 at 1 31 27 PM"
    src="https://github.com/user-attachments/assets/c602f183-1c25-4c51-8f9f-e565cb6bd637"
    />
    
    Unanswered freeform
    <img width="856" height="126" alt="Screenshot 2026-01-27 at 1 31 42 PM"
    src="https://github.com/user-attachments/assets/7e3d9d8b-820b-4b9a-9ef2-4699eed484c5"
    />
    
    ## Key changes
    
    - Footer tips wrap at tip boundaries (no truncation mid‑tip); footer
    height scales to wrapped tips.
    - Keep tooltip text as Esc: interrupt in all states.
    - Make the full Tab: add notes tip cyan/bold when applicable; hide notes
    UI by default.
    - Notes toggling/backspace:
    - Tab opens notes when an option is selected; Tab again clears notes and
    hides the notes UI.
        - Backspace in options clears the current selection.
        - Backspace in empty notes closes notes and returns to options.
    - Selection/answering behavior:
    - Option questions highlight a default option but are not answered until
    Enter.
    - Enter no longer auto‑selects when there’s no selection (prevents
    accidental answers).
        - Notes submission can commit the selected option when present.
    - Freeform questions require Enter with non‑empty text to mark answered;
    drafts are not submitted unless committed.
    - Unanswered cues:
        - Skipped option questions count as unanswered.
        - Unanswered question titles are highlighted for visibility.
    - Typing/navigation in options:
        - Typing no longer opens notes; notes are Tab‑only.
    - j/k move option selection; h/l switch questions (Ctrl+n/Ctrl+p still
    work).
    
    ## Tests
    
    - Added unit coverage for:
        - tip‑level wrapping
        - focus reset when switching questions with existing drafts
        - backspace clearing selection
        - backspace closing empty notes
        - typing in options does not open notes
        - freeform draft submission gating
        - h/l question navigation in options
    - Updated snapshots, including narrow footer wrap.
    
    ## Why
    
    These changes make the ask‑user‑question overlay:
    
    - safer (no silent auto‑selection or accidental freeform submission),
    - clearer (tips wrap cleanly and unanswered states stand out),
    - more ergonomic (Tab explicitly controls notes; backspace acts like
    undo/close).
    
    ## Codex author
    `codex fork 019bfc3c-2c42-7982-9119-fee8b9315c2f`
    
    ---------
    
    Co-authored-by: Ahmed Ibrahim <aibrahim@openai.com>
  • Fixing main and make plan mode reasoning effort medium (#9980)
    It's overthinking so much on high and going over the context window.
  • Reuse ChatComposer in request_user_input overlay (#9892)
    Reuse the shared chat composer for notes and freeform answers in
    request_user_input.
    
    - Build the overlay composer with ChatComposerConfig::plain_text.
    - Wire paste-burst flushing + menu surface sizing through the bottom
    pane.
  • Feat: add isOther to question returned by request user input tool (#9890)
    ### Summary
    Add `isOther` to question object from request_user_input tool input and
    remove `other` option from the tool prompt to better handle tool input.
  • Chore: update plan mode output in prompt (#9592)
    ### Summary
    * Update plan prompt output
    * Update requestUserInput response to be a single key value pair
    `answer: String`.
  • Add request-user-input overlay (#9585)
    - Add request-user-input overlay and routing in the TUI