Repository navigation
cmux NEXT agent chat: message hover rows like Claude's (check, age, Copy, Retry, Fork; just now; exact time above) - #23769
Conversation
…act time above, 24px buttons, fade) The hover row under prompts and answers now follows Claude Code desktop's code (read from its bundle): "just now" under a minute and counts in weeks, months and years past a week instead of switching to a date; the time's tooltip reads "Oct 20, 2026, 10:16 PM" (year, short month, day, hour, 2-digit minute, in the pane's language) and shows above the time; icons are 16px in touching 24px buttons, the age in the body size; the row fades in after 100ms over 120ms and out over 60ms on Claude's snap curve. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
… and Pin; receipt in a 24px square; prompt age stays caption Claude's Code tab draws a prompt's row as age, read receipt, Copy, Rewind, Fork; cmux's Edit sat between Copy and Fork. It now follows Fork, with Pin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
…o Pin
Leo (2026-10-21): under a user message, left to right: the read check
("Read by <harness>"), the relative time (its absolute date on hover), a
dot, Copy, Retry and Fork, each naming itself on hover; no Pin. Retry now
shows under every prompt (it resends that prompt) and names itself
"Retry" with "Send this prompt again" under it. Fork stays hidden where
the harness cannot fork. cmux's Edit follows Fork where the chat can fork
before the prompt. The Chief's prompt row matches.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Probably yours: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; base red: the same failure on the base 4313b23; does not block
Agents: Gallery before/after for
States
Pick other states with a |
|
Owned by transcript-parity on cosmic-gray · session |
|
Found 5 test failures on Blacksmith runners: Failures
|
|
Bead |
…ctions test; steer-read-hover note says Fork, not Pin) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
|
Review (subagent, correctness first): BLOCK at b2eb067 This covers b6d6a77 plus the merge of feat-cmux-next (b2eb067). The merge itself is fine: the conflict in user-message-actions.test.tsx keeps the new label order and adds base's two assertions, and the composer.gallery.ts steer note is correct. All three blockers below are on both heads, and CI on b6d6a77 already shows them failing (react-apps-check shards 1, 3 and 4). Blocking (tests that fail because of this PR):
Checked and correct:
Not blocking:
|
…on the motion scale; tests count only stray Retry - relativeTime: mark Claude's English "just now" l10n-allow (other languages get Intl's own word). - The row's fade uses the motion scale: in --cmux-motion-micro (120ms, Claude's), out --cmux-motion-quick (80ms; Claude's 60ms is off scale). - Retry hides under a prompt still on its way (a second send would duplicate it). - Another agent's message row keeps 6px between its age and Copy. - suggested-tasks: the reminder and notification turns offer no Retry of their own; the person's prompt now has its own (Leo's row). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (subagent, correctness first): SHIP at dbe3eb3 Blocking: none. All three earlier blockers are fixed. I checked each against its scanner or test, not against the commit message:
Also checked:
Non-blocking:
Not run: no browser or |
…onversation.css 30) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
|
Review (subagent, correctness first): SHIP at 71f32fe Reviewed the feat-cmux-next merge (second parent 4313b23) on top of the SHIP at dbe3eb3, using
Not run: |
|
Shipped in:
|
…d time fade like the message row (#24049) * Agent chat tests: a failed tool call's red mark at rest, a running one's spinner, the hover fade Leo (2026-10-21): "let's only show the green/red checkmark + time on hover for ours". Red before the fix: a failed call that is not a shell says "failed" in the dim detail color, and the hover check and time snap in with no fade. Gallery states tool-hover-meta-lone(-hovered) show a finished, a failed and a running call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray * Agent chat: a failed tool call says failed in red at rest; the hover check and time fade like the message row Leo (2026-10-21): "let's only show the green/red checkmark + time on hover for ours". #23081 already hides a finished call's check and time until hover or focus. Two gaps remained: a failed call that is not a shell (a fetch, a read, an MCP call) said "failed" in the dim detail color, so its failure blended in at rest; it now uses the red failure color, as a command's "exit 1" and a group's "1 failed" do. And the check and time snapped in; they now fade as a message's hover row does (#23769): in after 100ms over 120ms, at once from the keyboard, out in 80ms, none under Reduce Motion. Running rows keep their spinner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray * Gallery: the lone-call hover states open the ended turn's Worked for first The running turn's finished calls sat folded, so the plays never found a check (gallery health: waitFor did not hold). The fixture is now an ended turn, as tool-hover-meta's is; the running spinner stays covered by the unit test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray * Gallery: the lone-call plays open the folded run too (Searched the web) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- IncomingMessageCard measured its text with the global getComputedStyle (#23932), which a jsdom test does not install; any transcript with another agent's message threw. It now reads the box's own window, as PromptText does. (regression; fixes transcript-copy's sent-prompt test) - transcript-range-content's button variant clicked the prompt's floating Copy, which #24267 removed on purpose. It now selects a range that starts at another agent's message (a line that keeps its floating Copy) and clicks that. (stale test) - agent-pane-older-rows-fade read a row's turn from its textContent, and #23769's message age ("3 weeks ago") runs straight on from "Question 130", so opened rows read as turns 1113..1303. The recorder now drops <time>. (stale test) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- IncomingMessageCard measured its text with the global getComputedStyle (#23932), which a jsdom test does not install; any transcript with another agent's message threw. It now reads the box's own window, as PromptText does. (regression; fixes transcript-copy's sent-prompt test) - transcript-range-content's button variant clicked the prompt's floating Copy, which #24267 removed on purpose. It now selects a range that starts at another agent's message (a line that keeps its floating Copy) and clicks that. (stale test) - agent-pane-older-rows-fade read a row's turn from its textContent, and #23769's message age ("3 weeks ago") runs straight on from "Question 130", so opened rows read as turns 1113..1303. The recorder now drops <time>. (stale test) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Leo (2026-10-28): "there should be, like, a fast fade-in fade-out. Right now they're just appearing and disappearing. Like they're just blinking in and out of existence, and it's a bit jarring". Every control the transcript shows only on hover now takes the message hover row's fade (#23769, --cv-actions-in/-in-delay/-out): out quickly at rest, in after a beat under the pointer, at once from the keyboard. - No fade before: another agent's message line's Reply and "Read after this step" tag, and a tool output's corner actions (Wrap lines). - One-off timings before, now the shared fade: table Open/Copy, a sent message's Copy, Open chat on a disclosure line, media Open/Expand, a finished subagent line's actions, the live line's background hint. test/transcript-hover-fade.test.ts fails when a transcript stylesheet reveals a class on hover or focus without that fade. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d of blinking (#27560) * gallery: hover-revealed transcript controls, settled and caught mid-fade A new gallery entry (agent-pane.hover-fade) points at another agent's waiting message line and at a finished call's output, each settled and caught partway into its fade in, so the fade (or its absence) shows in a still capture. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent chat: hover-revealed transcript controls fade instead of blinking Leo (2026-10-28): "there should be, like, a fast fade-in fade-out. Right now they're just appearing and disappearing. Like they're just blinking in and out of existence, and it's a bit jarring". Every control the transcript shows only on hover now takes the message hover row's fade (#23769, --cv-actions-in/-in-delay/-out): out quickly at rest, in after a beat under the pointer, at once from the keyboard. - No fade before: another agent's message line's Reply and "Read after this step" tag, and a tool output's corner actions (Wrap lines). - One-off timings before, now the shared fade: table Open/Copy, a sent message's Copy, Open chat on a disclosure line, media Open/Expand, a finished subagent line's actions, the live line's background hint. test/transcript-hover-fade.test.ts fails when a transcript stylesheet reveals a class on hover or focus without that fade. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: trailing-plates reads the tool output actions under the frame's Reduce Motion The page asked Playwright for reduced motion, but the gallery frame emulates its own media from its URL, so the actions' new fade in had just started when their opacity was read ("0", not "1"). The frame now gets reducedMotion=1 as well. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
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'scubic-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.
·, Copy, Retry (every prompt), Fork, then Edit; no Pinh-control) button, no gap·with 4 px each side--text-body, 8 px gapnumeric: "auto"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 PMin en-US, but other fields and order in other languages)tooltipSide: "top")--cmux-motion-quick; 60 ms is off the motion scale)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 newprompt-time-tooltipandanswer-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-bubbleFleet 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
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