Repository navigation
cmux-next: main pane layout, an agent chat's opens land in one column on its right - #23105
Conversation
… on its right
`layout.mainPane` ("agent-chats" by default, "off"), with a Debug Settings override
(`panes.mainPane`: follow the setting, on, off). An agent chat that is its screen's main pane
(the chat dock, or a chat alone on its screen) never holds what it opens:
- links, files and folders it opens (LinkOpener) are a tab in the strip pane right of the chat
dock, or, from a lone chat, open unselected in its pane while the chat docks left, so that pane
becomes the column on its right;
- subagent and side chat panes (AgentTabStore.openBeside) are tabs there too instead of splits
stacked beside the chat.
The placement is ChatColumnPlacement's, the rule a person's new tab from the chat already
follows. A person's click focuses the new tab; an agent's open keeps focus in the chat. Closing
the column's last tab folds the dock back into a plain pane, so the chat gets its full width.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
|
Owned by projects-d9 on cosmic-gray · session |
|
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)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by web and size checks: green Tour of |
This comment has been minimized.
This comment has been minimized.
|
Bead |
…n the right column, close gives full width) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
The unescaped "Follow the setting" ended the string literal, so CmuxNextLayout did not compile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
…ock, keeps chats in the dock - An agent's open in the right column selects its tab without moving keyboard focus (selectWhenReportedKeepingFocus), as AgentBesidePlacement does. - A lone chat's open reports finished only once the chat is listed in its dock, so a queued second open lands as a tab in the same column instead of a split. - A past chat picked on a New Tab page in the chat dock replaces the page in the dock again; main pane routing applies to terminals, browsers and links only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
|
Review (independent subagent): SHIP at bf31888 I reviewed the full diff against feat-cmux-next by reading the code. Nothing was built on this host.
|
|
|
This comment has been minimized.
This comment has been minimized.
…75874) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
|
Review (independent subagent): SHIP at ea6e682 This follows the SHIP at bf31888. I checked the merge of feat-cmux-next (410d713) and the autofix exports (ea6e682) by reading only; nothing was built on this host.
|
…ayout # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentTabs+Wiring.swift
|
codex-review: SHIP at c04a225
|
This comment has been minimized.
This comment has been minimized.
…93869) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
|
Review (independent subagent): SHIP at 8d0d6a2 This follows the SHIP at ea6e682. I checked the base merges c04a225, ebe84dc and 8d0d6a2 and the autofix exports 1f386e5 by reading only; nothing was built on this host.
|
…ayout # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/DropOverlay/DropOverlayTunables.swift
…only the new column slides in MainPaneLayout.dockChat hands the chat's content to the dock (LayoutModel.handOffContent, #22949), as AgentBesidePlacement does, and cancels the hint when the dock fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
…t belongs to base) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
|
Review (independent subagent): SHIP at 416026d This follows the SHIP at 8d0d6a2. I checked the base merge 1c78451, the content hand-off in 0d3b7c7 and the test registry revert in 416026d by reading only; nothing was built on this host.
|
…ayout # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentTabs+Header.swift
|
Review (independent subagent): SHIP at 48354b3 This follows the SHIP at 416026d. I checked the base merge 48354b3 and its AgentTabs+Header.swift conflict by reading only; nothing was built on this host.
|
|
Merged at 48354b3 (squash 2a7eec5).
Two things for later:
|
|
Defaults approval: Leo's order (relayed by claude-sr2, 2026-10-21): keep layout.mainPane = agent-chats. |
…st_target workflows run (#23428) GitHub takes a pull_request_target workflow from the default branch whatever the pull request's base, so .github/workflows/cmux-next-defaults-guard.yml, which lived only on feat-cmux-next, never ran: #23105 merged a new default (layout.mainPane) with no call owner's approval. This adds the same workflow to main. It still judges with the base's guard and owners file (checked out at the pull request's base commit) and reads the head only as data. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Shipped in:
|
… pane Leo 2026-10-21: "HOW COULD ANYBODY HAVE POSSIBLY THOUGHT OPENING A NEW TAB IN HERE BY DEFAULT WAS ACCEPTABLE", about his agent pane, and "#22822 was SO STUPID": he had asked about the tab-open animation, not where links go. This reverts commit 7997e21. Every link and file a terminal, an agent chat, Home or a page opens goes where layout.linkPlacement says again (the pane on the right, else a new split); the cmdClick plumbing, the links.pagesFollowPlacement toggle, its settings text and release note go. The New Tab pick toggle is newTab.picksFollowLinks again (default off: a pick takes the page's place). Kept from later work: main pane layout (#23105) and the Chrome-style link focus. ClickedLinkFocusTests: the in-pane case sets Same Pane; the file link test waits for the daemon's tab, not the split's pending one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray
… tab in its pane (#23886) * Revert #22822: links and pages from a chat never open as a tab in its pane Leo 2026-10-21: "HOW COULD ANYBODY HAVE POSSIBLY THOUGHT OPENING A NEW TAB IN HERE BY DEFAULT WAS ACCEPTABLE", about his agent pane, and "#22822 was SO STUPID": he had asked about the tab-open animation, not where links go. This reverts commit 7997e21. Every link and file a terminal, an agent chat, Home or a page opens goes where layout.linkPlacement says again (the pane on the right, else a new split); the cmdClick plumbing, the links.pagesFollowPlacement toggle, its settings text and release note go. The New Tab pick toggle is newTab.picksFollowLinks again (default off: a pick takes the page's place). Kept from later work: main pane layout (#23105) and the Chrome-style link focus. ClickedLinkFocusTests: the in-pane case sets Same Pane; the file link test waits for the daemon's tab, not the split's pending one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray * Settings export for the reverted link help; keep #22990's background-click test Review of #23886: the schema export and its stamp still carried #22822's help text, and the revert deleted LinkRouterCmdClickTests with the Cmd-click-in-background test #22990 had added to it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray * Settings stamp: the merged base's string catalog Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray * Generated settings files: base's, with only this PR's help text The generated-file merge driver kept this branch's older exports over the base's, which dropped sidebar.showLocalMachine and voiceInput from them; the string catalog gets only the revert's 21 strings on top of the base's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2d-622e-7433-aed6-f3c248542f5d&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
An agent chat is now its screen's main pane, and nothing opens into it. Links, files and folders a chat opens, and its subagent and side chat panes, become tabs in one column on the chat's right. A chat alone on its screen docks left the first time, so that column slides in beside it. Closing the column's last tab gives the chat its full width back: the daemon folds the dock into a plain pane, which
dock_column_flags_cleared_by_a_close_stay_cleared_after_restartcovers.This is on by default as
layout.mainPane: "agent-chats", and"off"turns it off. Debug Settings > Panes and Columns > Main pane layout overrides the setting: Follow the setting, On or Off.How it works
MainPaneLayout.side(CmuxNextLayout) reusesChatColumnPlacement, the rule a person's new tab from the chat already follows:.dockChat).The callers:
LinkOpener: links, files and folders from the chat go to the column on its right. Before this, a click in a chat opened a tab inside the chat (cmux-next: what a page opens is a tab in its pane; Cmd-click still opens right #22822).MainPaneLayout.dockChat).ChatColumnPlacement.route).AgentTabStore.openBeside: subagent panes and side chats open as tabs in that column, not as splits stacked beside the chat.beside_caller: browser, diff, process terminal, Files tree) and a person's Cmd-T from the chat already landed there. They're unchanged.Focus follows the link-focus rule. A person's click focuses the new tab. An agent's open, or an unfocused subagent open, selects its tab in the column without moving keyboard focus (
selectWhenReportedKeepingFocus). A lone chat's open reports finished only once the chat is listed in its dock, so a second open right after it is a tab in the same column, not a split. A past chat picked on a New Tab page in the dock still replaces the page in the dock (mainPane: false): chats never become tabs in the right column.The slide-in uses the existing pane springs. #22949 (directional-motion) holds the chat in place while a lone chat docks for
AgentBesidePlacement. Once it lands,MainPaneLayout.dockChatgets the same one-linehandOffContenthint.Changelog
Testing
MainPaneLayoutTests,MainPaneSettingTests,LinkOpenPlacementTests,LinkPlacementSettingTestsandHomeLoneDockTests. All 30 tests passed, at both bf31888 and ea6e682.defaults_guard.py check-stamppasses.prepush-gate.pyfound no new violations, andlint-ios-package-conventions.shpassed.scripts/cmux-next/media/tours/main-pane.json, run under themedia-tourlabel. It shows a lone chat docking for a link, tabs joining the right column, and closing the column giving the chat its full width back.🤖 Generated with Claude Code
Agent session: cosmic-gray
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
An agent chat now stays as its screen's main pane: links, files, folders, subagent panes, and side chats it opens land as tabs in one column on its right, instead of inside the chat (#22822) or as splits stacked beside it.
layout.mainPane: "agent-chats";"off"restores the previous rules. A Debug Settings override (panes.mainPane: Follow the setting, On, Off) can force either.Written for commit 48354b3. Summary will update on new commits.