Repository navigation
cmux NEXT: a link opened to the right shows in its split in the click's frame, never in the source pane first - #32900
Conversation
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
afdedd6 to
3febc50
Compare
ddcfc13 to
6027476
Compare
|
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)
web and size checks: green Default changesThis pull request changes 1 default at
Signed off on this commit by Merge receipt: merged as Regenerate the snapshot with Shipped in:
|
|
Found 6 test failures on Blacksmith runners: Failures
|
|
Review (codex gpt-6.1-sol high, sweep, via the review router; full diff from merge base e674d0b to this head): BLOCK at 6027476 [P2] [blocking] Packages/macOS/CmuxNext/Sources/CmuxNextDaemonService/BrowserTabSplitCommand.swift:59 - |
|
Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 6027476 BLOCK at 6027476
Follow-ups:
|
…it in the click's frame
LinkOpener's split right and split below no longer make the tab in the
source pane and move it once the store lists it (two daemon round
trips, and the opening played on the source pane first). A web link's
split shows now with a stand-in tab (PaneBrowserTabSplit) and one
new-frontend-browser-tab {pane, split} makes the tab in the daemon's
new pane (frontend-browser-tab-split-v1). A folder's terminal opens as
Cmd-D's optimistic split. An older daemon keeps make-and-move.
PaneBrowserTabSplit and the tests come from austinywang's #23032.
Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com>
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> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…(review) A local foreground link took openStandIn first: the tab showed in the source pane and its split request never finished, so the source's open turns queued forever. The split branch now runs first; the test checks that the next open beside the pane still runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
…ock rules As in austinywang's #23032 (08c04fc): a chat dock, a pane with no room or a strip column too narrow keeps the move, which refuses or opens a new column as every split does. Co-authored-by: Austin Wang <38676809+austinywang@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
… pane is listed; incognito keeps the move (review) router-review (gpt-6.1-sol) BLOCK at 6027476: the reply can come before the pane's events, so the next queued link aimed at the provisional pane; and an incognito pane could mount about:blank before the reply registered its URL. BrowserTabSplitCommand now waits (30 s bound) for the store to list the made tab, as LinkOpener's move does; incognito panes keep make-and-move. The bench's quick arm skips commands with no key (link_right). Regression tests: LinkOpenSplitDirectTests.theTurnWaitsForTheDaemonsPaneNotJustTheReply, anIncognitoPaneKeepsTheMove. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed9226b71907d8aaa0b6
0ea30d2 to
71fd6d3
Compare
|
Review (codex, router-review): SHIP at 71fd6d3 Reviewer: codex gpt-6.1-sol xhigh, fast tier. Follow-ups: 3. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 71fd6d3
Follow-ups:
|
A newer verdict blocks 777eebc (no independent SHIP at the head).
|
Review (codex gpt-6-astra high, router-review): SHIP at 777eebc Range review of the PR's diff at the head left by cmux-bot's base merge. No blocking findings. Follow-ups: [P2] |
…in their split Leo 2026-11-03: "the new tab at the top opening first in the main pane THEN in the right split is still an issue... that top tab animation". #32900 made a link opened to the right use `new-frontend-browser-tab {split}`; Split Browser Right/Down (its key and menus, link hints' F, VS Code inline, browser hits) and the chat header's Browser still made the tab in the source pane and moved it. Both now use the one split maker (LinkOpener.browserSplit), falling back to make-and-move where the daemon or pane cannot. Leo-ask: ask-08552f8ea0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-910f9bcf7fd2069746eb
…in their split, never in the main pane first (#33466) * test(next): Split Browser Right shows its split with its tab in the action's turn (failing) Leo-ask: ask-08552f8ea0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-910f9bcf7fd2069746eb * fix(next): Split Browser and the chat header's Browser open straight in their split Leo 2026-11-03: "the new tab at the top opening first in the main pane THEN in the right split is still an issue... that top tab animation". #32900 made a link opened to the right use `new-frontend-browser-tab {split}`; Split Browser Right/Down (its key and menus, link hints' F, VS Code inline, browser hits) and the chat header's Browser still made the tab in the source pane and moved it. Both now use the one split maker (LinkOpener.browserSplit), falling back to make-and-move where the daemon or pane cannot. Leo-ask: ask-08552f8ea0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-910f9bcf7fd2069746eb * fix(next): browserSplit's doc keeps the App target's line count flat after the base merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-07121e8fa07d68e815b1 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Swift logic follow-up (tip watcher swift-logic row, STATUS 13027 "SWIFT LOGIC CULPRITS"; lead order). This PR raised
plans/cmux-next/layer-ownership.md says Rust owns every state, list and rule and Swift is the platform shell. Please move the new logic of this PR in a follow-up: to Rust (the crate that owns the area; the owner lists in STATUS 12147-12165 name the target per area), or at least out of the app into its package. If a declaration above is platform code (AppKit, Core Animation, OS calls, strings, tokens, DEBUG tooling), reply here and the table gets a PLATFORM row with your reason instead. The swift-logic row is a report, not a gate: nothing blocks on this comment. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo (2026-11-03): "it's so slow to open and close idk if there's some sort of threading issue but it's nigh instant for claude and codex so we nede to be at least as fast", and "the browser/tab opening animation still plays on the main pane before going". Earlier ask (#23032's title): "a link opened to the right appears in its split, never in the source pane first".
leo-named-fix. The daemon half, #32862, has landed (de2ecaf).
What
A web link LinkOpener puts in a new split right or below (a chat link, a terminal Cmd-click, a file page's link) no longer gets made as an unselected tab of the source pane, then waits for the store to list it (up to
listLimit, 30 s) before aTabMoves.toNewSplitand a second wait: two daemon round trips with nothing on screen, and the opening played on the source pane first.Now, when the pane's daemon serves
frontend-browser-tab-split-v1(plussplit-client-keys-v1):BrowserTabSplitCommand(CmuxNextDaemonService) puts a provisional split with a stand-in browser tab in the store in the click's turn, and the window lays it out in that frame, the way an agent tab's split (ConversationTabSplit) and Cmd-D already do.new-frontend-browser-tab {pane, split}makes the tab in the daemon's new pane, which replaces the provisional one by its client-minted id. Even split sizing is shown at once and committed on the reply, or rolled back on a refusal.LinkOpener.opentakes an optionalSplitMake;.splitRight/.splitBelowuse it and fall back to make-and-move when it answers nil (an older daemon, a remote pane without browser tabs, Home's pinned dock, an incognito pane, a pane without split room)..newColumn,.besideDockand.dockChatare unchanged here.Review fixes (router-review gpt-6.1-sol BLOCK at 6027476): the open's turn ends only once the store lists the daemon's pane, not just at the reply, so the next queued link never aims at the provisional pane; incognito panes keep make-and-move, since their record holds about:blank until the reply registers the URL. The bench's quick arm skips commands with no key (link_right).
Not in this PR (#33021): folder and terminal opens to the right still use make-and-move, and
turns.seriallystill serializes opens beside one source.Carried from austinywang's #23032:
PaneBrowserTabSplit(nowBrowserTabSplitCommand, moved into CmuxNextDaemonService), thesplitrequest field and connection check, the stand-inProvisionalTab.browser(_:), the split-room rule, andLinkOpenSplitDirectTests(adapted to today's opener). Those commits carryCo-authored-by: Austin Wang.Also:
LinkDragItemandLinkDropPlanmoved from CmuxNextApp into CmuxNextAppCore andexistingPanemoved ontoLinkOpenPlacement.Target, so the App target does not grow.debug.new_tab {action: bench_create, command: link_right}times a link opened to the right (click to the frame the new pane shows).Tests
LinkOpenSplitDirectTests(CmuxNextAppTests): a link to the right shows a split intent with the stand-in at once, the source pane never lists the tab, and exactly one create goes out carryingsplitwith the provisional ids; the open's turn waits for the daemon's pane, not just the reply; an incognito pane keeps the move; without the capability the tab is made in the source with nosplit; New Column still moves; a split maker that answers nil falls back.Performance
Same fleet Mac for both arms (instant-new-surfaces-bench.py
--commands link_right --arms warm --phases idle,load --runs 12). Before: 0d15fd4 (#32862 plus only the bench command). After: 71fd6d3 (this head).The split now shows in the first frame after the click (frames to visible 1, from 4) and never in the source pane. The click's turn costs more: it now records the split intent and lays out the window in that turn, as Cmd-D does, instead of doing nothing until the daemon replies. The p95 of 15 ms is above the 10 ms action budget; #33021 tracks trimming it.
Observed / Not run
theTurnWaitsForTheDaemonsPaneNotJustTheReplyandanIncognitoPaneKeepsTheMove.Risk
risk:normal. Opens to the right on a current daemon change path; older daemons keep the old path. A refused create rolls the split back.
Changelog
Fixed: a link opened to the right shows in its new split at once, never as a tab of the pane it was clicked in first.
Agent session: agent session
🤖 Generated with Claude Code