cmux NEXT agent chat: message hover rows like Claude's (check, age, Copy, Retry, Fork; just now; exact time above)
Summary
Leo: "WE ALSO NEED EXACT HOVER THING JUST LIKE CLAUDE", then his exact spec for the row under a user message. This makes the hover rows under prompts and answers in the cmux NEXT agent pane match it.
Under a prompt (Leo's spec): read check ("Read by "), relative age, ·, Copy, Retry, Fork from here, each named in a tooltip on hover. No Pin. Retry now shows under every prompt, not only the last turn's; it resends that prompt. It's hidden while the prompt is still being sent, so a click can't send it twice. Fork stays hidden where the harness can't fork at that prompt. cmux's Edit (edit and resend through a fork) follows Fork on prompts the chat can fork before. Claude's Code tab has no Edit here, but it's the only way into that feature, so it stays.
Under an answer (Claude's order, unchanged): Copy, Fork, Pin, Read aloud, age.
Both rows: relative time is Claude's: "just now" under a minute, then minutes, hours, "yesterday", days, "last week", weeks, months, "last year". It never switches to a date. The tooltip on the time reads Oct 20, 2026, 10:16 PM (year, short month, day, hour, 2-digit minute, localised to the pane's language) and shows above the time, as Claude's does. Icons are 16 px in touching 24 px buttons. The row fades in over 120 ms after a 100 ms hover delay, and out over 80 ms, on Claude's cubic-bezier(.32,.72,0,1). Claude's fade-out is 60 ms, but our motion scale's shortest step is 80 ms.
The tooltip is the pane's shared glass title tooltip (frosted, never opaque). The only change to it is a new data-tooltip-side="top".
Comparison: Claude Code desktop vs main before this PR
Claude's values come from its installed app bundle (read-only), cross-checked against Claude captures in the design references repo.
| Claude Code desktop (Code tab) | main before | this PR | |
|---|---|---|---|
| Prompt row order | age, read check, Copy, Rewind, Fork | age, check, Copy, Edit, Retry (last turn only), Fork, Pin | Leo's spec: check, age, ·, Copy, Retry (every prompt), Fork, then Edit; no Pin |
| Answer row order | Copy, Fork, Pin, Read aloud, (rating), age | Copy, Fork, Pin, Read aloud, age | same (no rating in cmux) |
| Icon size / button | 16 px glyph in 24 px (h-control) button, no gap | 14 px glyph in 20 px button, 2 px gap | 16 px in 24 px, no gap |
| Prompt age text | caption, 6 px inline padding | caption, 4 px margin | caption, 2 px before it, · with 4 px each side |
| Answer age text | body (13 px), 8 px padding | 13 px raw, 8 px gap | --text-body, 8 px gap |
| Under a minute | "just now" (en), Intl's "now" word elsewhere | "now" | "just now" (en), Intl's word elsewhere |
| Units | minute, hour, day, week, month, year; rounded; numeric: "auto" | minute, hour, day, then a date ("Oct 13") past 7 days | Claude's units |
| 36 h / 7 d / 30 d / 400 d | yesterday / last week / last month / last year | yesterday / Oct 13 / Sep 20 / Sep 16 | Claude's |
| Tooltip text | Oct 20, 2026, 10:16 PM (year:"numeric", month:"short", day:"numeric", hour:"numeric", minute:"2-digit") | dateStyle: medium, timeStyle: short (Oct 20, 2026, 10:16 PM in en-US, but other fields and order in other languages) | Claude's options, pane language |
| Tooltip place | above the time (tooltipSide: "top") | below | above (below only at the top edge) |
| Tooltip look | dark rounded | glass title tooltip | unchanged glass title tooltip |
| Retry / Fork tooltip | name + detail line | Retry said "Send this prompt again" | "Retry" + detail; "Fork from here" + detail |
| Fade in | 120 ms, 100 ms delay, snap curve | 120 ms ease-out, no delay | 120 ms, 100 ms delay, snap curve |
| Fade out | 60 ms, no delay | 120 ms ease-out | 80 ms (--cmux-motion-quick; 60 ms is off the motion scale) |
| Keyboard focus | in, no delay | in, 120 ms | in, no delay |
What main fixed since Leo's build (03960f5)
#22773 added Pin, Read aloud, the read receipt and the exact-time title. #23081 added check and time on hover. Both are on main. Leo's build had none of the time tooltip.
Visual proof
Gallery entry agent-pane.user-bubble: prompt-hover, answer-hover, and new prompt-time-tooltip and answer-time-tooltip (forced hover, tooltip shown). Before/after (gallery-compare, tailnet): https://cmux-lawrences-mac-mini.tail137216.ts.net:18796/compare/tp-claude-hover-row/?entry=agent-pane.user-bubble
Fleet compile-check (cmux-ci compile-check --app) passed on dbe3eb3 and on 71f32fe (the head after a base merge).
Test plan
webviews/test/user-message-actions.test.tsx: exact prompt-row order and tooltip text, Fork hidden when the chat can't fork, relative-time thresholds incl. just now, 1 minute, 59 minutes, 90 minutes, yesterday, last week, months, last year, future clock skew, German, and the exact-time format (Oct 20, 2026, 10:16 PM,Jan 5, 2026, 9:03 AM, German20. Okt. 2026, 22:16).webviews/src/ui/titleTooltips.test.ts: a top-side tooltip sits above, and goes below only at the edge.webviews/test/thread-minimap-rail.test.tsx: bookmarks toggle from the rail dot and card; prompt rows have no Pin.webviews/test/agent-pane-suggested-tasks.test.ts: reminder and notification turns still offer no Retry of their own. Only the person's prompt has one.scripts/web-lint.shpasses.
Observed / Not run
- Observed: web lint passes locally.
- Not run locally: bun tests. cosmic-gray is Leo's Mac and its hook refuses
bun test, so the tests run on CI (cmux-next-web).
Changelog
Changed: The hover row under agent chat messages matches Claude's: read check, age, Copy, Retry, Fork under prompts; "just now" and week/month/year ages; the exact date and time above the age on hover.
Takes back #22773: removes Pin from the row under prompts (Leo's spec, 2026-10-21). Bookmarks stay on the thread minimap's dot and card.
Leo-ask: ask-0033ce890a
Leo-ask: ask-4ea1e566ad
Leo-ask: ask-13f79420bd
Agent session: cosmic-gray
🤖 Generated with Claude Code