cmux NEXT transcript: an opened message from another agent has one Copy
Leo, 2026-10-27: "why are there two copy-paste symbols? I mean, two copy symbols". Leo, 2026-10-29: "wouldnt it be a little copy symbol on the top right within this card?" (#28057).
When a message from another agent is opened, it shows two Copy buttons. The card draws its Copy in the top-right corner (CardCopy, #28057), and the line's hover row draws a second one beside the time (ReceivedActions' MessageCopy). The two even copy different text: the corner copies the unsigned words, the row copies the raw text. design/chat-transcript.md says "Each message has one Copy control".
What changes
- Opened, the card's corner Copy is the message's only Copy, and the line's hover row draws none (
CardCopyShownContext, provided byIncomingMessageLine, read byReceivedActions). - Closed, the row's Copy is the only one, as before.
- Time, Retry, Pin, Reply and a waiting steer's ⋯ stay in the row. Nothing else changes, and nothing is removed: each state keeps exactly one Copy. A sub-session's prompt card and a wait's reply had only the corner Copy already.
Tests (red at the first commit, green at the head)
webviews/test/received-message-one-copy-browser.test.ts: Chromium on the gallery'sagent-pane.incoming-message(longandopened), with the pointer on the message's line. Closed shows 1 Copy; opened shows 1 Copy, in the corner; closed again shows the row's Copy back. It writes 2x light and dark stills of the opened message.
Stills
Gallery agent-pane.incoming-message / opened, Chromium, synthetic data, light and dark: to follow from the cmux-ci runs at the red commit (before) and the head (after).
Observed / Not run
- Observed: vp fmt and the browser-lane check on the changed files. web-lint's other failures are base debt in files this PR doesn't touch.
- Not run yet: the test (it goes to cmux-ci).
Changelog
Fixed: an opened message from another agent shows one Copy button, not two.
Design spec: leo-workspace design/chat-transcript.md ("Delivery and actions").
Agent session: agent session
🤖 Generated with Claude Code