Skip to content

cx-v9k2f: lanes view on Agent Activity + sidebar attention count (Labs preview) - #20363

Merged
teamleaderleo merged 13 commits into
feat-cmux-nextfrom
op-next-cursors/lanes-view
Oct 14, 2026
Merged

teamleaderleo merged 13 commits into
feat-cmux-nextfrom
op-next-cursors/lanes-view

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Bead: cx-v9k2f (part 2 of 2). Needs #20362 (acpmux decides lane) to show anything; without it every session decodes to no lane.

Problem

Leo, 2026-10-13: cmux NEXT coordination should make lanes that go idle or stuck obvious. About 25 lanes sat idle for hours unnoticed that day, some dead on out-of-credit errors.

Change

This is behind Settings > Advanced > Labs > Show Preview Features (labs.previewFeatures, off by default), following the no-prototype-UI rule. It is fully functional, but not yet styled.

  • Lanes view on the Agent Activity page, with a Lanes | Computer use switch:
    • lists every acpmux session on this Mac and on the acpmux peers it mirrors;
    • groups them by machine, then by the coordinator that started them (mux.parent, headed by the coordinator's own session);
    • orders each group: failed (with the error text, e.g. "Credit balance too low"), lost, waiting on permission, idle (longest first, "Idle · 5h"), then working.
    • The filter also matches error text.
    • A click opens the chat through the cmux://session/<id> path every session link takes. It reveals the tab that shows the chat, or opens one in the focused pane.
  • Sidebar: a client-only Lanes item next to What's New, shown only while the flag is on. It quietly counts the sessions that need a person (failed, lost, waiting on permission); a click opens the page.
  • Data path: the existing _acpmux/watch feed (AgentTurnStateFeed) also decodes each summary's lane into AgentLaneStore. No new connection and no polling.
  • New target CmuxNextAgentLanes (for the CmuxNextApp size cap). It now holds AgentTurnStateFeed, moved unchanged except for public entry points and a drain-timing hook for debug.timings, plus the sidebar's Lanes item. The lanes observation is AgentActivityModel.follow. CmuxNextApp is 164 lines under its cap.
  • Strings: 13 new, in 21 locales (non-English marked needs_review). The sidebar item reuses the page's "Lanes".
  • Gallery: a new lanes variant on pages.agent-activity.

Not in this PR:

  • Sessions on remote cmux machines (Cloud, SSH, servers). Their chats are reachable only one tab at a time through agent-session-attach-v1, so listing them needs a new read-only daemon verb.
  • Verifying that opening a peer's session works end to end.

Verification

  • Web, red then green. test/agent-activity-lanes.test.tsx renders the page with one fixture per lane state across this Mac and a peer.
    • Red at 514c0af (test only): 6 fail, 1 pass. The one pass is the flag-off case, already true without the view.
    • Green at 7f8309f: 7 pass.
    • Covered: order, grouping, state words and durations, the error text, the attention count, click → jump, filter by error text, the view switch, and flag off.
  • Swift, AgentLanesTests. The real watch feed runs against a stand-in acpmux on a socket.
    • It checks: lanes decoded, the badge at 3 (failed, waiting, lost), live pushes moving the badge, a closed session leaving, and the Lanes item shown only while labs.previewFeatures is on.
    • On the fleet at 7f8309f: PASS ^CmuxNextAppTests\.AgentLanesTests/.
    • It uses new API, so it can't compile on base; there is no separate red run.
  • Release compile on the fleet at 7e6d0a5 (the merged head, with fix(cmux-next): Release compile crash on main-actor generic class deinits (macOS 14 target) #20408): passed (aws-m4pro-6). Earlier at 7f8309f and 0869fbe: passed.
  • Full Swift suites on the fleet at 7e6d0a5: 286 passed, 0 failed.
    • Passes include AgentLanesTests and the moved feed's suites: AgentChatDoneDotTests, AgentChatMuteTests, AgentChatTabTitleTests.
    • The step exits 1 only because AcpmuxBundleReplacedTests (daemon) skipped for want of the same-tree cmux-tui. This PR doesn't touch it.
  • Release compile on the fleet at 7ef7eca (base with cx-v9k2f: acpmux decides each session's lane (working, input, idle since, failed with why, lost) #20362 and agent pane: a chat's attach and older pages carry maxBytes again (cx-b08ei) #20659): passed (xcodebuild exit status: 0). The final head ce89f66 differs only by webviews: base red: clear the four home-channels lint warnings #20641's home-channels web files.
  • Before/after, watched (--builder mac DEV builds on capture slots). Base is 3f4c100, which has cx-v9k2f: acpmux decides each session's lane (working, input, idle since, failed with why, lost) #20362's lane field but not the view. Seven acpmux sessions were seeded through a fake agent (chief working, op-docs idle, op-billing failed, op-deploy asking, op-search working, op-flaky's process died, scratch with no parent). Labs previewFeatures was set by a per-run config file, never the shared one.
    • Before: no Lanes item, and Agent Activity shows only Computer use.
    • After: the sidebar Lanes item shows a badge of 3. A real click opens Agent Activity on Lanes | Computer use. The page reads "Needs you: 3", then This Mac with the chief group and "On their own". Each row shows Working (green), Failed with its reason (red), Waiting on you (red) or Idle (grey), with its duration.
    • Labs off: the head build matches base pixel for pixel.
    • Design call: red marks everything that needs the person, failed or waiting, and the words tell them apart.
    • Not shown: the Lost state. The fake's process died between turns, which acpmux reports as failed with its reason; lost needs a death mid-turn (views.rs). Durations read "1m" after about 30 s.

plan image 20363/before-agent-activity.png
plan image 20363/after-lanes-page.png
plan image 20363/side-by-side-sidebar.png
plan image 20363/labs-off-head-sidebar.png
plan gif 20363/before-recording.gif (from before-recording.mp4)
plan video 20363/before-recording.mp4
plan gif 20363/after-recording.gif (from after-recording.mp4)
plan video 20363/after-recording.mp4
uploaded 20363/before-agent-activity.png
uploaded 20363/after-lanes-page.png
uploaded 20363/side-by-side-sidebar.png
uploaded 20363/labs-off-head-sidebar.png
uploaded 20363/before-recording.gif
uploaded 20363/before-recording.mp4
uploaded 20363/after-recording.gif
uploaded 20363/after-recording.mp4

before agent activity

after lanes page

side by side sidebar

labs off head sidebar

before recording

Full quality: before-recording.mp4

after recording

Full quality: after-recording.mp4

  • Swift suites on the fleet at ce89f66 (exact head): 310 passed, 0 failed; PASS ^CmuxNextAppTests\.AgentLanesTests/.
  • Local web checks: bun run check, tsc, ui-rules and gallery-coverage pass.
  • Repo checks: check-concurrency, crash_ratchet, check-system-blue and check-no-godfiles are ok.

Open question

Should the badge also count idle child lanes (under a coordinator)? It counts only failed, lost and waiting sessions, so a normal set of idle chats doesn't keep a number up. On the page, idle shows as "Idle · 5h", longest first.

Changelog

none (behind Labs preview features)

🤖 Generated with Claude Code

teamleaderleo and others added 2 commits October 13, 2026 18:01
…cx-v9k2f)

One fixture per lane state across this Mac and an acpmux peer: failed with
its error text, lost, waiting on a permission, idle for how long, working;
grouped by coordinator; a click opens the chat; off without lanes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every acpmux session on this Mac and its acpmux peers, by machine and
coordinator (mux.parent), with the lane acpmux decides: working, waiting on
permission, idle since, failed with the error text, lost. What needs a person
comes first; a click opens the chat (the cmux://session path). The sidebar's
Lanes item counts the sessions that need a person. Off by default until it is
styled: only with labs.previewFeatures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 482fc6a2-4675-47c9-a1ce-45040b055449

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

all web/size checks green

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Gallery

Review in feed

8 states changed: pages.agent-activity/timeline · 8 new states

Diff page and renders (the run's gallery-pr artifact)

State Before · after
pages.agent-activity/timeline (Apple System Colors Light, chromium)
pages.agent-activity/timeline (Apple System Colors, chromium)
pages.agent-activity/timeline (Apple System Colors Light, webkit)
pages.agent-activity/timeline (Apple System Colors, webkit)
pages.agent-activity/timeline (Apple System Colors Light, chromium)
pages.agent-activity/timeline (Apple System Colors, chromium)

2 more on the diff page.

Live preview (follows this branch; start it with scripts/gallery-live.sh up <branch> from an hq checkout):

  • pages.agent-activity/timeline: /wt/op-next-cursors-lanes-view/?entry=pages.agent-activity#/pages.agent-activity/timeline
  • pages.agent-activity/lanes: /wt/op-next-cursors-lanes-view/?entry=pages.agent-activity#/pages.agent-activity/lanes

24 unchanged · base 8996714 · head ce89f66

AgentLaneStore moves to CmuxNextAgentActivity (CmuxNextApp was over its
size cap). A session_changed lane keeps its id when the summary omits it.
Durations redraw each minute; the attention count covers every lane, not
just the filtered ones; a filter that hides all says so. "Waiting on you"
(a question waits too), and the state and duration join through a
localized format.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@blacksmith-sh

This comment has been minimized.

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Not verified: macOS jobs did not run: compile and app tests were skipped on ce89f66699; ci-status is green without them.

CI passes on ce89f66699 (run 38592270375 attempt 1).
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

CI fast guards passes on ce89f66699 (https://github.com/manaflow-ai/cmux/actions/runs/38592270375). This covers only the fast guards, not CI: CI's result is the ci-status check, and the CI failure attribution comment names any failing test.

teamleaderleo and others added 3 commits October 13, 2026 19:57
…-v9k2f)

The lanes view put CmuxNextApp 64 lines over its size cap once base grew.
AgentTurnStateFeed (the one `_acpmux/watch` connection for turn states and
lanes) and LanesSidebarItem move to a new CmuxNextAgentLanes target; the
lanes observation becomes AgentActivityModel.follow, and the sidebar title
reuses the Agent Activity catalog's "Lanes". The feed's drain timing reaches
debug.timings through a hook. CmuxNextApp is now 157 lines under the cap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@blacksmith-sh

This comment has been minimized.

teamleaderleo added a commit that referenced this pull request Oct 14, 2026
…rmat, tall-approval wait (no bead) (#20387)

* style(webviews): format HistoryPage.tsx, a react-apps-check base red (no bead)

64747bb reached feat-cmux-next with a button vp fmt keeps on one line, so `bun run check`
fails on the tip (5bd53b9): "Found formatting issues in 1 file". vp fmt, no other change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(webviews): the tall-approval test waits for the diff to outgrow the panel (no bead)

permission-panel-buttons read "tall" as false after a fixed 300 ms on #20363 and #20379
(react-apps-check), and passed on 8 of 9 other heads with the same permission code: the diff
draws its rows after .cv-edit-diff appears, later on a loaded runner with a cold dev server.
Wait (up to 10 s) for the request to outgrow the panel, then check the answers are in view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo and others added 3 commits October 13, 2026 21:28
… (cx-v9k2f)

The package conventions lint refuses an all-static public enum; the item
becomes SidebarTransientItem.lanes(_:) and .lanesID.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cursors/lanes-view

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentLanes/AgentTurnStateFeed.swift
Keeps base's now-playing follower beside the lanes What's New settings in
SidebarBridge+Cards. The lanes item's click moves to
WhatsNewPage.activateClientItem (the client-only item hub), so SidebarBridge
stays within its 1000-line type limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 14, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@cursor

cursor Bot commented Oct 14, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@teamleaderleo
teamleaderleo merged commit 4a6d57c into feat-cmux-next Oct 14, 2026
138 of 150 checks passed
@teamleaderleo
teamleaderleo deleted the op-next-cursors/lanes-view branch October 14, 2026 16:52
lawrencecchen added a commit that referenced this pull request Oct 21, 2026
… view

Lawrence 2026-10-20: "get rid of lanes thing". Removes what #20363,
#20934, #21422 and #22662 added for Lanes:

- the sidebar's Lanes item (SidebarTransientItem.lanes, its click route
  to Agent Activity) and its attention badge
- the Agent Activity page's Lanes tab and lanes list (lanes.ts, the Lanes
  view, its styles and gallery variant), the page's "jump" request, and
  the web priority reducer that only fed that list (priority.ts, the
  unused onEvent bridge)
- the Debug toggle agentActivity.lanesShowFleet, AgentLaneStore.shown,
  attentionCount and follow(_:), AgentActivityModel.lanes/onJump and the
  13 lanes.* strings in every locale

Kept: AgentLaneStore, AgentActivityLane and the _acpmux/watch feed; the
sidebar Priority view, the Chief item and the session tree read them.
AgentActivityPageService.jump(to:) stays for the Priority view. The
computer-use timeline layout's Debug label says Timeline, not Lanes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 21, 2026
… view

Lawrence 2026-10-20: "get rid of lanes thing". Removes what #20363,
#20934, #21422 and #22662 added for Lanes:

- the sidebar's Lanes item (SidebarTransientItem.lanes, its click route
  to Agent Activity) and its attention badge
- the Agent Activity page's Lanes tab and lanes list (lanes.ts, the Lanes
  view, its styles and gallery variant), the page's "jump" request, and
  the web priority reducer that only fed that list (priority.ts, the
  unused onEvent bridge)
- the Debug toggle agentActivity.lanesShowFleet, AgentLaneStore.shown,
  attentionCount and follow(_:), AgentActivityModel.lanes/onJump and the
  13 lanes.* strings in every locale

Kept: AgentLaneStore, AgentActivityLane and the _acpmux/watch feed; the
sidebar Priority view, the Chief item and the session tree read them.
AgentActivityPageService.jump(to:) stays for the Priority view. The
computer-use timeline layout's Debug label says Timeline, not Lanes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…ef (#22683)

* cmux-next: Chief view gallery, five experimental views beside the Chief

webviews/src/pages/chief-views (cmux-page://cmux.chief-views/): a page tab
in Home's right column with a dots switcher and a gallery of views, each
named by intent with a one-line description, a switch and "Open as" Pane,
Split or Sidebar. Only the first view is on by default. Views register
through one registry (registry.ts: id, title, description, component,
default placement, what data it needs), shaped like the AppPlatform
manifest.

- Where is everybody: every agent by machine (name, folder, state, task,
  time since last output, PR), what needs you first.
- Agent board: Working, Needs you, Ready to land, Landed today.
- Fleet: the CI dashboard's data.json (machines, load per core, runners,
  queue); says when it is unset or unreachable and takes an address.
- Landing: open, ready to land, CI red and merged-today PRs with owner
  chips.
- Timeline: today's events across agents and PRs.

Revives the lanes view of #20363 (lanes.ts order and durations, the
AgentLaneStore feed). AgentActivityLane also keeps the summary's cwd,
updatedAt and createdAt.

The app answers cmux.chief_views.* (ChiefViewsPageProvider): agents from
AgentLaneStore and terminal hook agents on every machine, with an
Observation stream; fleet from the address the person sets
(CMUX_CHIEF_VIEWS_FLEET_URL or the view's field); landing from GitHub
search, kept 90 s; open, open_url and set_fleet_url need a click.
Action chief.openViews (palette). Debug Settings > Home > "Chief view
gallery", on by default; DEV and NIGHTLY only.

Tests: webviews/test/chief-views-page.test.tsx,
CmuxNextAppTests/ChiefViewsPageTests.swift.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray

* Chief view gallery: own target, review fixes

Move the gallery's Swift (page, provider, feeds, agent rows, strings) out of
CmuxNextApp into a new CmuxNextChiefViews target so the app does not grow.
The app keeps a 20-line tab glue; a generic WebPageTab replaces the
one-off page-tab classes for Stats, Chief Usage, channels and CodeRouter,
which offsets it.

Review fixes:
- AgentActivityLane equality ignores updatedAt, so output alone does not
  re-rank and animate the lanes view.
- The dashboard address must be https; http only for localhost and tailnet
  names. Pull request links reject dot segments.
- Remote terminals group under the machine's name, so they sit with the
  same machine's acpmux chats.
- Fleet's address form says when an address is refused.
- An unavailable read keeps its last reply.
- Tests record through a main-actor class instead of captured vars.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray

* Chief view gallery: leave ci-target-graph.json to the base autofix

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray

* Tier routing test: a new target named in Package.swift passes before the bot regenerates the graph

The CI target graph is bot-only, so a pull request that adds a SwiftPM target cannot carry it and the coverage test failed on every such PR. A directory the graph lacks now passes when Package.swift declares that target; a stray source directory still fails.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray

* Chief view gallery: re-review fixes

- Lanes keep their synthesized equality, so the store still records each new updatedAt; the lanes view compares lanes without it (AgentActivityLane.ranked) before it re-ranks.
- ChiefViewsPage imports Foundation publicly (URL in its public API).
- The tunables list is nonisolated, like the others; the refused-address message says https.

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray

* Lanes: the changed-row id ignores output time too; ranked copies the lane

Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray

* cmux NEXT Chief views: own the lane order and duration stamp

Base removed webviews/src/agent-activity/lanes.ts with the Agent Activity
lanes view (859e5cb), so the gallery's bundle failed to resolve it.
The page now keeps the two pieces it used, in model.ts: the same order
(failed, waiting, idle longest first, working newest first) over its own
AgentState, and shortDuration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray

* cmux NEXT Chief views: the dot and switch knob shadows use the elevation scale

subtle-elevation.test.ts allows a blurred drop shadow only through
--elevation-1/2; the current-view dot and the switch knob had their own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray

* cmux NEXT Chief views: format WhereIsEverybody.tsx (vp fmt)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant