Gate the runtime alt-toggle resize latch when PI_TUI_RESIZE_IN_PLACE explicitly forces the fast path off, while preserving multiplexer handling.
Add regression coverage that auto-detects the alt-toggle echo, then verifies a later width resize still borrows the alternate screen and performs the authoritative ED3 rewrap.
Terminals that re-report their size whenever the alternate screen buffer toggles turned every fullscreen-overlay exit (/settings, models page) and resize into a spurious height-only SIGWINCH. That armed the resize drag/settle behind the overlay and drove a destructive ED3 clear-scrollback full repaint on exit -- visible as a flicker on terminals without DEC 2026 synchronized output -- with the size revert flashing another.
A SIGWINCH while a fullscreen overlay covers the transcript now repaints the overlay in place instead of arming the drag/settle, and the in-place resize path is latched once the height-only alt-toggle echo is observed, so this was previously handled only for Warp and is now auto-detected for any such terminal.
Fixes#6511
- Replaced resolveHangulCompatibilityJamoWidthFromTerminalIdentity with a
static hangulJamoWidth field on TerminalInfo (ghostty 2, warp 1,
platform otherwise); startup now reads TERMINAL.hangulJamoWidth.
- Reused terminal identity detection to select Warp narrow and Ghostty wide profiles.
- Covered Warp resolution while preserving platform defaults for other terminals.
Fixes#6461
Status presenters (showWarning/showError/showStatus and extension/tool
error presenters) baked theme.fg() into Text at construction, so a
warning shown while the auto-theme default guess was dark kept the
dark-mode color after async appearance detection switched the active
theme to light — dark-catppuccin Mocha yellow on the light Latte
background (1.12:1 contrast, effectively invisible).
Add Text.setStyleFn(), a foreground styler evaluated at render time, and
route the transient status presenters through it. Because the coding
agent invalidates status components on onThemeChange, a theme swap now
re-shapes them against the live theme instead of replaying the palette
active when they were constructed.
Fixes#6337
omp took full ownership of the TTY and emitted a comprehensive private-mode
reset menu on teardown, but never restored normal cursor-key (DECCKM) or
numeric-keypad mode (terminfo `rmkx` = `\x1b[?1l\x1b>`). The native key decoder
accepts both CSI (`\x1b[A`) and SS3 (`\x1bOA`) arrow encodings, so omp never
enabled application mode itself and never bothered to reset it -- but a program
that shares the TTY (or inherited state) could leave the terminal in
application-cursor-keys mode. Arrows then arrived as SS3 and the parent shell's
Up/Down history navigation stayed broken after omp exited.
Emit `rmkx` in ProcessTerminal.start() (normalize inherited state so arrows use
the predictable CSI form inside omp), ProcessTerminal.stop(), and the blind
branch of emergencyTerminalRestore() (restore normal mode so the shell handoff
is sane), symmetric with every other terminal mode omp manages.
Fixes#6374
- Provider sign-in, theme, and web-search lists now shrink their visible row window to fit available height.
- Decorative chrome (sign-in hint, theme mock preview) yields to the list when space is tight.
- SelectList and OAuthSelector expose `setMaxVisible`/`setMaxHeight` so hosts can refit lists after construction.
Selected one highest-scoring completion per command so canonical names and matching aliases no longer occupy duplicate rows while exact aliases still win.
Fixes#6131
- Wrapped the user-requested OSC 11 query and DA1 sentinel in one tmux passthrough envelope.
- Preserved direct startup and Mode 2031 probes and retained passthrough routing when a refresh is queued.
- Added regression coverage for the emitted tmux control sequence.
Fixes#6066
Expired post-paint settle timestamps kept requestDirectWrite on the scheduled component-render path after the 150 ms guard ended.
Expire stale timestamps before selecting the fallback, preserving coalescing inside the active window.
Fixes#6024
Rebased the committed-row seam when multiplexer reflow exposes native scrollback inside an enlarged viewport.
Added production transcript coverage for a finalized prefix above a live response and verified no ED3 is emitted.
Fixes#6011
Carry exact visible widths from Text and Box render results into their owners, and through Editor wrap/layout/render state. Stamp derived widths and render caches with a monotonic Hangul width-config epoch. Retain sidecar entries only by WeakMap owner identity, with immutable publication-time line/width proof, and conservatively remeasure escape-leading padded rows.
Before:
static_redraw 1633.11 us/op
editor_edits 1249.71 us/op
After hardened repair:
static_redraw 1321.51 us/op (1.236x)
editor_edits 1150.32 us/op (1.086x)
Win:
Exact byte/grid/scrollback hashes match across all five phases; every phase CV is below 20%, with no B/C regression.
Memory:
retained heap 251,393,541 -> 251,500,114 bytes (+0.042%).
Op: carry exact widths through render ownership and editor layout
Restores: repeated visible-width measurement in core TUI hot paths
Kept full-root rendering as the default after input and introduced an explicit host opt-in for stable-focus subtree repainting. The coding-agent default composer opts in, while extension-provided editors and other TUI consumers retain callback-safe full composition.
Scoped ordinary input frames to the focused component while retaining a full compose when input moves focus. Explicitly repainted the coding-agent pending-message sibling and covered stable focus, wrapped growth, focus movement, and queue clearing.
Fixes#5928
Closed active OSC 8 state on wrap_single_line's short-line fast path and wrapped whole table cells in one call so hyperlinks stay balanced across <br>-derived newlines.
Fixes#5885
Closed and restored OSC 8 hyperlinks at native wrap boundaries so composed table cells cannot inherit active link state.
Moved explicit-link spacing outside the clickable URL span and added wrapped table regression coverage.
Fixes#5885
- Kept height-only resize echoes on the normal buffer.
- Preserved alternate-screen borrowing for width drags.
- Added a regression test for the settings-exit resize path.
Fixes#5854
Treated CMUX_REMOTE_TRANSPORT as an authoritative cmux marker so pane resizes use the in-place repaint path instead of borrowing the alternate screen.
Added a regression test for the native cmux SSH environment and documented the fix.
Fixes#5857
Re-enabled wrapped descriptions for slash-command autocomplete while preserving the existing visual-row popup budget.
Replaced the compact-row regression with an editor-level contract that proves long description tails remain visible.
Fixes#5848
Raw unbracketed paste data may span adjacent stdin reads. The prior call-local check drained a first chunk such as "line 1\r" before later lines could classify the burst, leaving the original per-line submit bug.
- Held ESC-free break-bearing input in a fixed 10 ms classification window and appended adjacent raw reads before classification.
- Coalesced candidates after two completed logical line breaks; replayed ambiguous candidates unchanged through the normal per-key path on expiry or before escape-bearing input.
- Cleared and exposed pending candidates through the existing flush, clear, getBuffer, and destroy lifecycle.
- Added regressions for split reads, a break-only boundary, and delayed replay of ordinary Enter input.
Fixes#5841
The single-interior-break heuristic misclassified a single Enter batched with a following keystroke in one stdin read ("a\rb") as a paste, swallowing the submit. Terminal read boundaries are not key boundaries.
- Tightened RAW_MULTILINE_BURST to content-break-content-break-content so only 3+ line bursts (two interior break runs; CRLF counts as one) coalesce; a single Enter can never produce two interior breaks.
- Added regression tests for CRLF three-line bursts, a batched single Enter, and an ambiguous two-line burst staying on the key path.
Fixes#5841
- Detected an ESC-free stdin burst with an interior CR/LF in StdinBuffer.process and routed it through the paste channel instead of per-key splitting, so a Cmd+V multiline block whose terminal omitted the \x1b[200~…\x1b[201~ markers no longer fires one submit per line.
- Guarded to ESC-free buffers so real bracketed pastes, CSI keys, and mouse reports keep their path; a lone Enter, a single trailing newline, and a run of bare Enters stay normal keypresses.
- Added regression tests for the raw CR/LF burst, single Enter, trailing Enter, bare-Enter run, single-line burst, and escape-bearing chunk.
Fixes#5841
Brings the per-advisor toggle, status-line glyphs, quota display, and the
failing-advisor stall/abort fix (f4c8143) onto main's rewritten advisor
runtime. Conflict reconciliation kept main's architecture (fingerprint
prefix reconciliation, host-level onTurnError recovery + fallback chains,
terminal-failure classification) and ported the branch semantics onto it:
- #failing latch: waitForCatchup resolves immediately while an advisor is
mid-failure; parked waiters wake the moment a turn fails, before any
async hook or retry sleep.
- Turn-end render containment: a formatter bug restores the cursor/prefix/
dedup snapshot and never propagates into the primary's turn-end callback
(per-advisor try/catch boundary in AgentSession).
- Quota pause: when host recovery declines a usage-limit failure, the
runtime latches quotaExhausted, requeues the batch, and notifies —
cleared only by an explicit reset.
- Hard halt after a permanent rejection or three backlog-drop cycles.
- #recoverAdvisorTurn also marks usage limits for structural errors thrown
before any assistant turn is recorded.
- v17.0.1 (#5476) rewrote the normal buffer in place per SIGWINCH, so
the terminal's own width reflow pushed wrapped fragments into native
scrollback mid-drag and resize smoothness collapsed.
- Throwaway drag frames paint on the alternate screen again; the settle
full paint fuses the buffer exit ahead of its destructive repaint.
- Kept the #5319 fixes: deferred overlay alt-exit fusing, confirmed-only
DECRPM 2026 handling, and Warp's in-place resize path.
- Reverted PR #5751 (issue #5749): continuation rows wrapped the editor
top border onto extra lines, which is unacceptable for the input frame.
- EditorTopBorder is back to a single content/width pair; narrow widths
drop right segments, shrink the path, then drop left segments.
Cherry-picked 69c9fe8d4; resolved terminal.ts against the newer
onPrivateModeReport signature and unioned appearance tests with the
Windows Terminal polling regression.