Companion speech bubble truncated at narrow terminal widths

Resolved 💬 4 comments Opened Apr 1, 2026 by jphein Closed Apr 9, 2026

Problem

At narrow terminal widths (< 100 columns), the companion speech bubble text is hard-truncated to 23 characters + and there's no way to read the full text.

Example at 60 cols:

(°oo°) "*ears droop* `defaultWi…"

Root cause

In CompanionSprite.tsx, the narrow-terminal path (line 228 in v2.1.88 source) slices the reaction text:

const NARROW_QUIP_CAP = 24;
const quip = reaction && reaction.length > NARROW_QUIP_CAP
  ? reaction.slice(0, NARROW_QUIP_CAP - 1) + '…'
  : reaction;

At ≥ 100 columns (MIN_COLS_FOR_FULL_SPRITE), a SpeechBubble component renders with word wrapping at 30 chars — no truncation. But below 100 cols, the full text is discarded.

The full text exists in appState.companionReaction but is sliced before rendering and never persisted anywhere (not in session JSONL, not via hooks).

Suggested fix

Instead of truncating, wrap the text or allow expanding it. For example:

  • Use wrap(reaction, availableWidth) like the wide SpeechBubble does
  • Or render the narrow bubble as a multi-line box above the face when speaking
  • At minimum, increase NARROW_QUIP_CAP — 24 chars is very short

Environment

  • Claude Code v2.1.89
  • Linux (Ubuntu), 60-column terminal
  • Companion: Umbra (capybara)

Related: #42048 (companion reactions not accessible via hooks/API)

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