Repository navigation
Debug: chat header tools in the pane's tab row (no top bar prototype, hq-1d) - #20933
Conversation
….rowTools
With the row offered (tabRow {height, trailingInset}), the chat header is the
row's height, ends its tools at the inset and reports their width with
pane.tabRowTools; without an offer the header is its own row and reports
nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Leo 2026-10-14, "why is there even a top bar". With the Debug setting
chrome.tabs.rowTools on (off by default), a chat pane's tab strip gives up
the width of the chat header's tools at its trailing end, left of the
pane's "...", and the chat page covers the strip's row: the strip and "..."
stay above it, and the page draws only its tools there, at the row's
height, with a short fade under the row. Off, nothing changes.
- CmuxNextDesign: PaneTabRowSharing, ChromeTunables.tabRowTools.
- PaneContentView+TabRow: the narrower strip frame, the row offered to
the content, the agent name tag kept below the row.
- Agent pane: pane.tabRowTools {width} (decoded 0...2000, in
AgentPageOps), the tabRow event (replayed on the page host, offered
again after a page load), AgentPaneTabRow on the model. The side chat
helper moves to AgentPaneSideChat to keep AgentPaneModel under 1000
lines.
- Page: header/tabRow.ts; the header's data-tab-row mode; the summary card
under the row.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…toolbar/no-top-bar # Conflicts: # webviews/src/agent-session/acpmux/App.tsx
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. |
|
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 |
|
all web/size checks green |
|
Bead |
…mance Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Found 1 test failure on Blacksmith runners: Failure
|
- regenerated schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38698999038
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. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… op-next-toolbar/no-top-bar
|
Fleet Release compile passes at fad20e4 ( |
|
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by |
|
|
…s its draft useTabRowTools kept the tools element in state; setting it on mount re-rendered the pane while its first snapshot loaded, and a relaunched new chat lost its kept draft (agent-pane-unsent-draft, red on fad20e4, green here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…toolbar/no-top-bar # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Tunables/ChromeTunables.swift
The zoom and setting checks move to AgentPaneTabRow; AgentPaneView's conformance only forwards to it. The pane sets the content's tools callback with each offer instead of following and unfollowing views, and the agent tag's offset is inline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Re-tested in the app at c938fd2 (cosmic-gray DEV, after the size-cap refactor and the draft fix): toggle off/on, few and many tabs, light and dark. Same layout as the body's stills; with it on, the strip narrows 980 → 834pt for the tools. Release compile passes on this head (step 0eb1b58f). |
…toolbar/no-top-bar
…toolbar/no-top-bar
Base grew to 3 lines under the CmuxNextApp cap. The strip's share of the row and the offer move to a PaneTabRowSharing extension, AgentPaneView's witnesses to a constrained extension in CmuxNextAgentPane, and the App keeps three layout lines and the conformance on its existing Parking line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A page that said ready again without reloading lost its width in the App, and the re-offered identical row was deduped, so the tabs ran under the tools. Also keep the agent tag's offset unchanged with the setting off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…toolbar/no-top-bar
|
react-apps-check on 52b49dc is red from base: |
Base reds: exact base 062b82b (landing 6 head, cmux-tui full run 38530387510). The gate excludes a red job only when that run has the same job red with the same error lines; expected: "valgrind-leak-check (startup)" and "valgrind-leak-check" (red on feat-cmux-next 12b1e29, run 38357900702; valgrind 0 errors). This landing changes only cmux-tui/crates/acpmux and cmux-tui/crates/cmux-coderouter. Windows VM proof (gpuitest, router e5cc1d8, same acpmux and cmux-coderouter code apart from tip changes in hub/ and tests): windows_daemon 11 passed, 0 failed, incl. a_killed_daemon_takes_its_router_with_it.
…cx-ncc.54) wait_for_winner (daemon/windows.rs) waits while another start's daemon holds daemon.lock and has not bound its socket yet. It tested the lock with File::try_lock, which took the lock for an instant when it was free: a third start's daemon that tried the lock in that instant exited too. Now a 1-byte read at offset 0 on a read-only handle tests the lock and never takes it. ERROR_LOCK_VIOLATION (33) means another handle holds the lock (LockFileEx over the whole range, as File::try_lock takes it); a read or ERROR_HANDLE_EOF (38, std returns it as Ok(0)) means the lock is free. Proven on the Windows VM (Windows Server 2022, NTFS, as gpuitest, folder C:\build-wb\acpwin-probe, /tmp/acpwin/l4/probe/lock-probe.ps1): with a holder in another process, an empty and a 1-byte daemon.lock both gave 33; free, both gave 38. The outdated RISK comment is replaced.
hq-84 approved the per-connection peer decision (c12e44a) with two P3 follow-ups, both done here: - free_tier::ProviderPeer is neither Clone nor Copy: a peer read for one connection cannot be handed to another (serve_with_admin is public). - The Windows router admin bind retry (server/windows_socket.rs) removes the old socket file only after the same check bind_unix makes: another user's socket is refused and never removed, a socket that still answers (a stopping router) is left until it goes, a stale file of our user is removed. Also admin_connection takes the AdminConnection as one value, so the clippy::too_many_arguments allow is gone.
…toolbar/no-top-bar
…toolbar/no-top-bar
…reruns once alone and passes as FLAKY (named), or stays red cargo test ran the 361 test binaries one after another: 765 s of tests on rbx, 998 s on cmux9. nextest runs them at once: 55-60 s on rbx at 32 threads. The full run's reds were load reds (a different set every run, each green alone; cx-mqvyw, cx-t9m9q). A lower thread cap did not remove them (16 threads: 1 flaky in 2 runs, 99-109 s; 8 threads: 190 s). So a failed test runs once more alone after the full run (2 s on rbx): a test that fails alone stays red; one that passes alone is printed as gate-notice: FLAKY with its name. Doc tests are their own step. The 4 Linux load-red skips go away (the rerun covers them); protocol_ir_is_current is a base red (cx-ngrbq).
…mux-windows-router-owner
…ith the step; nextest extracts beside its final path; rerun_notes
…toolbar/no-top-bar
* test: stopping a vp dev server stops the Vite it started Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: browser tests stop the Vite their vp dev server started SIGTERM to vp left its Vite child running; every dev-server test leaked about 1.1 GiB per run, and on react-apps-check the leaks starved the dev server files after a failing menu-focus into timeouts. stopDevServer stops vp's children by parent pid, then vp, and keeps the server in the test's process group so the runner's timeout still reaches it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: the dev server warm check covers tests that load pages dev-server-stop starts and stops vp dev without a browser, so it has nothing to warm. Also read pgrep's output safely when it is missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
….2) (#20972) * test(cx-kz6m0.2): agent chat approval banners offer Allow once and Deny Red: the banner posts without the approval category and its buttons answer nothing yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(cx-kz6m0.2): import NotificationSource's module in the approval banner test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(cx-kz6m0.2): Allow once and Deny on agent chat approval banners An agent chat on this Mac that waits on one tool permission now gets a banner that says what it asks to do (tool title and command, scrubbed), with Allow once and Deny (destructive). Each button re-reads the prompt over a person-proven acpmux connection and answers it with _acpmux/permission_respond only while the same request is pending; the decision-to-option mapping is shared with the feed bridge. A prompt that ended or changed opens the tab instead. debug.notifications gains allow/deny actions and an approval field. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(cx-kz6m0.2): approval banners skip a read or superseded ask Red: a banner whose prompt read outlived an acknowledge or a newer ask still posts, and an older approval banner still answers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cx-kz6m0.2): approval banners skip stale reads and retire older buttons A banner whose prompt read outlived an acknowledge or a newer notification of its tab no longer posts; a newer banner on a tab retires the older approval banner's buttons, so the map holds one entry per tab. The approval category hides the command where macOS hides previews. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(cx-kz6m0.2): approval banners live in CmuxNextAgentPane CmuxNextApp is size-capped (SW14). The answerer, the person-proven acpmux line, the banner bookkeeping and category, the prompt helpers the feed bridge shares (digest, frame, shown command, option mapping), and FeedSecretScrubber move to CmuxNextAgentPane, which already holds the acpmux connection types. CmuxNextApp keeps only the wiring and ends 57 lines smaller than its base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(cx-kz6m0.2): prompt and scrubber helpers as extensions, not public namespaces package-conventions-lint refuses all-static public enums. The prompt helpers and FeedSecretScrubber stay internal to CmuxNextAgentPane; the app reaches them through extensions on the request dictionary, offered options, String and Data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* test: reasoning menu rows share one check gutter and Ultracode's note is one short line The reasoning-claude gallery variant now offers Extra High on Opus, so its menu shows Ultracode as its note promises. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * CmuxNext: reasoning menu drawn as a native menu Ultracode's two-line grey description becomes a short note beside its name (Extra High + multi-agent, every locale), with the text as its tooltip. The check moves into a fixed leading gutter shared by every row, so labels align whether or not a row is checked, as in the access menu. Rows are one height; section headers sit on the label column in the system's caption style; the separator is inset to the rows with even spacing. The access menu's 1-4 numbers become secondary key-equivalent text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * CmuxNext: reasoning menu rows and headers use logical padding for RTL The asymmetric row padding and the header's gutter indent were physical (left/right), so in Arabic the check gutter sat on the right while the extra inset stayed on the left. Use padding-inline so both mirror. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: reasoning menu rows with Ultracode as its own On/Off section The base now draws Ultracode as a switch section after the levels; the one-line note sits on its On row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 8902b9d - regenerated schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38699733289 * CmuxNext: mark Ultracode's note tooltip as allowed (the menu may cut the note) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
… _acpmux/btw (#20826) * test: side sessions share one right pane and the palette asks a side question Behavior tests for /btw side sessions: _acpmux/btw goes out through the pane relay like a prompt and its side session opens beside the chat; later side sessions of a chat open as tabs in its one right pane; Ask a Side Question… is a palette action that sends the page sideQuestion. The tracker and view command are stubs here (old behavior), so these fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(cmux-next): /btw side sessions share one right pane; Ask a Side Question… chat.sideChat (New side chat and /btw side sessions) opens a chat's later side sessions as focused tabs in the pane its first one split off to the right, instead of a new split each time (AgentSidePanes, one tracker per chat session, opens one at a time like AgentSubagentPanes). The pane relay allows _acpmux/btw (sessionId, question, model): session scoped, gesture required like a prompt, and its reply's sessionId joins the pane's scope so chat.sideChat may open it. Ask a Side Question… (agentPane.sideQuestion) is a palette action for a focused agent chat, with no default key; it sends the page sideQuestion, which the page ignores while its side sessions gate is off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(cmux-next): regenerate action exports for Ask a Side Question… From scripts/measure/export-action-surfaces.sh (fleet light step) on 004a08b. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: the pane relay refuses the inline side question _acpmux/ask /btw now starts a side session (_acpmux/btw); the page no longer sends _acpmux/ask and the Rust policy drops it (web PR). The relay still passes it here, so this fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-next): the pane relay no longer allows _acpmux/ask The page sends _acpmux/btw for /btw now and the Rust pane policy drops _acpmux/ask (web PR), so the Swift allowlist, its session scope, gesture rule and params entry drop it too and the two lists stay mirrored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * revert(cmux-next): drop the Ask a Side Question… palette action for now Review: it shows for every NEXT user and does nothing while the page's side sessions gate is off, the default. It returns with the Labs flag follow-up, gated by requires on labs.sideSessions. Removes its catalog group, handler, strings, AgentPaneView.askSideQuestion (no other caller), its test, and its action exports (back to the base copies; regenerated on the fleet to confirm). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: a chat whose side tabs all closed keeps no side-pane tracker AgentSidePanes keeps one tracker per chat session for good today, so this fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-next): drop side-pane trackers whose side tabs all closed AgentSidePanes.chat drops idle trackers of other chats with no side tab still open (read through the latest open's pane lookup), so the registry does not keep one per chat that ever had a side session. The test layout's pane lookup holds it weakly, as the app's does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(cmux-next): side-pane placement lives in CmuxNextAgentPane, not the App The App size cap fails when a change adds lines to CmuxNextApp. The side pane's single placement closure (AgentSidePanes.open(_:chat:pane:place:)) moves into CmuxNextAgentPane, and the App reuses openBeside, which now focuses a side session it adds as a tab, so CmuxNextApp does not grow. AcpmuxPaneMethods.swift stays at its 400-line budget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(cmux-next): /btw and Ask a Side Question… follow Debug Settings' Side sessions Red first: with agent.sideSessions off (the default) the palette has no Ask a Side Question… and the page's header state says side sessions are off; with it on the action shows in a focused agent chat, the page is told, turning it off hides the action again without reopening, and running the action sends the page the sideQuestion command (prefill). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(cmux-next): Side sessions (/btw) Debug Settings toggle gates /btw and Ask a Side Question… agent.sideSessions (Debug Settings > Pages, "Side sessions (/btw)", off by default, DEV and NIGHTLY) replaces the page's side-question experiment. The page reads it as sideSessions in the chat header state (pane.tabState and the headerState push); the header watch observes the toggle, so a change reaches open chats without reopening them. Ask a Side Question… returns (from 161e75f) in the palette only, no key, requiring the new sideSessions context fact, which ActionRegistry.publishSideSessions() keeps in step with the toggle, so it is hidden while the toggle is off. Its handler shares one loop with Switch Model… and Search Files…, so CmuxNextApp does not grow; the AgentPaneView and AgentPaneModel god types do not grow either. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(cmux-next): regenerate action exports for Ask a Side Question… From export-action-surfaces.sh on fleet step 82e608fc0e5b3b3b3c3708a7 (light, aws-m4pro-9) at c8dbb22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(cmux-next): regenerate action exports on the merged head The textual merge of action-surfaces.json went stale; regenerated by export-action-surfaces.sh on fleet step 3384e925ec431e91b8a90d09 at 986fed6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-next): name the sideSessions context fact for the control bridge RegistryReachabilityTests runs every action with every named context fact; the bridge's own name table lacked sideSessions, so Ask a Side Question… stayed unavailable there (fleet suites at 47266ba). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(cmux-next): ActionCatalog.xcstrings is base's plus Ask a Side Question… The textual merge rewrote 27 of base's lines; this is base's catalog with only action.agentPane.sideQuestion added (no key or value lost). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(cmux-next): regenerate action exports on the merged head export-action-surfaces.sh on fleet step 715bded4f5ecea4562b53200 at 000d2fd; the textual merge of the exports went stale again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at c6ec002 - regenerated plans/cmux-next/action-surfaces.json - regenerated plans/cmux-next/actions.md Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38724924351 * next: move Ask a Side Question… to a follow-up; keep the Side sessions toggle The palette action, its context bit, catalog strings and action exports leave this PR (plans/cmux-next exports are frozen). The Debug Settings toggle and the header-state plumbing that gates /btw stay, with a header test for the off and on states. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
…toolbar/no-top-bar # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AgentPaneModel+Header.swift
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. |
|
Landed as edc99a4. Gate on 23695c6: fleet Release compile passed (step 6a36e90f), react-apps-check, the CmuxNextApp size cap and the crash ratchet green, freeze-check clean. In-app check on cosmic-gray on 52b49dc (stills above); every commit since is a base merge, and the one conflict (AgentPaneModel+Header.swift, with #20826) keeps the AgentPaneSideChat enum with base's new body. Review subagent: no blocking findings; the setting-on follow-ups are listed in the description. cmux-next checks shows only base reds (BuiltInAdBlockerSetting, BrowserFitFrameView type scale). The chrome.tabs.rowTools Debug toggle stays off by default. |
…32687) * test(agent-pane): header icons have nothing behind them at rest, in the tab row too Fails on base: the shell paints --agent-page-bg behind the tab-row tools, and hover / toggled-on draw no pill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a2f53c60d9511e7ec747 * fix(agent-pane): no background behind the header's top-right icons at rest The chat shell painted the page color across the pane's tab row, so the header tools sat on a band of it while the tabs beside them sat on the row (since #20933; #25638 cleared html but not the shell). The shell now paints the page color only below the row. The icon under the pointer gets the hover pill, and a toggle whose panel is open (or a button whose menu is open) gets the filled rounded square, as in Leo's reference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a2f53c60d9511e7ec747 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Prototype for Leo's "why is there even a top bar" (hq-1d context): with the Debug toggle
chrome.tabs.rowToolson, a chat pane has one row on top. Its header tools (summary, chat menu, …) move into the right end of the pane's tab row, and the separate chat header bar goes away. Off by default; nothing changes until it's turned on.tabRow {height, trailingInset}event; page → native:pane.tabRowTools {width}(allowlisted inAgentPageOps.methods). Both convert through the page zoom.PaneTabRowSharing(CmuxNextDesign);PaneContentViewlays the content host under the row and keeps the strip and "…" above it.header/tabRow.ts(useTabRow,useTabRowTools), CSS vars--acpmux-tab-row-height/--acpmux-tab-row-inset; a slight fade where the tools meet the tabs.Known rough edges (prototype): the page's rounded corners sit at the row's top; the warning status slot is hidden in this mode; the tools can flash once in the row before their width arrives; the lone-chat compact header is unchanged.
Stills below; the default stays off until Leo OKs it.
Showcase
DEV build on cosmic-gray at this head (fad20e4), a mock chat, with
chrome.tabs.rowToolsoff (today) and on. Same window, 1200x760.With it on, the chat gets one row back (~32pt); with many tabs, they shrink a bit more to leave room for the five tools (Chrome-style shrinking unchanged).
Testing
webviews/test/agent-pane-tab-row.test.ts"the same row offered again" (a page that says ready again without reloading): red on 07b3822 (waitForFunctiontimeout, no report), green on 4369f14.Red then green:
bun test test/agent-pane-tab-row.test.ts(327c783 red; 2/2 with the feature).vp checkclean; crash ratchet, concurrency, god-file and system-blue checks OK.Fleet Release compile passes on the head (step 6a36e90f, 23695c6).
Tested in the app (cosmic-gray DEV on 52b49dc): the toggle switches live; tabs, tools and chat lay out as shown.
Follow-ups (setting on only)
.acpmux-artifact) isn't offset for the row.pane.tabRowToolsgets through the agent page host.Changelog
none
🤖 Generated with Claude Code