Repaint sidebar after child scrolls the host scroll region

Codex (Ratatui) emits an 8x RI burst on startup right after setting
DECSTBM. RI at the top of the scroll region scrolls the region down,
and DECSTBM only constrains rows -- so the scroll spans every column
and drags the right-rail session-tree entries down with the main pane.
The chrome cache then hid the clobber because the computed sidebar
frame was unchanged.

The viewport renderer now flags any chunk containing RI / IND / NEL /
SU / SD / IL / DL and OnPTYOut drops the sidebar cache when the flag
is set, so the next drawSidebar repaints over the drift.

Adds unit tests for the new flag and a harness regression scenario
(sidebar_survives_ri_scroll) that fails without the fix.
This commit is contained in:
2026-05-14 20:01:14 +01:00
parent 3622c41fd0
commit 58dbb56937
5 changed files with 151 additions and 0 deletions

View File

@@ -45,6 +45,12 @@ loosely follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
extra row of viewport.
### Fixed
- Child processes spawned by an orchestrator are now killed when the
orchestrator dies, recursively through the tree. Applies whether the
parent was closed via MCP, Ctrl-C'd by the user, or exited on its
own — `reapChild` cascades a SIGTERM (escalating to SIGKILL after 2s)
to every direct child, and each descendant's own reap fires the same
cascade so the kill flows through arbitrary depth.
- Killed agents no longer linger in the command palette. Agent
entries that aren't running are filtered out of the switch list;
session-persistent commands (which can be restarted) stay visible.
@@ -85,6 +91,15 @@ loosely follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
cell, so any child write to that column (or `clearViewport`'s ECH)
would erase it. The viewport is now one column narrower so the
border has a dedicated column.
- Sidebar session-tree entries no longer get pushed downward when an
agent emits a scroll burst on startup. Codex (Ratatui) issues 8× RI
(`\x1bM`) right after setting its scroll region, which scrolls the
region down across every column — dragging the right-rail entries
with it. The chrome cache then hid the clobber because the computed
frame still matched. The viewport renderer now flags any chunk that
contains a scroll-triggering escape (RI / IND / NEL / SU / SD / IL /
DL) and `OnPTYOut` drops the sidebar cache when the flag is set, so
the next `drawSidebar` repaints over the drift.
## Conventions