fix: preserve styled blank rows in VT replay

Merged
AU
1mo ago
+90-7

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-vt Cloud replay cell-grid tests on the resulting pin
  • ancestry checked for a3e9304c5d, 0068ece733, edefce7785, and e168fd31c0

Closes manaflow-ai/cmux#15109.


View with [code]smith Autofix with [code]smith
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.