cmux NEXT transcript: no Pin or hover Copy on messages from other sessions

Merged
TE
5d ago
+152-35

Leo, 2026-10-30: "we have these things removed in the next nightly right? all these weird button stuff from messages from other sessions... weird to be able to pin them etc and an entire stupid unstyled open chat button when you should just be abel to click on their names"

Leo, earlier: "removing the "read after this step" maybe and the odd gap betwene the pin and the ellipsis and the redundant "open chat" (just make the left side identifier like it was before and you can click it to go to that session"

What was still there

On the feat-cmux-next tip, #28113 (the carry of #27602) had already removed "Open chat", the "From:" line and "Read after this step"/"Read after this turn" from messages from other sessions, and made the sender's name the button that opens that session. What it left in the line's hover row was Copy and Pin, on both a delivered message and a waiting one.

What changes (messages from other sessions only)

  • ReceivedActions (a delivered message's hover row) loses Pin and Copy. It keeps its age, Retry (on the last ended turn) and a waiting steer's ⋯ (Send now).
  • QueuedMessageCard (a waiting message) loses its hover Copy. The ⋯ keeps Send now and Dismiss.
  • With Pin gone, the gap between Pin and ⋯ is gone too.
  • The opened card keeps its corner Copy (CardCopy, #28057), so you can still copy the text. Right-click still opens the message menu.
  • The sender's name on the left is still the only target that opens the session (SenderName, unchanged). "Open chat" and "Read after this step" stay gone from these rows. The tests now check both.
  • Unchanged: your own prompts (age, Copy, Retry; queued Send now/×/"Read after this step" in PendingSteer), assistant replies (Copy, Pin, Read aloud, More), queue behaviour, the alignment of these rows (#28796 handles that) and the colours.

Overlap: #28674 (open, our lane) makes the closed line's hover Copy the one Copy. This PR removes that hover Copy from other sessions' messages, so after this lands, #28674's closed-state half no longer applies (its opened-state result, a corner Copy only, is what this PR gives). #28796 changes these rows' left inset only and does not touch their actions.

Risk: low. Webview only. It removes two hover buttons from one row kind. Nothing new runs per token, and there is no new timer or observer.

Before / after (2x, Linux Chromium gallery, synthetic data)

Viewed after image: yes, all four. The hover row ends at the age (and ⋯ on a waiting one), the chevron does not move, and the name is the click target.

StateBeforeAfter
Waiting message, light (agent-pane.hover-fade/received)
Waiting message, dark
Delivered message, light (agent-pane.incoming-message/sender-hover)
Delivered message, dark

Design choice: none. Leo named the removal exactly, so there are no gallery variants. Spec: leo-workspace design/chat-transcript.md ("Each message has one Copy control" now reads: a message from another session has its Copy in the opened card's corner).

Tests

cmux-ci test (fleet Linux, run 41184217383 at 0193fa67): typecheck clean, 79 pass / 0 fail across 10 files:

  • new other-session-message-actions-browser.test.ts (real Chromium, light and dark, waiting and delivered): no .cv-message-pin, no hover Copy, no "Open chat"/"Read after this", and the name is a button. Red at base (run 41184230039: 4 fail), green here. It writes the stills above.
  • queue-agent-message.test.tsx: a waiting message's group has ⋯ with no Copy and no Pin; a delivered steer's one group has no Pin, Copy, Open chat or Read after this step.
  • incoming-message-disclosure-browser.test.ts: no Pin or hover Copy in a waiting line's hover row.
  • also incoming-sender-chip, message-actions-menu-reveal, received-message-fold-browser, transcript-hover-fade, user-message-actions (your own prompt's actions unchanged), thread-minimap-rail, PendingSteer.test.tsx.

Changelog

Fixed: Messages from other sessions no longer show Pin and Copy buttons on hover. Click the sender's name to open that session, and copy from the opened message.

🤖 Generated with Claude Code

Agent session: agent session