fix(cmux-next): animate side-open tabs in their destination pane

Merged
TE
13d ago
+483-38

Leo reported: “the animation ... starts ... on the main pane, right? But then you open up the second pane, and then it does it again there ... The order of operations is not good.”

A side-bound open was created in the source pane, so TabStripView animated it there before TabMoves created the destination. This PR adds an OutboundTab placement hold: source strips hide only the tab being moved, the destination is allowed to mount, and the tab is exposed once in its final pane. The hold handles a daemon echo before the move answer, move failure, pane teardown, user selection, reused IDs, and provisional stand-ins.

Changelog

  • Fixed: side-open tabs animate once in their final pane instead of flashing/animating in the source pane first.

Validation

  • swiftc -parse passed for the changed Swift sources on Big Red.
  • git diff --check passed.
  • Added SideOpenStripTests covering source suppression, final-pane reveal, failed moves, selection, stand-ins, reused IDs, and move-before-source-drop.
  • Native build, Swift tests, and frame timing are fleet-only and remain to be attached from the exact head 45b349a5d13d950d44b8cbf8d2fcc4bd90661e4c using motion-proof.py/golden.py.
  • Timer cleanup: OutboundTab owns DemandTimer and cancels it on finish/drop; source teardown and rejection clear the hold; no new polling loop was added.

Agent session: big-red


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Fixes side-opened tabs animating in their source pane before reaching their destination pane. Links, files, and agent tabs opened to the right were created unselected in the pane they opened from, so TabStripView animated them there before TabMoves moved them into a new split, column, or dock chat.

Adds OutboundTab, a placement hold that keeps the tab out of the source strip until it lands in its final pane, so the opening animation plays only once, there.

  • Source strips hide only the outbound tab; the destination pane mounts and lists it normally.
  • The hold releases on failed moves, pane teardown, user selection mid-move, reused tab IDs, and provisional stand-ins, and follows agent tab ids when they are rekeyed.
  • Adds SideOpenStripTests covering source suppression, final-pane reveal, failed moves, selection, stand-ins, reused IDs, and move-before-source-drop.