Repository navigation
Agent chat: a lone Chromium chat's toolbar hole paints the chat's surface (#33261) - #33407
Conversation
…face, so the row is one surface Alone in its pane a chat paints its own surface (appearance.surfaces.agentPane) across the whole tab row (header.css [data-solo-tab], #33142). In Chromium the chat is a window above the pane that leaves the pane's toolbar a hole (AgentPaneTabRow.nativeHoles), where the pane's own shade showed: a block of another colour beside the tools. The chat now hands the pane the colour its page paints there (PaneTabRowSharing.tabRowHoleFill, AgentPaneTabRow.holeFill), and the toolbar fills its frame with it. With tabs shown the page leaves the row clear and on WebKit the page is under the toolbar: no fill. Fixes #33261. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 2ebf589 BLOCK at 2ebf589
Swift/AppKit checks could not run here because the box has no Swift toolchain. Follow-ups:
|
…e shared host; tests fixed Review of #33407: the shared page host also runs WebKit, where the page already paints under the toolbar, so the fill now keys on chromiumPage. The AgentPane tests read the model's fill (the conformance is the App's), a WebKit host test covers no fill, and the App test installs a toolbar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
Review (codex gpt-6-astra high, router-review): BLOCK at cb22a60 BLOCK at cb22a60
|
|
Review (codex, router-review): SHIP at 8a2f84f Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 8a2f84f No correctness regressions found in the layout, theme, or fill-clearing paths. AppKit tests could not run in this Linux box.
Follow-ups:
|
…ll (#33346) #33346 leaves the row's top point uncovered across the chat's tools so the window's lit rim runs unbroken. The toolbar's fill is now a plate below that rim (PaneTabRowRim.height, shared with AgentPaneTabRow.rimHeight) instead of the view's background, and the App test checks it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
|
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)
red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: Shipped in:
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/41619934635 at 092736d failed: cmux-next fleet Release compile. |
|
Found 9 test failures on Blacksmith runners: Failures
|
|
Review (codex, router-review): SHIP at 4b243b6 Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 4b243b6 No correctness regression found in the code review. AppKit tests could not run in this Linux box.
Follow-ups:
|
…wner-s1-strip-tick Conflicts, both kept: - PaneContentView.layout: feat's offerTabRow(..., toolbar:) and the tab-row hole paint (#33407), with S1's onResize at the hold's end. - MotionClock: S2 (#33725) steps the springs by FrameTick.motionElapsed; S1 keeps that step and sets frameTimestamp from the new FrameTick.motionTimestamp (next to motionElapsed): the frame's show time (targetTimestamp) with motion.frameOwner.timing on, else the link time, so a strip move that starts inside a frame begins on the time base its springs step on. With the S2 switch off (its default) it is the link time, as before this merge.
* cmux NEXT: remove the dead lone-tab solo row code #34327 made a pane's tab strip show at every tab count, so the pane always offers the row with its tabs shown. The code that followed a hidden lone tab (#33132, #33142, #33261/#33407) no longer runs: - PaneTabRowSharing.setTabRowTabs(shown:), offerTabRow(tabs:toolbar:), tabRowHoleFill and NSView.paintTabRowHole (the hole fill was nil whenever tabs show); AgentPaneTabRow.tabsShown, holeFill, soloTab in the tabRow event, nativeHoles(tabs:) (the rim hole stays) - TabStripModel.holdsOneTab, TabStripView.laidOutOneTab and layOutPaneIfOneTabChanged - the page's soloTab: header/tabRow.ts, [data-solo-tab] CSS, VirtualTranscript and ThreadMinimap topInset, header/underHeader.ts and its gating record, the solo gallery variants - AgentPaneTabRowSoloTests, TabStripHoldsOneTabTests, the tabsShown parts of AgentPaneTabRowHolesTests, chat-header-solo-tab.test.ts, under-header-lines.test.ts, theToolbarPaintsTheChatsHoleFill theStripShowsAtOneHeightWhateverItsTabCount now asserts what is on screen: the strip and + in the pane at 0, 1 and 2 tabs, a tab cell per tab, each tab's and +'s centre resolve to .strip, and the space past + to .empty. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 * webviews: drop the double blank line the solo gallery removal left Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 * webviews: one-line the rail-foot variant list the formatter wants Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6 --------- 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)
Leo (2026-11-03, on the nightly): "latest nightly still not fixed yet?", then "i mean the rectangle near the buttons".
Fixes #33261.
What changes
A chat alone in its pane paints its own surface (
appearance.surfaces.agentPane) across the whole tab row (header.css,.acpmux-shell[data-tab-row][data-solo-tab], from #33142). In Chromium the chat is a window above the pane that cuts a hole for the pane's toolbar (AgentPaneTabRow.nativeHoles). That hole showed the pane's own shade, so a block of another colour sat beside the chat's tools.The chat now gives the pane the colour its page paints there:
PaneTabRowSharing.tabRowHoleFillreturns it, worked out byAgentPaneTabRow.holeFill.offerTabRowfills the toolbar with it after each offer.The fill is a plate that starts below the window's lit top rim (
PaneTabRowRim.height, 1 pt). #33346 leaves that rim uncovered across the chat's tools, and the plate keeps it unbroken over the toolbar too.There is no fill with tabs shown, because the page leaves the row clear then. There is none on WebKit either, because the page sits under the toolbar and already paints there. A clear page colour (glass) gives no fill, and leaving the row or switching to non-chat content clears it. A theme change lays the pane out again, which offers the row again and reads the colour anew. Nothing changes behind the tools themselves, and the toggled Session Info plate is untouched.
Scope
This covers the one-tab Chromium case that #33261 describes. In a pane with two or more tabs the page is clear across the whole row (#32944), so nothing paints behind the tools that differs from the strip, and this PR leaves that path alone.
Relation to the nightly report
Leo's capture shows the window's top rim breaking into a flat line where the header tools begin. #33346, which landed while this was in flight, fixes that: the page now leaves the rim uncovered over the tools. This PR fixes the other rectangle in that row, the toolbar block in a lone Chromium chat that has its own colour (#33261), and keeps #33346's rim intact over the toolbar.
Tests
AgentPaneTabRowHolesTests.aLoneChromiumChatsToolbarHolePaintsThePagesSurfacechecks the fill matrix: lone tab in Chromium, tabs shown, WebKit, out of the row, and a clear page.AgentPaneTabRowHolesTests.aLoneWebKitChatPaintsNoToolbarHolechecks that a shared page host on WebKit gets no fill.AgentPaneTabRowHolesTests.aLoneChromiumChatHandsThePaneItsSurfaceForTheToolbarchecks that the chat's fill follows its own theme scope and that the fill is dropped when the row ends.TabRowToolsStayClickableTests.theToolbarPaintsTheChatsHoleFillchecks that the pane's toolbar takes the fill below the 1 pt rim, keeps its own background clear, and goes clear again.Design spec: design/chat-header.md (the row reads as one surface behind the tools).
Agent session: agent session
🤖 Generated with Claude Code