cmux-tui: new-frontend-browser-tab can make its tab directly in a new split (frontend-browser-tab-split-v1)
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. This is the daemon half; the app wiring follows in a second PR.
What
new-frontend-browser-tab takes an optional split ({direction, pane_id, split_id}, only with pane), behind the new capability frontend-browser-tab-split-v1, the same object new-conversation-tab takes under conversation-tab-split-v1. The tab is created directly in a new pane on that side of pane, in one pane.split commit: one pane-added delta whose pane holds only the tab, and the source pane never lists it. Today the app creates the tab in the source pane, waits for the store to list it, then sends a move to a new split: two daemon round trips, and the page shows in the source pane first.
Spec: cmux-tui/spec/commands.md and sdk-schema.json; SDK bindings regenerated (cmux-tui/bindings/codegen/generate.py --write), and the raw Rust client's keyed create names split as missing.
Carried commits
The three code commits are austinywang's from #23032 (authorship kept), cherry-picked onto current feat-cmux-next with only their daemon, spec and test parts; the generated bindings were regenerated instead of merged. The crate diff is line-for-line the same as #23032's. #23032's Swift side no longer applies on today's base (the browser opener moved to stand-in tabs), so the app wiring is rebuilt in the follow-up PR.
Tests
cmux-tui-core server::frontend_browser_split_tests (from #23032): one commit, one pane-added, no tab-added on the source pane, caller-minted ids, refusals (no pane, after with split, bad direction, a refused dock split creates no tab), pinned-dock-alone opens a column.
Risk
Low. Additive request field behind a new capability; a client that does not send split is unaffected. Rust only, no Swift.
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
Fixes new-frontend-browser-tab so a link opened to the right appears directly in its new split pane instead of first rendering in the source pane.
- Adds an optional
splitfield ({direction, pane_id?, split_id?}, shared withnew-conversation-tab) behind thefrontend-browser-tab-split-v1capability, so the tab is created in onepane.splitcommit with a singlepane-addeddelta and is never listed by the source pane. - Sending
splitwithoutpaneis refused,afteris refused withsplit, and keyed creates fingerprint their split so a retry with a different split conflicts. - Clients that don't send
splitare unaffected. This is the daemon half; the app wiring that sends it follows in a second PR, and older daemons keep the make-then-move path.