Repository navigation
Remote Orca Servers: one list instead of six sections; SSH Hosts: bulk remove that stays removed - #31082
Conversation
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 Walkthrough
Priority: ➖ Normal Merge Risk: 🔵 Low · up to
|
There was a problem hiding this comment.
Actionable comments posted: 2
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
bc4f8d00-9786-4b2a-85d2-1f6a1620560c
📥 Commits
Reviewing files that changed from the base of the PR and between 41f1580 and 003013e38a08767d5d20fb500f4eae805a9075d0.
📒 Files selected for processing: 103
src/cli/handlers/managed-server.test.tssrc/main/ipc/runtime-environments/runtime-environment-connectivity-handlers.tssrc/main/ipc/runtime-environments/runtime-environment-host-dispatch.test.tssrc/main/ipc/runtime-environments/runtime-environments-pairing.test.tssrc/main/ipc/wsl-host-handlers.tssrc/main/managed-server/lifecycle/orcad-runtime-decommission.tssrc/renderer/src/components/settings/CloudVmSetupGuide.test.tsxsrc/renderer/src/components/settings/CloudVmSetupGuide.tsxsrc/renderer/src/components/settings/EphemeralVmRuntimesSection.test.tsxsrc/renderer/src/components/settings/EphemeralVmRuntimesSection.tsxsrc/renderer/src/components/settings/ManagedServerRow.tsxsrc/renderer/src/components/settings/ManagedServersSection.tsxsrc/renderer/src/components/settings/RuntimeAccessGrantList.tsxsrc/renderer/src/components/settings/RuntimeEnvironmentsPane.test.tssrc/renderer/src/components/settings/RuntimeEnvironmentsPane.tsxsrc/renderer/src/components/settings/RuntimeHostAccessForm.test.tsxsrc/renderer/src/components/settings/RuntimeHostAccessForm.tsxsrc/renderer/src/components/settings/RuntimePairingGeneratorForm.tsxsrc/renderer/src/components/settings/RuntimePairingUrlGenerator.tsxsrc/renderer/src/components/settings/RuntimeRepairDialog.tsxsrc/renderer/src/components/settings/RuntimeSshAccessControl.tsxsrc/renderer/src/components/settings/SshDestructiveActionDialog.tsxsrc/renderer/src/components/settings/SshHostChangedActions.tsxsrc/renderer/src/components/settings/SshHostKeepServerVersionDialog.tsxsrc/renderer/src/components/settings/SshHostMoveAnywayAction.test.tsxsrc/renderer/src/components/settings/SshHostMoveAnywayAction.tsxsrc/renderer/src/components/settings/SshHostRestartServerAction.test.tsxsrc/renderer/src/components/settings/SshHostRestartServerAction.tsxsrc/renderer/src/components/settings/SshPane.test.tsxsrc/renderer/src/components/settings/SshPane.tsxsrc/renderer/src/components/settings/SshPaneToolbar.tsxsrc/renderer/src/components/settings/SshRestoreRemovedHostsDialog.tsxsrc/renderer/src/components/settings/SshTargetCard.test.tsxsrc/renderer/src/components/settings/SshTargetCard.tsxsrc/renderer/src/components/settings/SshTargetDestructiveActions.test.tsxsrc/renderer/src/components/settings/SshTargetDestructiveActions.tsxsrc/renderer/src/components/settings/SshTargetForm.test.tsxsrc/renderer/src/components/settings/SshTargetForm.tsxsrc/renderer/src/components/settings/SshTargetList.tsxsrc/renderer/src/components/settings/SshTargetServerStatus.tsxsrc/renderer/src/components/settings/WslHostsSection.tsxsrc/renderer/src/components/settings/cli-source-control-integration-cards.test.tsxsrc/renderer/src/components/settings/managed-server-copy.test.tssrc/renderer/src/components/settings/managed-server-copy.tssrc/renderer/src/components/settings/managed-server-row-parts.test.tsxsrc/renderer/src/components/settings/managed-server-row-parts.tsxsrc/renderer/src/components/settings/network-address-label.tssrc/renderer/src/components/settings/provider-account-scope.test.tssrc/renderer/src/components/settings/provider-account-scope.tssrc/renderer/src/components/settings/runtime-active-server-section.tsxsrc/renderer/src/components/settings/runtime-add-server-dialog.tsxsrc/renderer/src/components/settings/runtime-default-host-row.tsxsrc/renderer/src/components/settings/runtime-environment-dialogs.tsxsrc/renderer/src/components/settings/runtime-environment-host-details.tssrc/renderer/src/components/settings/runtime-environments-search.tssrc/renderer/src/components/settings/runtime-install-server-dialog.tsxsrc/renderer/src/components/settings/runtime-server-default-name.tssrc/renderer/src/components/settings/runtime-server-list-row.tsxsrc/renderer/src/components/settings/runtime-server-list.tsxsrc/renderer/src/components/settings/runtime-server-row-details.tsxsrc/renderer/src/components/settings/runtime-server-row-menu.tsxsrc/renderer/src/components/settings/runtime-server-row-meta.test.tssrc/renderer/src/components/settings/runtime-server-row-meta.tssrc/renderer/src/components/settings/runtime-server-row-presentation.test.tssrc/renderer/src/components/settings/runtime-server-row-presentation.tssrc/renderer/src/components/settings/runtime-server-row-state.tssrc/renderer/src/components/settings/runtime-server-row-unverifiable-host.test.tsxsrc/renderer/src/components/settings/runtime-server-row.tsxsrc/renderer/src/components/settings/runtime-server-workflow-sections.test.tsxsrc/renderer/src/components/settings/runtime-server-workflow-sections.tsxsrc/renderer/src/components/settings/runtime-servers-connect-section.tsxsrc/renderer/src/components/settings/runtime-servers-header-actions.tsxsrc/renderer/src/components/settings/runtime-servers-page-context.tsxsrc/renderer/src/components/settings/runtime-share-computer-card.tsxsrc/renderer/src/components/settings/runtime-ssh-access-dialog.tsxsrc/renderer/src/components/settings/settings-remote-security-section-renderers.tsxsrc/renderer/src/components/settings/ssh-bulk-remove-summary.tssrc/renderer/src/components/settings/ssh-hosts-header-slot.tsxsrc/renderer/src/components/settings/ssh-target-list-model.test.tssrc/renderer/src/components/settings/ssh-target-list-model.tssrc/renderer/src/components/settings/task-tracker-integration-cards.test.tsxsrc/renderer/src/components/settings/use-managed-server-catalog.tssrc/renderer/src/components/settings/use-managed-server-lifecycle.tssrc/renderer/src/components/settings/use-runtime-environment-catalog.tssrc/renderer/src/components/settings/use-runtime-environment-mutation-actions.tssrc/renderer/src/components/settings/use-ssh-bulk-remove.tssrc/renderer/src/components/settings/use-ssh-config-sync.tssrc/renderer/src/components/settings/use-ssh-target-selection.tssrc/renderer/src/components/settings/use-ssh-target-tests.tssrc/renderer/src/components/sidebar/AddRemoteHostFields.tsxsrc/renderer/src/hooks/settings-navigation-remote-sections.tssrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsontests/e2e/ephemeral-vm-cleanup-retry.spec.tstests/e2e/helpers/ssh-config-host-picker.tstests/e2e/ssh-config-host-import.spec.tstests/e2e/ssh-host-form-modal.spec.tstests/e2e/wsl-host-fake-transport.spec.ts
💤 Files with no reviewable changes: 8
- src/renderer/src/components/settings/ManagedServerRow.tsx
- src/renderer/src/components/settings/runtime-servers-connect-section.tsx
- src/renderer/src/components/settings/ManagedServersSection.tsx
- src/renderer/src/components/settings/runtime-server-workflow-sections.test.tsx
- src/renderer/src/components/settings/RuntimePairingUrlGenerator.tsx
- src/renderer/src/components/settings/runtime-server-workflow-sections.tsx
- src/renderer/src/components/settings/runtime-active-server-section.tsx
- src/renderer/src/components/settings/SshHostChangedActions.tsx
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.
003013e to
2273d64
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.
🟡 Minor · Clear the bulk selection before awaiting the reload. · use-ssh-bulk-remove.ts:39-62
src/renderer/src/components/settings/use-ssh-bulk-remove.ts:39-62
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winClear the bulk selection before awaiting the reload.
runBulkRemoveclears the dialog and per-target busy guards beforefinishBulkRemovestarts its awaited reload. The old targets and selection remain rendered during that await, so the user can confirm bulk removal again for hosts that were already removed.The second IPC call still enters
removeRegisteredSshTarget; the backend does not reject the missing target before repeating teardown andstore.removeTarget. If it resolves, the renderer counts the target as removed and shows another removal summary. Clear the selection beforeargs.reload()to prevent this duplicate confirmation and result.Suggested fix
if (result.removed.length > 0) { recordFeatureInteraction('ssh') + if (mountedRef.current) { + args.clearSelection() + } await args.reload() + } else if (mountedRef.current) { + args.clearSelection() } if (!mountedRef.current) { return } - args.clearSelection() const notify =
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
09ae428c-bdc9-4504-b344-7112fb5857e6
📥 Commits
Reviewing files that changed from the base of the PR and between 003013e38a08767d5d20fb500f4eae805a9075d0 and 2273d64c1e7a3f9861ca35da20908b97e1f3cfb3.
📒 Files selected for processing: 8
src/renderer/src/components/settings/SshPane.tsxsrc/renderer/src/components/settings/SshTargetServerStatus.tsxsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.json
🚧 Files skipped from review as they are similar to previous changes: 5
- src/renderer/src/i18n/locales/es.json
- src/renderer/src/i18n/locales/ko.json
- src/renderer/src/i18n/locales/en.json
- src/renderer/src/i18n/locales/fr.json
- src/renderer/src/i18n/locales/zh.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.
c906e80 to
3a85003
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
165a5464-58cd-464b-9596-77f4ea59c8c1
📥 Commits
Reviewing files that changed from the base of the PR and between 2273d64c1e7a3f9861ca35da20908b97e1f3cfb3 and 3a85003.
📒 Files selected for processing: 32
src/main/ipc/runtime-environments/runtime-environment-connectivity-handlers.tssrc/main/ipc/runtime-environments/runtime-environments-pairing.test.tssrc/main/ssh/connection/ssh-connection-store.tssrc/renderer/src/components/settings/RuntimeEnvironmentsPane.tsxsrc/renderer/src/components/settings/RuntimeHostAccessForm.tsxsrc/renderer/src/components/settings/SshPane.test.tsxsrc/renderer/src/components/settings/SshPane.tsxsrc/renderer/src/components/settings/SshTargetList.test.tsxsrc/renderer/src/components/settings/SshTargetList.tsxsrc/renderer/src/components/settings/runtime-add-server-dialog.tsxsrc/renderer/src/components/settings/runtime-default-host-row.test.tsxsrc/renderer/src/components/settings/runtime-default-host-row.tsxsrc/renderer/src/components/settings/runtime-server-default-name.test.tssrc/renderer/src/components/settings/runtime-server-default-name.tssrc/renderer/src/components/settings/runtime-server-list.tsxsrc/renderer/src/components/settings/runtime-server-row-presentation.test.tssrc/renderer/src/components/settings/runtime-server-row-presentation.tssrc/renderer/src/components/settings/runtime-server-row.tsxsrc/renderer/src/components/settings/runtime-share-computer-card.test.tsxsrc/renderer/src/components/settings/runtime-share-computer-card.tsxsrc/renderer/src/components/settings/ssh-target-list-model.test.tssrc/renderer/src/components/settings/ssh-target-list-model.tssrc/renderer/src/components/settings/use-runtime-environment-mutation-actions.tssrc/renderer/src/components/settings/use-ssh-target-selection.tssrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/shared/ssh-target-source.test.tssrc/shared/ssh-target-source.ts
🚧 Files skipped from review as they are similar to previous changes: 8
- src/main/ipc/runtime-environments/runtime-environments-pairing.test.ts
- src/main/ipc/runtime-environments/runtime-environment-connectivity-handlers.ts
- src/renderer/src/i18n/locales/ja.json
- src/renderer/src/i18n/locales/es.json
- src/renderer/src/i18n/locales/fr.json
- src/renderer/src/i18n/locales/en.json
- src/renderer/src/i18n/locales/zh.json
- src/renderer/src/i18n/locales/ko.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.
| onDeployed={async () => { | ||
| void loadEnvironments() | ||
| await managedCatalog.reload() | ||
| }} |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
cat src/renderer/src/components/settings/use-managed-server-catalog.ts
rg -n 'onDeployed|toast\.|catch|try' src/renderer/src/components/settings/runtime-install-server-dialog.tsx
sed -n '170,182p;285,300p' src/renderer/src/components/settings/RuntimeEnvironmentsPane.tsxRepository: stablyai/orca
Length of output: 4976
🏁 Script executed:
sed -n '1,115p' src/renderer/src/components/settings/runtime-install-server-dialog.tsx
sed -n '35,75p' src/renderer/src/components/settings/use-managed-server-catalog.ts
rg -n -F --glob '*.ts' --glob '*.tsx' -e 'listTargets' -e 'listPendingMigrations' src/renderer/src src/preload src/shared | head -80Repository: stablyai/orca
Length of output: 14950
Keep catalog refresh failures out of the install error toast.
managedCatalog.reload() can reject because it awaits both API calls without catching failures. RuntimeInstallServerDialog.deploy awaits onDeployed() inside its try block after showing the success toast. A refresh failure can therefore show an install-failure toast for a successful install.
Handle the failure in reload and set loadFailed. Catching only at the call site would suppress the error but would not update loadFailed.
Suggested fix
const reload = useCallback(async () => {
if (!api) {
return
}
- const [nextTargets, nextPending] = await Promise.all([
- window.api.ssh.listTargets(),
- api.listPendingMigrations()
- ])
- if (mountedRef.current) {
- setTargets(nextTargets)
- setPending(nextPending)
- setLoadFailed(false)
+ try {
+ const [nextTargets, nextPending] = await Promise.all([
+ window.api.ssh.listTargets(),
+ api.listPendingMigrations()
+ ])
+ if (mountedRef.current) {
+ setTargets(nextTargets)
+ setPending(nextPending)
+ setLoadFailed(false)
+ }
+ } catch {
+ if (mountedRef.current) {
+ setLoadFailed(true)
+ }
}
}, [api, mountedRef])There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.
🟡 Minor · Handle preflight failures in the shared update action. · remote-server-updates.ts:96-114
src/renderer/src/store/slices/remote-server-updates.ts:96-114
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick winHandle preflight failures in the shared update action.
If
runtimeEnvironments.list()orupdater.getVersion()rejects,refreshRemoteServerUpdatesclears its checking flag but leaves the open dialog without an error or retry state. The dialog can show stale data, an empty result, or rows stuck in “Checking…”. Handle the rejection in the shared action and expose a terminal error state with retry behavior so both current callers receive the same fallback.
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
e5e67c34-43af-4eab-b414-095f74c8bab6
📥 Commits
Reviewing files that changed from the base of the PR and between 3a85003 and a25dce9af156da423895d9934603779e64f64fbc.
📒 Files selected for processing: 1
tests/e2e/wsl-host-fake-transport.spec.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.
… SSH Hosts Remote Orca Servers: replace the three mode cards, Advanced fold, duplicate managed/SSH-access lists and troubleshooting accordion with a single list (one row per server: status, one action, overflow menu), an always-visible 'New projects open on' row, and Share / Cloud VM cards that open dialogs. SSH Hosts: group by source, filter, checkbox + shift-range selection, one confirm for bulk remove (skipping hosts with a managed server or workspaces), bulk Test. 'Sync ~/.ssh/config' no longer clears removal tombstones; 'Restore removed hosts (n)' is a separate confirmed action.
- SSH filter stays clearable when the list shrinks under the threshold - Cmd/Ctrl-A only selects hosts when pressed in the list itself - group legacy no-source hosts with main's import predicate (now shared) - capture the shift-range anchor before queuing the selection update - blank server names de-duplicate instead of colliding - Share dialog Done refreshes link count and resets name editing - Install / SSH-route dialogs reload SSH hosts when opened - default-host row shows the selector when the default is a WSL host - managed 'Not running' no longer masks connecting/revoked/update states - servers without a dropped transport can be re-checked
…hells repo.rm now stops the project's terminals on the host (#29964), so the 'orphan left by older builds' setup can no longer be built; use a shell only the host knows of instead. Resolve the project path so macOS /private/var matches what the host reports.
a25dce9 to
effc359
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
5112a146-48a3-4ae7-8040-5054f680ad9f
📥 Commits
Reviewing files that changed from the base of the PR and between a25dce9af156da423895d9934603779e64f64fbc and effc359.
📒 Files selected for processing: 28
src/renderer/src/components/settings/ManagedServerRow.tsxsrc/renderer/src/components/settings/ManagedServersSection.tsxsrc/renderer/src/components/settings/SshHostChangedActions.tsxsrc/renderer/src/components/settings/SshHostKeepServerVersionDialog.tsxsrc/renderer/src/components/settings/SshHostMoveAnywayAction.tsxsrc/renderer/src/components/settings/SshHostRestartServerAction.test.tsxsrc/renderer/src/components/settings/SshHostRestartServerAction.tsxsrc/renderer/src/components/settings/SshManagedHostRemoveDialog.tsxsrc/renderer/src/components/settings/SshPane.test.tsxsrc/renderer/src/components/settings/SshTargetServerStatus.tsxsrc/renderer/src/components/settings/managed-server-row-parts.test.tsxsrc/renderer/src/components/settings/managed-server-row-parts.tsxsrc/renderer/src/components/settings/runtime-environments-search.tssrc/renderer/src/components/settings/runtime-install-server-dialog.tsxsrc/renderer/src/components/settings/runtime-server-list.tsxsrc/renderer/src/components/settings/runtime-server-row-meta.test.tssrc/renderer/src/components/settings/runtime-server-row-meta.tssrc/renderer/src/components/settings/runtime-server-row-unverifiable-host.test.tsxsrc/renderer/src/components/settings/runtime-server-row.tsxsrc/renderer/src/components/settings/runtime-servers-connect-section.tsxsrc/renderer/src/components/settings/runtime-servers-header-actions.tsxsrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.json
💤 Files with no reviewable changes: 4
- src/renderer/src/components/settings/SshHostChangedActions.tsx
- src/renderer/src/components/settings/runtime-servers-connect-section.tsx
- src/renderer/src/components/settings/ManagedServersSection.tsx
- src/renderer/src/components/settings/ManagedServerRow.tsx
🚧 Files skipped from review as they are similar to previous changes: 7
- src/renderer/src/i18n/en-runtime-required.json
- src/renderer/src/i18n/locales/ja.json
- src/renderer/src/i18n/locales/es.json
- src/renderer/src/i18n/locales/zh.json
- src/renderer/src/i18n/locales/ko.json
- src/renderer/src/i18n/locales/en.json
- src/renderer/src/i18n/locales/fr.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review.
| onClick={() => { | ||
| onOpenChange(false) | ||
| openSettingsTarget({ pane: 'ssh', repoId: null }) | ||
| }} |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Route the "Add an SSH host" link through handleOpenChange.
The link calls onOpenChange(false) directly. This skips the background-install notice in handleOpenChange. During a deploy, the dialog closes and the install continues. The user does not get the "Setting up Orca on … in the background" toast. The user can then think the install was cancelled. The Cancel/Close button and the dialog's own onOpenChange already use handleOpenChange.
Proposed fix
--- "a/src/renderer/src/components/settings/runtime-install-server-dialog.tsx"
+++ "b/src/renderer/src/components/settings/runtime-install-server-dialog.tsx"
@@ -173,10 +173,10 @@
<button
type="button"
className="cursor-pointer text-foreground underline underline-offset-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
onClick={() => {
- onOpenChange(false)
+ handleOpenChange(false)
openSettingsTarget({ pane: 'ssh', repoId: null })
}}
>
{translate('auto.components.settings.serverList.addSshHost', 'Add an SSH host')}
</button>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| onClick={() => { | |
| onOpenChange(false) | |
| openSettingsTarget({ pane: 'ssh', repoId: null }) | |
| }} | |
| onClick={() => { | |
| handleOpenChange(false) | |
| openSettingsTarget({ pane: 'ssh', repoId: null }) | |
| }} |
main moved 408 commits. One kind of conflict: - en, es, fr, ja, ko and zh: stablyai#31082 and this branch both appended keys to the end of auto.components.sidebar.AddRemoteHostDialog. main's pairingHelpShareComputer comes first, then the two sshImportSynced sentences from this branch. en-runtime-required.json and the Korean overrides merged on their own; the branch still only swaps the drop-upload toast key in the runtime catalog. Against main the branch still removes the same twelve keys and adds the same 24 in all six catalogs, with no other value changed.
208 commits landed on main between 1529b0f and ebc8b06, and all six catalogs conflicted along with en-runtime-required.json, so the catalogs and en-runtime-required.json are taken from main and the prune is recomputed in one pass. It is the previous 1,509 keys plus 109: 108 lost their reader when stablyai#31082 folded the six Remote Orca Servers sections into one list and stablyai#31099 retitled the SSH host section, and SshTargetList.selectGroup arrived with stablyai#31082 without a reader. None left the set. en.json goes from 16,704 entries to 15,086; en-runtime-required.json keeps 579 of them.
ELI5
The Remote Orca Servers settings page showed the same server in up to three places and hid the important setting under "Advanced". It also buried everything under mode tabs and walls of grey status text. It's now one list: each server gets one row with its status, one button and a "⋯" menu.
The SSH Hosts page imports every alias in
~/.ssh/config, and before this you had to delete them one confirm at a time. Now you can tick several hosts and remove them with one confirm. Deleted hosts also stay deleted.What Changed
Remote Orca Servers
default-runtimedeep link.Nothing is removed, only moved. Managed-server stop / forget / recover / roll back, the pending state for reaching a server through SSH (with Retry and Cancel), and per-server update checks all live on the row or in its menu.
SSH Hosts
importConfig({ reAdopt: false }), so removed aliases stay removed. Restore removed hosts (n)… is a separate, confirmed menu action.How it works: this is a renderer-only rework. It reuses the existing data hooks, IPC, dialogs and state machines (
ManagedServerRowlogic is nowmanaged-server-row-parts). Bulk removal calls the existing per-hostremoveTarget, so every main-process guard still applies. The only main/CLI edits are user-facing strings that pointed at the old layout ("Share this host" → "Share this computer", "Advanced > Default host" → "New projects open on").Why
The page was organised around how it's built (a managed-server subsystem, an SSH-access subsystem, three modes) rather than the user's question: "which machines can I work on, are they OK, and how do I add one?" We mocked three directions:
For SSH Hosts, bulk delete alone wouldn't help: the old Import button cleared every deletion, so removed aliases came back in the host pickers.
Two adversarial review rounds (one design reviewer, one front-end reviewer) caught and fixed several problems:
Visual Proof
Screenshots use fake hosts and servers.
The "before" SSH screenshot is cropped, to leave out the rows for real hosts.
Testing
ssh-target-list-model.test.ts, including Shift-range in display orderSshPane.test.tsx: bulk remove, the filter dropping hidden hosts from the selection, bulk Test, and the Sync / Restore splitmanaged-server-row-parts.test.tsxruntime-server-row-meta.test.tsGates:
pnpm tc:webandpnpm tc:node: clean.check:code-quality:changed: 0 new findings across 88 files.ssh-host-form-modal,ssh-config-host-importandephemeral-vm-cleanup-retrypass.wsl-host-fake-transporthas 3 of 4 tests passing. The failing test is "adds a WSL distro as a host, adds a project on it…": the project added through "Open host project" ends up with no host. It fails the same way on cleanmain(ba6599eabbd), so it isn't caused by this PR. That failure stops the test before the WSL Remove step this PR updated (it now goes through the row's ⋯ menu), so that change hasn't run in e2e.Not exercised live: managed, WSL, Cloud VM, update-available, access-revoked and connected rows (covered by unit tests and review), and the web client (gating checked in code).
Review
Suggested order:
RuntimeEnvironmentsPane.tsx→runtime-server-list*.tsx→runtime-server-row-*SshPane.tsx→SshTargetList.tsx→use-ssh-target-selection.ts/use-ssh-bulk-remove.ts/use-ssh-config-sync.tsAbout 40% of the diff is locale catalogs.
Agent skill upstream boundary
Notes
Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass. Typecheck and the scoped tests and lint pass locally; CI covers the full suite.