Skip to content

Fix SSH image drops through terminal text route - #3755

Merged
lawrencecchen merged 6 commits into
mainfrom
fix-cmux-ssh-image-dnd
May 8, 2026
Merged

lawrencecchen merged 6 commits into
mainfrom
fix-cmux-ssh-image-dnd

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented May 8, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Route terminal text file drops through the existing SSH-aware file-drop upload planner.
  • Add a debug socket drop simulation and Docker SSH regression for cmux ssh image drops.

Verification

  • ./scripts/reload.sh --tag sshfix --launch
  • CMUX_SOCKET_PATH=/tmp/cmux-debug-sshfix.sock CMUXTERM_CLI=/tmp/cmux-cli python3 tests_v2/test_ssh_remote_image_drop_upload.py
  • git diff --check HEAD~2..HEAD

Note

Medium Risk
Changes terminal file-drop routing and focus behavior, which could affect drag-and-drop handling across terminals/editors (especially for remote/SSH sessions). Added debug-only RPC and an end-to-end Docker-based regression test reduces but doesn’t eliminate behavioral risk.

Overview
Fixes terminal drop-as-text handling by routing terminal file drops through the existing image/file transfer path (including the SSH-aware upload planner), instead of a separate “insert paths as text” shortcut.

Introduces FileDropTextDropController.performTerminalFileDrop(...) and updates overlay/pane drop hit-testing to use it, while removing the legacy handleDropped*AsText terminal APIs and exposing GhosttyNSView.handleDroppedFileURLs for shared use.

Adds a debug-only socket method debug.terminal.simulate_file_drop (with selectable routing) plus a Python client wrapper, and a new Docker-backed regression test that validates SSH image drops upload correctly by comparing remote vs local SHA-256.

Reviewed by Cursor Bugbot for commit 9c50452. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Fixes image drag-and-drop into SSH terminals by routing all terminal drops through the SSH-aware upload planner. Adds a debug drop simulator and a Docker SSH regression test with bounded timeouts to avoid hangs.

  • Bug Fixes

    • Terminal and pane drops now call FileDropTextDropController.performTerminalFileDrop(...) in both overlay hit-testing and pane drop handlers, so images dropped in SSH sessions upload to the remote host.
    • Exposed GhosttyNSView.handleDroppedFileURLs(...) and removed the legacy “as text” path for terminal surfaces.
  • New Features

    • Added debug.terminal.simulate_file_drop RPC with route selection (terminal/direct or text_destination) and a Python wrapper in tests_v2/cmux.py; now validates params and returns clear errors.
    • Added tests_v2/test_ssh_remote_image_drop_upload.py which spins up a Docker SSH server and verifies the uploaded image hash on the remote, with bounded subprocess/CLI timeouts.

Written for commit 9c50452. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Improved terminal-targeted file-drop routing and insertion for more reliable drops and focus handling.
    • Added a debug RPC to simulate terminal file drops for testing and automation.
    • Terminal drop handler made accessible to enable broader use.
  • Bug Fixes

    • Delay computing text payload from dropped files until confirmed editable, avoiding unnecessary/empty inserts.
  • Tests

    • New end-to-end SSH remote image-drop regression test and test-client helper to simulate terminal file drops.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@vercel

vercel Bot commented May 8, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment May 8, 2026 11:05pm
cmux-staging Building Building Preview, Comment May 8, 2026 11:05pm

@coderabbitai

coderabbitai Bot commented May 8, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR consolidates terminal file-drop routing into a dedicated helper method, widens method visibility to enable cross-module access, exposes file-drop simulation via a new DEBUG RPC handler, and validates the functionality end-to-end with an SSH regression test.

Changes

Terminal File Drop Simulation

