mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 00:57:45 +00:00
fix(runtime): route runtime filesystem commands by resolved execution host (#18325)
`ResolvedRuntimeFileTarget` carried `connectionId?: string` and no host id, so `undefined` spelled three different answers at once — "runtime: host", "unresolved" and "genuinely local". Its sole resolver read `store.getRepo(worktree.repoId)?.connectionId` and never looked at `worktree.hostId`, which outranks every repo row, so one arbitrarily chosen row decided the execution host for ~30 filesystem dispatches. This is #18307's defect in the same file family; it was deliberately left out of that PR rather than doubling an already-36-site diff. The target now carries `executionHostId: ExecutionHostId` (never null, never optional), resolved through `resolveWorktreeHostRouting` — the same adapter #18307 added — and dispatched through #18296's `resolveFilesystemRouteForHost`. Dispatch sites call `requireRuntimeFileProvider`, where `null` means exactly one thing: the host is `local` and the read happens here. Four answers that used to collapse into one: - `ssh:x` with a rival row on `ssh:y` — routes to x. Previously the first row won. - `local` with a surviving `connectionId` — a row contradicting itself; no SSH connection is handed out. - `runtime:<env>` — throws `ExecutionHostNotDispatchableError`. Its repo row's connection names a target in the *server's* namespace; reading it here reaches a same-named target on this client. - rival rows disagreeing with no worktree host — `worktree_execution_host_unresolved`, matching the launch and Git paths rather than guessing a row. Two further reads stop degrading. `assertRuntimeFileMutationExpectation` recomputed the host from `connectionId`, so a client's host expectation could pass against a host the workspace never named; it now compares the resolved host. And the cross-workspace terminal tap coalesced `knownWorkspaceTarget?.connectionId ?? connectionId`, so a sibling workspace resolved as `local` inherited the origin worktree's SSH target and statted a local path on the remote box; a non-optional host id replaces rather than coalesces. An unreachable SSH host still throws `SSH_FILESYSTEM_PROVIDER_UNAVAILABLE_MESSAGE`; loss of contact is never evidence of locality (docs/reference/ssh-execution-boundary.md). Quick-open listing and path search keep degrading to empty for an unreachable host — that is a false negative, not a local answer — and now do so only for a host that really is remote. The whole `runtime-file-commands-*` family carries `@ts-nocheck` from a mechanical class split, so removing the field could not raise the compile errors that made #18307 safe. `runtime-file-command-target.ts` is deliberately checked, and a ratchet test stands in for the errors the family cannot produce. No wire change: `ResolvedRuntimeFileTarget` is main-process internal, and the SSH watcher-release and grant keys are byte-identical to before.
This commit is contained in:
@@ -3,7 +3,7 @@ import type { Store } from '../persistence'
|
||||
import type {
|
||||
ResolvedRuntimeFileTarget,
|
||||
ResolvedRuntimeFileWorktree
|
||||
} from './runtime-file-watcher-leases'
|
||||
} from './runtime-file-command-target'
|
||||
import type { ExecutionHostId } from '../../shared/execution-host'
|
||||
import type { RuntimeNativeChatFileContext } from '../../shared/runtime-types'
|
||||
import type { FsChangeEvent } from '../../shared/filesystem-entry-types'
|
||||
@@ -42,8 +42,9 @@ export type RuntimeFileCommandHost = {
|
||||
pathText: string,
|
||||
absolutePath: string
|
||||
): boolean | Promise<boolean>
|
||||
// `executionHostId`, not `connectionId`: a repo row's connection cannot tell `runtime:` from
|
||||
// `local`, and this contract must not re-introduce that spelling. See runtime-git-command-target.
|
||||
// `executionHostId`, not `connectionId`, on both target contracts: a repo row's connection cannot
|
||||
// tell `runtime:` from `local`, and neither may re-introduce that spelling. See
|
||||
// runtime-git-command-target and runtime-file-command-target.
|
||||
resolveRuntimeGitTarget(
|
||||
selector: string
|
||||
): Promise<{ worktree: ResolvedRuntimeFileWorktree; executionHostId: ExecutionHostId }>
|
||||
|
||||
Reference in New Issue
Block a user