Skip to content

Remove legacy OS file-drop routing (STA-6940 PR6/6) - #26385

Merged
brennanb2025 merged 37 commits into
mainfrom
brennanb2025/sta-6940-pr6-remove-legacy-drops
Oct 8, 2026
Merged

brennanb2025 merged 37 commits into
mainfrom
brennanb2025/sta-6940-pr6-remove-legacy-drops

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 32 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​463 $\color{#cf222e}{\Huge{\mathbf{−}}}$​1442 $\color{#cf222e}{\Huge{\mathbf{−}}}$​979
Prod 22 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​91 $\color{#cf222e}{\Huge{\mathbf{−}}}$​658 $\color{#cf222e}{\Huge{\mathbf{−}}}$​567

ELI5

Files dropped from the operating system could reach a hidden chat, the active terminal instead of the pane under the cursor, or the active workspace instead of the one under the drop. Preload cancelled the real event, guessed its destination from element attributes, and sent it through main to window-wide subscribers; the remaining unowned areas still defaulted to opening files in the active editor.

This is PR 6 of 6 for STA-6940. PR1–PR5 are merged on main: the earlier PRs established ownership for chat, composers, feedback, terminals, explorer, sidebar, tab strips, and editors. This final PR removes the old route: dropping on empty chrome, the dashboard popout, or a terminal divider silently does nothing and shows the not-allowed cursor. Drops on an owned surface continue to go once to that surface.

PR5 merged as d1e7d15f4c41b6d3245dba3e7b96e9865da49639; this PR has no open PR dependency. The final sync merged main commit b0fbcfd6a7e919743856dcd96198897baa92593e. The final merge preserved the 54-file PR6 diff exactly, with no overlapping-main exceptions. CI then found that removing the old drop subscription also removed an object used by an existing OS-resume test; a test-only correction keeps that object empty while the removed subscription stays absent.

What Changed

  • Delete preload's document capture drop/dragover interception, migration release rule, and blanket non-file drop cancellation; delete target breadcrumbs, routed payload types, window.api.ui.onFileDrop, its web stand-in, and both legacy Electron channels.
  • Replace the main relay module with registration of the existing fs:prepareDroppedPaths request. Keep its path limits, sender validation, macOS temporary-file copies, globally serialized copy queue, reload abort, expiry, and replacement-window cleanup.
  • Delete useGlobalFileDrop and its app-shell mount, removing active-editor fallback and global rejection toasts. Move the rejection-message formatter and its tests to native-file-drop-rejection-message because the owners still report failures they accepted; keep existing translation keys and editor-open code.
  • Remove every legacy target attribute and the temporary terminal-divider boundary. Keep the owner hook, document capture/bubble cancellation guards, path bridge, and feedback dialog's web byte upload.

Why

The element receiving the browser event already knows its destination. A parallel window-wide route recreates the ambiguity the first five PRs removed. Unowned areas need only cancellation; they should neither select a destination nor produce a refusal toast.

Retained differences from the common pattern, as approved in the plan:

  • Intended: capture listeners and nearest registered owner arbitration protect nested chats and embedded editors.
  • Intended: main prepares macOS temporary files because terminal processes cannot read the originals; the queue and consumer rules remain.
  • Intended: desktop passes paths, with existing SSH/runtime uploads and WSL mapping downstream of the captured owner.
  • Intended: cancellation-only document guards protect the web client from navigation.
  • Temporary: web and remote-runtime chat path drops still refuse through the existing owner feedback; the planned “file-byte attachment delivery for web and runtime chat” follow-up removes this limitation.

The preload release rule and legacy attributes were temporary stack scaffolding and are now gone.

Linked Issue

STA-6940: deliver operating-system file drops to the element under the cursor

Visual Proof

A separate QA agent ran this branch (head b1b93fb8af0, before the test-only fix round) as a hidden Orca dev window with an isolated profile and two folder workspaces (ws-a and ws-b), and simulated OS file drops through the Chrome DevTools Protocol. 10 of 11 scenarios passed and 1 was not applicable: terminal pane body, the gap between two panes, empty window chrome, explorer folder rows in both workspaces, the editor area, the tab strip, the project sidebar, the new-workspace card, and Orca's own explorer and tab drags. Not applicable: a drop on an inactive pane's title bar, because this build only shows a title bar on the active pane (covered by DOM-level tests). No message or toast appeared in any scenario.

1. File dropped on the left pane while the right pane is active. The quoted path lands at the left pane's prompt; the right pane is untouched and stays active.

Terminal drop goes to the pane under the cursor

2. File dropped on the gap between the two panes. Nothing happens: no path in either pane, no editor tab, no message. The same was checked on empty window chrome (top strip and status bar). Before this PR, a drop no surface owned could still be sent to the editor.

Drop on the divider does nothing

3. Explorer drop after switching to ws-b. The file lands in ws-b's inbox, the workspace the explorer shows.

Explorer drop lands in the shown workspace

4. File dropped on the editor content area. It opens as its own tab (my report.txt); the already-open readme.txt is unchanged.

Editor area drop opens the file as a tab

Not covered: real SSH, WSL and remote-runtime hosts, Linux and Windows (unit fixtures only).

Testing

  • Final GitHub Actions: passed: full run 37719775266, attempt 2 completed successfully, with all ten unit shards, relay integration, static analysis/typechecks, Linux and Windows packaging, and aggregate verification green; used one full rerun after the known Windows writer-stall flake, whose test is byte-identical to main (head f1e8f1936dba63305ed7c4f3cb02b439c14508a3).

  • I manually tested these changes locally

  • Automated tests updated and run.

The final review fixes change tests, comments, and obsolete timing entries only; the comment correction and final main sync introduce no additional production behavior change.

  • Final local Vitest: 82 suites / 656 tests passed on macOS after the main merge, using node_modules/.bin/vitest run --config config/vitest.config.ts with a non-empty, existence-checked Bash array containing all 77 requested suites, the surviving conflict paths, and all five suites using the terminal global-effects test helper; the two deleted legacy conflict paths were verified absent.
  • orca-ci-checks: application typechecks passed, followed by 22/22 static checks passing on the committed merge with --no-typecheck, including lint, code-quality, React checks, and localization verification. The initial uncommitted-merge React check included main changes through the old ancestry; the final check uses the merged main commit and passes. git diff --check passed; the install-added @pnpm/exe lockfile block was restored from main.
  • Confirmed the three end-to-end selectors against the source DOM: the tab-strip owner, the visible outer terminal surface and its leaf owner, and the title-strip owner. The scrollbar, terminal, placement, and internal file-path delivery assertions remain. Searching tests/ and src/ found no readers of the removed attribute.
  • Ran pnpm run typecheck:e2e: it still fails with 245 existing diagnostics in 136 other files, with zero diagnostics in the three edited specs. The config documents that this repository-wide check is not yet enforced. Corrected the title spec's existing nullable lookup, which accounted for the initial run's additional error.
  • The three changed end-to-end specs were not executed. This worker did not launch an app, perform an operating-system drag, or run live Windows/Linux/SSH/WSL/mobile checks.

Both new assertions failed before removal on PR5 head 2ef4f37349a. The finalized fixtures were also replayed with the baseline preload/shared modules restored from that head: two failures, followed by two passes after restoring the final sources (the owner case was excluded by the regression filter):

  • src/preload/preload-file-drop-absence.test.ts: preload must register no document drop or dragover listener (PR5 registered both).
  • src/renderer/src/lib/os-file-drop-preload-integration.test.tsx, “refuses unowned chrome without opening, uploading, or showing a toast”: an unowned drag/drop must end at dropEffect = none, without path resolution, preparation or relay delivery (PR5 kept the copy cursor).

terminal-pane-element-file-drop.test.tsx additionally asserts divider and unowned-chrome drops are cancelled with dropEffect = none, with no editor open, upload, preparation, terminal delivery or toast. The divider already refused on PR5; here that protection works without its temporary boundary.

Exact 77-file Vitest list
src/main/window/attach-main-window-services.test.ts
src/main/window/dragged-temp-file-copy.test.ts
src/main/window/dropped-path-preparation-ipc.test.ts
src/main/window/dropped-path-preparation.test.ts
src/preload/app-restart-checkpoint-routing.test.ts
src/preload/preload-file-drop-absence.test.ts
src/renderer/src/components/NewWorkspaceComposerCard.file-drop.test.tsx
src/renderer/src/components/NewWorkspaceComposerCard.quick-file-drop.test.tsx
src/renderer/src/components/automations/automation-editor-prompt-options.test.ts
src/renderer/src/components/editor/editor-dropped-file-open.escaping-link.test.ts
src/renderer/src/components/editor/editor-dropped-file-open.test.ts
src/renderer/src/components/editor/use-editor-group-file-drop-owner.remote.test.tsx
src/renderer/src/components/editor/use-editor-group-file-drop-owner.test.tsx
src/renderer/src/components/native-chat/NativeChatComposer.test.tsx
src/renderer/src/components/native-chat/native-chat-attachment-upload.test.ts
src/renderer/src/components/native-chat/native-chat-composer-autogrow.test.tsx
src/renderer/src/components/native-chat/native-chat-composer-composition.test.tsx
src/renderer/src/components/native-chat/native-chat-composer-drop-scope.test.tsx
src/renderer/src/components/native-chat/native-chat-composer-field-resume.test.tsx
src/renderer/src/components/native-chat/native-chat-composer-ime-file-drop.test.tsx
src/renderer/src/components/native-chat/native-chat-composer-prompt-recall.test.tsx
src/renderer/src/components/native-chat/native-chat-composer-workspace-file-drop.test.tsx
src/renderer/src/components/native-chat/native-chat-element-file-drop.test.tsx
src/renderer/src/components/native-chat/native-chat-external-attachments-destination.test.tsx
src/renderer/src/components/native-chat/native-chat-floating-file-drop.test.tsx
src/renderer/src/components/native-chat/native-chat-pane-file-drop.test.tsx
src/renderer/src/components/native-chat/native-chat-paste-routing.test.tsx
src/renderer/src/components/native-chat/native-chat-queue-send-confirm.test.tsx
src/renderer/src/components/native-chat/native-chat-structured-send-composition-clear.test.tsx
src/renderer/src/components/native-chat/native-chat-view-file-drop.test.tsx
src/renderer/src/components/native-chat/use-native-chat-external-attachments.test.tsx
src/renderer/src/components/native-chat/use-native-chat-file-attachment-actions.test.tsx
src/renderer/src/components/right-sidebar/useFileExplorerDragDrop.os-file-drop.test.tsx
src/renderer/src/components/right-sidebar/useFileExplorerImport.committed-scope.test.tsx
src/renderer/src/components/right-sidebar/useFileExplorerImport.os-file-drop.test.tsx
src/renderer/src/components/right-sidebar/useFileExplorerImport.remote.test.tsx
src/renderer/src/components/sidebar/Sidebar.test.tsx
src/renderer/src/components/sidebar/WorktreeList.status-lane-lineage-drop.test.tsx
src/renderer/src/components/sidebar/use-feedback-image-drop.test.tsx
src/renderer/src/components/sidebar/useSidebarProjectDrop.os-file-drop.test.tsx
src/renderer/src/components/sidebar/workspace-status.test.ts
src/renderer/src/components/tab-bar/TabBar.os-file-drop.test.tsx
src/renderer/src/components/tab-group/TabGroupPanel.os-file-drop.test.tsx
src/renderer/src/components/terminal-pane/TerminalPaneHeaderOverlay.test.tsx
src/renderer/src/components/terminal-pane/terminal-drop-handler.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-internal-handler.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-local-workspace.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-pane-resolution.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-runtime-catalog-owner.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-transport-owner.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-worktree-path.test.ts
src/renderer/src/components/terminal-pane/terminal-pane-element-file-drop.test.tsx
src/renderer/src/hooks/composer-native-file-drop.test.ts
src/renderer/src/hooks/composer-state/attachment-drop-failure.test.tsx
src/renderer/src/hooks/composer-state/attachment-drop-lifetime.test.tsx
src/renderer/src/hooks/composer-state/composer-attachment-target.test.ts
src/renderer/src/hooks/use-os-file-drop-owner.test.tsx
src/renderer/src/hooks/useComposerState.integration.test.ts
src/renderer/src/lib/local-file-access.test.ts
src/renderer/src/lib/native-file-drop-rejection-message.test.ts
src/renderer/src/lib/os-file-drop-cancellation-guard.test.ts
src/renderer/src/lib/os-file-drop-preload-integration.test.tsx
src/renderer/src/web/web-preload-api-composition.test.ts
src/renderer/src/web/web-preload-api-filesystem.test.ts
src/shared/native-file-drop.test.ts
src/renderer/src/lib/workspace-file-drag.test.ts
src/renderer/src/components/sidebar/use-workspace-status-drop.test.ts
src/renderer/src/components/sidebar/workspace-kanban-sidebar-drop.test.ts
src/renderer/src/components/sidebar/workspace-kanban-card-pointer-drag-dom.test.ts
src/renderer/src/components/sidebar/worktree-sidebar-pointer-drag-dom.test.ts
src/renderer/src/components/tab-group/tab-drag-pointer.test.ts
src/renderer/src/components/tab-group/tab-drag-pointer-sensor.test.ts
src/renderer/src/components/tab-group/TabGroupSplitLayout.drag.test.tsx
src/renderer/src/lib/pane-manager/pane-drag-reorder.test.ts
src/renderer/src/lib/pane-manager/pane-drop-no-op.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-shell.test.ts
src/renderer/src/components/terminal-pane/terminal-drop-path-writer.test.ts
Removed or replaced legacy assertions (PR3–PR5 fixtures)
  • NewWorkspaceComposerCard.file-drop.test.tsx and native-chat-composer-composition.test.tsx: remove the assertions that data-native-file-drop-target is absent. The attribute has been removed from all code and fixtures; live owner delivery assertions remain.
  • useComposerState.integration.test.ts: remove both onFileDrop-not-called assertions (after mounting and after unmounting two composers). The method no longer exists; composer lifecycle assertions remain.
  • use-native-chat-file-attachment-actions.test.tsx: remove the obsolete “does not subscribe to legacy window drops” assertion/test. Picker delivery and cancellation tests remain.
  • native-chat-composer-drop-scope.test.tsx: replace the two exact legacy send assertions for the unscoped-composer and editor control drops with no-send assertions. They are now unowned controls; both attachment caches must still stay empty. Remove the fixture's main-relay echo and singleton preload setup.
  • native-chat-element-file-drop.test.tsx: replace the exact legacy terminal send assertion after dropping outside a portaled chat with no-send. The chat still attaches exactly once, and its drop cannot reach the ancestor. Remove legacy target attributes from the disabled-chat and workspace-card fixtures.
  • native-chat-pane-file-drop.test.tsx: replace the absent legacy-target-attribute assertion on an empty chat with a present owner-attribute assertion, preserving its refusal boundary.
  • terminal-pane-element-file-drop.test.tsx: remove the no-broadcast assertion and absent legacy-terminal-attribute assertion for each title/body case. The API/attribute are gone; exact preparation and terminal delivery counts, no legacy IPC, no activation, and inactive-pane isolation remain.
  • use-terminal-pane-global-effects-file-drop.test.ts: remove the retired three-case no-onFileDrop-subscription suite and its callback fixture. The hook no longer has that API; element-owner tests cover active/hidden/retired panes.
  • os-file-drop-preload-integration.test.tsx: replace the old unmarked-chrome copy-cursor/one-legacy-send assertions with guard refusal. Remove the nested-legacy-child test's copy cursor, one relay send, no preparation and no owner delivery assertions, since there are no legacy child barriers.

Remaining onFileDrop test stubs and legacy target fixtures were removed without changing their functional assertions. All other owner assertions remain. Shared breadcrumb/payload-construction/relay-validator suites and preload-release tests were removed with those deleted implementations; file limits are now tested directly by the retained path validator, copy/preparation semantics by the preparation suites, and request registration/sender/lifetime validation by dropped-path-preparation-ipc.test.ts. Legacy relay tests for target-field preservation, window broadcast order, rejection forwarding, send exceptions, and relay listener registration/removal have no remaining production contract.

Review

The coordinator arranges independent review and rendered checks. This worker did not run review loops, mark the PR ready, merge, or enable auto-merge.

Agent skill upstream boundary

  • Not applicable; no upstream skill-installer content is copied or translated.

Notes

Read the remote wire compatibility guide and searched src/main/runtime, relay code, mobile/, and the web client. terminal:file-drop and terminal:file-dropped-from-preload were local Electron IPC only; the web method was a no-op and no paired-client RPC, stream opcode, or host publication is removed. fs:prepareDroppedPaths and its response shape remain. Monaco's dropIntoEditor remains disabled on all five editor surfaces; both sidebar status readers still require Orca's drag types, and the hybrid file/text tests pass.

Local/SSH/runtime/WSL/folder ownership suites passed. Live Windows/Linux/SSH/mobile execution and real operating-system drag behavior were not verified. Author: @BrennanKB5.

Checklist

  • Small and focused final cleanup for STA-6940
  • Problem, user-facing change, mechanism, and rationale explained
  • Before/after rendered evidence attached (coordinator pending)
  • Implementation and compatibility checked
  • Cross-platform, SSH/remote, mobile and folder-workspace impact considered
  • Named tests, applicable typechecks, web build, lint and required repository checks pass

…lumbing' into brennanb2025/sta-6940-pr3-chat-composer-feedback
Preserve element-owned drops while integrating the upstream multi-file
paperclip picker and all-or-nothing attachment limit.

Resolve NativeChatComposer through its existing file-drop hook, keep the
host-qualified attachment resolver with the current workspace state type,
retain captured destinations and unmount checks through attachment reads
and uploads, and keep attachment actions picker-only without a broadcast
subscriber. Update picker fixtures and the upstream subscriber test.

Validation: web and Node typechecks, full Oxlint on 39 PR3 files, and
372 tests across 45 explicitly named files pass.
…omposer-feedback' into brennanb2025/sta-6940-pr4-terminal-owners
Resolve NativeChatComposerField imports: keep PR3's flushSync (interrupted
composition settlement) and drop the old ImageOff notice import that main's
notice card replaced. Adapt PR3's IME file-drop test to main's notices and
@-file suggestion props.
…or own OS drops

STA-6940 PR5. The file explorer tree, the project sidebar, each editor
group's tab strip and its editor area now take OS file drops on their own
element through the shared owner hook, with identity from their own render
(the explorer's shown workspace and target row, the tab strip's and editor
group's worktree and group) instead of the active worktree. The explorer and
sidebar broadcast subscribers and their legacy drop markers are deleted;
editor-open moves out of useGlobalFileDrop into editor-dropped-file-open,
which the legacy unmarked-chrome route still uses until PR6.
@brennanb2025

Copy link
Copy Markdown
Contributor Author

Review summary

This PR went through an independent code review, a fix round, a focused re-review, and a rendered check in a real Orca window. The reviewers and the rendered-check agent did not write the code. Their reports are summarized here because they were kept off GitHub while the work was in progress.

First review (head b1b93fb8af0): no app bugs, two cleanup items

The reviewer searched the whole tree (app, mobile, config, tests) for remnants of the old pipeline and found none in the shipped app. It confirmed what this PR keeps: the main-process preparation of dropped paths (including the macOS screenshot-copy queue and its limits), the file-path bridge, the shared drop hook, the document guards, the feedback dialog's image upload, Monaco's drop-into-editor staying off, and Orca's own internal drags. Each remaining error message comes from a surface that actually accepted the drop and is shown once. The removed channels were local to the desktop app, never exchanged with paired clients or remote hosts. Every removed test either covered deleted code or has a replacement; two new regression tests fail on PR 5's code and pass here. It found:

  1. Three end-to-end tests (tab-strip scrolling, the core-flow terminal check, and title-bar placement) still looked for the removed drop attribute, so they would time out before reaching what they check.
  2. The feedback dialog's test still simulated the old preload route, and a few comments described it.

Fix round (head 9f96644b11d), re-review: approved, one comment reworded

The three tests now target the elements that really render (the strip's own drop root, the terminal surface and each pane, the title bar's own drop root) and keep all their original checks; the outer terminal wrapper deliberately stays without a drop target so the gap between panes keeps refusing drops. The feedback test uses the real guard and checks that drops outside the dialog, or after it closes, end with the "not allowed" cursor, no attachment and no message. Two timing entries for deleted test files were removed. The re-review traced every new selector to the component that renders it, and found one comment that overstated where an editor drop opens; it was reworded. The end-to-end typecheck reports the same diagnostics on main (this PR adds none and removes one); no CI job runs it.

Rendered check (head b1b93fb8af0): 10 of 11 scenarios passed, 1 not applicable

Drops on a terminal pane went to that pane while the other stayed active; drops on the gap between panes and on empty window chrome did nothing, with no message; explorer drops landed in the displayed workspace's folder, including after switching workspaces; the editor area and tab strip opened the file without touching the open file's text; the project sidebar offered to open the folder; the new-workspace card refused the drop; moving a file inside the explorer and reordering tabs still work. Screenshots are in the description. The later fix round changed only tests, one comment and timing data.

Not verified

  • A drop on an inactive pane's title bar: this build only shows a pane title bar on the active pane, so the rendered check could not reach one (covered by DOM-level tests).
  • The three repaired end-to-end tests were checked against the source, not run.
  • Real SSH, WSL and remote-runtime hosts, Linux and Windows.

Final sync with main (head f1e8f1936db)

PR 5 merged, so this PR no longer depends on anything open. The one comment the re-review flagged was reworded, then main (b0fbcfd6a7e) was merged once. Ten files conflicted only because this branch carried PR 5's pre-squash copy; they now match main plus this PR's own changes. Compared line by line, this PR's diff against main is the reviewed change plus two lines: the reworded comment and ui: {} in a shared terminal test fixture, which CI caught (this PR removes the old drop listener from that namespace, and a window-focus test still reads it).

Local: CI's static checks (lint, code quality, localization, typecheck) and 82 test files (656 tests) passed. CI on f1e8f1936db: 19 passed, 18 skipped because the changed paths don't need them, none failed. That covers all ten test shards, both packages and the relay integration. The first attempt hit the known Windows profile-state-writer-stall timeout in a file this PR doesn't touch; one full rerun passed.

With this PR, STA-6940 is complete: every surface owns its own OS file drops, and nothing guesses a target from the active pane or workspace.

@brennanb2025
brennanb2025 marked this pull request as ready for review October 8, 2026 03:36
@coderabbitai

coderabbitai Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 52103340-bd74-4243-a731-268e6fdb8362
📥 Commits

Reviewing files that changed from the base of the PR and between b0fbcfd and f1e8f19.

📒 Files selected for processing (54)
  • config/scripts/ci-shard-timings.json
  • src/main/window/attach-main-window-services.test.ts
  • src/main/window/attach-main-window-services.ts
  • src/main/window/dropped-path-preparation-ipc.test.ts
  • src/main/window/dropped-path-preparation-ipc.ts
  • src/main/window/dropped-path-preparation.test.ts
  • src/main/window/native-file-drop-relay.test.ts
  • src/main/window/native-file-drop-relay.ts
  • src/preload/api/ui-bridge-clipboard-and-window-controls.ts
  • src/preload/api/ui-window-api.ts
  • src/preload/index.ts
  • src/preload/preload-file-drop-absence.test.ts
  • src/preload/preload-native-file-drop-release.test.ts
  • src/preload/preload-runtime-support.ts
  • src/renderer/src/app-shell/use-app-shell-services.ts
  • src/renderer/src/components/NewWorkspaceComposerCard.file-drop.test.tsx
  • src/renderer/src/components/NewWorkspaceComposerCard.quick-file-drop.test.tsx
  • src/renderer/src/components/editor/editor-dropped-file-open.ts
  • src/renderer/src/components/editor/use-editor-group-file-drop-owner.ts
  • src/renderer/src/components/native-chat/NativeChatComposer.test.tsx
  • src/renderer/src/components/native-chat/NativeChatPaneFileDropSurface.tsx
  • src/renderer/src/components/native-chat/native-chat-composer-composition.test.tsx
  • src/renderer/src/components/native-chat/native-chat-composer-drop-scope.test.tsx
  • src/renderer/src/components/native-chat/native-chat-composer-prompt-recall.test.tsx
  • src/renderer/src/components/native-chat/native-chat-element-file-drop.test.tsx
  • src/renderer/src/components/native-chat/native-chat-pane-file-drop.test.tsx
  • src/renderer/src/components/native-chat/native-chat-paste-routing.test.tsx
  • src/renderer/src/components/native-chat/native-chat-queue-send-confirm.test.tsx
  • src/renderer/src/components/native-chat/native-chat-structured-send-composition-clear.test.tsx
  • src/renderer/src/components/native-chat/use-native-chat-file-attachment-actions.test.tsx
  • src/renderer/src/components/new-workspace/use-new-workspace-composer-file-drop.ts
  • src/renderer/src/components/right-sidebar/useFileExplorerImport.committed-scope.test.tsx
  • src/renderer/src/components/right-sidebar/useFileExplorerImport.os-file-drop.test.tsx
  • src/renderer/src/components/right-sidebar/useFileExplorerImport.ts
  • src/renderer/src/components/sidebar/use-feedback-image-drop.test.tsx
  • src/renderer/src/components/sidebar/useSidebarProjectDrop.os-file-drop.test.tsx
  • src/renderer/src/components/sidebar/useSidebarProjectDrop.ts
  • src/renderer/src/components/terminal-pane/TerminalPaneSurface.tsx
  • src/renderer/src/components/terminal-pane/terminal-pane-element-file-drop.test.tsx
  • src/renderer/src/components/terminal-pane/use-terminal-pane-file-drop-owner.ts
  • src/renderer/src/components/terminal-pane/use-terminal-pane-global-effects-file-drop.test.ts
  • src/renderer/src/components/terminal-pane/use-terminal-pane-global-effects-test-harness.ts
  • src/renderer/src/hooks/useComposerState.integration.test.ts
  • src/renderer/src/lib/native-file-drop-rejection-message.test.ts
  • src/renderer/src/lib/native-file-drop-rejection-message.ts
  • src/renderer/src/lib/os-file-drop-preload-integration.test.tsx
  • src/renderer/src/web/preload-api/web-ui-api.ts
  • src/renderer/src/web/web-preload-api-composition.test.ts
  • src/shared/native-file-drop-preparation.ts
  • src/shared/native-file-drop.test.ts
  • src/shared/native-file-drop.ts
  • tests/e2e/golden-core-flows.spec.ts
  • tests/e2e/tab-strip-scroll-render-isolation.spec.ts
  • tests/e2e/terminal-pane-title-strip-placement.spec.ts
💤 Files with no reviewable changes (19)
  • src/renderer/src/components/terminal-pane/TerminalPaneSurface.tsx
  • src/renderer/src/components/NewWorkspaceComposerCard.file-drop.test.tsx
  • src/renderer/src/components/native-chat/native-chat-composer-composition.test.tsx
  • src/preload/preload-native-file-drop-release.test.ts
  • src/main/window/attach-main-window-services.test.ts
  • src/main/window/native-file-drop-relay.test.ts
  • src/renderer/src/components/terminal-pane/use-terminal-pane-global-effects-file-drop.test.ts
  • src/renderer/src/components/right-sidebar/useFileExplorerImport.os-file-drop.test.tsx
  • src/renderer/src/components/sidebar/useSidebarProjectDrop.os-file-drop.test.tsx
  • src/shared/native-file-drop-preparation.ts
  • config/scripts/ci-shard-timings.json
  • src/preload/api/ui-window-api.ts
  • src/renderer/src/components/right-sidebar/useFileExplorerImport.committed-scope.test.tsx
  • src/renderer/src/app-shell/use-app-shell-services.ts
  • src/renderer/src/web/preload-api/web-ui-api.ts
  • src/renderer/src/components/NewWorkspaceComposerCard.quick-file-drop.test.tsx
  • src/main/window/native-file-drop-relay.ts
  • src/preload/api/ui-bridge-clipboard-and-window-controls.ts
  • src/shared/native-file-drop.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 remain after this review.


📝 Walkthrough

Walkthrough

The main window now registers dropped-path preparation instead of the native file-drop relay. The preload and UI APIs no longer provide the legacy file-drop subscription, and shared native-drop target and payload helpers have been removed. Renderer code no longer installs the global drop hook. Tests now cover preparation IPC and queue behavior, OS file-drop ownership, and cancellation of unowned drops.

Priority: ➖ Normal

Merge Risk: ⚪ Minimal · up to f1e8f

No actionable merge-blocking issue is established; normal checks can proceed.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 27 functions across 35 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely identifies the main change: removing legacy OS file-drop routing. The issue and PR sequence provide useful context without making the title unclear.
Description check ✅ Passed The description is complete and directly matches the pull request objectives. It includes the user-facing change, implementation details, rationale, linked issue, visual proof, testing results, limita…
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.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@brennanb2025
brennanb2025 merged commit e4cd14d into main Oct 8, 2026
95 of 98 checks passed
@brennanb2025
brennanb2025 deleted the brennanb2025/sta-6940-pr6-remove-legacy-drops branch October 8, 2026 06:12
Fanzzzd added a commit to Fanzzzd/orca that referenced this pull request Oct 8, 2026
…ment

Upstream removed preload's document-level file-drop routing (stablyai#26385), which the
offscreen page hooked to claim drops. The page element now listens for drops
itself, like Orca's other drop owners, and the preload bridge resolves the files
to paths for main.

Claude-Session: https://claude.ai/code/session_01DvNJ16LEPYmdEkpQWtDL7n
Fanzzzd added a commit to Fanzzzd/orca that referenced this pull request Oct 8, 2026
…ment

Upstream removed preload's document-level file-drop routing (stablyai#26385), which the
offscreen page hooked to claim drops. The page element now listens for drops
itself, like Orca's other drop owners, and the preload bridge resolves the files
to paths for main.

Claude-Session: https://claude.ai/code/session_01DvNJ16LEPYmdEkpQWtDL7n
Fanzzzd added a commit to Fanzzzd/orca that referenced this pull request Oct 10, 2026
…ment

Upstream removed preload's document-level file-drop routing (stablyai#26385), which the
offscreen page hooked to claim drops. The page element now listens for drops
itself, like Orca's other drop owners, and the preload bridge resolves the files
to paths for main.

Claude-Session: https://claude.ai/code/session_01DvNJ16LEPYmdEkpQWtDL7n
Fanzzzd added a commit to Fanzzzd/orca that referenced this pull request Oct 13, 2026
…ment

Upstream removed preload's document-level file-drop routing (stablyai#26385), which the
offscreen page hooked to claim drops. The page element now listens for drops
itself, like Orca's other drop owners, and the preload bridge resolves the files
to paths for main.

Claude-Session: https://claude.ai/code/session_01DvNJ16LEPYmdEkpQWtDL7n
Fanzzzd added a commit to Fanzzzd/orca that referenced this pull request Oct 15, 2026
…ment

Upstream removed preload's document-level file-drop routing (stablyai#26385), which the
offscreen page hooked to claim drops. The page element now listens for drops
itself, like Orca's other drop owners, and the preload bridge resolves the files
to paths for main.

Claude-Session: https://claude.ai/code/session_01DvNJ16LEPYmdEkpQWtDL7n
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