fix: preserve styled blank rows in VT replay
Summary
Fix the remaining Cloud restore replay gap behind manaflow-ai/cmux#15109.
Fork main already contains Ghostty PR #241's trailing-row state fix. This branch starts from that main, merges the existing startup-input bytes pair from PR #239 so the pin keeps the fork's prior change reachable, and adds the missing styled-row classification: a full-width row of background-only cells is terminal content for VT/HTML formatting and must not be collapsed as text-free.
That row is the grey composer band in the Codex restore repro. Dropping it leaves the replay consumer with the right text but default cells, so the subsequent absolute-cell redraw paints holes and artifacts.
Testing
Page VT preserves a fully styled blank row- cmux
ghostty-vtCloud replay cell-grid tests on the resulting pin - ancestry checked for
a3e9304c5d,0068ece733,edefce7785, ande168fd31c0
Closes manaflow-ai/cmux#15109.
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.
Summary by cubic
Fixes Cloud restore replay so styled blank rows (full-width background) are preserved in VT/HTML output, preventing holes and artifacts after redraw. Also fixes config string parsing so \xNN escapes are treated as single bytes instead of Unicode codepoints, ensuring escaped startup input round-trips correctly.
- Styled cells now count as content in the VT formatter only when styled output is requested; plain output still collapses text-free rows.
- Hex escapes in config strings now write the raw byte rather than encoding the codepoint as UTF-8; the test asserts the indexed background spelling the formatter actually emits.
Summary by CodeRabbit
- Bug Fixes
- Hex escape sequences now decode to their intended byte values, including non-ASCII text, while other escape sequences retain their existing behavior.
- Background styling is preserved on otherwise empty terminal rows in VT and HTML output, instead of styled blank rows and cells being discarded or collapsed as blank.