cmux-next agent pane: the thread minimap spans the transcript's height

Merged
TE
15d ago
+1040-36

The thread minimap now spans the transcript's full height. Leo liked how smooth the rail is, but said it "feels short": it covered a small, centered part of the pane and showed only a few ticks. The whole scroll height now maps onto a rail as tall as the transcript.

What it does

  • Marks at their place: every prompt and every reply is drawn where it sits in the chat. Prompts are longer, brighter ticks and tab stops. Replies are shorter, dimmer and set in by 4 px. Replies a few px apart merge, so a 2,000-turn chat stays bounded.
  • The view bar: a faint bar shows what's on screen. It moves by transform on the scroll's own frame, with no React render.
  • Hover: marks near the pointer grow (a fisheye by px distance), and the nearest message opens the existing preview card after the hover delay. A prompt's card has its bookmark; a reply's card shows the reply's start.
  • Jumping: clicking a prompt jumps the way the compact rail does (lands, settles, flashes the bubble). Clicking a reply scrolls to it. Clicking empty track centers the view there. Dragging anywhere scrubs.
  • Keyboard: Tab, arrow keys and Home/End walk the prompts; Return or Space jumps; Escape closes the card.
  • Old rail kept as an option: Codex's compact rail stays as the compact arm of the new thread-minimap-layout experiment. To switch, set cmux.experiments to {"thread-minimap-layout":"compact"}. full is the default.
  • Shared card: the preview card moved into PreviewCard.tsx, which both rails now use.

Claude Code desktop has no transcript minimap as far as I know, so this follows the Codex rail's motion and goes further on coverage.

Proof

Gallery agent-pane.thread-minimap now has an experiment compare view showing full and compact side by side, and its variants play in both arms.

Tests

  • test/thread-scroll-map.test.ts covers the model: placement, merging, the view bar, seek and hit testing.
  • The compact rail's existing tests pin the compact arm.

Observed / Not run

  • Not run locally: no test, lint or type check. Leo's Mac (cosmic-gray) is under the load rule and its git is frozen, so CI is the first run.
  • Only the formatter ran, in the commit hook.

Changelog

  • Changed: The chat's thread minimap spans the whole transcript, with a tick for every prompt and reply, a bar for the view, click or drag to jump, and a preview on hover.

Agent session: cosmic-gray

šŸ¤– Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

The thread minimap now spans the full height of the transcript instead of sitting as a small centered rail. Every prompt and reply draws at its place in the chat, with a view bar that follows the scroll, hover previews, and click or drag to jump.

  • Prompts render as longer, brighter ticks and tab stops; replies as shorter, dimmer ones that merge when close together so long chats stay bounded. Marks are keyed by row id, so they stay on the same message when replies merge or older turns arrive above.
  • Hovering near a mark grows it (fisheye) and previews the nearest message; clicking a prompt lands, settles, and flashes the bubble like the compact rail.
  • The compact Codex rail stays available as the compact arm of the new thread-minimap-layout experiment; full is the default and {"thread-minimap-layout":"compact"} opts out.
  • The preview card moved into a shared PreviewCard.tsx used by both rails.
  • New thread-scroll-map.test.ts covers the map's model in mapGeometry.ts; the compact rail's existing tests now pin that arm.