Skip to content

Fix pane tab drags silently never starting (#10033) - #10038

Merged
austinywang merged 11 commits into
mainfrom
issue-10033-tab-drag-wide-tabs
Aug 12, 2026
Merged

austinywang merged 11 commits into
mainfrom
issue-10033-tab-drag-wide-tabs

Conversation

@austinywang

@austinywang austinywang commented Aug 12, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Since the native tab drag rewrite (after 0.64.22), pane tab drags regressed twice over (#10033):

  1. Drags silently never started. trackTabMouseDown only armed on clickCount == 1; AppKit counts a press within the double-click interval near the same point as clickCount == 2, so click-to-select-then-drag never armed. Felt sporadic (pure timing).
  2. No drop targets. bonsplit 33969f2 replaced the com.splittabbar.tabtransfer JSON payload with a bare capability token, but cmux's pane/browser drop overlays (PaneDragTransfer, BonsplitTabDragPayload, BrowserPaneDragTransfer) resolve drop targets by JSON-parsing that payload. They decoded nothing → drag image rendered but the blue drop zones never appeared and drops did nothing.

Fixes

Horizontal insert-between-tabs positioning (the one post-0.64.22 behavior to keep) is untouched and covered by TabDropIndexResolverTests / TabWideTitleDragTests.

Validation

  • bonsplit suite: 23 tests green locally and in bonsplit CI on all three PRs.
  • Debug-log traced the exact failure on the dogfood build: tab.dragStart fired, terminal.paneDrop.hitTest capture=1 hasTransfer=1 captured, then decode returned nil → no zones, no drop.
  • Tagged dev build for dogfood: issue-10033-tab-drag (cloud reload).
  • Localization audit: no user-facing strings changed.

Fixes #10033

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Improved pane and tab drag-and-drop handling across workspaces and terminal areas.
    • Accepted transfers now complete cleanly and end their native drag sessions.
    • Failed or rejected drops remain unaffected.
    • Improved cleanup of temporary pane transfer data after successful drops.
  • Tests
    • Added coverage for the full lifecycle of accepted pane transfers.

austinywang and others added 7 commits August 11, 2026 23:23
Tab drags silently never started when the press arrived with
clickCount >= 2 — the common click-to-select-then-immediately-drag flow.
Bonsplit PR: manaflow-ai/bonsplit#217

Fixes #10033

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ends cancelled tab drags immediately instead of after AppKit's snap-back
animation, so drag state is revoked before the next press.
Bonsplit PR: manaflow-ai/bonsplit#218

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Aug 12, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 733368f0-63c0-47f2-a7a8-42239f8cf7b9

📥 Commits

Reviewing files that changed from the base of the PR and between bd222b3 and b590e72.

📒 Files selected for processing (9)
  • Sources/BrowserPaneDropTargetView.swift
  • Sources/ContentView+MoveTabToNewWorkspace.swift
  • Sources/PaneDropRoutingSupport.swift
  • Sources/PaneTransferDropRouter.swift
  • Sources/PaneTransferSourceResolver.swift
  • Sources/Sidebar/SidebarBonsplitTabDropDelegate.swift
  • Sources/Sidebar/SidebarBonsplitTabWorkspaceDropOverlay.swift
  • Sources/TerminalPaneDropTargetView.swift
  • cmuxTests/VaultPaneTransferLifecycleTests.swift

📝 Walkthrough

Walkthrough

Accepted Bonsplit pane and workspace drops now finish originating tab-drag transfers with the drag pasteboard. Pane transfer lifecycle tests verify native drag and registry cleanup. The vendored Bonsplit revision also updates.

Changes

Bonsplit tab-drag lifecycle

Layer / File(s) Summary
Complete accepted pane drops
Sources/PaneDropRoutingSupport.swift, Sources/PaneTransferSourceResolver.swift, Sources/PaneTransferDropRouter.swift, Sources/BrowserPaneDropTargetView.swift, Sources/TerminalPaneDropTargetView.swift, cmuxTests/VaultPaneTransferLifecycleTests.swift
Pane drop routing passes the pasteboard through source resolution. Accepted surface transfers finish through the tab transfer registry. The lifecycle test verifies native drag and registry cleanup.
Complete accepted workspace drops
Sources/ContentView+MoveTabToNewWorkspace.swift, Sources/Sidebar/SidebarBonsplitTabDropDelegate.swift, Sources/Sidebar/SidebarBonsplitTabWorkspaceDropOverlay.swift
Successful immediate and deferred workspace drops finish the originating transfer. Failed moves and rejected drops do not finish it.
Update Bonsplit revision
vendor/bonsplit
The Bonsplit submodule pointer updates to commit 18f3f8bc2ac3019d0f30b41586f4785950af6de7.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant DropTarget
  participant PaneTransferDropRouter
  participant PaneTransferSourceResolver
  participant TabDragTransferRegistry
  DropTarget->>PaneTransferDropRouter: perform accepted drop with pasteboard
  PaneTransferDropRouter->>PaneTransferSourceResolver: finishAcceptedDrop(source, id, pasteboard)
  PaneTransferSourceResolver->>TabDragTransferRegistry: finish originating drag
  TabDragTransferRegistry-->>DropTarget: remove transfer registration and end native drag
Loading

Possibly related PRs

Suggested reviewers: lawrencecchen

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the pane tab drag regression and references the tracked issue, although it does not mention missing drop targets.
Description check ✅ Passed The description clearly documents the problems, fixes, and validation results, but it omits the template checklist, review trigger, and demo video.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR-side diff adds explicit @MainActor AppDelegate and resolver methods; PaneTransferDropRouter is already @MainActor, with no new model/protocol/Sendable or background UI-store access.
Cmux Swift Blocking Runtime ✅ Passed The production diff adds MainActor registry completion and pasteboard plumbing only; scans found no semaphore, wait, sleep, delayed dispatch, timer, main.sync, polling, or manual lock.
Cmux Browser Automation Off-Main ✅ Passed PR diff leaves TerminalController.swift and ControlCommandExecutionPolicy.swift unchanged; it only changes pane-drop drag lifecycle code, with no browser.* socket automation command routing changes.
Cmux Expensive Synchronous Load ✅ Passed The PR delta adds only drag-transfer completion on MainActor; scans found no agent-history loads, large-file reads, JSON/JSONL parsing, directory scans, or syscalls.
Cmux Cache Substitution Correctness ✅ Passed The PR diff only changes drag/drop transfer completion and its lifecycle test; it introduces no persistence, history, undo, or snapshot read substitution.
Cmux No Hacky Sleeps ✅ Passed The PR-side diff changes only Swift files, a Swift test, and the Bonsplit submodule; it introduces no covered TypeScript, JavaScript, shell, or build/runtime delay code.
Cmux Algorithmic Complexity ✅ Passed The PR adds no scalable collection scans. New registry completion uses dictionary removal, and the only added loop is test-only view-fixture code.
Cmux Swift Concurrency ✅ Passed The Swift diff adds synchronous drop-finalization and MainActor isolation only; no new Dispatch, Combine, completion-handler, or fire-and-forget Task patterns. The async addition is test-only.
Cmux Swift @Concurrent ✅ Passed Changed production paths are synchronous and actor-bound; the only new async function is an @MainActor test, and the Bonsplit diff adds no @concurrent or nonisolated async work.
Cmux Swift Package Boundaries ✅ Passed Changed code is AppKit drag-session and AppDelegate/registry glue; the router/resolver predate this diff, and new completion logic depends on AppKit and app singletons.
Cmux Swiftpm Lockfiles ✅ Passed PR diff contains only Swift sources/tests and the vendor/bonsplit submodule; no Package.swift, Package.resolved, .gitignore, workflow, or Xcode package-reference changes.
Cmux Swift Logging ✅ Passed The diff adds no print, debugPrint, dump, NSLog, or ad hoc file/stdout logging; new cmuxDebugLog calls are #if DEBUG and log only drag IDs, agent/status, and drop metadata.
Cmux User-Facing Error Privacy ✅ Passed The app diff adds drag lifecycle and pasteboard routing only; no new user-facing errors or alerts. Bonsplit additions are tests, comments, and internal logging, not user-visible copy.
Cmux Full Internationalization ✅ Passed The PR-side diff adds only drag-routing plumbing, a developer comment, and test code; it adds no user-facing Swift/web/catalog text or locale changes.
Cmux Swiftui State Layout ✅ Passed The PR adds drop-event completion and pasteboard plumbing only. It adds no ObservableObject state, GeometryReader, lazy-row store reference, or render-time state mutation; AppKit bridge changes are...
Cmux Architecture Rethink ✅ Passed The diff adds no timing, blocking, observer, or new mutable state; completion routes through the AppDelegate registry and PaneTransferDropRouter, with platform callbacks only invoking that shared o...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The diff adds no standalone production window. It adds an NSView drag source and test-only NSWindow fixtures; the auxiliary-window lint also passes.
Cmux Source Artifacts ✅ Passed The PR diff contains only intentional Swift product code, tests, and a deliberate vendor/bonsplit dependency pin; no logs, media, caches, temp folders, build output, or scratch directories were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The production diff adds no DEBUG/test-build guard or test-shaped member; the new drop-finishing methods are called by real pane and workspace drop paths.
Cmux No Ambient Global State ✅ Passed The PR adds instance methods and pasteboard plumbing only; the AppDelegate registry and singleton state already exist in the PR base, and no new global or singleton appears in added production code.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-10033-tab-drag-wide-tabs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@vendor/bonsplit`:
- Line 1: Add regression coverage for modifier handling in
TabBarDragAndHoverView.trackTabMouseDown by testing that Control-clicks are
rejected, and add a sidebar workspace reorder test alongside the existing
wide-tab and same-/cross-pane reorder cases. Reuse the current Bonsplit test
helpers and run the full Bonsplit test suite.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4569779e-8418-4390-995f-7c318871f357

📥 Commits

Reviewing files that changed from the base of the PR and between b17c260 and 3aa145e.

📒 Files selected for processing (1)
  • vendor/bonsplit

Comment thread vendor/bonsplit Outdated
@@ -1 +1 @@
Subproject commit 2270bacdf94672384097f6b94864111a54bcf548
Subproject commit d689ecb1a299ba4ce21b120afeb654786fce3293

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

old=2270bacdf94672384097f6b94864111a54bcf548
new=d689ecb1a299ba4ce21b120afeb654786fce3293

git -C vendor/bonsplit cat-file -e "${old}^{commit}"
git -C vendor/bonsplit cat-file -e "${new}^{commit}"
git -C vendor/bonsplit diff --check "$old" "$new"
git -C vendor/bonsplit diff --stat "$old" "$new"
git -C vendor/bonsplit diff "$old" "$new"
git -C vendor/bonsplit grep -n -E \
  'trackTabMouseDown|TabBarBackgroundNSView|hit.?test|transfer|snap.?back|Control|workspace.*reorder' \
  "$new" -- '*.swift' || true

Repository: manaflow-ai/cmux

Length of output: 50373


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo '--- integration files ---'
fd -t f 'BonsplitTabBarPassThrough.swift|BrowserWindowPortal.swift' . | sort
for f in $(fd -t f 'BonsplitTabBarPassThrough.swift|BrowserWindowPortal.swift' .); do
  echo "--- $f ---"
  rg -n -C 8 'BonsplitTabBarPassThrough|TabBarBackgroundNSView|hitTest|hitRegion|634|644|tab.?bar|view' "$f" | head -240
done

echo '--- focused changed source symbols ---'
git -C vendor/bonsplit grep -n -E \
  'trackTabMouseDown|handleTabMouseDragged|beginNativeTabDrag|nativeTabDragSessionDidEnd|animatesToStartingPositionsOnCancelOrFail|finishDrag|shouldCaptureHitTest|insertionIndex|isNoopSamePaneTarget' \
  d689ecb1a299ba4ce21b120afeb654786fce3293 -- '*.swift' || true

echo '--- focused tests ---'
git -C vendor/bonsplit grep -n -E \
  'clickCount|control|Control|cancel|snap|animation|wide|Wide|sidebar|workspace|reorder|hitTest|hit.?region|structure|TabBarBackground' \
  d689ecb1a299ba4ce21b120afeb654786fce3293 -- 'Tests/**/*.swift' || true

Repository: manaflow-ai/cmux

Length of output: 12750


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo '--- files ---'
fd -t f 'BonsplitTabBarPassThrough.swift|BrowserWindowPortal.swift' . | sort

echo '--- drag implementation ---'
git -C vendor/bonsplit show --format= --no-ext-diff d689ecb1a299ba4ce21b120afeb654786fce3293:Sources/Bonsplit/Internal/Views/TabBarView.swift |
  sed -n '2150,2315p'

echo '--- focused tests and test names ---'
git -C vendor/bonsplit ls-tree -r --name-only d689ecb1a299ba4ce21b120afeb654786fce3293 Tests/BonsplitTests |
  grep -E 'TabBarDragEventRoutingTests|TabBarDropHandlerTests|TabWideTitleDragTests|workspace|Sidebar|Reorder'
for f in \
  Tests/BonsplitTests/TabBarDragEventRoutingTests.swift \
  Tests/BonsplitTests/TabBarDropHandlerTests.swift \
  Tests/BonsplitTests/TabWideTitleDragTests.swift; do
  echo "--- $f ---"
  git -C vendor/bonsplit show --format= --no-ext-diff d689ecb1a299ba4ce21b120afeb654786fce3293:"$f" |
    rg -n -C 5 'func test|clickCount|control|cancel|snap|animation|wide|sidebar|workspace|reorder|hit' | head -360
done

Repository: manaflow-ai/cmux

Length of output: 22509


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

new=d689ecb1a299ba4ce21b120afeb654786fce3293
old=2270bacdf94672384097f6b94864111a54bcf548

echo '--- drag routing tests ---'
git -C vendor/bonsplit show --format= "$new":Tests/BonsplitTests/TabBarDragEventRoutingTests.swift |
  sed -n '1,230p'

echo '--- wide-title tests ---'
git -C vendor/bonsplit show --format= "$new":Tests/BonsplitTests/TabWideTitleDragTests.swift |
  sed -n '1,180p'

echo '--- workspace/sidebar reorder references ---'
git -C vendor/bonsplit grep -n -i -E \
  'workspace|sidebar|reorder' "$new" -- 'Tests/**/*.swift' 'Sources/**/*.swift' |
  head -240 || true

echo '--- tab-bar hierarchy and hit-region changes ---'
git -C vendor/bonsplit diff --unified=35 "$old" "$new" -- \
  Sources/Bonsplit/Internal/Views/TabBarView.swift |
  rg -n -C 35 \
  'TabBarDragAndHoverView|TabBarBackgroundNSView|overlay|background|hitTest|onBeginTabDrag|TabBarDropDestinationView|BonsplitTabItemHitRegionProviding' |
  head -520

echo '--- package test definitions ---'
git -C vendor/bonsplit ls-tree -r --name-only "$new" |
  grep -E 'Package.swift|Tests/.+\\.swift$' |
  head -120

Repository: manaflow-ai/cmux

Length of output: 47730


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

new=d689ecb1a299ba4ce21b120afeb654786fce3293
old=2270bacdf94672384097f6b94864111a54bcf548

echo '--- explicit Control-click and sidebar/workspace tests ---'
git -C vendor/bonsplit grep -n -i -E \
  'control.?click|modifierFlags|workspace|sidebar.*reorder|reorder.*sidebar|sidebar.*workspace|workspace.*sidebar' \
  "$new" -- 'Tests/**/*.swift' 'Sources/**/*.swift' || true

echo '--- relevant TabBarView body before and after ---'
for rev in "$old" "$new"; do
  echo "--- $rev ---"
  git -C vendor/bonsplit show --format= "$rev":Sources/Bonsplit/Internal/Views/TabBarView.swift |
    sed -n '970,1185p'
done

echo '--- direct hierarchy diff ---'
git -C vendor/bonsplit diff --unified=12 "$old" "$new" -- \
  Sources/Bonsplit/Internal/Views/TabBarView.swift |
  sed -n '1,420p'

Repository: manaflow-ai/cmux

Length of output: 46976


Add Control-click and sidebar workspace reorder regression tests.

TabBarDragAndHoverView.trackTabMouseDown rejects Control-clicks at vendor/bonsplit/Sources/Bonsplit/Internal/Views/TabBarView.swift:2186, but no modifier-flag test covers this path. The tests cover wide-tab geometry and same-/cross-pane reorder, but not sidebar workspace reorder. Add both cases and run the Bonsplit test suite.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@vendor/bonsplit` at line 1, Add regression coverage for modifier handling in
TabBarDragAndHoverView.trackTabMouseDown by testing that Control-clicks are
rejected, and add a sidebar workspace reorder test alongside the existing
wide-tab and same-/cross-pane reorder cases. Reuse the current Bonsplit test
helpers and run the full Bonsplit test suite.

Advance Bonsplit to the restored legacy pasteboard payload
(manaflow-ai/bonsplit#219): pane/browser drop overlays decode
tab.id/kind/sourcePaneId/sourceProcessId again, so the blue drop zones
render and drops route. Also share one tab-drag capability registry
between workspaces and the Dock so bonsplit tab-strip destinations can
resolve drags that began in another controller, matching 0.64.22 where
any destination could decode the drag.

Fixes #10033

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai coderabbitai Bot mentioned this pull request Aug 12, 2026
3 of 5 tasks

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/PaneDropRoutingSupport.swift`:
- Around line 12-15: Replace the namespace-only BonsplitTabDragSharing access
around finishAcceptedDrop with an explicitly owned, injectable drag coordinator
or registry instance. Thread that single instance from the app-owned drag
coordinator through workspace and Dock controllers into drop targets, and invoke
it from finishAcceptedDrop instead of process-wide mutable state. Preserve the
single authoritative registry while making ownership constructable and testable.

In `@Sources/Sidebar/SidebarBonsplitTabWorkspaceDropOverlay.swift`:
- Line 222: Move the BonsplitTabDragSharing.finishAcceptedDrop call out of the
immediate deferred-drop path and invoke it only after
performPendingDropIfPossible() confirms moved == true. Ensure rejected or
unsuccessful pending drops leave the shared drag unfinished, or add an explicit
failure/cancellation path if queuing remains the acceptance boundary.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f879e349-7942-4351-8130-6e31e23df94d

📥 Commits

Reviewing files that changed from the base of the PR and between 75adf5b and 76be87b.

📒 Files selected for processing (7)
  • Sources/BrowserPaneDropTargetView.swift
  • Sources/ContentView+MoveTabToNewWorkspace.swift
  • Sources/PaneDropRoutingSupport.swift
  • Sources/Sidebar/SidebarBonsplitTabDropDelegate.swift
  • Sources/Sidebar/SidebarBonsplitTabWorkspaceDropOverlay.swift
  • Sources/TerminalPaneDropTargetView.swift
  • vendor/bonsplit

Comment thread Sources/PaneDropRoutingSupport.swift
point: localPoint(sender),
transfer: transfer
)
BonsplitTabDragSharing.finishAcceptedDrop(from: sender.draggingPasteboard)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Do not finalize a deferred drop before the move succeeds.

Line 222 calls finishAcceptedDrop immediately after queuing pendingDrop. performPendingDropIfPossible() can later reject the action or return moved == false, so the originating drag finishes even though no tab moved. Complete the drag only after the deferred move returns true. If queuing is the intended acceptance boundary, add an explicit failure or cancellation path instead of using success completion unconditionally.

This follows the PR contract that failed drop paths must not finalize the shared drag.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Sources/Sidebar/SidebarBonsplitTabWorkspaceDropOverlay.swift` at line 222,
Move the BonsplitTabDragSharing.finishAcceptedDrop call out of the immediate
deferred-drop path and invoke it only after performPendingDropIfPossible()
confirms moved == true. Ensure rejected or unsuccessful pending drops leave the
shared drag unfinished, or add an explicit failure/cancellation path if queuing
remains the acceptance boundary.

cmux reload-cloud added 2 commits August 12, 2026 13:08
…wide-tabs

# Conflicts:
#	Sources/BrowserPaneDropTargetView.swift
#	Sources/DockSplitStore.swift
#	Sources/TerminalPaneDropTargetView.swift
#	Sources/Workspace.swift
#	vendor/bonsplit
@cursor

cursor Bot commented Aug 12, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@vendor/bonsplit`:
- Line 1: Restore the missing drag regression coverage in the Bonsplit host
tests: update TabBarDragEventRoutingTests and its event helper to exercise
Control-click rejection in TabBarView.trackTabMouseDown, including the
appropriate modifier flags, while preserving the existing double-click arming
case. Also add or retain a sidebar/workspace reorder regression test in the
appropriate test suite.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 640f3cd8-2f95-4dca-8e3e-cdb5c1a1ce41

📥 Commits

Reviewing files that changed from the base of the PR and between 76be87b and bd222b3.

📒 Files selected for processing (1)
  • vendor/bonsplit

Comment thread vendor/bonsplit
@@ -1 +1 @@
Subproject commit 5b61b184336756deb0c435e1f79dd1c839eb0281
Subproject commit 18f3f8bc2ac3019d0f30b41586f4785950af6de7

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Retain the missing drag regression coverage in this revision.

TabBarView.trackTabMouseDown rejects Control-clicks, but TabBarDragEventRoutingTests only covers double-click arming and its event helper uses empty modifier flags. The Bonsplit test tree also has no sidebar/workspace reorder regression case. Add the Control-click test and keep the sidebar/workspace reorder test in the appropriate host test suite. (raw.githubusercontent.com)

This repeats the unresolved test-coverage concern from the previous review.

#!/usr/bin/env bash
set -euo pipefail

rev=18f3f8bc2ac3019d0f30b41586f4785950af6de7

git -C vendor/bonsplit cat-file -e "${rev}^{commit}"

echo "--- drag-event modifier coverage ---"
git -C vendor/bonsplit show "${rev}:Tests/BonsplitTests/TabBarDragEventRoutingTests.swift" |
  grep -n -E 'modifierFlags|clickCount|control' || true

echo "--- sidebar/workspace test coverage ---"
git -C vendor/bonsplit grep -n -i -E 'sidebar|workspace|reorder' \
  "${rev}" -- 'Tests/**/*.swift' || true
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@vendor/bonsplit` at line 1, Restore the missing drag regression coverage in
the Bonsplit host tests: update TabBarDragEventRoutingTests and its event helper
to exercise Control-click rejection in TabBarView.trackTabMouseDown, including
the appropriate modifier flags, while preserving the existing double-click
arming case. Also add or retain a sidebar/workspace reorder regression test in
the appropriate test suite.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regression since 0.64.22: pane tab drag sporadically stops tracking (long/wide tab titles); must click-to-maximize before dragging to another pane

1 participant