be54a046d0
Both `render_line_with_links` (paragraphs, list items) and the standalone `wrap_text` (code blocks) were word-based wrappers: when a single word's display width exceeded the available column budget they placed the word alone on a line and let it overflow the right edge of the transcript silently. Long URLs, file paths, commit hashes, JWTs, and any no-whitespace CJK run all hit this in #1344 and #1351 reports. The fix mirrors the v0.8.25 table-cell fix (`wrap_cell_text`): extract the per-character width-aware splitter as a free helper `push_word_breaking_chars`, and call it from `wrap_text`, `wrap_cell_text`, and the new char-break branch in `render_line_with_links`. Each rendered line is now guaranteed to fit in the requested width; full content is preserved across the wrapped segments. Snapshot-style regression tests pin the invariant at widths 40, 60, 80, and 120 — covering 200-char `a`-runs, long URL fixtures, mixed-short+overlong-word fixtures, and the existing table-cell property. A regression guard also confirms short words still break on whitespace (no mid-word breaks for ordinary prose). Closes #1344 (output-side overflow). Partial fix for #1351 (the table-cell concern was already fixed in v0.8.25; the long-prompt input-area concern is a separate visible-window issue, not a wrap bug — the composer already uses a grapheme-based wrapper). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>