feat(tui): render markdown tables responsively#18576
Draft
fcoury-oai wants to merge 6 commits intomainfrom
Draft
feat(tui): render markdown tables responsively#18576fcoury-oai wants to merge 6 commits intomainfrom
fcoury-oai wants to merge 6 commits intomainfrom
Conversation
d8a5069 to
c868d3d
Compare
9e8dc88 to
9e3dfdd
Compare
4c6b99b to
e0d20c3
Compare
Store streamed markdown source so queued output and finalized transcript cells can be re-rendered when the terminal width changes. Clear stale pending history lines before rebuilding scrollback from transcript cells. Handle terminal resize as a distinct TUI event so resize-driven renders can force a full repaint and avoid stale terminal contents after resize.
Add a disabled-by-default `terminal_resize_reflow` feature around the transcript scrollback rebuild path so old resize behavior stays intact unless explicitly enabled. Keep live terminal resize updates flowing to active streams while preserving the coalesced reflow path for opt-in testing.
Add explicit argument comments for resize reflow test and stream-width callsites so CI's argument comment lint accepts the new positional literals. This keeps the resize behavior unchanged while documenting the literal arguments introduced by the PR.
Set `background_task_id` on the dummy ChatGPT auth test record so Bazel clippy can compile the login unit test target after the auth record gained the optional field.
aa0e6b5 to
d0b08cf
Compare
e0d20c3 to
a8a9b0f
Compare
Move resize reflow and thread event buffering helpers out of `app.rs` so the PR stays below the blob-size policy limit. This keeps the behavior intact while preserving the resize reflow split and making the module boundaries more explicit.
Render pipe-table markdown into responsive box-drawing tables and keep streamed table tails mutable until finalization so column widths can settle. Add table detection, live-tail holdback, markdown-fence unwrapping, and regression coverage for resize, emoji width, and interrupt cleanup paths.
a8a9b0f to
d2f1e04
Compare
036d15f to
5ae5512
Compare
e4366f4 to
bcb9067
Compare
e3e32d1 to
0103043
Compare
fcoury-oai
added a commit
that referenced
this pull request
Apr 26, 2026
Fixes multiple scrollback and terminal resize issues: #5538, #5576, #8352, #12223, #16165, and #15380. ## Why Codex writes finalized transcript output into terminal scrollback after wrapping it for the current viewport width. A later terminal resize could leave that scrollback shaped for the old width, so wider windows kept narrow output and narrower windows could show stale wrapping artifacts until enough new output replaced the visible area. This is also the foundation PR for responsive markdown tables. Table rendering needs finalized transcript content to be width-sensitive after insertion, not only while content is first streaming. Markdown table rendering itself stays in #18576. ## Stack - PR1: resize backlog reflow and interrupt cleanup - #18576: markdown table support ## What Changed - Rebuild source-backed transcript history when the terminal width changes. `terminal_resize_reflow` is introduced through the experimental feature system, but is enabled by default for this rollout so we can validate behavior across real terminals. - Preserve assistant and plan stream source so finalized streaming output can participate in resize reflow after consolidation. - Debounce resize work, but force a final source-backed reflow when a resize happened during active or unconsolidated streaming output. - Clear stale pending history lines on resize so old-width wrapped output is not emitted just before rebuilt scrollback. - Bound replay work with `[tui.terminal_resize_reflow].max_rows`: omitted uses terminal-specific defaults, `0` keeps all rendered rows, and a positive value sets an explicit cap. The cap applies both while initially replaying a resumed transcript into scrollback and when rebuilding scrollback after terminal resize. - Consolidate interrupted assistant streams before cleanup, then clear pending stream output and active-tail state consistently. - Move resize reflow and thread event buffering helpers out of `app.rs` into dedicated TUI modules. - Add focused coverage for resize reflow, feature-gated behavior, streaming source preservation, interrupted output cleanup, unicode-neutral text, terminal-specific row caps, and composer/layout stability. ## Runtime Bounds Resize reflow keeps only the most recent rendered rows when a row cap is active. The default is `auto`, which maps to the detected terminal's default scrollback size where Codex can identify it: VS Code `1000`, Windows Terminal `9001`, WezTerm `3500`, and Alacritty `10000`. Terminals without a dedicated mapping use the conservative fallback of `1000` rows. Users can override this with `[tui.terminal_resize_reflow] max_rows = N`, or set `max_rows = 0` to disable row limiting. ## Validation - `just fmt` - `git diff --check` - `cargo test --manifest-path codex-rs/Cargo.toml -p codex-tui reflow` - `cargo test --manifest-path codex-rs/Cargo.toml -p codex-tui transcript_reflow` - `just fix -p codex-tui` - PR CI in progress on the squashed branch
This was referenced Apr 26, 2026
canvrno-oai
pushed a commit
that referenced
this pull request
Apr 28, 2026
Fixes multiple scrollback and terminal resize issues: #5538, #5576, #8352, #12223, #16165, and #15380. ## Why Codex writes finalized transcript output into terminal scrollback after wrapping it for the current viewport width. A later terminal resize could leave that scrollback shaped for the old width, so wider windows kept narrow output and narrower windows could show stale wrapping artifacts until enough new output replaced the visible area. This is also the foundation PR for responsive markdown tables. Table rendering needs finalized transcript content to be width-sensitive after insertion, not only while content is first streaming. Markdown table rendering itself stays in #18576. ## Stack - PR1: resize backlog reflow and interrupt cleanup - #18576: markdown table support ## What Changed - Rebuild source-backed transcript history when the terminal width changes. `terminal_resize_reflow` is introduced through the experimental feature system, but is enabled by default for this rollout so we can validate behavior across real terminals. - Preserve assistant and plan stream source so finalized streaming output can participate in resize reflow after consolidation. - Debounce resize work, but force a final source-backed reflow when a resize happened during active or unconsolidated streaming output. - Clear stale pending history lines on resize so old-width wrapped output is not emitted just before rebuilt scrollback. - Bound replay work with `[tui.terminal_resize_reflow].max_rows`: omitted uses terminal-specific defaults, `0` keeps all rendered rows, and a positive value sets an explicit cap. The cap applies both while initially replaying a resumed transcript into scrollback and when rebuilding scrollback after terminal resize. - Consolidate interrupted assistant streams before cleanup, then clear pending stream output and active-tail state consistently. - Move resize reflow and thread event buffering helpers out of `app.rs` into dedicated TUI modules. - Add focused coverage for resize reflow, feature-gated behavior, streaming source preservation, interrupted output cleanup, unicode-neutral text, terminal-specific row caps, and composer/layout stability. ## Runtime Bounds Resize reflow keeps only the most recent rendered rows when a row cap is active. The default is `auto`, which maps to the detected terminal's default scrollback size where Codex can identify it: VS Code `1000`, Windows Terminal `9001`, WezTerm `3500`, and Alacritty `10000`. Terminals without a dedicated mapping use the conservative fallback of `1000` rows. Users can override this with `[tui.terminal_resize_reflow] max_rows = N`, or set `max_rows = 0` to disable row limiting. ## Validation - `just fmt` - `git diff --check` - `cargo test --manifest-path codex-rs/Cargo.toml -p codex-tui reflow` - `cargo test --manifest-path codex-rs/Cargo.toml -p codex-tui transcript_reflow` - `just fix -p codex-tui` - PR CI in progress on the squashed branch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add responsive markdown pipe-table rendering for the TUI, including markdown-fence unwrapping for agent output and terminal-width-aware boxed table layout.
Streaming agent output now holds mutable table tails until finalization, so column widths can settle without committing malformed partial rows to scrollback. The live-tail path is gated behind
stream_table_live_tail_reflowfor speculative uncommitted table preview behavior.Validation
just fmtjust write-config-schemacargo test -p codex-tuijust fix -p codex-tui