Session Info always pushes the chat left, never covers it; a narrow pane narrows it and waits to open

Merged
TE
4d ago
+385-31

Leo, 2026-11-02: "THE FING SESSION INFO NOT FING PUSH THE LAYOUT LEFT"

On a 740pt window, a new agent chat in its ~370px agent pane opened with Session Info shown by default, lying over the transcript, the "Not sent. Send it again." Retry link and the composer.

Cause

  • #32159 (native Session Info on by default) together with #32056: the App draws the panel over the page, but the page kept no room for it. A "pushed" panel only moved the header, and the chat ran on full width under it. This is the regression.
  • #23862 (the push placement, its floor kept since then): pushedWidth never went below SESSION_INFO_WIDTH.min (260px), and nothing checked PUSH_MIN_CHAT before opening. In a 370px pane that left the chat ~100px.

Change

Session Info always pushes the chat left. It never covers the chat, at any width.

  • pushedWidth: below 260px the pushed panel narrows to PUSH_PANEL_MIN = 200px (still wider than the 180px live-preview card under it), and never past the pane less its margins. Chat + panel + 8px margin = pane, side by side.
  • Native panel: when pushing, the page keeps the panel's room in the shell's row (.acpmux-session-info-room, pushed width plus the 8px margin, the same slot the web panel takes). The chat reflows beside it, and the App's frame (sessionInfoFrame) sits exactly in that room.
  • Default-open: below sessionInfoFits (PUSH_MIN_CHAT 440 + PUSH_PANEL_MIN 200 + 8 = 648px), a saved open state does not open it. It stays closed until the person opens it (toggle, palette, a running line's count), and then it pushes. Wider panes keep today's default-open. This reuses #32576's per-chat "asked" state, cherry-picked with authorship.
  • Native drag: once a drag ends, the page's width replaces the drag's, so the native frame never stays wider than the page's room.

Widths: 370px pane gives a 200px panel and a 162px chat. 528px gives 200 and 320. 740px gives 292 and 440.

This supersedes the popover direction of #32576 (a click-away popover under 528px). Leo asked for push, not cover. The short-pane popover (POPOVER_BELOW_HEIGHT, pane height under 520) is unchanged, except that it too now waits to be asked before opening.

Spec: design/session-info.md rule 1 (leo-workspace) is being updated to match: push always, a narrow-panel floor, and no default-open below the fit.

Compared with the references (cmux-design-references, ids only)

Gallery `agent-pane.session-info-narrow-pane`, captured in Chromium at 370, 528 and 740px, in the saved-open and opened variants, and compared against:

  • `claude/live/browser-panel-empty` and `claude/live/session-running-with-side-panels`: the right panel takes its own column and the chat and composer reflow narrower beside it. That holds at every width here.
  • `claude/live/panels-right-environment-changes-column` and `claude/live/side-panel-cards-environment-changes`: Leo prefers that the chat is pushed left, ChatGPT-style, over a panel that lies on the chat or leaves empty space.
  • `chatgpt/live/sidebar-session-info-rail-sections`: opened from the header's list toggle.
  • The bug itself: `cmux/live/session-info-panel-changes-and-sources` and cmuxterm-hq#6137.

At 370px the 200px panel leaves a 162px chat. That is narrow but whole, and the chat only gets there after the person opens it. At 740px it opens unasked with a 440px chat. The panel's background and drag handles are not touched (another lane owns them).

Tests (red on base)

  • test/session-info.test.tsx: pushed widths sum to the pane at 180/370/528/740/1200; pushedWidth(370|528) = 200, pushedWidth(740) = 292; sessionInfoFits at 370/528/647/648/740.
  • test/session-info-surfaces.test.tsx: in 370px and 528px panes a saved open state leaves the chat clear, and the toggle opens it pushing at 200px; a 740px pane opens it unasked; with the native host, the page keeps a room equal to the posted width at 370/528/740.
  • test/session-info-placement.test.ts (Chromium and WebKit): at 370/528/740 the panel's left edge is at or right of .acpmux-main's right edge, it covers no row, and the composer and last row lie whole inside the chat. 370 and 528 don't open unasked.
  • sessionInfoPopover.test.ts: a narrow tall pane pushes, not a popover.
  • Swift AgentPaneNativeSessionInfoTests: pushedPanelFillsThePagesRoomExactly and pageWidthReplacesTheDragOnceTheDragEnds.
  • Gallery: agent-pane.session-info-narrow-pane (370, 528 and 740px; saved-open and opened variants). The agent-pane.header and inspector-composer-foot plays now open Session Info from the toggle wherever the pane waits for the person.

Risk: Session Info placement only. Wide panes are unchanged (floating or pushing at 260 to 560px).

Agent session: agent session

šŸ¤– Generated with Claude Code