Layer / File(s) Summary
Type Visibility
Sources/GhosttyTerminalView.swift
handleDroppedFileURLs widened from fileprivate to internal.
Drop Routing Consolidation
Sources/DragOverlayRoutingPolicy.swift, Sources/FileDropOverlayViewHitTesting.swift
New performTerminalFileDrop overloads added; hit-testing now computes inserted-text only when an editable NSTextView is hit; terminal insert path delegates to FileDropTextDropController.
Pane Drop Integration
Sources/TerminalPaneDropTargetView.swift
hostedView and TerminalPanel fallback branches now call FileDropTextDropController.performTerminalFileDrop instead of inline performPanelTextDrop + insert closures.
Debug RPC Handler
Sources/TerminalController.swift
DEBUG-only debug.terminal.simulate_file_drop added to V2 dispatcher and capabilities; handler validates params, resolves panel, and dispatches either direct hosted-view simulation or text-destination simulation via FileDropTextDropController.
Test Client Helper
tests_v2/cmux.py
simulate_terminal_file_drop added to resolve panel to surface_id and invoke the debug V2 RPC with extended timeout.
SSH Regression Test Infrastructure
tests_v2/test_ssh_remote_image_drop_upload.py
Adds CLI discovery, Docker checks, subprocess/SSH helpers, readiness polling, CLI JSON invocation, workspace/surface resolution, and remote-drop-path polling.
End-to-End SSH Test
tests_v2/test_ssh_remote_image_drop_upload.py
End-to-end regression test builds a Docker SSH fixture, creates an SSH-backed workspace, simulates a terminal file-drop of a PNG, discovers the remote path printed in the terminal, verifies SHA-256 parity over SSH, and cleans up resources.

Sequence Diagram(s)

sequenceDiagram
  participant TestClient
  participant TerminalController
  participant FileDropController
  participant TerminalSurface
  TestClient->>TerminalController: debug.terminal.simulate_file_drop(surface_id, paths, route)
  TerminalController->>TerminalController: validate & resolve panel
  alt route == terminal/direct
    TerminalController->>TerminalSurface: debugSimulateFileDrop(paths)
  else route == text_destination
    TerminalController->>FileDropController: performTerminalFileDrop(workspace, panelId, hostedView, urls, window)
    FileDropController->>TerminalSurface: handleDroppedFileURLs(urls)
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐇 A rabbit scampers through the code,
Dropping files where terminals glow,
Paths hop ssh, hashes learn the road,
Tiny PNGs make the pixels show,
Hooray — the drops arrive, intact and bold.


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore

