Repository navigation
cmux NEXT: running rows draw orbiting dots on the left - #21954
teamleaderleo wants to merge 20 commits into
Conversation
Leo 2026-10-18: a running row gets a running animation on the left, like Claude Code's four orange dots that slowly rotate and regroup. - The Orbit status icon set, now the default: agent work is four dots in Claude's orange that turn once per two pulse periods and draw in and out once per period. Nothing fades, so at the fastest Debug Settings periods they regroup at most twice a second (#21633). Stopped, they stand on the axes; under Reduce Motion or the Static mode the static look draws (#21659). Every other state keeps the Codex-like marks. - The Status icon row badge from #20900, now the default: one status icon per row (its most urgent state) in a fixed slot on the left, so titles line up; Debug Settings sidebar.statusIconSide puts it on the right. No corner badge or count number. - Session rows listed under a workspace draw their own status on the same side. - From #20409: an indeterminate report draws no bar under the row; a measured one sits inside the pill between the row's insets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A web copy of the app's Orbit mark (OrbitDots), with a gallery entry (ui.running-dots) that sets sidebar rows and their sessions in the Codex-like look on the right next to the Orbit look on the left, the mark at 6x, and the static look under Reduce Motion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Bead |
feat-cmux-next quieted the indeterminate bar itself (0eef92e), so WorkspaceRowContent takes its version. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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)
Pending: CI is running on Last result: Unclear: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 1fac57d; does not block
Agents: |
|
Agents: |
This comment has been minimized.
This comment has been minimized.
… the slot, rows speak the drawn state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sion rows and VoiceOver follow the left status slot - StatusIndicatorLayer+Orbit: a new replicator frame drops the turn so updateAnimation starts one in it (a row is configured before layout). - GroupHeaderRowView: the name starts past the rows left status slot, so headers stay on the rows column. - WorkspaceRowView: a connecting placeholder keeps the slot with no state; the agent mark never takes the status slot under .status. - SidebarTabRowView: session rows honour the list badge style and the working row element, as workspace rows do. - Accessibility: a row speaks the state it draws (rowStatus). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s each tab's status once The orbit's raw CAKeyframeAnimation failed the Motion tokens check. Motion.sampledKeyframes builds the same linear keyframe turn (the curve is in the sampled points). SidebarMapping.row read every tab's status reports three times: for the row's merged status, its working slot, and the tab row's mark. It reads them once now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sh/running-dots # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Logic/SidebarTunables.swift
- regenerated Packages/macOS/CmuxNext/ci-target-graph.json - vp fmt webviews/src/agent-session/acpmux/replyHref.ts - vp fmt webviews/src/pages/markdown/README.md - vp fmt webviews/src/pages/markdown/links.ts - vp fmt webviews/test/markdown-cmux-app-links.test.ts Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39210872231
… claude-polish/running-dots
…sh/running-dots # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextBridge/SidebarMapping.swift # webviews/src/agent-session/acpmux/replyHref.ts # webviews/src/pages/markdown/links.ts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
[Medium impact] The latest changes appear safe to merge; the two earlier, non-blocking display issues remain. FindingsSummaryAdds orange orbiting dots for running agents and makes a single status mark the default for sidebar rows.
Reviews (4) · Last reviewed commit: "test(next): by default a working row's t..." · Reviewed by Greptile |
| func rowStatus(_ ws: SidebarWorkspace, activity: StatusIndicatorState) -> StatusIndicatorState { | ||
| statusSide == nil ? activity : WorkspaceRowBadges(unread: ws.unread, activity: activity).first ?? .idle |
There was a problem hiding this comment.
Detailed icons setting is ignored
rowStatus calls WorkspaceRowBadges without detailed:, which defaults to true. With the new default .status style, turning Detailed Status Icons off still shows separate waiting and error icons. A working row with unread work also keeps its working mark instead of showing Ready.
Pass shown.detailedStatus into this path and use the same result for accessibility.
…st a budget red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Found 6 test failures on Blacksmith runners: Failures
|
| // Where a turn starts: four dots spread on the axes. | ||
| let side = rect.width * StatusIndicatorLayer.orbitDotShare | ||
| for index in 0..<StatusIndicatorLayer.orbitCount { | ||
| let center = StatusIndicatorLayer.orbitPoint(turn: CGFloat(index) / CGFloat(StatusIndicatorLayer.orbitCount), in: rect) |
There was a problem hiding this comment.
Still dots have uneven spacing
StatusIconSet.orbit.image(state: .working, ...) draws the horizontal dots closer to the center than the vertical dots. Passing index / orbitCount to orbitPoint changes both the angle and the radius. The live stopped mark instead puts all four dots at the outer radius, so the image does not match it.
Rotate the initial point for each copy instead of advancing its animation time.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
|
I'm holding this PR. Merging the base in conflicts in 4 files (SidebarMapping, StatusIndicatorLayer, SidebarRowBadgeStyle, WorkspaceRowView+Rendering) with 57997c3, which Lawrence landed at 00:04Z: "a tab or workspace row shows one state mark, on the right; only the icon on the left". He wrote: "Nothing should ever be on the left side besides the favicon." This PR's default is the opposite: the status icon and the orbiting dots on the left ( Two ways forward:
The orbit work itself (StatusIconSet.orbit, Motion.sampledKeyframes, the reduce-motion handling) doesn't depend on the side. |
Conflicts with 57997c3 (Lawrence: one state mark per row, on the right; only the icon on the left): layoutRowBadge takes no style now, the corner badge is a trailing glyph, the unread color reads Palette.notificationBlue, and tab rows take their favicon from browserFaces. The status icon side's default is unchanged here; the next commits move it to the right. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efault Lawrence 2026-10-19 (57997c3): nothing on a row's left but the favicon. The left-hand running mark stays a Debug Settings choice and keeps its test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ays a Debug choice sidebar.statusIconSide defaults to right, so the Orbit running mark and the row's one status icon sit at the row's end, the slot 57997c3 gives every state mark. Debug Settings > Sidebar > Status icon side > Left keeps Leo's mark before the title (2026-10-18). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… right With the status icon on the right, an unread session whose agent works drew the unread dot and the running mark side by side. Lawrence 2026-10-19: a single indicator on the right. The tests also check that nothing but the icon draws left of a row's title by default. The unread dot becomes internal so the test can read it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…atus mark With the status icon row badge, a session row's mark is its most urgent state with unread folded in, as WorkspaceRowView.rowStatus does: the running mark while its agent works, else the done mark. The unread dot draws only with another row badge, so the right side holds one mark (Lawrence 2026-10-19). The header comment now says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s does Closes the review's gap: no empty status slot is kept on the left when the mark sits on the right. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Leo wanted a running row to show "a nice running animation on the left", like Claude Code's four orange dots that slowly rotate and regroup. This PR adds that mark and folds in the two open PRs it needs: #20900 (the status icon on the left) and #20409 (no fake progress line).
Gallery:
ui.running-dots/rowsandreduce-motion(MP4). The gallery shows a web copy of the native mark at the same geometry and timing; the app draws it with Core Animation (StatusIndicatorLayer+Orbit.swift).What changes
StatusIconSet.orbit, now the default):sidebar.statusIconSidemoves the icon to the right, andsidebar.rowBadgekeeps the corner, stack and trailing looks.StatusMapping.summary(tab)) on the same side, in the same fixed slot.Not here
#20900 also hid kind icons on tabs and moved the tab status mark to a side. Tabs are out of scope here and come in a follow-up.
Testing
OrbitStatusIconSetTestscovers:SidebarRunningMarkTestscovers:SidebarRowQuietProgressTests(from Sidebar: quiet the workspace row (no fake progress line, aligned agent mark) #20409).SidebarRowCornerBadgeTestsnow pins the corner look explicitly, andCodexStatusIconSetTestsno longer asserts the default.gallery-coverage,gallery-manifest,ui-rules,theme-colorsandpane-englishpass;check:layers,check:system-blue,check:type-scaleandcheck:text-focuspass.Supersedes #20900 and #20409.
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Running rows draw Claude Code-style working marks: four orange dots that turn and regroup, in a fixed slot on the right of each row by default.
sidebar.statusIconSidemoves them left; the Status icon row badge (one status icon per row, no corner badge or count) is now the default, and indeterminate progress no longer draws a full-width bar under the row.sidebar.statusIconSidemoves it to the left, and the old row badge styles remain as Debug Settings options. Group headers start past the left slot, a connecting placeholder keeps it empty, and rows speak the state they draw.The
feat-cmux-nextmerge also carries:_acpmux/route/listwith routing details (the composer's Account menu lists only matching routes); anagent.sessionStatusDebug toggle; tunable registries listed one entry per line; comments and baselines that clear five base reds; a perf-10x daemon request-latency bench; and #22127, webview tests running past a budget red.An autofix pass regenerated
ci-target-graph.jsonand reformatted webview files.Written for commit 2db3ff2. Summary will update on new commits.