Session Info: gutter, then a gradual push, then an overlay above the composer, by the pane's width
Leo, 2026-11-03: "but you should still be able to have it be an overlay... we previously had all that behaviour logic going from not affecting layout at all -> gradually pushing into the chat layout -> overlay"
Session Info takes one of three places by the pane's width (sessionInfoStage in SessionInfo.tsx). The numbers below are for the default 320px panel and Normal text width.
| Stage | Pane width | What happens |
|---|---|---|
| 1. Gutter | 1471px and wider | The right gutter holds the panel and both 8px margins. Nothing in the chat moves. |
| 2. Push | 648 to 1470px | The panel pushes into the chat gradually. pushedRoom reserves only what the gutter lacks: 0px at the gutter's edge, 191px at 1200px, and the full panel plus margin from about 1020px. Under 768px the panel narrows (pushedWidth) so the chat keeps 440px (PUSH_MIN_CHAT). |
| 3. Overlay | under 648px (440 + 200px panel floor + 8px margin) | The panel lies over the chat at its own width. Its foot stops above the composer's top, so the composer stays whole. In a pane under 520px tall it is a popover. |
Settings Push always is unchanged: it pushes at every width.
Regressions
- #27790 removed the gradual stage (
inspectorChatShift): where the gutter couldn't hold the panel, it went straight to an overlay. - #31423 removed the overlay stage: the default pushed wherever the gutter couldn't hold the panel, even when set to Overlay.
- #32591 pushed down to a 200px panel at any width, so no overlay range was left.
Kept from #32591
- In the push stage, the page reserves the room the native panel takes (
.acpmux-session-info-room, nowpushedRoomwide), so the native and web frames agree. In stage 3 the native panel is an overlay too, and the page reserves nothing. - The per-chat "has the person asked" state.
- The drag-end width sync.
- The saved-open rule: if the first measured frame is under 648px, Session Info stays closed until the toggle, a running line's count, or the palette opens it. An overlay nobody asked for over a narrow chat is what cmuxterm-hq#6137 reported. A panel that is already showing stays open when a split narrows the pane, and becomes an overlay.
How the gradual push works. On the web, the part of the panel that the chat's own gutter still holds is a negative left margin (--acpmux-session-info-overlap). The enter and exit slide still moves only the room it takes. underSessionInfo places the card under the panel against that room.
Tests
These fail on base and pass here. They live in session-info.test.tsx, session-info-surfaces.test.tsx, sessionInfoPopover.test.ts and session-info-placement.test.ts.
- Stage at each boundary, just above and below: the gutter edge, 648/647, short panes, handoff, and Push always.
- Every pushing width keeps the chat at 440px or wider, and the column stays a margin clear of the panel.
- The room grows a few pixels per pixel of pane.
- Native room at 370, 528, 740 and 1200px.
- Browser, at 370 and 528px: the panel is an overlay, its bottom is at or above the composer's top, and the chat keeps the pane's width. #32591's "narrow still pushes" cases are updated.
Gallery
agent-pane.session-info-narrow-pane(370/528/740) has updated notes.- New
agent-pane.session-info-stagescovers 740/1200/1600.
Spec: leo-workspace design/session-info.md, rules 1, 2 and 7. They're replaced by the three stages; the wording goes to the owner.
Agent session: agent session
🤖 Generated with Claude Code
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Restores Session Info's three-stage placement by pane width. The panel now floats in the gutter while it fits, pushes into the chat gradually by only the room the gutter lacks, and lies over the chat above the composer when pushing would shrink the chat below 440px. This fixes two regressions: #27790 removed the gradual push, and #31423/#32591 removed the overlay stage. Settings Push always is unchanged.
Behavior
- Adds
sessionInfoStage(float/push/overlay) andpushedRoom, so the push grows pixel by pixel from the gutter's edge instead of taking the full panel width at once. - Under 648px the panel overlays the chat at its own width and its foot stops above the composer; a saved open state still waits for the toggle on a first frame that narrow.
- A panel already showing stays open when a split narrows the pane, becoming an overlay.
- The chat's overflow is read from its drawn width while the push slides in, so a 1200px pane reserves only what it needs.
Tests and galleries
- Adds boundary tests for each stage transition and asserts the chat never dips below 440px while pushing.
- Updates browser tests so 370px and 528px panes expect an overlay above the composer and panes under 648px expect no layout movement; adds a new gallery entry covering 740/1200/1600px panes.