Repository navigation
Conversation
…ult behind the internal WSL hosts gate (D1b-9)
…fter a reload, and lets a start settle an unfinished move (D1b-9 review)
… through Reflect (D1b-9)
nwparker
force-pushed
the
nwparker/wsl-mover-d1b-driver
branch
from
October 21, 2026 07:46
528cfab to
b5cb7b5
Compare
nwparker
force-pushed
the
nwparker/wsl-mover-d1b-9-move-ux
branch
from
October 21, 2026 07:47
741fa06 to
a9aa406
Compare
This was referenced Oct 22, 2026
Contributor
Author
|
Contained in the dark landing PR #34059 (its head commit is an ancestor of the landing branch). Closing in favour of it; branch kept. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ELI5
Orca can now move a WSL project onto that distro's own Orca server (the "WSL host"), but until now the only way to start a move was through code. This PR adds the screens a person uses for it. You pick the projects, see what would block the move, watch it run, and get told plainly how it ended.
What Changed
Before: No screen anywhere started a move. The driver (#31417) had
wslMove:preview/start/cancel/listUnfinishedand a progress event, and nothing called them.After (gate on only):
\\wsl.localhostfolder is opened (D2). It is N/A: that surface does not exist yet.requestLazyChunkRecoveryReload), so unsaved editors are backed up first.listUnfinisheddrives a small "automations still off" line under the WSL host list.Mechanism:
components/wsl-move/wsl-move-dialog-store.ts), not in the app's singleactiveModalslot. Any otheropenModalwould evict a running move and lose its reload prompt.AppRootSurfaces, inside an error boundary.donegets the same reload prompt.useWslHostsEnabled(), which needs the preload's gated WSL API and the Experimental switch. Main also refuses every call with the gate closed.Why
activeModal: a move can't be lost to an unrelated dialog, and the window can't be left on rewritten state without a reload prompt. The alternative was a newactiveModalid, which any keyboard shortcut opening Quick Open would evict.Dialog,Checkbox,Progress,BadgeandDropdownMenuItem,LoadingSpinner, the existingServerListRowmenu, the project actions menu,SettingsRow, and the existing restart-preparation reload. Nothing is restyled.Linked Issue
Internal (WSL via orcad tracker, row D1b-9).
Visual Proof
Before: none of these surfaces exist. The WSL host row menu had only "Remove…", and nothing in the app started a move.
After (CDP screenshots of the hidden test window, from
tests/e2e/wsl-move-dialog.spec.ts):Testing
Unit tests (
components/wsl-move/*.test.ts(x), 39 tests):E2E
tests/e2e/wsl-move-dialog.spec.ts: the fake WSL hosts transport, with main'swslMove:*handlers swapped for a scripted host and the renderer and preload left real.ORCA_BACKGROUND_LAUNCH=1and the hidden window.Checks:
pnpm tc, the neighbouring settings/sidebar/app-shell suites (5030 tests),check:code-quality:changed, oxlint, localization verify, and the max-lines, ts-nocheck, e2e-typecheck, repo-host-read, worktree-id-composer, path-literal, id-only-store-write, focus-read, layout-writer and dead-classes ratchets. No baseline changes.I manually tested these changes locally
Automated tests added/updated, or explained why not below
Review
An adversarial review (gate leaks, misleading copy, stuck states) ran before opening. It found no gate leaks.
Fixed:
Residuals:
movedresult and the reload, the old window can still write stale focus or last-active ids for the moved projects. Restart preparation has no write suppression; it lands a checkpoint of the current state. Fixing this cheaply would need a renderer-side freeze of UI-routing writes for the moved project ids. Left for a follow-up or D1b-10.Agent skill upstream boundary
Notes
Shared paths this touches (outside
components/wsl-move/):src/renderer/src/app-shell/AppRootSurfaces.tsx: mountsWslMoveDialogHost.src/renderer/src/components/settings/WslHostsSection.tsx: the host row menu item and the unfinished notice.src/renderer/src/components/sidebar/worktree-list/rows/repo-header-project-actions.tsx: the project menu item.src/renderer/src/components/settings/RepositoryWindowsRuntimeSection.tsxandRepositoryPane.tsx: the runtime toggle becomes "Move project" (one newrepoprop).src/shared/wsl-move/wsl-move-driver-types.ts: one optionalbrowserLoginsNotCopiedReasonon the moved result. It is a hook for 7f; nothing sets it yet, and it is wire-safe.src/renderer/src/i18n/locales/en.json: thewslMove.*strings.Other notes:
wslMovestub refuses, and nothing renders there.Copy that needs an owner decision:
Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (typecheck, touched and neighbouring tests, changed-code quality and ratchets pass locally; CI covers the rest)