❌ Failed checks (1 error, 1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Cmux Swiftui State Layout ❌ Error PR introduces new ObservableObject classes with @Published properties. Per swiftui-state-layout.md, new cmux state should use @Observable+@State instead of ObservableObject+@published. Replace TerminalSurface and SearchState classes with @Observable macro and @State properties per modern SwiftUI patterns.
Docstring Coverage ⚠️ Warning Docstring coverage is 5.88% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Cmux Swift Actor Isolation ❓ Inconclusive No result was produced after verification. Marking as INCONCLUSIVE. Re-run the check or adjust instructions to produce a final result.
✅ Passed checks (12 passed)
Check name Status Explanation
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 Blocking Runtime ✅ Passed Production Swift code introduces no blocking/timing synchronization. DEBUG-only code using v2MainSync follows established codebase patterns and is exempt as test scaffolding.
Cmux No Hacky Sleeps ✅ Passed PR contains no TypeScript, JavaScript, or shell changes. Swift changes excluded. Test code uses bounded timeouts with real event checks—allowed exception.
Cmux Swift Concurrency ✅ Passed No violations of Swift concurrency modernization rules detected. New code avoids legacy async patterns; uses synchronous returns and pre-existing AppKit boundary crossing mechanisms only.
Cmux Swift @Concurrent ✅ Passed All Swift functions in PR are synchronous. FileDropTextDropController is @MainActor-isolated. No nonisolated async, missing @concurrent, or concurrent isolation violations found.
Cmux Swift File And Package Boundaries ✅ Passed 82 DEBUG-only lines in TerminalController qualifies as focused bug fix exception (under 250-line threshold). Production logic properly isolated. No mixed responsibilities.
Cmux Swift Logging ✅ Passed All Swift code changes comply with logging rules. No print/debugPrint/dump/NSLog found in new production code. Debug RPC handler properly guarded with #if DEBUG.
Cmux Architecture Rethink ✅ Passed Unified drop routing consolidation. No timing repairs, observers, locks, or duplicate wiring introduced. Uses existing v2MainSync pattern. Clear ownership and invariants maintained.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed No new user-visible NSWindow, NSPanel, NSWindowController, or WindowGroup code. NSWindow? parameters are method arguments only.
Title check ✅ Passed The title 'Fix SSH image drops through terminal text route' directly describes the primary change: fixing SSH image drops by routing them through the terminal text route via the unified FileDropTextDropController.
Description check ✅ Passed The pull request description addresses all key template sections: Summary clearly states what changed and why, Verification provides specific testing steps, and a comprehensive checklist is included with all items addressed.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-cmux-ssh-image-dnd

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 and usage tips.

@greptile-apps

greptile-apps Bot commented May 8, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Routes all terminal text-drop paths through the new FileDropTextDropController.performTerminalFileDrop shared entry point, ensuring SSH-aware upload planning and consistent focus management are applied whether the drop originates from the overlay hit-test, pane drop target, or the new debug RPC. Removes the now-redundant handleDroppedFileURLsAsText/handleDroppedURLsAsText helpers and adds a Docker SSH end-to-end regression test with SHA-256 integrity verification.

  • Unified terminal drop entry point: Both FileDropOverlayViewHitTesting and TerminalPaneDropTargetView now call performTerminalFileDrop; the insertedText guard that previously prevented images from reaching the SSH planner is removed from the terminal branch.
  • Debug RPC: debug.terminal.simulate_file_drop (DEBUG-only, registered in the capability list) accepts a route parameter to exercise either the direct or text-destination code path, with a corresponding Python helper in tests_v2/cmux.py.
  • Regression test: test_ssh_remote_image_drop_upload.py spins up a Docker SSH container, drops a 1×1 PNG via simulate_terminal_file_drop, and compares local vs remote SHA-256; all subprocesses use explicit timeouts.

Confidence Score: 5/5

Safe to merge; the core routing change is well-contained and the previously flagged dual-wiring issues are resolved.

All three terminal drop entry points (overlay hit-test, pane drop target, debug RPC) now converge on performTerminalFileDrop, which owns both the SSH-aware planner dispatch and the focus transition. The removal of handleDroppedFileURLsAsText eliminates the divergent path that caused the original regression. The only findings are a named-pasteboard accumulation in a DEBUG-only helper and a fragile regex in the regression test — neither affects production behavior.

Sources/GhosttyTerminalView.swift — the debugSimulateFileDrop helper creates named NSPasteboard objects without releasing them; worth a one-line follow-up if the test suite calls this heavily.

Important Files Changed

Filename Overview
Sources/DragOverlayRoutingPolicy.swift Adds two performTerminalFileDrop overloads; one workspace/panel-context overload for pane and overlay drops, one GhosttyNSView overload with graceful fallback when workspace context can't be resolved.
Sources/FileDropOverlayViewHitTesting.swift Moves insertedText guard inside the textView branch so terminal drops route through the SSH-aware planner unconditionally.
Sources/GhosttyTerminalView.swift Removes handleDroppedFileURLsAsText/handleDroppedURLsAsText; widens handleDroppedFileURLs to internal. DEBUG debugSimulateFileDrop creates named NSPasteboard objects without releasing them.
Sources/TerminalController.swift Adds debug.terminal.simulate_file_drop RPC (DEBUG-only) with route selection, consistent with existing debug method patterns.
Sources/TerminalPaneDropTargetView.swift Both hostedView and TerminalPanel branches now call the shared performTerminalFileDrop helper.
tests_v2/cmux.py Adds simulate_terminal_file_drop Python wrapper; discarding _call return value is safe because _call raises on error responses.
tests_v2/test_ssh_remote_image_drop_upload.py Docker SSH regression test with SHA-256 integrity check; _wait_for_remote_drop_path tightly couples to a hardcoded remote path regex.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[File Drop Event] --> B{Drop Source}
    B --> |Overlay hit-test| C[FileDropOverlayViewHitTesting\nperformFileDropAsText]
    B --> |Pane drop target| D[TerminalPaneDropTargetView\nhandleFileDropAsText]
    B --> |Debug RPC| E[TerminalController\nv2DebugSimulateTerminalFileDrop]

    C --> F{Target under cursor}
    F --> |NSTextView| G[insertedText check\n→ insert text]
    F --> |GhosttyNSView terminal| H[performTerminalFileDrop\nterminal: overload]

    D --> I[performTerminalFileDrop\nworkspace: overload]
    E --> |route=text_destination| I
    E --> |route=terminal| J[debugSimulateFileDrop\nNSPasteboard path]

    H --> K{Workspace/panel\nresolvable?}
    K --> |Yes| L[performPanelTextDrop\n→ focus + insert]
    K --> |No fallback| M[handleDroppedFileURLs\ndirect]

    I --> L
    L --> N[handleDroppedURLs\n→ executePreparedImageTransfer]
    N --> O{SSH remote?}
    O --> |Yes| P[Upload to remote host]
    O --> |No| Q[Local insert / path text]
Loading

Reviews (4): Last reviewed commit: "fix: tighten ssh drop debug helper" | Re-trigger Greptile

Comment thread Sources/DragOverlayRoutingPolicy.swift Outdated
Comment on lines +131 to +147
static func performTerminalTextDrop(
workspace: Workspace,
panelId: UUID,
hostedView: GhosttySurfaceScrollView,
urls: [URL],
window: NSWindow?
) -> Bool {
performPanelTextDrop(
workspace: workspace,
panelId: panelId,
focusIntent: .terminal(.surface),
window: window,
insert: {
hostedView.handleDroppedURLs(urls)
}
)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Misleading abstraction name on the new helper

performTerminalTextDrop is a function inside FileDropTextDropController (all about text drops), but its closure now calls hostedView.handleDroppedURLs(urls), which routes through the full SSH-aware executePreparedImageTransfer planner — not text insertion. A future engineer reading the name "TextDrop" will assume this path is limited to text insertion and may incorrectly bypass it for binary/image files, or wire another caller through handleDroppedURLsAsText instead. The name should reflect the actual invariant (e.g., performTerminalFileDrop or performSSHAwareTerminalDrop).

Rule Used: Flag Swift fixes that patch symptoms while leaving... (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed in e8d197a by renaming performTerminalTextDrop to performTerminalFileDrop so the helper name matches the SSH-aware file upload behavior.

— Claude Code

Comment on lines +12431 to +12465
v2MainSync {
guard let panel = resolveTerminalPanel(from: surfaceId, tabManager: tabManager) else {
return
}

switch route {
case "terminal", "direct":
let handled = panel.hostedView.debugSimulateFileDrop(paths: paths)
result = handled
? .ok(["handled": true, "route": "terminal"])
: .err(code: "internal_error", message: "Terminal drop simulation failed", data: nil)
case "text", "text_destination", "pane_text":
guard let workspace = tabManager.tabs.first(where: { $0.id == panel.workspaceId }) else {
result = .err(code: "not_found", message: "Workspace not found", data: [
"workspace_id": panel.workspaceId.uuidString
])
return
}
let urls = paths.map { URL(fileURLWithPath: $0).standardizedFileURL }
let handled = FileDropTextDropController.performTerminalTextDrop(
workspace: workspace,
panelId: panel.id,
hostedView: panel.hostedView,
urls: urls,
window: panel.hostedView.window
)
result = handled
? .ok(["handled": true, "route": "text_destination"])
: .err(code: "internal_error", message: "Text destination drop simulation failed", data: nil)
default:
result = .err(code: "invalid_params", message: "Unknown route", data: [
"route": route
])
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Dual wiring of terminal-drop behaviour remains after this PR

The text_destination branch calls FileDropTextDropController.performTerminalTextDrop (which goes through hostedView.handleDroppedURLs → surfaceView.handleDroppedFileURLs), while FileDropOverlayViewHitTesting.insert(_:into:) calls terminal.handleDroppedFileURLs directly with its own separate focus-management block. Both paths invoke the SSH-aware planner, but they arrive there through independent wrappers with independent focus side-effects. If focus logic is updated in one path it must also be kept in sync with the other; the last pre-PR regression was caused by exactly this kind of divergence. The architectural fix would be a single shared entry point that owns both the planner dispatch and the subsequent focus transition — the new performTerminalTextDrop is a step in the right direction, but the FileDropOverlayViewHitTesting path does not yet use it.

Rule Used: Flag Swift fixes that patch symptoms while leaving... (source)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in e8d197a by routing overlay terminal drops through FileDropTextDropController.performTerminalFileDrop, so pane, overlay, and debug text-destination drops use the shared terminal file-drop helper and focus path.

— Claude Code

@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 `@tests_v2/test_ssh_remote_image_drop_upload.py`:
- Around line 124-125: Change the broad except Exception to catch
json.JSONDecodeError (or ValueError) specifically and re-raise the cmuxError
while preserving the original traceback using "from exc"; locate the except
block that currently does "except Exception as exc:" around the json.loads call
and update it to "except json.JSONDecodeError as exc:" (or ValueError if json
not imported) and then raise cmuxError(f"Invalid JSON output for {'
'.join(args)}: {proc.stdout!r} ({exc})") from exc so the original exception
chain is preserved.
🪄 Autofix (Beta)

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

Run ID: ab4b1e5f-b7c6-4ad1-a647-33a7dc78a278

📥 Commits

Reviewing files that changed from the base of the PR and between a89aaf1 and cd943f4.

📒 Files selected for processing (7)
  • Sources/DragOverlayRoutingPolicy.swift
  • Sources/FileDropOverlayViewHitTesting.swift
  • Sources/GhosttyTerminalView.swift
  • Sources/TerminalController.swift
  • Sources/TerminalPaneDropTargetView.swift
  • tests_v2/cmux.py
  • tests_v2/test_ssh_remote_image_drop_upload.py

Comment thread tests_v2/test_ssh_remote_image_drop_upload.py Outdated

@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/TerminalController.swift`:
- Line 3024: The capability string "debug.terminal.simulate_file_drop" in
TerminalController.swift is being advertised unconditionally; wrap its inclusion
in the same DEBUG compile condition as the dispatcher and implementation so it’s
only present in debug builds (e.g., enclose the capability entry in the same `#if`
DEBUG / `#endif` block used to register the dispatcher and implement the handler),
ensuring the advertised capability and the handler remain consistent across
build configurations.

In `@tests_v2/test_ssh_remote_image_drop_upload.py`:
- Around line 32-37: The subprocess helper _run currently calls subprocess.run
without a timeout and should be extended to accept a timeout parameter (e.g.,
timeout: float | None = DEFAULT_TIMEOUT) and pass it to subprocess.run, raising
on timeout; likewise update _run_cli_json to accept and forward the timeout.
Update all callers of _run and _run_cli_json in the test file to pass a sensible
default timeout (small value) and override it for slow operations like image
builds or docker pulls (longer timeout). Reference the helper functions _run and
_run_cli_json and ensure the timeout is threadable per-call so CI won't hang on
docker/ssh/cli wedges.
🪄 Autofix (Beta)

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

Run ID: 6bd448bc-2d8c-4ac1-9951-17c416fd887a

📥 Commits

Reviewing files that changed from the base of the PR and between cd943f4 and e8d197a.

📒 Files selected for processing (5)
  • Sources/DragOverlayRoutingPolicy.swift
  • Sources/FileDropOverlayViewHitTesting.swift
  • Sources/TerminalController.swift
  • Sources/TerminalPaneDropTargetView.swift
  • tests_v2/test_ssh_remote_image_drop_upload.py

Comment thread Sources/TerminalController.swift Outdated
Comment thread tests_v2/test_ssh_remote_image_drop_upload.py Outdated

@cursor cursor 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit aab9918. Configure here.

Comment thread Sources/GhosttyTerminalView.swift

@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 `@Sources/TerminalController.swift`:
- Around line 12429-12470: The route string (variable `route`) must be validated
before entering the `v2MainSync` block so an invalid route doesn't get masked by
the `resolveTerminalPanel(from:tabManager:)` guard; move or duplicate the
`switch route { ... default: result = .err(code: "invalid_params", message:
"Unknown route", data: ["route": route]) }` check to run immediately after
computing `route` and before calling `v2MainSync`, returning early on invalid
routes, otherwise proceed into `v2MainSync` and keep the existing panel
resolution and per-route handling (`terminal/direct` and
`text/text_destination/pane_text`) that set `result`.
🪄 Autofix (Beta)

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

Run ID: 83c12790-967a-4047-a5ec-42a17940dc21

📥 Commits

Reviewing files that changed from the base of the PR and between e8d197a and aab9918.

📒 Files selected for processing (2)
  • Sources/TerminalController.swift
  • tests_v2/test_ssh_remote_image_drop_upload.py

Comment thread Sources/TerminalController.swift

This branch was successfully deployed

1 active deployment
Preview – cmux — 9c504525 Deployed May 8, 2026 by vercel[bot]
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.

1 participant