cmux NEXT Session Info: it floats and never takes a column; no x band; composer glass

Merged
TE
12d ago
+350-241

Leo, 2026-10-24:

"making it not a part of the true agent pane area except in the case when both would fit if only the gent pane shifted left. then it doesnt weirdly cover up the top right buttons when it's open. then there's no weird accounting ofr i ton the side. it was never supposed to be a sidebar; y'all kept doing sidebars."

"you still didn't remove the, like, top bit with the closing mark. It doesn't— it's not necessary. ... Why is— why do the buttons now hide?"

"didn't we say, like we wanted that to be glass as well?... the composer itself also being a little bit glassy and stuff, as well as the session rail."

What changes

  • Session Info floats in every pane width. It takes a column (push) only with Settings > Agent Chat > Inspector: Push always. A narrow pane (#23862) or a handoff review's wider form no longer turns it into a sidebar.
  • Why the buttons hid: with the header's tools in the pane's tab row (chrome.tabs.rowTools, on by default), the pushed column narrowed .acpmux-main and pulled the tools left, under the native tab strip (900px pane: the tools' right edge went from 870 to 542). Floating, the header never moves.
  • The chat shifts left only when both fit (inspectorChatShift). If the right gutter already holds the panel and its 8px margins, nothing moves. If the two gutters together hold it, the transcript and the composer's stack move left by exactly what the right gutter lacks. Otherwise nothing moves and the panel floats over the chat, under the header.
  • No x and no band above the first row. The toggle and Esc close it. It already steps aside while a diff in place hides the header (#24344), so the toggle is always in reach. A subagent's panel keeps its title row.
  • The composer's glass (#24566 tokens): 70% composer surface under a 24px blur on an opaque window, 50% under the shared blur over art or a see-through window. Lens, Spectrum and Reduce Transparency are unchanged. The blur covers only the panel's own box, the same cost as the composer card over the scrolling transcript.

Supersedes #24574 ("rail grows with content"), which made it a full-height rail. Spec: leo-workspace design/session-info.md (teamleaderleo/leo-workspace PR from rail-opus-session-info-spec).

Before / after

Real pane harness (test/support/papercutChat.ts), Chromium.

BeforeAfter
900px pane, tools in the tab rowbefore 900after 900
1200px panebefore 1200after 1200

Before at 900px: a pushed column, the header's tools pulled to the middle of the row (under the native tabs in the app), and the lone x in an empty band. After: it floats, the tools stay at the right end, and there is no x band. At 1200px the chat and the composer move left together, so the panel lies over neither.

Tests

  • chat-inspector.test.tsx, chat-inspector-surfaces.test.tsx and all inspector unit files: 88 pass.
  • Browser lane (CMUX_BROWSER_TESTS=1, Chromium; WebKit doesn't launch on this Linux host): chat-inspector-placement 11/0, chat-inspector-overlay-transcript 2/0, chat-inspector-push-motion 3/0, chat-inspector-overlay-toggle 8/0. New or rewritten: it floats under the header in 560/700/900/1200px panes and the chat keeps its width; at 1200px no row or composer is under it once the shift settles; Push always still pushes and covers nothing; no x and no band; the chat shift values (0 / 111 / 0 / 86 px).
  • prepush-gate.py: no new violations.

Risk

Medium, all in the webview. In panes too narrow for both, the panel now floats over the chat's right edge where it used to push. That is Leo's design, and Push always remains for anyone who wants the column. The composer's stack now gets a translate (0 when nothing shifts) and a translate transition. Nothing else on those elements uses translate. No new timers or observers.

Agent session: huge-blue

🤖 Generated with Claude Code