@neuralnomads/codenomad-dev 0.20.0-dev-20260911-ea37f97b → 0.20.0-dev-20260917-aa51cbb9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/api-types.js.map +1 -1
- package/dist/opencode/automation-plugin.test.js +32 -38
- package/dist/opencode/automation-plugin.test.js.map +1 -1
- package/dist/opencode/compatibility/contract-fixture.js +15 -0
- package/dist/opencode/compatibility/contract-fixture.js.map +1 -0
- package/dist/opencode/compatibility/events.js +9 -0
- package/dist/opencode/compatibility/events.js.map +1 -0
- package/dist/opencode/compatibility/location.js +89 -0
- package/dist/opencode/compatibility/location.js.map +1 -0
- package/dist/opencode/compatibility/location.test.js +92 -0
- package/dist/opencode/compatibility/location.test.js.map +1 -0
- package/dist/opencode/compatibility/negotiate.js +73 -0
- package/dist/opencode/compatibility/negotiate.js.map +1 -0
- package/dist/opencode/compatibility/negotiate.test.js +61 -0
- package/dist/opencode/compatibility/negotiate.test.js.map +1 -0
- package/dist/opencode/compatibility/proxy-locations.js +137 -0
- package/dist/opencode/compatibility/proxy-locations.js.map +1 -0
- package/dist/opencode/compatibility/proxy-locations.test.js +42 -0
- package/dist/opencode/compatibility/proxy-locations.test.js.map +1 -0
- package/dist/opencode/compatibility/proxy.js +60 -0
- package/dist/opencode/compatibility/proxy.js.map +1 -0
- package/dist/opencode/compatibility/proxy.test.js +47 -0
- package/dist/opencode/compatibility/proxy.test.js.map +1 -0
- package/dist/opencode/compatibility/requests.js +54 -0
- package/dist/opencode/compatibility/requests.js.map +1 -0
- package/dist/opencode/compatibility/runtime.js +26 -0
- package/dist/opencode/compatibility/runtime.js.map +1 -0
- package/dist/opencode/compatibility/transport.js +112 -0
- package/dist/opencode/compatibility/transport.js.map +1 -0
- package/dist/opencode/compatibility/transport.test.js +83 -0
- package/dist/opencode/compatibility/transport.test.js.map +1 -0
- package/dist/opencode/session-pruning/location.js +16 -0
- package/dist/opencode/session-pruning/location.js.map +1 -0
- package/dist/opencode/session-pruning/package.test.js +37 -0
- package/dist/opencode/session-pruning/package.test.js.map +1 -0
- package/dist/opencode/session-pruning/plugin.js +5 -2
- package/dist/opencode/session-pruning/plugin.js.map +1 -1
- package/dist/opencode/session-pruning/preview-store.js +3 -2
- package/dist/opencode/session-pruning/preview-store.js.map +1 -1
- package/dist/opencode/session-pruning/pruning.test.js +7 -5
- package/dist/opencode/session-pruning/pruning.test.js.map +1 -1
- package/dist/opencode/session-pruning/service.js +5 -4
- package/dist/opencode/session-pruning/service.js.map +1 -1
- package/dist/opencode/session-pruning/service.test.js +65 -53
- package/dist/opencode/session-pruning/service.test.js.map +1 -1
- package/dist/permissions/opencode-replier.js +2 -2
- package/dist/permissions/opencode-replier.js.map +1 -1
- package/dist/permissions/opencode-replier.test.js +1 -1
- package/dist/permissions/opencode-replier.test.js.map +1 -1
- package/dist/permissions/opencode-yolo-metadata.js.map +1 -1
- package/dist/permissions/opencode-yolo-metadata.test.js.map +1 -1
- package/dist/plugins/session-pruning/plugin.mjs +422 -271
- package/dist/server/__tests__/instance-proxy-legacy.test.js +111 -0
- package/dist/server/__tests__/instance-proxy-legacy.test.js.map +1 -0
- package/dist/server/__tests__/instance-proxy.test.js +95 -34
- package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
- package/dist/server/http-server.js +147 -237
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/routes/session-pruning.js +4 -2
- package/dist/server/routes/session-pruning.js.map +1 -1
- package/dist/server/routes/session-pruning.test.js +16 -2
- package/dist/server/routes/session-pruning.test.js.map +1 -1
- package/dist/server/routes/worktrees.js +1 -0
- package/dist/server/routes/worktrees.js.map +1 -1
- package/dist/server/routes/worktrees.test.js +54 -1
- package/dist/server/routes/worktrees.test.js.map +1 -1
- package/dist/workspaces/host-opencode-service.test.js +56 -7
- package/dist/workspaces/host-opencode-service.test.js.map +1 -1
- package/dist/workspaces/instance-client.js.map +1 -1
- package/dist/workspaces/instance-events.js +71 -57
- package/dist/workspaces/instance-events.js.map +1 -1
- package/dist/workspaces/instance-events.test.js +122 -9
- package/dist/workspaces/instance-events.test.js.map +1 -1
- package/dist/workspaces/manager.js +24 -39
- package/dist/workspaces/manager.js.map +1 -1
- package/dist/workspaces/manager.test.js +43 -7
- package/dist/workspaces/manager.test.js.map +1 -1
- package/dist/workspaces/opencode-cli-service.js +56 -29
- package/dist/workspaces/opencode-cli-service.js.map +1 -1
- package/dist/workspaces/opencode-connection-generation.test.js +57 -0
- package/dist/workspaces/opencode-connection-generation.test.js.map +1 -0
- package/dist/workspaces/opencode-service.js +70 -16
- package/dist/workspaces/opencode-service.js.map +1 -1
- package/dist/workspaces/opencode-service.test.js +3 -4
- package/dist/workspaces/opencode-service.test.js.map +1 -1
- package/dist/workspaces/worktree-session-evacuation.js +31 -11
- package/dist/workspaces/worktree-session-evacuation.js.map +1 -1
- package/dist/workspaces/worktree-session-evacuation.test.js +211 -0
- package/dist/workspaces/worktree-session-evacuation.test.js.map +1 -1
- package/dist/workspaces/wsl-opencode-service.test.js +64 -24
- package/dist/workspaces/wsl-opencode-service.test.js.map +1 -1
- package/package.json +3 -3
- package/public/assets/App-BROhwPo9.js +54 -0
- package/public/assets/App-BROhwPo9.js.map +1 -0
- package/public/assets/{FilesTab-CRpGDs1B.js → FilesTab-DY3Vr-3r.js} +3 -3
- package/public/assets/{FilesTab-CRpGDs1B.js.map → FilesTab-DY3Vr-3r.js.map} +1 -1
- package/public/assets/{GitChangesTab-DxFebTiq.js → GitChangesTab-BD6CJngE.js} +3 -3
- package/public/assets/{GitChangesTab-DxFebTiq.js.map → GitChangesTab-BD6CJngE.js.map} +1 -1
- package/public/assets/{SplitFilePanel-DgTMrrO-.js → SplitFilePanel-BdY6d_6m.js} +2 -2
- package/public/assets/{SplitFilePanel-DgTMrrO-.js.map → SplitFilePanel-BdY6d_6m.js.map} +1 -1
- package/public/assets/StatusTab-C-_2yaPa.js +2 -0
- package/public/assets/StatusTab-C-_2yaPa.js.map +1 -0
- package/public/assets/{align-justify-v_yPXSys.js → align-justify-DI8VTZ4G.js} +2 -2
- package/public/assets/{align-justify-v_yPXSys.js.map → align-justify-DI8VTZ4G.js.map} +1 -1
- package/public/assets/{bundle-full-HzL_Jtqk.js → bundle-full-D_M65Eb_.js} +2 -2
- package/public/assets/{bundle-full-HzL_Jtqk.js.map → bundle-full-D_M65Eb_.js.map} +1 -1
- package/public/assets/{client-state-CF-PJ0GG.js → client-state-CWCzCOz6.js} +2 -2
- package/public/assets/{client-state-CF-PJ0GG.js.map → client-state-CWCzCOz6.js.map} +1 -1
- package/public/assets/{diff-viewer-BFDQBDVy.js → diff-viewer-CGPsYEr3.js} +2 -2
- package/public/assets/{diff-viewer-BFDQBDVy.js.map → diff-viewer-CGPsYEr3.js.map} +1 -1
- package/public/assets/index-B8-lAqjr.js +2 -0
- package/public/assets/index-B8-lAqjr.js.map +1 -0
- package/public/assets/index-BeUewQym.js +2 -0
- package/public/assets/index-BeUewQym.js.map +1 -0
- package/public/assets/index-BxRFHpJd.js +2 -0
- package/public/assets/{index-D2UHSOG5.js.map → index-BxRFHpJd.js.map} +1 -1
- package/public/assets/index-Bzv1kU-S.js +2 -0
- package/public/assets/{index-CTKYD_VJ.js.map → index-Bzv1kU-S.js.map} +1 -1
- package/public/assets/index-C9tI4CRG.js +2 -0
- package/public/assets/index-C9tI4CRG.js.map +1 -0
- package/public/assets/index-CGYHFZ6F.js +2 -0
- package/public/assets/index-CGYHFZ6F.js.map +1 -0
- package/public/assets/{index-CHYmKl10.js → index-CMEAjBFp.js} +2 -2
- package/public/assets/index-CMEAjBFp.js.map +1 -0
- package/public/assets/index-Cazypvyc.js +2 -0
- package/public/assets/index-Cazypvyc.js.map +1 -0
- package/public/assets/index-CwqzofWP.js +2 -0
- package/public/assets/index-CwqzofWP.js.map +1 -0
- package/public/assets/index-Da9yOa6q.js +2 -0
- package/public/assets/index-Da9yOa6q.js.map +1 -0
- package/public/assets/{index-RK9gf0uk.js → index-Ddjkirek.js} +2 -2
- package/public/assets/{index-RK9gf0uk.js.map → index-Ddjkirek.js.map} +1 -1
- package/public/assets/index-HHgvEOAH.js +3 -0
- package/public/assets/index-HHgvEOAH.js.map +1 -0
- package/public/assets/index-MeFffHqb.css +1 -0
- package/public/assets/loading-CdhHiSED.css +1 -0
- package/public/assets/{loading-BSB82snY.js → loading-Gqh6NPUr.js} +2 -2
- package/public/assets/{loading-BSB82snY.js.map → loading-Gqh6NPUr.js.map} +1 -1
- package/public/assets/main-Cbx7KdTr.js +38 -0
- package/public/assets/main-Cbx7KdTr.js.map +1 -0
- package/public/assets/{markdown-DtidoL2Z.js → markdown-BWnjyvnX.js} +4 -4
- package/public/assets/{markdown-DtidoL2Z.js.map → markdown-BWnjyvnX.js.map} +1 -1
- package/public/assets/monaco-viewer-BEJIiZWL.js +27 -0
- package/public/assets/monaco-viewer-BEJIiZWL.js.map +1 -0
- package/public/assets/{startup-state-settings-card-BY741Rt0.js → startup-state-settings-card-C4E2Itop.js} +2 -2
- package/public/assets/{startup-state-settings-card-BY741Rt0.js.map → startup-state-settings-card-C4E2Itop.js.map} +1 -1
- package/public/assets/{terminal-square-BdC_jwm3.js → terminal-square-C3wutdV0.js} +2 -2
- package/public/assets/{terminal-square-BdC_jwm3.js.map → terminal-square-C3wutdV0.js.map} +1 -1
- package/public/assets/tool-call-DNsAQ_m4.js +60 -0
- package/public/assets/tool-call-DNsAQ_m4.js.map +1 -0
- package/public/assets/{unified-picker-C0eo1chJ.js → unified-picker-tB7y17Qz.js} +2 -2
- package/public/assets/unified-picker-tB7y17Qz.js.map +1 -0
- package/public/assets/{wrap-text-BuMtdvMx.js → wrap-text-CkBxzt04.js} +2 -2
- package/public/assets/{wrap-text-BuMtdvMx.js.map → wrap-text-CkBxzt04.js.map} +1 -1
- package/public/index.html +4 -4
- package/public/loading.html +5 -5
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/public/assets/App-0-FcHzPS.js +0 -44
- package/public/assets/App-0-FcHzPS.js.map +0 -1
- package/public/assets/StatusTab-LKUA9cbH.js +0 -2
- package/public/assets/StatusTab-LKUA9cbH.js.map +0 -1
- package/public/assets/index-8iPlm2r0.js +0 -2
- package/public/assets/index-8iPlm2r0.js.map +0 -1
- package/public/assets/index-B185mC7m.js +0 -2
- package/public/assets/index-B185mC7m.js.map +0 -1
- package/public/assets/index-Bbj1xF8i.js +0 -2
- package/public/assets/index-Bbj1xF8i.js.map +0 -1
- package/public/assets/index-BsmFN3k1.js +0 -2
- package/public/assets/index-BsmFN3k1.js.map +0 -1
- package/public/assets/index-Bz_OQJYA.css +0 -1
- package/public/assets/index-C52CfqK3.js +0 -2
- package/public/assets/index-C52CfqK3.js.map +0 -1
- package/public/assets/index-CHYmKl10.js.map +0 -1
- package/public/assets/index-CTKYD_VJ.js +0 -2
- package/public/assets/index-D2UHSOG5.js +0 -2
- package/public/assets/index-DDoB_Z36.js +0 -2
- package/public/assets/index-DDoB_Z36.js.map +0 -1
- package/public/assets/index-DcwAtZw-.js +0 -3
- package/public/assets/index-DcwAtZw-.js.map +0 -1
- package/public/assets/index-DxUD3RYr.js +0 -2
- package/public/assets/index-DxUD3RYr.js.map +0 -1
- package/public/assets/loading-CmEVQgyj.css +0 -1
- package/public/assets/main-CZztwrfv.js +0 -48
- package/public/assets/main-CZztwrfv.js.map +0 -1
- package/public/assets/monaco-viewer-CpxDfB-6.js +0 -27
- package/public/assets/monaco-viewer-CpxDfB-6.js.map +0 -1
- package/public/assets/tool-call-DbtCsJ4x.js +0 -60
- package/public/assets/tool-call-DbtCsJ4x.js.map +0 -1
- package/public/assets/unified-picker-C0eo1chJ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/workspaces/manager.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\"\nimport { spawnSync } from \"child_process\"\nimport { randomUUID } from \"node:crypto\"\nimport { realpath } from \"node:fs/promises\"\nimport type { Endpoint } from \"@opencode-ai/client/service\"\nimport type { LocationGetOutput, LocationRef, OpenCodeClient, OpenCodeEvent } from \"@opencode-ai/client\"\nimport { EventBus } from \"../events/bus\"\nimport type { SettingsService } from \"../settings/service\"\nimport type { BinaryResolver } from \"../settings/binaries\"\nimport { FileSystemBrowser } from \"../filesystem/browser\"\nimport { searchWorkspaceFiles, WorkspaceFileSearchOptions } from \"../filesystem/search\"\nimport { clearWorkspaceSearchCache } from \"../filesystem/search-cache\"\nimport { WorkspaceDescriptor, WorkspaceFileResponse, FileSystemEntry } from \"../api-types\"\nimport { Logger } from \"../logger\"\nimport {\n buildServiceLaunchSpec,\n parseWslUncPath,\n resolveWslHostDirectory,\n resolveWslServiceDirectory,\n type ServiceLaunchSpec,\n} from \"./spawn\"\nimport {\n HostOpenCodeService,\n hostOpenCodeServiceIdentity,\n startupEnvironmentHash,\n} from \"./host-opencode-service\"\nimport {\n OpenCodeSharedService,\n type OpenCodeServiceLifecycle,\n type OpenCodeSharedServiceOptions,\n} from \"./opencode-service\"\nimport { WslOpenCodeService } from \"./wsl-opencode-service\"\nimport { isPathOwnedByWorktree, resolveOwnedWorktreePath } from \"./worktree-directory\"\n\nconst DEFAULT_LAUNCH_TIMEOUT_MS = 30_000\nconst MAX_ACTIVE_WORKSPACE_CREATIONS = 32\nconst WORKSPACE_STATE = Symbol(\"workspaceState\")\ntype ManagerTimeout = number | NodeJS.Timeout\n\ninterface SharedService {\n endpoint: (options?: OpenCodeSharedServiceOptions) => Promise<Endpoint>\n client: (options?: OpenCodeSharedServiceOptions) => Promise<OpenCodeClient>\n headers: (options?: OpenCodeSharedServiceOptions, requestOptions?: { deadlineAt?: number }) => Promise<{ authorization: string } | undefined>\n validateLocation: (location: LocationRef, requestOptions?: { signal?: AbortSignal; deadlineAt?: number }, serviceOptions?: OpenCodeSharedServiceOptions) => Promise<LocationGetOutput>\n evictLocation: (location: LocationRef, requestOptions?: { signal?: AbortSignal }, serviceOptions?: OpenCodeSharedServiceOptions) => Promise<void>\n subscribe: (requestOptions?: { signal?: AbortSignal }, serviceOptions?: OpenCodeSharedServiceOptions) => Promise<AsyncIterable<OpenCodeEvent>>\n invalidate?: () => void\n shutdown: (options?: { timeoutMs?: number }) => Promise<void>\n}\n\nexport function binaryPathsEqual(left: string, right: string, platform = process.platform): boolean {\n const leftWsl = parseWslUncPath(left)\n const rightWsl = parseWslUncPath(right)\n if (leftWsl || rightWsl) {\n return Boolean(\n leftWsl\n && rightWsl\n && leftWsl.distro.toLowerCase() === rightWsl.distro.toLowerCase()\n && leftWsl.linuxPath === rightWsl.linuxPath,\n )\n }\n return platform === \"win32\" ? left.toLowerCase() === right.toLowerCase() : left === right\n}\n\ninterface WorkspaceManagerOptions {\n rootDir: string\n settings: SettingsService\n binaryResolver: BinaryResolver\n eventBus: EventBus\n logger: Logger\n sharedService?: SharedService\n prepareSessionPruning?: (launch: ServiceLaunchSpec, environment: NodeJS.ProcessEnv) => Promise<void>\n shutdownTimeoutMs?: number\n launchSettlementTimeoutMs?: number\n launchTimeoutMs?: number\n now?: () => number\n setTimeout?: (callback: () => void, delayMs: number) => ManagerTimeout\n clearTimeout?: (timer: ManagerTimeout) => void\n platform?: NodeJS.Platform\n wslServiceDirectoryResolver?: (directory: string, distro: string, timeoutMs: number) => string | null | Promise<string | null>\n wslHostDirectoryResolver?: (directory: string, distro: string, timeoutMs: number) => string | null | Promise<string | null>\n wslServiceLifecycleFactory?: (\n spec: Extract<ServiceLaunchSpec, { kind: \"wsl\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ) => OpenCodeServiceLifecycle\n hostServiceLifecycleFactory?: (\n spec: Extract<ServiceLaunchSpec, { kind: \"host\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ) => OpenCodeServiceLifecycle\n}\n\nexport function isWindowsHostPath(directory: string): boolean {\n return /^[A-Za-z]:[\\\\/]|^(?:\\\\\\\\|\\/\\/)/.test(directory)\n}\n\nexport function canonicalWorktreeIdentity(directory: string, platform = process.platform): string {\n const wsl = parseWslUncPath(directory)\n if (wsl) return `wsl:${wsl.distro.toLowerCase()}:${wsl.linuxPath}`\n const identity = path.normalize(directory)\n return platform === \"win32\" ? identity.toLowerCase() : identity\n}\n\ninterface WorkspaceRecord extends WorkspaceDescriptor {\n location?: LocationRef\n wslDistro?: string\n [WORKSPACE_STATE]: WorkspaceState\n}\n\ninterface WorkspaceState {\n abortController: AbortController\n settlement?: Promise<void>\n cleanupSettlement?: Promise<WorkspaceDescriptor>\n deletePromise?: Promise<WorkspaceDescriptor | undefined>\n published: boolean\n stoppedPublished: boolean\n locationOwned: boolean\n creationClaims: Map<string, CreationRequestState>\n creationRetained: boolean\n serviceOptions?: OpenCodeSharedServiceOptions\n}\nexport class WorkspaceLaunchCancelledError extends Error {\n constructor(workspaceId: string) {\n super(`Workspace ${workspaceId} launch was cancelled`)\n this.name = \"WorkspaceLaunchCancelledError\"\n }\n}\nexport class WorkspaceLaunchTimeoutError extends Error {\n readonly code = \"WORKSPACE_LAUNCH_TIMEOUT\"\n readonly retryable = true\n constructor(workspaceId: string | undefined, timeoutMs: number) {\n super(`${workspaceId ? `Workspace ${workspaceId}` : \"Workspace\"} did not finish launching within ${timeoutMs}ms`)\n this.name = \"WorkspaceLaunchTimeoutError\"\n }\n}\nexport class WorkspaceCleanupTimeoutError extends Error {\n readonly code = \"WORKSPACE_CLEANUP_TIMEOUT\"\n readonly retryable = true\n constructor(operation: string, timeoutMs: number) {\n super(`Workspace ${operation} did not finish within ${timeoutMs}ms; cleanup can be retried`)\n this.name = \"WorkspaceCleanupTimeoutError\"\n }\n}\nexport class WorkspaceShutdownError extends AggregateError {\n readonly code = \"WORKSPACE_SHUTDOWN_FAILED\"\n readonly retryable = true\n constructor(errors: unknown[]) {\n super(errors, `Failed to stop ${errors.length} workspace${errors.length === 1 ? \"\" : \"s\"} during shutdown; cleanup can be retried`)\n this.name = \"WorkspaceShutdownError\"\n }\n}\nexport interface WorkspaceCreateResult {\n workspace: WorkspaceDescriptor\n created: boolean\n}\nexport interface WorkspaceCreateOptions {\n requestId?: string\n}\ntype CreationRequestState = \"owner\" | \"cancelled\" | \"released\"\nexport class WorkspaceManager {\n private readonly workspaces = new Map<string, WorkspaceRecord>()\n private readonly cancelledCreationRequests = new Set<string>()\n private readonly pendingCreationRequests = new Set<string>()\n private readonly activeLocationCreations = new Set<Promise<void>>()\n private locationEvictions: Promise<void> = Promise.resolve()\n private pendingLocationEvictions = 0\n private activeWorkspaceCreations = 0\n private shuttingDown = false\n private readonly sharedService: SharedService\n private serviceAuthorization?: string\n private warnedLegacyServiceEnvironment = false\n\n constructor(private readonly options: WorkspaceManagerOptions) {\n this.sharedService = options.sharedService ?? new OpenCodeSharedService()\n }\n list(): WorkspaceDescriptor[] {\n return Array.from(this.workspaces.values())\n .filter((record) => record[WORKSPACE_STATE].published)\n }\n\n get(id: string): WorkspaceDescriptor | undefined {\n const record = this.workspaces.get(id)\n return record?.[WORKSPACE_STATE].published ? record : undefined\n }\n\n getInstanceAuthorizationHeader(id: string): string | undefined {\n return this.workspaces.get(id)?.[WORKSPACE_STATE].published ? this.serviceAuthorization : undefined\n }\n\n getServiceDirectory(id: string): string | undefined {\n const record = this.workspaces.get(id)\n return record?.[WORKSPACE_STATE].published ? record.location?.directory ?? record.path : undefined\n }\n\n async getSharedServiceEndpoint(id: string): Promise<Endpoint | undefined> {\n if (!this.workspaces.get(id)?.[WORKSPACE_STATE].published) return undefined\n try {\n const [endpoint, headers] = await Promise.all([this.sharedService.endpoint(), this.sharedService.headers()])\n this.serviceAuthorization = headers?.authorization\n return endpoint\n } catch (error) {\n this.options.logger.warn({ err: error }, \"Shared OpenCode service is unavailable\")\n return undefined\n }\n }\n\n getSharedServiceClient(): Promise<OpenCodeClient> {\n return this.sharedService.client()\n }\n\n invalidateSharedServiceConnection(): void {\n this.sharedService.invalidate?.()\n }\n\n async ownsDirectory(id: string, directory: string): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n if (directory === record.path || directory === record.location?.directory) return true\n if (await this.ownsHostDirectory(record, directory)) return true\n if (!record.wslDistro) return false\n const hostDirectory = await this.resolveWslHostDirectory(directory, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n return Boolean(hostDirectory && await this.ownsHostDirectory(record, hostDirectory))\n }\n\n async ownsLocation(id: string, location: LocationRef): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n const requested = await this.resolveOwnedWorktree(record, location.directory)\n if (!requested) return false\n if (!location.workspaceID) return true\n try {\n const candidates = record.location?.workspaceID === location.workspaceID\n ? [record.location]\n : (await (await this.sharedService.client(record[WORKSPACE_STATE].serviceOptions)).debug.location.list())\n .filter((candidate) => candidate.workspaceID === location.workspaceID)\n for (const candidate of candidates) {\n const resolved = await this.resolveOwnedWorktree(record, candidate.directory)\n if (resolved && canonicalWorktreeIdentity(resolved.worktreeDirectory, this.options.platform)\n === canonicalWorktreeIdentity(requested.worktreeDirectory, this.options.platform)) return true\n }\n return false\n } catch {\n return false\n }\n }\n\n async ownsLocationWorkspace(id: string, workspaceID: string): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n if (record.location?.workspaceID === workspaceID) return true\n try {\n const locations = await (await this.sharedService.client(record[WORKSPACE_STATE].serviceOptions)).debug.location.list()\n for (const location of locations) {\n if (location.workspaceID === workspaceID && await this.ownsDirectory(id, location.directory)) return true\n }\n return false\n } catch {\n return false\n }\n }\n\n async getServiceDirectoryForPath(id: string, directory: string): Promise<string | undefined> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return undefined\n const owned = await this.resolveOwnedWorktree(record, directory)\n if (!owned) return undefined\n if (!record.wslDistro) return owned.directory\n return await this.resolveWslServiceDirectory(owned.directory, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS) ?? undefined\n }\n\n async getWorktreeIdentityForPath(id: string, directory: string): Promise<string | undefined> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return undefined\n const owned = await this.resolveOwnedWorktree(record, directory)\n if (!owned) return undefined\n return canonicalWorktreeIdentity(owned.worktreeDirectory)\n }\n\n async getServicePathForPath(id: string, candidate: string): Promise<string | undefined> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published || !await this.ownsPath(id, candidate)) return undefined\n if (!record.wslDistro) return candidate\n return await this.resolveWslServiceDirectory(candidate, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n ?? (path.posix.isAbsolute(candidate) ? candidate : undefined)\n }\n\n private async ownsHostDirectory(record: WorkspaceRecord, directory: string): Promise<boolean> {\n return (await resolveOwnedWorktreePath({\n workspaceId: record.id,\n workspacePath: record.path,\n directory,\n logger: this.options.logger,\n })) !== null\n }\n\n private async resolveOwnedWorktree(record: WorkspaceRecord, directory: string) {\n const hostDirectory = record.wslDistro\n ? isWindowsHostPath(directory)\n ? directory\n : await this.resolveWslHostDirectory(directory, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n : directory\n if (!hostDirectory) return null\n return resolveOwnedWorktreePath({\n workspaceId: record.id,\n workspacePath: record.path,\n directory: hostDirectory,\n logger: this.options.logger,\n })\n }\n\n async ownsPath(id: string, candidate: string): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n if (await this.ownsHostPath(record, candidate)) return true\n if (!record.wslDistro) return false\n const hostPath = await this.resolveWslHostDirectory(candidate, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n return Boolean(hostPath && await this.ownsHostPath(record, hostPath))\n }\n\n private ownsHostPath(record: WorkspaceRecord, candidate: string): Promise<boolean> {\n return isPathOwnedByWorktree({\n workspaceId: record.id,\n workspacePath: record.path,\n candidate,\n logger: this.options.logger,\n })\n }\n\n subscribeToSharedService(signal?: AbortSignal): Promise<AsyncIterable<OpenCodeEvent>> {\n return this.sharedService.subscribe({ signal })\n }\n\n findReadyInstanceIdByBinary(binaryPath: string): string | undefined {\n const resolvedPath = this.resolveBinaryPath(binaryPath)\n return this.list().find((workspace) => {\n return workspace.status === \"ready\" && binaryPathsEqual(workspace.binaryId, resolvedPath)\n })?.id\n }\n\n listFiles(workspaceId: string, relativePath = \".\"): FileSystemEntry[] {\n const workspace = this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: workspace.path })\n return browser.list(relativePath)\n }\n\n searchFiles(workspaceId: string, query: string, options?: WorkspaceFileSearchOptions): FileSystemEntry[] {\n const workspace = this.requireWorkspace(workspaceId)\n return searchWorkspaceFiles(workspace.path, query, options)\n }\n\n readFile(workspaceId: string, relativePath: string, options?: { encoding?: \"utf-8\" | \"base64\" }): WorkspaceFileResponse {\n const workspace = this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: workspace.path })\n const encoding = options?.encoding ?? \"utf-8\"\n const contents = encoding === \"base64\" ? browser.readFileBase64(relativePath) : browser.readFile(relativePath)\n return {\n workspaceId,\n relativePath,\n contents,\n encoding,\n }\n }\n\n readFileInDirectory(workspaceId: string, directory: string, relativePath: string, options?: { encoding?: \"utf-8\" | \"base64\" }): WorkspaceFileResponse {\n this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: directory })\n const encoding = options?.encoding ?? \"utf-8\"\n const contents = encoding === \"base64\" ? browser.readFileBase64(relativePath) : browser.readFile(relativePath)\n return {\n workspaceId,\n relativePath,\n contents,\n encoding,\n }\n }\n\n writeFile(workspaceId: string, relativePath: string, contents: string): void {\n const workspace = this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: workspace.path })\n browser.writeFile(relativePath, contents)\n }\n\n writeFileInDirectory(workspaceId: string, directory: string, relativePath: string, contents: string): void {\n this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: directory })\n browser.writeFile(relativePath, contents)\n }\n\n async create(\n folder: string,\n name?: string,\n options: WorkspaceCreateOptions = {},\n ): Promise<WorkspaceCreateResult> {\n if (options.requestId) this.beginCreationRequest(options.requestId)\n let creationCounted = false\n let settlementTracked = false\n const launchTimeoutMs = Math.max(1, this.options.launchTimeoutMs ?? DEFAULT_LAUNCH_TIMEOUT_MS)\n const launchDeadlineAt = this.now() + launchTimeoutMs\n try {\n const submittedPath = path.isAbsolute(folder) ? path.normalize(folder) : path.resolve(this.options.rootDir, folder)\n const workspacePath = await this.withLaunchDeadline(\n realpath(submittedPath).then((resolved) => path.normalize(resolved), () => submittedPath),\n undefined,\n launchDeadlineAt,\n launchTimeoutMs,\n )\n if (options.requestId && this.cancelledCreationRequests.has(options.requestId)) {\n throw new Error(`Workspace creation request ${options.requestId} was cancelled`)\n }\n if (this.shuttingDown) {\n throw new Error(\"Workspace manager is shutting down\")\n }\n if (this.activeWorkspaceCreations >= MAX_ACTIVE_WORKSPACE_CREATIONS) {\n throw new Error(\"Too many workspace creations are already in progress\")\n }\n this.activeWorkspaceCreations += 1\n creationCounted = true\n const record = this.reserveWorkspace(workspacePath, name, options, launchDeadlineAt)\n const creation = this.startCreation(record, launchDeadlineAt, launchTimeoutMs)\n settlementTracked = true\n void record[WORKSPACE_STATE].settlement!.then(() => { this.activeWorkspaceCreations -= 1 })\n return this.finishCreation(await creation, options.requestId, record)\n } finally {\n if (creationCounted && !settlementTracked) this.activeWorkspaceCreations -= 1\n if (options.requestId) this.finishCreationRequest(options.requestId)\n }\n }\n private reserveWorkspace(\n workspacePath: string,\n name: string | undefined,\n options: WorkspaceCreateOptions,\n launchDeadlineAt: number,\n ): WorkspaceRecord {\n const id = randomUUID()\n const binary = this.options.binaryResolver.resolveDefault()\n const resolvedBinaryPath = this.resolveBinaryPath(binary.path, Math.max(1, launchDeadlineAt - this.now()))\n clearWorkspaceSearchCache(workspacePath)\n\n this.options.logger.info({ workspaceId: id, folder: workspacePath, binary: resolvedBinaryPath }, \"Creating workspace\")\n\n const proxyPath = `/workspaces/${id}/instance`\n\n\n const record = {\n id,\n requestId: options.requestId,\n path: workspacePath,\n name,\n status: \"starting\",\n proxyPath,\n binaryId: resolvedBinaryPath,\n binaryLabel: binary.label,\n binaryVersion: binary.version,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n } as WorkspaceRecord\n Object.defineProperties(record, {\n wslDistro: { value: undefined, writable: true },\n [WORKSPACE_STATE]: { value: {\n abortController: new AbortController(),\n published: false,\n stoppedPublished: false,\n locationOwned: false,\n creationClaims: new Map(options.requestId ? [[options.requestId, \"owner\"]] : []),\n creationRetained: options.requestId === undefined,\n } },\n })\n\n this.workspaces.set(id, record)\n return record\n }\n private startCreation(record: WorkspaceRecord,\n launchDeadlineAt: number, launchTimeoutMs: number): Promise<WorkspaceCreateResult> {\n const launch = this.createResolvedWorkspace(record, launchDeadlineAt)\n const creation = this.createWithDeadline(record, launchDeadlineAt, launchTimeoutMs, launch)\n record[WORKSPACE_STATE].settlement = launch.then(() => undefined, () => undefined)\n return creation\n }\n private async createWithDeadline(record: WorkspaceRecord,\n launchDeadlineAt: number, launchTimeoutMs: number,\n launch: Promise<WorkspaceCreateResult>): Promise<WorkspaceCreateResult> {\n const timeoutMs = Math.max(1, launchDeadlineAt - this.now())\n const state = record[WORKSPACE_STATE]\n let timeout: ManagerTimeout | null = (this.options.setTimeout ?? setTimeout)(() => {\n timeout = null\n if (!state.abortController.signal.aborted) {\n state.abortController.abort(new WorkspaceLaunchTimeoutError(record.id, launchTimeoutMs))\n }\n }, timeoutMs)\n try {\n const deadline = new Promise<never>((_resolve, reject) => {\n state.abortController.signal.addEventListener(\"abort\", () => reject(state.abortController.signal.reason), { once: true })\n })\n return await Promise.race([launch, deadline])\n } finally {\n if (timeout) (this.options.clearTimeout ?? clearTimeout)(timeout)\n }\n }\n\n private async withLaunchDeadline<T>(operation: Promise<T>, workspaceId: string | undefined,\n deadlineAt: number, launchTimeoutMs: number): Promise<T> {\n const timeoutMs = Math.max(1, deadlineAt - this.now())\n let timeout: ManagerTimeout | null = null\n const deadline = new Promise<never>((_resolve, reject) => {\n timeout = (this.options.setTimeout ?? setTimeout)(() => {\n timeout = null\n reject(new WorkspaceLaunchTimeoutError(workspaceId, launchTimeoutMs))\n }, timeoutMs)\n })\n try {\n return await Promise.race([operation, deadline])\n } finally {\n if (timeout) (this.options.clearTimeout ?? clearTimeout)(timeout)\n }\n }\n private async createResolvedWorkspace(\n record: WorkspaceRecord,\n launchDeadlineAt: number,\n ): Promise<WorkspaceCreateResult> {\n const state = record[WORKSPACE_STATE]\n const { id, path: workspacePath, binaryId: resolvedBinaryPath } = record\n let cancelledLocation: LocationRef | undefined\n try {\n const launch = buildServiceLaunchSpec(resolvedBinaryPath, {\n platform: this.options.platform,\n })\n const timeoutMs = Math.max(1, launchDeadlineAt - this.now())\n const startupEnvironment = launch.kind === \"wsl\"\n ? await this.wslStartupEnvironment(this.serviceStartupEnvironment(), launch.distro, launchDeadlineAt)\n : this.serviceStartupEnvironment()\n await this.options.prepareSessionPruning?.(launch, startupEnvironment)\n const serviceOptions: OpenCodeSharedServiceOptions = {\n kind: \"lifecycle\",\n identity: launch.kind === \"host\"\n ? hostOpenCodeServiceIdentity({\n binary: launch.binary,\n platform: launch.platform,\n startupEnvironment,\n })\n : `wsl:${launch.distro.trim().toLowerCase()}:${path.posix.normalize(launch.binary)}`\n + `:env:${startupEnvironmentHash(startupEnvironment, \"linux\")}`,\n lifecycle: launch.kind === \"host\"\n ? this.createHostServiceLifecycle(launch, timeoutMs, startupEnvironment)\n : this.createWslServiceLifecycle(launch, timeoutMs, startupEnvironment),\n }\n state.serviceOptions = serviceOptions\n this.throwIfCancelled(record)\n record.wslDistro = launch.kind === \"wsl\" ? launch.distro : undefined\n const serviceDirectory = launch.kind === \"wsl\"\n ? await this.requireWslServiceDirectory(workspacePath, launch.distro, launchDeadlineAt - this.now())\n : workspacePath\n record.location = { directory: serviceDirectory }\n return await this.withLocationCreation(async () => {\n this.throwIfCancelled(record)\n const [headersResult, locationResult] = await Promise.allSettled([\n this.sharedService.headers(serviceOptions, { deadlineAt: launchDeadlineAt }),\n this.sharedService.validateLocation(\n { directory: serviceDirectory },\n { signal: state.abortController.signal, deadlineAt: launchDeadlineAt },\n serviceOptions,\n ),\n ])\n if (state.abortController.signal.aborted && locationResult.status === \"fulfilled\") {\n cancelledLocation = {\n directory: locationResult.value.directory,\n workspaceID: locationResult.value.workspaceID,\n }\n }\n this.throwIfCancelled(record)\n if (locationResult.status === \"fulfilled\") {\n record.location = { directory: locationResult.value.directory, workspaceID: locationResult.value.workspaceID }\n state.locationOwned = true\n }\n if (headersResult.status === \"rejected\") throw headersResult.reason\n if (locationResult.status === \"rejected\") throw locationResult.reason\n this.serviceAuthorization = headersResult.value?.authorization\n this.throwIfCancelled(record)\n state.published = true\n this.options.eventBus.publish({ type: \"workspace.created\", workspace: record })\n this.throwIfCancelled(record)\n\n record.status = \"ready\"\n record.updatedAt = new Date().toISOString()\n this.options.eventBus.publish({ type: \"workspace.started\", workspace: record })\n this.options.logger.info({ workspaceId: id, location: record.location }, \"Workspace ready\")\n return { workspace: record, created: true }\n })\n } catch (error) {\n const launchFailure = state.abortController.signal.aborted ? state.abortController.signal.reason : error\n if ((state.locationOwned || cancelledLocation) && !this.shuttingDown) {\n const eviction = cancelledLocation\n ? this.evictCancelledLocation(record, cancelledLocation)\n : this.evictRecordLocation(record)\n await eviction.catch((evictionError) => {\n this.options.logger.warn(\n { workspaceId: id, err: evictionError },\n \"Failed to evict an OpenCode location after workspace launch failure\",\n )\n })\n }\n if (!state.deletePromise && (!state.published || !state.locationOwned)) {\n this.removeRecord(id, record, state.published)\n }\n this.options.logger.error({ workspaceId: id, err: launchFailure }, \"Workspace failed to start\")\n throw launchFailure\n }\n }\n\n delete(id: string): Promise<WorkspaceDescriptor | undefined> {\n const record = this.workspaces.get(id)\n if (!record) return Promise.resolve(undefined)\n const state = record[WORKSPACE_STATE]\n if (!state.abortController.signal.aborted) {\n state.abortController.abort(new WorkspaceLaunchCancelledError(id))\n }\n if (!state.deletePromise) {\n let deletePromise!: Promise<WorkspaceDescriptor | undefined>\n deletePromise = this.cleanupDeletedWorkspace(id, record).catch((error) => {\n if (state.deletePromise === deletePromise) state.deletePromise = undefined\n throw error\n })\n state.deletePromise = deletePromise\n }\n return state.deletePromise\n }\n\n releaseCreationRequest(id: string, requestId: string): boolean {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n const state = record[WORKSPACE_STATE]\n const claim = state.creationClaims.get(requestId)\n if (claim === \"released\") return true\n if (claim !== \"owner\") return false\n state.creationClaims.set(requestId, \"released\")\n state.creationRetained = true\n this.refreshCreationRequestId(record)\n return true\n }\n\n async cancelCreationRequest(requestId: string): Promise<void> {\n const deletions: Promise<WorkspaceDescriptor | undefined>[] = []\n let releasedClaimFound = false\n for (const [workspaceId, record] of this.workspaces) {\n const state = record[WORKSPACE_STATE]\n const claim = state.creationClaims.get(requestId)\n if (claim === undefined) continue\n if (claim === \"released\") {\n releasedClaimFound = true\n continue\n }\n state.creationClaims.set(requestId, \"cancelled\")\n this.refreshCreationRequestId(record)\n if (!state.creationRetained && !this.hasActiveCreationClaims(state)) {\n deletions.push(this.delete(workspaceId))\n }\n }\n if (!releasedClaimFound && this.pendingCreationRequests.has(requestId)) {\n this.cancelledCreationRequests.add(requestId)\n }\n await Promise.all(deletions)\n }\n\n private finishCreation(\n result: WorkspaceCreateResult,\n requestId: string | undefined,\n record: WorkspaceRecord,\n ): WorkspaceCreateResult {\n const requestState = requestId ? record[WORKSPACE_STATE].creationClaims.get(requestId) : undefined\n if (requestId && (requestState === \"cancelled\" || this.cancelledCreationRequests.has(requestId))) {\n throw new Error(`Workspace creation request ${requestId} was cancelled`)\n }\n const ownsCreation = requestId !== undefined && requestState === \"owner\"\n return {\n workspace: { ...result.workspace, requestId: ownsCreation ? requestId : undefined },\n created: result.created && (requestId === undefined || ownsCreation),\n }\n }\n\n private refreshCreationRequestId(record: WorkspaceRecord): void {\n record.requestId = Array.from(record[WORKSPACE_STATE].creationClaims)\n .find(([, claim]) => claim === \"owner\")?.[0]\n }\n\n private hasActiveCreationClaims(state: WorkspaceState): boolean {\n return Array.from(state.creationClaims.values()).some((claim) => claim === \"owner\")\n }\n\n private beginCreationRequest(requestId: string): void {\n const claimed = Array.from(this.workspaces.values())\n .some((record) => record[WORKSPACE_STATE].creationClaims.has(requestId))\n if (this.pendingCreationRequests.has(requestId) || claimed) {\n throw new Error(`Workspace creation request ${requestId} is already in use`)\n }\n this.pendingCreationRequests.add(requestId)\n }\n\n private finishCreationRequest(requestId: string): void {\n this.pendingCreationRequests.delete(requestId)\n this.cancelledCreationRequests.delete(requestId)\n }\n\n async shutdown() {\n this.shuttingDown = true\n this.options.logger.info(\"Shutting down all workspaces\")\n const shutdownTimeoutMs = Math.max(1, this.options.shutdownTimeoutMs ?? 10000)\n const deadlineAt = this.now() + shutdownTimeoutMs\n const records = Array.from(this.workspaces.entries())\n for (const [id, record] of records) {\n const state = record[WORKSPACE_STATE]\n if (!state.abortController.signal.aborted) state.abortController.abort(new WorkspaceLaunchCancelledError(id))\n }\n const settlements = records.map(([, record]) => {\n const state = record[WORKSPACE_STATE]\n return state.cleanupSettlement ?? state.deletePromise ?? state.settlement ?? Promise.resolve()\n })\n const stopFailures: unknown[] = []\n if (settlements.length) {\n await this.withTimeout(Promise.allSettled(settlements), shutdownTimeoutMs, \"shutdown\")\n .then((results) => {\n stopFailures.push(...results.flatMap((result) => result.status === \"rejected\" ? [result.reason] : []))\n })\n .catch((error) => stopFailures.push(error))\n }\n for (const [id, record] of records) this.removeRecord(id, record, true, \"stopped\")\n this.cancelledCreationRequests.clear()\n this.pendingCreationRequests.clear()\n const remaining = Math.max(1, deadlineAt - this.now())\n await this.withTimeout(\n this.sharedService.shutdown({ timeoutMs: remaining }),\n remaining,\n \"shared service shutdown\",\n ).catch((error) => stopFailures.push(error))\n if (stopFailures.length) throw new WorkspaceShutdownError(stopFailures)\n }\n\n private async withTimeout<T>(operation: Promise<T>, timeoutMs: number, label: string): Promise<T> {\n let timeout: ManagerTimeout | null = null\n const deadline = new Promise<never>((_resolve, reject) => {\n timeout = (this.options.setTimeout ?? setTimeout)(() => {\n timeout = null\n reject(new WorkspaceCleanupTimeoutError(label, timeoutMs))\n }, timeoutMs)\n })\n\n try {\n return await Promise.race([operation, deadline])\n } finally {\n if (timeout) (this.options.clearTimeout ?? clearTimeout)(timeout)\n }\n }\n\n private requireWorkspace(id: string): WorkspaceDescriptor {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) throw new Error(\"Workspace not found\")\n return record\n }\n\n private throwIfCancelled(record: WorkspaceRecord): void {\n record[WORKSPACE_STATE].abortController.signal.throwIfAborted()\n }\n\n private async cleanupDeletedWorkspace(id: string, record: WorkspaceRecord): Promise<WorkspaceDescriptor> {\n const timeoutMs = Math.max(1, this.options.launchSettlementTimeoutMs ?? 5000)\n const state = record[WORKSPACE_STATE]\n const cleanup = state.cleanupSettlement ?? (async () => {\n await state.settlement!\n await this.evictRecordLocation(record)\n this.removeRecord(id, record, true)\n return record\n })()\n state.cleanupSettlement = cleanup\n void cleanup.catch(() => {\n if (state.cleanupSettlement === cleanup) state.cleanupSettlement = undefined\n })\n return this.withTimeout(cleanup, timeoutMs, `${id} cleanup`)\n }\n\n private async evictRecordLocation(record: WorkspaceRecord): Promise<void> {\n const state = record[WORKSPACE_STATE]\n if (!state.locationOwned || !record.location) return\n await this.withLocationEviction(async () => {\n if (this.shuttingDown) return\n if (!state.locationOwned || !record.location) return\n const location = record.location\n const shared = Array.from(this.workspaces.values()).some((candidate) => (\n candidate !== record\n && candidate[WORKSPACE_STATE].locationOwned\n && !candidate[WORKSPACE_STATE].abortController.signal.aborted\n && candidate.location\n && this.locationsEqual(record, location, candidate, candidate.location)\n ))\n if (shared) {\n state.locationOwned = false\n return\n }\n await this.sharedService.evictLocation(location, undefined, state.serviceOptions)\n for (const candidate of this.workspaces.values()) {\n if (candidate.location && this.locationsEqual(record, location, candidate, candidate.location)) {\n candidate[WORKSPACE_STATE].locationOwned = false\n }\n }\n })\n }\n\n private async evictCancelledLocation(record: WorkspaceRecord, location: LocationRef): Promise<void> {\n await this.withLocationEviction(async () => {\n if (this.shuttingDown) return\n const shared = Array.from(this.workspaces.values()).some((candidate) => (\n candidate !== record\n && candidate[WORKSPACE_STATE].locationOwned\n && !candidate[WORKSPACE_STATE].abortController.signal.aborted\n && candidate.location\n && this.locationsEqual(record, location, candidate, candidate.location)\n ))\n if (!shared) await this.sharedService.evictLocation(location, undefined, record[WORKSPACE_STATE].serviceOptions)\n })\n }\n\n private locationsEqual(\n leftRecord: WorkspaceRecord,\n left: LocationRef,\n rightRecord: WorkspaceRecord,\n right: LocationRef,\n ): boolean {\n if (leftRecord[WORKSPACE_STATE].serviceOptions?.identity !== rightRecord[WORKSPACE_STATE].serviceOptions?.identity) {\n return false\n }\n return left.directory === right.directory && left.workspaceID === right.workspaceID\n }\n\n private async withLocationCreation<T>(operation: () => Promise<T>): Promise<T> {\n while (this.pendingLocationEvictions) await this.locationEvictions\n let release!: () => void\n const active = new Promise<void>((resolve) => { release = resolve })\n this.activeLocationCreations.add(active)\n try {\n return await operation()\n } finally {\n this.activeLocationCreations.delete(active)\n release()\n }\n }\n\n private withLocationEviction<T>(operation: () => Promise<T>): Promise<T> {\n this.pendingLocationEvictions += 1\n const run = this.locationEvictions.then(async () => {\n await Promise.all(this.activeLocationCreations)\n return operation()\n })\n const settled = run.finally(() => { this.pendingLocationEvictions -= 1 })\n this.locationEvictions = settled.then(() => undefined, () => undefined)\n return settled\n }\n\n private async requireWslServiceDirectory(directory: string, distro: string, timeoutMs = DEFAULT_LAUNCH_TIMEOUT_MS): Promise<string> {\n const translated = timeoutMs > 0 ? await this.resolveWslServiceDirectory(directory, distro, timeoutMs) : null\n if (!translated) {\n throw new Error(`Unable to translate workspace location for WSL distro \"${distro}\": ${directory}`)\n }\n return translated\n }\n\n private resolveWslServiceDirectory(directory: string, distro: string, timeoutMs: number): Promise<string | null> {\n if (this.options.wslServiceDirectoryResolver) {\n return Promise.resolve(this.options.wslServiceDirectoryResolver(directory, distro, timeoutMs))\n }\n return resolveWslServiceDirectory(directory, distro, undefined, timeoutMs)\n }\n\n private resolveWslHostDirectory(directory: string, distro: string, timeoutMs: number): Promise<string | null> {\n if (this.options.wslHostDirectoryResolver) {\n return Promise.resolve(this.options.wslHostDirectoryResolver(directory, distro, timeoutMs))\n }\n return resolveWslHostDirectory(directory, distro, undefined, timeoutMs)\n }\n\n private createWslServiceLifecycle(\n spec: Extract<ServiceLaunchSpec, { kind: \"wsl\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ): OpenCodeServiceLifecycle {\n return this.options.wslServiceLifecycleFactory?.(spec, timeoutMs, startupEnvironment)\n ?? new WslOpenCodeService({\n distro: spec.distro,\n binary: spec.binary,\n startupEnvironment,\n timeoutMs,\n })\n }\n\n private createHostServiceLifecycle(\n spec: Extract<ServiceLaunchSpec, { kind: \"host\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ): OpenCodeServiceLifecycle {\n return this.options.hostServiceLifecycleFactory?.(spec, timeoutMs, startupEnvironment)\n ?? new HostOpenCodeService({\n binary: spec.binary,\n platform: spec.platform,\n startupEnvironment,\n timeoutMs,\n })\n }\n\n private serviceStartupEnvironment(): NodeJS.ProcessEnv {\n const configured = this.options.settings.getOwner(\"config\", \"server\").environmentVariables\n const environment: NodeJS.ProcessEnv = {}\n const omitted: string[] = []\n if (configured && typeof configured === \"object\" && !Array.isArray(configured)) {\n for (const [key, value] of Object.entries(configured)) {\n if (typeof value !== \"string\") continue\n if ([\"OPENCODE_DB\", \"XDG_STATE_HOME\"].includes(key.toUpperCase())) {\n omitted.push(key)\n continue\n }\n if (!key || key.includes(\"=\") || key.includes(\"\\0\") || value.includes(\"\\0\")) {\n throw new Error(`Invalid OpenCode service environment variable name: ${key || \"(empty)\"}`)\n }\n environment[key] = value\n }\n }\n if (omitted.length && !this.warnedLegacyServiceEnvironment) {\n this.warnedLegacyServiceEnvironment = true\n this.options.logger.warn(\n { variables: omitted },\n \"Ignoring legacy OpenCode storage ownership variables for the global daemon\",\n )\n }\n if (process.env.NODE_EXTRA_CA_CERTS !== undefined) {\n for (const key of Object.keys(environment)) {\n if (key.toUpperCase() === \"NODE_EXTRA_CA_CERTS\") delete environment[key]\n }\n environment.NODE_EXTRA_CA_CERTS = process.env.NODE_EXTRA_CA_CERTS\n }\n return environment\n }\n\n private async wslStartupEnvironment(environment: NodeJS.ProcessEnv, distro: string, deadlineAt: number): Promise<NodeJS.ProcessEnv> {\n let caKey: string | undefined\n let caValue: string | undefined\n for (const [key, value] of Object.entries(environment)) {\n if (key.toUpperCase() !== \"NODE_EXTRA_CA_CERTS\") continue\n if (caKey === undefined || key === \"NODE_EXTRA_CA_CERTS\") {\n caKey = key\n caValue = value\n }\n delete environment[key]\n }\n if (caKey === undefined) return environment\n if (caValue && !path.posix.isAbsolute(caValue) && path.win32.isAbsolute(caValue)) {\n const remaining = deadlineAt - this.now()\n const translated = remaining > 0 ? await this.resolveWslServiceDirectory(caValue, distro, remaining) : null\n if (!translated) {\n throw new Error(`Unable to translate NODE_EXTRA_CA_CERTS for WSL distro \"${distro}\": ${caValue}`)\n }\n caValue = translated\n }\n environment.NODE_EXTRA_CA_CERTS = caValue\n return environment\n }\n\n private now(): number {\n return (this.options.now ?? Date.now)()\n }\n\n private removeRecord(\n id: string,\n record: WorkspaceRecord,\n publishStopped: boolean,\n reason: \"deleted\" | \"stopped\" = \"deleted\",\n ): void {\n if (this.workspaces.get(id) !== record) return\n this.workspaces.delete(id)\n clearWorkspaceSearchCache(record.path)\n if (publishStopped) this.publishStopped(record, reason)\n }\n\n private publishStopped(record: WorkspaceRecord, reason: \"deleted\" | \"stopped\" = \"stopped\"): void {\n const state = record[WORKSPACE_STATE]\n if (!state.published || state.stoppedPublished) return\n state.stoppedPublished = true\n record.status = \"stopped\"\n record.error = undefined\n this.options.eventBus.publish({ type: \"workspace.stopped\", workspaceId: record.id, reason })\n }\n\n resolveBinaryPath(identifier: string, timeoutMs = DEFAULT_LAUNCH_TIMEOUT_MS): string {\n if (!identifier) {\n return identifier\n }\n\n const looksLikePath = identifier.includes(\"/\") || identifier.includes(\"\\\\\") || identifier.startsWith(\".\")\n if (path.isAbsolute(identifier) || looksLikePath) {\n return identifier\n }\n\n const locator = process.platform === \"win32\" ? \"where\" : \"which\"\n\n try {\n const result = spawnSync(locator, [identifier], { encoding: \"utf8\", timeout: Math.max(1, timeoutMs) })\n if (result.status === 0 && result.stdout) {\n const candidates = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .filter((line) => !/^INFO:/i.test(line))\n\n if (candidates.length > 0) {\n const resolved = this.pickBinaryCandidate(candidates)\n this.options.logger.debug({ identifier, resolved, candidates }, \"Resolved binary path from system PATH\")\n return resolved\n }\n } else if (result.error) {\n this.options.logger.warn({ identifier, err: result.error }, \"Failed to resolve binary path via locator command\")\n }\n } catch (error) {\n this.options.logger.warn({ identifier, err: error }, \"Failed to resolve binary path from system PATH\")\n }\n\n return identifier\n }\n\n private pickBinaryCandidate(candidates: string[]): string {\n if (process.platform !== \"win32\") {\n return candidates[0] ?? \"\"\n }\n\n const extensionPreference = [\".exe\", \".cmd\", \".bat\", \".ps1\"]\n\n for (const ext of extensionPreference) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext))\n if (match) {\n return match\n }\n }\n\n return candidates[0] ?? \"\"\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/workspaces/manager.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\"\nimport { spawnSync } from \"child_process\"\nimport { randomUUID } from \"node:crypto\"\nimport { realpath } from \"node:fs/promises\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport type { LocationGetOutput, LocationRef, OpenCodeClient, OpenCodeEvent } from \"@opencode/client\"\nimport { EventBus } from \"../events/bus\"\nimport type { SettingsService } from \"../settings/service\"\nimport type { BinaryResolver } from \"../settings/binaries\"\nimport { FileSystemBrowser } from \"../filesystem/browser\"\nimport { searchWorkspaceFiles, WorkspaceFileSearchOptions } from \"../filesystem/search\"\nimport { clearWorkspaceSearchCache } from \"../filesystem/search-cache\"\nimport { WorkspaceDescriptor, WorkspaceFileResponse, FileSystemEntry } from \"../api-types\"\nimport { Logger } from \"../logger\"\nimport {\n buildServiceLaunchSpec,\n parseWslUncPath,\n resolveWslHostDirectory,\n resolveWslServiceDirectory,\n type ServiceLaunchSpec,\n} from \"./spawn\"\nimport {\n HostOpenCodeService,\n hostOpenCodeServiceIdentity,\n startupEnvironmentHash,\n} from \"./host-opencode-service\"\nimport {\n OpenCodeSharedService,\n type OpenCodeServiceLifecycle,\n type OpenCodeSharedServiceOptions,\n} from \"./opencode-service\"\nimport { WslOpenCodeService } from \"./wsl-opencode-service\"\nimport { isPathOwnedByWorktree, resolveOwnedWorktreePath } from \"./worktree-directory\"\nimport { locationRequestOptions, readLocationRef, sameLocation } from \"../opencode/compatibility/location\"\n\nconst DEFAULT_LAUNCH_TIMEOUT_MS = 30_000\nconst MAX_ACTIVE_WORKSPACE_CREATIONS = 32\nconst WORKSPACE_STATE = Symbol(\"workspaceState\")\ntype ManagerTimeout = number | NodeJS.Timeout\n\ninterface SharedService {\n acquire?: () => Promise<import(\"./opencode-service\").ServiceConnection>\n fetch?: () => Promise<typeof fetch>\n endpoint: (options?: OpenCodeSharedServiceOptions) => Promise<Endpoint>\n client: (options?: OpenCodeSharedServiceOptions) => Promise<OpenCodeClient>\n headers: (options?: OpenCodeSharedServiceOptions, requestOptions?: { deadlineAt?: number }) => Promise<{ authorization: string } | undefined>\n validateLocation: (location: LocationRef, requestOptions?: { signal?: AbortSignal; deadlineAt?: number }, serviceOptions?: OpenCodeSharedServiceOptions) => Promise<LocationGetOutput>\n evictLocation: (location: LocationRef, requestOptions?: { signal?: AbortSignal }, serviceOptions?: OpenCodeSharedServiceOptions) => Promise<void>\n subscribe: (requestOptions?: { signal?: AbortSignal }, serviceOptions?: OpenCodeSharedServiceOptions) => Promise<AsyncIterable<OpenCodeEvent>>\n invalidate?: () => void\n shutdown: (options?: { timeoutMs?: number }) => Promise<void>\n}\n\nexport function binaryPathsEqual(left: string, right: string, platform = process.platform): boolean {\n const leftWsl = parseWslUncPath(left)\n const rightWsl = parseWslUncPath(right)\n if (leftWsl || rightWsl) {\n return Boolean(\n leftWsl\n && rightWsl\n && leftWsl.distro.toLowerCase() === rightWsl.distro.toLowerCase()\n && leftWsl.linuxPath === rightWsl.linuxPath,\n )\n }\n return platform === \"win32\" ? left.toLowerCase() === right.toLowerCase() : left === right\n}\n\ninterface WorkspaceManagerOptions {\n rootDir: string\n settings: SettingsService\n binaryResolver: BinaryResolver\n eventBus: EventBus\n logger: Logger\n sharedService?: SharedService\n prepareSessionPruning?: (launch: ServiceLaunchSpec, environment: NodeJS.ProcessEnv) => Promise<void>\n shutdownTimeoutMs?: number\n launchSettlementTimeoutMs?: number\n launchTimeoutMs?: number\n now?: () => number\n setTimeout?: (callback: () => void, delayMs: number) => ManagerTimeout\n clearTimeout?: (timer: ManagerTimeout) => void\n platform?: NodeJS.Platform\n wslServiceDirectoryResolver?: (directory: string, distro: string, timeoutMs: number) => string | null | Promise<string | null>\n wslHostDirectoryResolver?: (directory: string, distro: string, timeoutMs: number) => string | null | Promise<string | null>\n wslServiceLifecycleFactory?: (\n spec: Extract<ServiceLaunchSpec, { kind: \"wsl\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ) => OpenCodeServiceLifecycle\n hostServiceLifecycleFactory?: (\n spec: Extract<ServiceLaunchSpec, { kind: \"host\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ) => OpenCodeServiceLifecycle\n}\n\nexport function isWindowsHostPath(directory: string): boolean {\n return /^[A-Za-z]:[\\\\/]|^(?:\\\\\\\\|\\/\\/)/.test(directory)\n}\n\nexport function canonicalWorktreeIdentity(directory: string, platform = process.platform): string {\n const wsl = parseWslUncPath(directory)\n if (wsl) return `wsl:${wsl.distro.toLowerCase()}:${wsl.linuxPath}`\n const identity = path.normalize(directory)\n return platform === \"win32\" ? identity.toLowerCase() : identity\n}\n\ninterface WorkspaceRecord extends WorkspaceDescriptor {\n location?: LocationRef\n wslDistro?: string\n [WORKSPACE_STATE]: WorkspaceState\n}\n\ninterface WorkspaceState {\n abortController: AbortController\n settlement?: Promise<void>\n cleanupSettlement?: Promise<WorkspaceDescriptor>\n deletePromise?: Promise<WorkspaceDescriptor | undefined>\n published: boolean\n stoppedPublished: boolean\n locationOwned: boolean\n creationClaims: Map<string, CreationRequestState>\n creationRetained: boolean\n serviceOptions?: OpenCodeSharedServiceOptions\n}\nexport class WorkspaceLaunchCancelledError extends Error {\n constructor(workspaceId: string) {\n super(`Workspace ${workspaceId} launch was cancelled`)\n this.name = \"WorkspaceLaunchCancelledError\"\n }\n}\nexport class WorkspaceLaunchTimeoutError extends Error {\n readonly code = \"WORKSPACE_LAUNCH_TIMEOUT\"\n readonly retryable = true\n constructor(workspaceId: string | undefined, timeoutMs: number) {\n super(`${workspaceId ? `Workspace ${workspaceId}` : \"Workspace\"} did not finish launching within ${timeoutMs}ms`)\n this.name = \"WorkspaceLaunchTimeoutError\"\n }\n}\nexport class WorkspaceCleanupTimeoutError extends Error {\n readonly code = \"WORKSPACE_CLEANUP_TIMEOUT\"\n readonly retryable = true\n constructor(operation: string, timeoutMs: number) {\n super(`Workspace ${operation} did not finish within ${timeoutMs}ms; cleanup can be retried`)\n this.name = \"WorkspaceCleanupTimeoutError\"\n }\n}\nexport class WorkspaceShutdownError extends AggregateError {\n readonly code = \"WORKSPACE_SHUTDOWN_FAILED\"\n readonly retryable = true\n constructor(errors: unknown[]) {\n super(errors, `Failed to stop ${errors.length} workspace${errors.length === 1 ? \"\" : \"s\"} during shutdown; cleanup can be retried`)\n this.name = \"WorkspaceShutdownError\"\n }\n}\nexport interface WorkspaceCreateResult {\n workspace: WorkspaceDescriptor\n created: boolean\n}\nexport interface WorkspaceCreateOptions {\n requestId?: string\n}\ntype CreationRequestState = \"owner\" | \"cancelled\" | \"released\"\nexport class WorkspaceManager {\n private readonly workspaces = new Map<string, WorkspaceRecord>()\n private readonly cancelledCreationRequests = new Set<string>()\n private readonly pendingCreationRequests = new Set<string>()\n private readonly activeLocationCreations = new Set<Promise<void>>()\n private locationEvictions: Promise<void> = Promise.resolve()\n private pendingLocationEvictions = 0\n private activeWorkspaceCreations = 0\n private shuttingDown = false\n private readonly sharedService: SharedService\n private serviceAuthorization?: string\n private warnedLegacyServiceEnvironment = false\n\n constructor(private readonly options: WorkspaceManagerOptions) {\n this.sharedService = options.sharedService ?? new OpenCodeSharedService()\n }\n list(): WorkspaceDescriptor[] {\n return Array.from(this.workspaces.values())\n .filter((record) => record[WORKSPACE_STATE].published)\n }\n\n get(id: string): WorkspaceDescriptor | undefined {\n const record = this.workspaces.get(id)\n return record?.[WORKSPACE_STATE].published ? record : undefined\n }\n\n getInstanceAuthorizationHeader(id: string): string | undefined {\n return this.workspaces.get(id)?.[WORKSPACE_STATE].published ? this.serviceAuthorization : undefined\n }\n\n getServiceDirectory(id: string): string | undefined {\n const record = this.workspaces.get(id)\n return record?.[WORKSPACE_STATE].published ? record.location?.directory ?? record.path : undefined\n }\n\n async getSharedServiceEndpoint(id: string): Promise<Endpoint | undefined> {\n if (!this.workspaces.get(id)?.[WORKSPACE_STATE].published) return undefined\n try {\n const [endpoint, headers] = await Promise.all([this.sharedService.endpoint(), this.sharedService.headers()])\n this.serviceAuthorization = headers?.authorization\n return endpoint\n } catch (error) {\n this.options.logger.warn({ err: error }, \"Shared OpenCode service is unavailable\")\n return undefined\n }\n }\n\n getSharedServiceClient(): Promise<OpenCodeClient> {\n return this.sharedService.client()\n }\n\n getSharedServiceFetch(): Promise<typeof fetch> {\n return this.sharedService.fetch ? this.sharedService.fetch() : Promise.resolve(globalThis.fetch)\n }\n\n async getSharedServiceConnection(id: string): Promise<import(\"./opencode-service\").ServiceConnection | undefined> {\n if (!this.workspaces.get(id)?.[WORKSPACE_STATE].published) return undefined\n return this.sharedService.acquire?.()\n }\n\n invalidateSharedServiceConnection(): void {\n this.sharedService.invalidate?.()\n }\n\n async ownsDirectory(id: string, directory: string): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n if (directory === record.path || directory === record.location?.directory) return true\n if (await this.ownsHostDirectory(record, directory)) return true\n if (!record.wslDistro) return false\n const hostDirectory = await this.resolveWslHostDirectory(directory, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n return Boolean(hostDirectory && await this.ownsHostDirectory(record, hostDirectory))\n }\n\n async ownsLocation(id: string, location: LocationRef, client?: OpenCodeClient): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n const directory = await this.getServiceDirectoryForPath(id, location.directory)\n if (!directory) return false\n if (location.workspaceID === undefined) return true\n // The directory fence alone cannot authorize a legacy native workspace.\n // Resolve the pair with the selected runtime and require exact identity.\n // Modern transports reject the context before making a native request.\n try {\n const requested = readLocationRef({ ...location, directory })\n const resolved = readLocationRef(client\n ? await client.location.get({ location: { directory } }, locationRequestOptions(requested))\n : await this.sharedService.validateLocation(requested, undefined, record[WORKSPACE_STATE].serviceOptions))\n return sameLocation(requested, resolved)\n } catch {\n return false\n }\n }\n\n async getServiceDirectoryForPath(id: string, directory: string): Promise<string | undefined> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return undefined\n const owned = await this.resolveOwnedWorktree(record, directory)\n if (!owned) return undefined\n if (!record.wslDistro) return owned.directory\n return await this.resolveWslServiceDirectory(owned.directory, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS) ?? undefined\n }\n\n async getWorktreeIdentityForPath(id: string, directory: string): Promise<string | undefined> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return undefined\n const owned = await this.resolveOwnedWorktree(record, directory)\n if (!owned) return undefined\n return canonicalWorktreeIdentity(owned.worktreeDirectory)\n }\n\n async getServicePathForPath(id: string, candidate: string): Promise<string | undefined> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published || !await this.ownsPath(id, candidate)) return undefined\n if (!record.wslDistro) return candidate\n return await this.resolveWslServiceDirectory(candidate, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n ?? (path.posix.isAbsolute(candidate) ? candidate : undefined)\n }\n\n private async ownsHostDirectory(record: WorkspaceRecord, directory: string): Promise<boolean> {\n return (await resolveOwnedWorktreePath({\n workspaceId: record.id,\n workspacePath: record.path,\n directory,\n logger: this.options.logger,\n })) !== null\n }\n\n private async resolveOwnedWorktree(record: WorkspaceRecord, directory: string) {\n const hostDirectory = record.wslDistro\n ? isWindowsHostPath(directory)\n ? directory\n : await this.resolveWslHostDirectory(directory, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n : directory\n if (!hostDirectory) return null\n return resolveOwnedWorktreePath({\n workspaceId: record.id,\n workspacePath: record.path,\n directory: hostDirectory,\n logger: this.options.logger,\n })\n }\n\n async ownsPath(id: string, candidate: string): Promise<boolean> {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n if (await this.ownsHostPath(record, candidate)) return true\n if (!record.wslDistro) return false\n const hostPath = await this.resolveWslHostDirectory(candidate, record.wslDistro, DEFAULT_LAUNCH_TIMEOUT_MS)\n return Boolean(hostPath && await this.ownsHostPath(record, hostPath))\n }\n\n private ownsHostPath(record: WorkspaceRecord, candidate: string): Promise<boolean> {\n return isPathOwnedByWorktree({\n workspaceId: record.id,\n workspacePath: record.path,\n candidate,\n logger: this.options.logger,\n })\n }\n\n subscribeToSharedService(signal?: AbortSignal): Promise<AsyncIterable<OpenCodeEvent>> {\n return this.sharedService.subscribe({ signal })\n }\n\n findReadyInstanceIdByBinary(binaryPath: string): string | undefined {\n const resolvedPath = this.resolveBinaryPath(binaryPath)\n return this.list().find((workspace) => {\n return workspace.status === \"ready\" && binaryPathsEqual(workspace.binaryId, resolvedPath)\n })?.id\n }\n\n listFiles(workspaceId: string, relativePath = \".\"): FileSystemEntry[] {\n const workspace = this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: workspace.path })\n return browser.list(relativePath)\n }\n\n searchFiles(workspaceId: string, query: string, options?: WorkspaceFileSearchOptions): FileSystemEntry[] {\n const workspace = this.requireWorkspace(workspaceId)\n return searchWorkspaceFiles(workspace.path, query, options)\n }\n\n readFile(workspaceId: string, relativePath: string, options?: { encoding?: \"utf-8\" | \"base64\" }): WorkspaceFileResponse {\n const workspace = this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: workspace.path })\n const encoding = options?.encoding ?? \"utf-8\"\n const contents = encoding === \"base64\" ? browser.readFileBase64(relativePath) : browser.readFile(relativePath)\n return {\n workspaceId,\n relativePath,\n contents,\n encoding,\n }\n }\n\n readFileInDirectory(workspaceId: string, directory: string, relativePath: string, options?: { encoding?: \"utf-8\" | \"base64\" }): WorkspaceFileResponse {\n this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: directory })\n const encoding = options?.encoding ?? \"utf-8\"\n const contents = encoding === \"base64\" ? browser.readFileBase64(relativePath) : browser.readFile(relativePath)\n return {\n workspaceId,\n relativePath,\n contents,\n encoding,\n }\n }\n\n writeFile(workspaceId: string, relativePath: string, contents: string): void {\n const workspace = this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: workspace.path })\n browser.writeFile(relativePath, contents)\n }\n\n writeFileInDirectory(workspaceId: string, directory: string, relativePath: string, contents: string): void {\n this.requireWorkspace(workspaceId)\n const browser = new FileSystemBrowser({ rootDir: directory })\n browser.writeFile(relativePath, contents)\n }\n\n async create(\n folder: string,\n name?: string,\n options: WorkspaceCreateOptions = {},\n ): Promise<WorkspaceCreateResult> {\n if (options.requestId) this.beginCreationRequest(options.requestId)\n let creationCounted = false\n let settlementTracked = false\n const launchTimeoutMs = Math.max(1, this.options.launchTimeoutMs ?? DEFAULT_LAUNCH_TIMEOUT_MS)\n const launchDeadlineAt = this.now() + launchTimeoutMs\n try {\n const submittedPath = path.isAbsolute(folder) ? path.normalize(folder) : path.resolve(this.options.rootDir, folder)\n const workspacePath = await this.withLaunchDeadline(\n realpath(submittedPath).then((resolved) => path.normalize(resolved), () => submittedPath),\n undefined,\n launchDeadlineAt,\n launchTimeoutMs,\n )\n if (options.requestId && this.cancelledCreationRequests.has(options.requestId)) {\n throw new Error(`Workspace creation request ${options.requestId} was cancelled`)\n }\n if (this.shuttingDown) {\n throw new Error(\"Workspace manager is shutting down\")\n }\n if (this.activeWorkspaceCreations >= MAX_ACTIVE_WORKSPACE_CREATIONS) {\n throw new Error(\"Too many workspace creations are already in progress\")\n }\n this.activeWorkspaceCreations += 1\n creationCounted = true\n const record = this.reserveWorkspace(workspacePath, name, options, launchDeadlineAt)\n const creation = this.startCreation(record, launchDeadlineAt, launchTimeoutMs)\n settlementTracked = true\n void record[WORKSPACE_STATE].settlement!.then(() => { this.activeWorkspaceCreations -= 1 })\n return this.finishCreation(await creation, options.requestId, record)\n } finally {\n if (creationCounted && !settlementTracked) this.activeWorkspaceCreations -= 1\n if (options.requestId) this.finishCreationRequest(options.requestId)\n }\n }\n private reserveWorkspace(\n workspacePath: string,\n name: string | undefined,\n options: WorkspaceCreateOptions,\n launchDeadlineAt: number,\n ): WorkspaceRecord {\n const id = randomUUID()\n const binary = this.options.binaryResolver.resolveDefault()\n const resolvedBinaryPath = this.resolveBinaryPath(binary.path, Math.max(1, launchDeadlineAt - this.now()))\n clearWorkspaceSearchCache(workspacePath)\n\n this.options.logger.info({ workspaceId: id, folder: workspacePath, binary: resolvedBinaryPath }, \"Creating workspace\")\n\n const proxyPath = `/workspaces/${id}/instance`\n\n\n const record = {\n id,\n requestId: options.requestId,\n path: workspacePath,\n name,\n status: \"starting\",\n proxyPath,\n binaryId: resolvedBinaryPath,\n binaryLabel: binary.label,\n binaryVersion: binary.version,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n } as WorkspaceRecord\n Object.defineProperties(record, {\n wslDistro: { value: undefined, writable: true },\n [WORKSPACE_STATE]: { value: {\n abortController: new AbortController(),\n published: false,\n stoppedPublished: false,\n locationOwned: false,\n creationClaims: new Map(options.requestId ? [[options.requestId, \"owner\"]] : []),\n creationRetained: options.requestId === undefined,\n } },\n })\n\n this.workspaces.set(id, record)\n return record\n }\n private startCreation(record: WorkspaceRecord,\n launchDeadlineAt: number, launchTimeoutMs: number): Promise<WorkspaceCreateResult> {\n const launch = this.createResolvedWorkspace(record, launchDeadlineAt)\n const creation = this.createWithDeadline(record, launchDeadlineAt, launchTimeoutMs, launch)\n record[WORKSPACE_STATE].settlement = launch.then(() => undefined, () => undefined)\n return creation\n }\n private async createWithDeadline(record: WorkspaceRecord,\n launchDeadlineAt: number, launchTimeoutMs: number,\n launch: Promise<WorkspaceCreateResult>): Promise<WorkspaceCreateResult> {\n const timeoutMs = Math.max(1, launchDeadlineAt - this.now())\n const state = record[WORKSPACE_STATE]\n let timeout: ManagerTimeout | null = (this.options.setTimeout ?? setTimeout)(() => {\n timeout = null\n if (!state.abortController.signal.aborted) {\n state.abortController.abort(new WorkspaceLaunchTimeoutError(record.id, launchTimeoutMs))\n }\n }, timeoutMs)\n try {\n const deadline = new Promise<never>((_resolve, reject) => {\n state.abortController.signal.addEventListener(\"abort\", () => reject(state.abortController.signal.reason), { once: true })\n })\n return await Promise.race([launch, deadline])\n } finally {\n if (timeout) (this.options.clearTimeout ?? clearTimeout)(timeout)\n }\n }\n\n private async withLaunchDeadline<T>(operation: Promise<T>, workspaceId: string | undefined,\n deadlineAt: number, launchTimeoutMs: number): Promise<T> {\n const timeoutMs = Math.max(1, deadlineAt - this.now())\n let timeout: ManagerTimeout | null = null\n const deadline = new Promise<never>((_resolve, reject) => {\n timeout = (this.options.setTimeout ?? setTimeout)(() => {\n timeout = null\n reject(new WorkspaceLaunchTimeoutError(workspaceId, launchTimeoutMs))\n }, timeoutMs)\n })\n try {\n return await Promise.race([operation, deadline])\n } finally {\n if (timeout) (this.options.clearTimeout ?? clearTimeout)(timeout)\n }\n }\n private async createResolvedWorkspace(\n record: WorkspaceRecord,\n launchDeadlineAt: number,\n ): Promise<WorkspaceCreateResult> {\n const state = record[WORKSPACE_STATE]\n const { id, path: workspacePath, binaryId: resolvedBinaryPath } = record\n let cancelledLocation: LocationRef | undefined\n try {\n const launch = buildServiceLaunchSpec(resolvedBinaryPath, {\n platform: this.options.platform,\n })\n const timeoutMs = Math.max(1, launchDeadlineAt - this.now())\n const startupEnvironment = launch.kind === \"wsl\"\n ? await this.wslStartupEnvironment(this.serviceStartupEnvironment(), launch.distro, launchDeadlineAt)\n : this.serviceStartupEnvironment()\n await this.options.prepareSessionPruning?.(launch, startupEnvironment)\n const serviceOptions: OpenCodeSharedServiceOptions = {\n kind: \"lifecycle\",\n identity: launch.kind === \"host\"\n ? hostOpenCodeServiceIdentity({\n binary: launch.binary,\n platform: launch.platform,\n startupEnvironment,\n })\n : `wsl:${launch.distro.trim().toLowerCase()}:${path.posix.normalize(launch.binary)}`\n + `:env:${startupEnvironmentHash(startupEnvironment, \"linux\")}`,\n lifecycle: launch.kind === \"host\"\n ? this.createHostServiceLifecycle(launch, timeoutMs, startupEnvironment)\n : this.createWslServiceLifecycle(launch, timeoutMs, startupEnvironment),\n }\n state.serviceOptions = serviceOptions\n this.throwIfCancelled(record)\n record.wslDistro = launch.kind === \"wsl\" ? launch.distro : undefined\n const serviceDirectory = launch.kind === \"wsl\"\n ? await this.requireWslServiceDirectory(workspacePath, launch.distro, launchDeadlineAt - this.now())\n : workspacePath\n record.location = { directory: serviceDirectory }\n return await this.withLocationCreation(async () => {\n this.throwIfCancelled(record)\n const [headersResult, locationResult] = await Promise.allSettled([\n this.sharedService.headers(serviceOptions, { deadlineAt: launchDeadlineAt }),\n this.sharedService.validateLocation(\n { directory: serviceDirectory },\n { signal: state.abortController.signal, deadlineAt: launchDeadlineAt },\n serviceOptions,\n ),\n ])\n if (state.abortController.signal.aborted && locationResult.status === \"fulfilled\") {\n cancelledLocation = readLocationRef(locationResult.value)\n }\n this.throwIfCancelled(record)\n if (locationResult.status === \"fulfilled\") {\n record.location = readLocationRef(locationResult.value)\n state.locationOwned = true\n }\n if (headersResult.status === \"rejected\") throw headersResult.reason\n if (locationResult.status === \"rejected\") throw locationResult.reason\n this.serviceAuthorization = headersResult.value?.authorization\n this.throwIfCancelled(record)\n state.published = true\n this.options.eventBus.publish({ type: \"workspace.created\", workspace: record })\n this.throwIfCancelled(record)\n\n record.status = \"ready\"\n record.updatedAt = new Date().toISOString()\n this.options.eventBus.publish({ type: \"workspace.started\", workspace: record })\n this.options.logger.info({ workspaceId: id, location: record.location }, \"Workspace ready\")\n return { workspace: record, created: true }\n })\n } catch (error) {\n const launchFailure = state.abortController.signal.aborted ? state.abortController.signal.reason : error\n if ((state.locationOwned || cancelledLocation) && !this.shuttingDown) {\n const eviction = cancelledLocation\n ? this.evictCancelledLocation(record, cancelledLocation)\n : this.evictRecordLocation(record)\n await eviction.catch((evictionError) => {\n this.options.logger.warn(\n { workspaceId: id, err: evictionError },\n \"Failed to evict an OpenCode location after workspace launch failure\",\n )\n })\n }\n if (!state.deletePromise && (!state.published || !state.locationOwned)) {\n this.removeRecord(id, record, state.published)\n }\n this.options.logger.error({ workspaceId: id, err: launchFailure }, \"Workspace failed to start\")\n throw launchFailure\n }\n }\n\n delete(id: string): Promise<WorkspaceDescriptor | undefined> {\n const record = this.workspaces.get(id)\n if (!record) return Promise.resolve(undefined)\n const state = record[WORKSPACE_STATE]\n if (!state.abortController.signal.aborted) {\n state.abortController.abort(new WorkspaceLaunchCancelledError(id))\n }\n if (!state.deletePromise) {\n let deletePromise!: Promise<WorkspaceDescriptor | undefined>\n deletePromise = this.cleanupDeletedWorkspace(id, record).catch((error) => {\n if (state.deletePromise === deletePromise) state.deletePromise = undefined\n throw error\n })\n state.deletePromise = deletePromise\n }\n return state.deletePromise\n }\n\n releaseCreationRequest(id: string, requestId: string): boolean {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) return false\n const state = record[WORKSPACE_STATE]\n const claim = state.creationClaims.get(requestId)\n if (claim === \"released\") return true\n if (claim !== \"owner\") return false\n state.creationClaims.set(requestId, \"released\")\n state.creationRetained = true\n this.refreshCreationRequestId(record)\n return true\n }\n\n async cancelCreationRequest(requestId: string): Promise<void> {\n const deletions: Promise<WorkspaceDescriptor | undefined>[] = []\n let releasedClaimFound = false\n for (const [workspaceId, record] of this.workspaces) {\n const state = record[WORKSPACE_STATE]\n const claim = state.creationClaims.get(requestId)\n if (claim === undefined) continue\n if (claim === \"released\") {\n releasedClaimFound = true\n continue\n }\n state.creationClaims.set(requestId, \"cancelled\")\n this.refreshCreationRequestId(record)\n if (!state.creationRetained && !this.hasActiveCreationClaims(state)) {\n deletions.push(this.delete(workspaceId))\n }\n }\n if (!releasedClaimFound && this.pendingCreationRequests.has(requestId)) {\n this.cancelledCreationRequests.add(requestId)\n }\n await Promise.all(deletions)\n }\n\n private finishCreation(\n result: WorkspaceCreateResult,\n requestId: string | undefined,\n record: WorkspaceRecord,\n ): WorkspaceCreateResult {\n const requestState = requestId ? record[WORKSPACE_STATE].creationClaims.get(requestId) : undefined\n if (requestId && (requestState === \"cancelled\" || this.cancelledCreationRequests.has(requestId))) {\n throw new Error(`Workspace creation request ${requestId} was cancelled`)\n }\n const ownsCreation = requestId !== undefined && requestState === \"owner\"\n return {\n workspace: { ...result.workspace, requestId: ownsCreation ? requestId : undefined },\n created: result.created && (requestId === undefined || ownsCreation),\n }\n }\n\n private refreshCreationRequestId(record: WorkspaceRecord): void {\n record.requestId = Array.from(record[WORKSPACE_STATE].creationClaims)\n .find(([, claim]) => claim === \"owner\")?.[0]\n }\n\n private hasActiveCreationClaims(state: WorkspaceState): boolean {\n return Array.from(state.creationClaims.values()).some((claim) => claim === \"owner\")\n }\n\n private beginCreationRequest(requestId: string): void {\n const claimed = Array.from(this.workspaces.values())\n .some((record) => record[WORKSPACE_STATE].creationClaims.has(requestId))\n if (this.pendingCreationRequests.has(requestId) || claimed) {\n throw new Error(`Workspace creation request ${requestId} is already in use`)\n }\n this.pendingCreationRequests.add(requestId)\n }\n\n private finishCreationRequest(requestId: string): void {\n this.pendingCreationRequests.delete(requestId)\n this.cancelledCreationRequests.delete(requestId)\n }\n\n async shutdown() {\n this.shuttingDown = true\n this.options.logger.info(\"Shutting down all workspaces\")\n const shutdownTimeoutMs = Math.max(1, this.options.shutdownTimeoutMs ?? 10000)\n const deadlineAt = this.now() + shutdownTimeoutMs\n const records = Array.from(this.workspaces.entries())\n for (const [id, record] of records) {\n const state = record[WORKSPACE_STATE]\n if (!state.abortController.signal.aborted) state.abortController.abort(new WorkspaceLaunchCancelledError(id))\n }\n const settlements = records.map(([, record]) => {\n const state = record[WORKSPACE_STATE]\n return state.cleanupSettlement ?? state.deletePromise ?? state.settlement ?? Promise.resolve()\n })\n const stopFailures: unknown[] = []\n if (settlements.length) {\n await this.withTimeout(Promise.allSettled(settlements), shutdownTimeoutMs, \"shutdown\")\n .then((results) => {\n stopFailures.push(...results.flatMap((result) => result.status === \"rejected\" ? [result.reason] : []))\n })\n .catch((error) => stopFailures.push(error))\n }\n for (const [id, record] of records) this.removeRecord(id, record, true, \"stopped\")\n this.cancelledCreationRequests.clear()\n this.pendingCreationRequests.clear()\n const remaining = Math.max(1, deadlineAt - this.now())\n await this.withTimeout(\n this.sharedService.shutdown({ timeoutMs: remaining }),\n remaining,\n \"shared service shutdown\",\n ).catch((error) => stopFailures.push(error))\n if (stopFailures.length) throw new WorkspaceShutdownError(stopFailures)\n }\n\n private async withTimeout<T>(operation: Promise<T>, timeoutMs: number, label: string): Promise<T> {\n let timeout: ManagerTimeout | null = null\n const deadline = new Promise<never>((_resolve, reject) => {\n timeout = (this.options.setTimeout ?? setTimeout)(() => {\n timeout = null\n reject(new WorkspaceCleanupTimeoutError(label, timeoutMs))\n }, timeoutMs)\n })\n\n try {\n return await Promise.race([operation, deadline])\n } finally {\n if (timeout) (this.options.clearTimeout ?? clearTimeout)(timeout)\n }\n }\n\n private requireWorkspace(id: string): WorkspaceDescriptor {\n const record = this.workspaces.get(id)\n if (!record?.[WORKSPACE_STATE].published) throw new Error(\"Workspace not found\")\n return record\n }\n\n private throwIfCancelled(record: WorkspaceRecord): void {\n record[WORKSPACE_STATE].abortController.signal.throwIfAborted()\n }\n\n private async cleanupDeletedWorkspace(id: string, record: WorkspaceRecord): Promise<WorkspaceDescriptor> {\n const timeoutMs = Math.max(1, this.options.launchSettlementTimeoutMs ?? 5000)\n const state = record[WORKSPACE_STATE]\n const cleanup = state.cleanupSettlement ?? (async () => {\n await state.settlement!\n await this.evictRecordLocation(record)\n this.removeRecord(id, record, true)\n return record\n })()\n state.cleanupSettlement = cleanup\n void cleanup.catch(() => {\n if (state.cleanupSettlement === cleanup) state.cleanupSettlement = undefined\n })\n return this.withTimeout(cleanup, timeoutMs, `${id} cleanup`)\n }\n\n private async evictRecordLocation(record: WorkspaceRecord): Promise<void> {\n const state = record[WORKSPACE_STATE]\n if (!state.locationOwned || !record.location) return\n await this.withLocationEviction(async () => {\n if (this.shuttingDown) return\n if (!state.locationOwned || !record.location) return\n const location = record.location\n const shared = Array.from(this.workspaces.values()).some((candidate) => (\n candidate !== record\n && candidate[WORKSPACE_STATE].locationOwned\n && !candidate[WORKSPACE_STATE].abortController.signal.aborted\n && candidate.location\n && this.locationsEqual(record, location, candidate, candidate.location)\n ))\n if (shared) {\n state.locationOwned = false\n return\n }\n await this.sharedService.evictLocation(location, undefined, state.serviceOptions)\n for (const candidate of this.workspaces.values()) {\n if (candidate.location && this.locationsEqual(record, location, candidate, candidate.location)) {\n candidate[WORKSPACE_STATE].locationOwned = false\n }\n }\n })\n }\n\n private async evictCancelledLocation(record: WorkspaceRecord, location: LocationRef): Promise<void> {\n await this.withLocationEviction(async () => {\n if (this.shuttingDown) return\n const shared = Array.from(this.workspaces.values()).some((candidate) => (\n candidate !== record\n && candidate[WORKSPACE_STATE].locationOwned\n && !candidate[WORKSPACE_STATE].abortController.signal.aborted\n && candidate.location\n && this.locationsEqual(record, location, candidate, candidate.location)\n ))\n if (!shared) await this.sharedService.evictLocation(location, undefined, record[WORKSPACE_STATE].serviceOptions)\n })\n }\n\n private locationsEqual(\n leftRecord: WorkspaceRecord,\n left: LocationRef,\n rightRecord: WorkspaceRecord,\n right: LocationRef,\n ): boolean {\n if (leftRecord[WORKSPACE_STATE].serviceOptions?.identity !== rightRecord[WORKSPACE_STATE].serviceOptions?.identity) {\n return false\n }\n return sameLocation(left, right)\n }\n\n private async withLocationCreation<T>(operation: () => Promise<T>): Promise<T> {\n while (this.pendingLocationEvictions) await this.locationEvictions\n let release!: () => void\n const active = new Promise<void>((resolve) => { release = resolve })\n this.activeLocationCreations.add(active)\n try {\n return await operation()\n } finally {\n this.activeLocationCreations.delete(active)\n release()\n }\n }\n\n private withLocationEviction<T>(operation: () => Promise<T>): Promise<T> {\n this.pendingLocationEvictions += 1\n const run = this.locationEvictions.then(async () => {\n await Promise.all(this.activeLocationCreations)\n return operation()\n })\n const settled = run.finally(() => { this.pendingLocationEvictions -= 1 })\n this.locationEvictions = settled.then(() => undefined, () => undefined)\n return settled\n }\n\n private async requireWslServiceDirectory(directory: string, distro: string, timeoutMs = DEFAULT_LAUNCH_TIMEOUT_MS): Promise<string> {\n const translated = timeoutMs > 0 ? await this.resolveWslServiceDirectory(directory, distro, timeoutMs) : null\n if (!translated) {\n throw new Error(`Unable to translate workspace location for WSL distro \"${distro}\": ${directory}`)\n }\n return translated\n }\n\n private resolveWslServiceDirectory(directory: string, distro: string, timeoutMs: number): Promise<string | null> {\n if (this.options.wslServiceDirectoryResolver) {\n return Promise.resolve(this.options.wslServiceDirectoryResolver(directory, distro, timeoutMs))\n }\n return resolveWslServiceDirectory(directory, distro, undefined, timeoutMs)\n }\n\n private resolveWslHostDirectory(directory: string, distro: string, timeoutMs: number): Promise<string | null> {\n if (this.options.wslHostDirectoryResolver) {\n return Promise.resolve(this.options.wslHostDirectoryResolver(directory, distro, timeoutMs))\n }\n return resolveWslHostDirectory(directory, distro, undefined, timeoutMs)\n }\n\n private createWslServiceLifecycle(\n spec: Extract<ServiceLaunchSpec, { kind: \"wsl\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ): OpenCodeServiceLifecycle {\n return this.options.wslServiceLifecycleFactory?.(spec, timeoutMs, startupEnvironment)\n ?? new WslOpenCodeService({\n distro: spec.distro,\n binary: spec.binary,\n startupEnvironment,\n timeoutMs,\n })\n }\n\n private createHostServiceLifecycle(\n spec: Extract<ServiceLaunchSpec, { kind: \"host\" }>,\n timeoutMs: number,\n startupEnvironment: NodeJS.ProcessEnv,\n ): OpenCodeServiceLifecycle {\n return this.options.hostServiceLifecycleFactory?.(spec, timeoutMs, startupEnvironment)\n ?? new HostOpenCodeService({\n binary: spec.binary,\n platform: spec.platform,\n startupEnvironment,\n timeoutMs,\n })\n }\n\n private serviceStartupEnvironment(): NodeJS.ProcessEnv {\n const configured = this.options.settings.getOwner(\"config\", \"server\").environmentVariables\n const environment: NodeJS.ProcessEnv = {}\n const omitted: string[] = []\n if (configured && typeof configured === \"object\" && !Array.isArray(configured)) {\n for (const [key, value] of Object.entries(configured)) {\n if (typeof value !== \"string\") continue\n if ([\"OPENCODE_DB\", \"XDG_STATE_HOME\"].includes(key.toUpperCase())) {\n omitted.push(key)\n continue\n }\n if (!key || key.includes(\"=\") || key.includes(\"\\0\") || value.includes(\"\\0\")) {\n throw new Error(`Invalid OpenCode service environment variable name: ${key || \"(empty)\"}`)\n }\n environment[key] = value\n }\n }\n if (omitted.length && !this.warnedLegacyServiceEnvironment) {\n this.warnedLegacyServiceEnvironment = true\n this.options.logger.warn(\n { variables: omitted },\n \"Ignoring legacy OpenCode storage ownership variables for the global daemon\",\n )\n }\n if (process.env.NODE_EXTRA_CA_CERTS !== undefined) {\n for (const key of Object.keys(environment)) {\n if (key.toUpperCase() === \"NODE_EXTRA_CA_CERTS\") delete environment[key]\n }\n environment.NODE_EXTRA_CA_CERTS = process.env.NODE_EXTRA_CA_CERTS\n }\n return environment\n }\n\n private async wslStartupEnvironment(environment: NodeJS.ProcessEnv, distro: string, deadlineAt: number): Promise<NodeJS.ProcessEnv> {\n let caKey: string | undefined\n let caValue: string | undefined\n for (const [key, value] of Object.entries(environment)) {\n if (key.toUpperCase() !== \"NODE_EXTRA_CA_CERTS\") continue\n if (caKey === undefined || key === \"NODE_EXTRA_CA_CERTS\") {\n caKey = key\n caValue = value\n }\n delete environment[key]\n }\n if (caKey === undefined) return environment\n if (caValue && !path.posix.isAbsolute(caValue) && path.win32.isAbsolute(caValue)) {\n const remaining = deadlineAt - this.now()\n const translated = remaining > 0 ? await this.resolveWslServiceDirectory(caValue, distro, remaining) : null\n if (!translated) {\n throw new Error(`Unable to translate NODE_EXTRA_CA_CERTS for WSL distro \"${distro}\": ${caValue}`)\n }\n caValue = translated\n }\n environment.NODE_EXTRA_CA_CERTS = caValue\n return environment\n }\n\n private now(): number {\n return (this.options.now ?? Date.now)()\n }\n\n private removeRecord(\n id: string,\n record: WorkspaceRecord,\n publishStopped: boolean,\n reason: \"deleted\" | \"stopped\" = \"deleted\",\n ): void {\n if (this.workspaces.get(id) !== record) return\n this.workspaces.delete(id)\n clearWorkspaceSearchCache(record.path)\n if (publishStopped) this.publishStopped(record, reason)\n }\n\n private publishStopped(record: WorkspaceRecord, reason: \"deleted\" | \"stopped\" = \"stopped\"): void {\n const state = record[WORKSPACE_STATE]\n if (!state.published || state.stoppedPublished) return\n state.stoppedPublished = true\n record.status = \"stopped\"\n record.error = undefined\n this.options.eventBus.publish({ type: \"workspace.stopped\", workspaceId: record.id, reason })\n }\n\n resolveBinaryPath(identifier: string, timeoutMs = DEFAULT_LAUNCH_TIMEOUT_MS): string {\n if (!identifier) {\n return identifier\n }\n\n const looksLikePath = identifier.includes(\"/\") || identifier.includes(\"\\\\\") || identifier.startsWith(\".\")\n if (path.isAbsolute(identifier) || looksLikePath) {\n return identifier\n }\n\n const locator = process.platform === \"win32\" ? \"where\" : \"which\"\n\n try {\n const result = spawnSync(locator, [identifier], { encoding: \"utf8\", timeout: Math.max(1, timeoutMs) })\n if (result.status === 0 && result.stdout) {\n const candidates = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .filter((line) => !/^INFO:/i.test(line))\n\n if (candidates.length > 0) {\n const resolved = this.pickBinaryCandidate(candidates)\n this.options.logger.debug({ identifier, resolved, candidates }, \"Resolved binary path from system PATH\")\n return resolved\n }\n } else if (result.error) {\n this.options.logger.warn({ identifier, err: result.error }, \"Failed to resolve binary path via locator command\")\n }\n } catch (error) {\n this.options.logger.warn({ identifier, err: error }, \"Failed to resolve binary path from system PATH\")\n }\n\n return identifier\n }\n\n private pickBinaryCandidate(candidates: string[]): string {\n if (process.platform !== \"win32\") {\n return candidates[0] ?? \"\"\n }\n\n const extensionPreference = [\".exe\", \".cmd\", \".bat\", \".ps1\"]\n\n for (const ext of extensionPreference) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext))\n if (match) {\n return match\n }\n }\n\n return candidates[0] ?? \"\"\n }\n}\n"]}
|
|
@@ -62,7 +62,7 @@ class ControlledSharedService {
|
|
|
62
62
|
const directory = location.directory;
|
|
63
63
|
return {
|
|
64
64
|
directory,
|
|
65
|
-
|
|
65
|
+
...this.resolvedLocation,
|
|
66
66
|
project: { id: "project-1", directory, canonical: directory },
|
|
67
67
|
};
|
|
68
68
|
}
|
|
@@ -101,7 +101,7 @@ function createHarness(service = new ControlledSharedService(), overrides = {})
|
|
|
101
101
|
return { manager, service, stopped, eventBus };
|
|
102
102
|
}
|
|
103
103
|
describe("workspace manager shared service lifecycle", () => {
|
|
104
|
-
it("validates native
|
|
104
|
+
it("validates native directory ownership and rejects removed workspace selectors", async () => {
|
|
105
105
|
const service = new ControlledSharedService();
|
|
106
106
|
service.debugLocations = [
|
|
107
107
|
{ directory: process.cwd(), workspaceID: "worktree-location" },
|
|
@@ -109,10 +109,9 @@ describe("workspace manager shared service lifecycle", () => {
|
|
|
109
109
|
];
|
|
110
110
|
const { manager } = createHarness(service);
|
|
111
111
|
const workspace = await manager.create(process.cwd());
|
|
112
|
-
assert.equal(await manager.ownsLocation(workspace.workspace.id, { directory: process.cwd()
|
|
112
|
+
assert.equal(await manager.ownsLocation(workspace.workspace.id, { directory: process.cwd() }), true);
|
|
113
113
|
assert.equal(await manager.ownsLocation(workspace.workspace.id, { directory: process.cwd(), workspaceID: "foreign" }), false);
|
|
114
114
|
assert.equal(await manager.ownsLocation(workspace.workspace.id, { directory: process.cwd(), workspaceID: "mismatch-location" }), false);
|
|
115
|
-
assert.equal(await manager.ownsLocationWorkspace(workspace.workspace.id, "worktree-location"), true);
|
|
116
115
|
});
|
|
117
116
|
it("distinguishes WSL service paths from Windows host paths", () => {
|
|
118
117
|
assert.equal(isWindowsHostPath("/mnt/d/repo"), false);
|
|
@@ -125,6 +124,45 @@ describe("workspace manager shared service lifecycle", () => {
|
|
|
125
124
|
assert.equal(canonicalWorktreeIdentity("\\\\WSL$\\UBUNTU\\repo\\Foo", "win32"), canonicalWorktreeIdentity("\\\\wsl.localhost\\Ubuntu\\repo\\Foo", "win32"));
|
|
126
125
|
assert.notEqual(canonicalWorktreeIdentity("\\\\wsl$\\Ubuntu\\repo\\Foo", "win32"), canonicalWorktreeIdentity("\\\\wsl.localhost\\Ubuntu\\repo\\foo", "win32"));
|
|
127
126
|
});
|
|
127
|
+
it("retains and validates native identity rather than authorizing an arbitrary owned-directory selector", async () => {
|
|
128
|
+
const service = new ControlledSharedService();
|
|
129
|
+
service.resolvedLocation = { directory: process.cwd(), workspaceID: "native-one" };
|
|
130
|
+
const { manager } = createHarness(service);
|
|
131
|
+
const { workspace } = await manager.create(process.cwd());
|
|
132
|
+
assert.equal(await manager.ownsLocation(workspace.id, service.resolvedLocation), true);
|
|
133
|
+
assert.equal(await manager.ownsLocation(workspace.id, { directory: process.cwd(), workspaceID: "native-two" }), false);
|
|
134
|
+
service.resolvedLocation = { directory: path.join(process.cwd(), "foreign"), workspaceID: "native-one" };
|
|
135
|
+
assert.equal(await manager.ownsLocation(workspace.id, { directory: process.cwd(), workspaceID: "native-one" }), false);
|
|
136
|
+
await manager.delete(workspace.id);
|
|
137
|
+
assert.deepEqual(service.evictionCalls[0].location, { directory: process.cwd(), workspaceID: "native-one" });
|
|
138
|
+
});
|
|
139
|
+
it("does not share lifecycle ownership between distinct legacy identities at one directory", async () => {
|
|
140
|
+
const service = new ControlledSharedService();
|
|
141
|
+
const { manager } = createHarness(service);
|
|
142
|
+
service.resolvedLocation = { directory: process.cwd(), workspaceID: "one" };
|
|
143
|
+
const first = await manager.create(process.cwd());
|
|
144
|
+
service.resolvedLocation = { directory: process.cwd(), workspaceID: "two" };
|
|
145
|
+
const second = await manager.create(process.cwd());
|
|
146
|
+
await manager.delete(first.workspace.id);
|
|
147
|
+
assert.deepEqual(service.evictionCalls.map(call => call.location.workspaceID), ["one"]);
|
|
148
|
+
assert.ok(manager.get(second.workspace.id));
|
|
149
|
+
await manager.delete(second.workspace.id);
|
|
150
|
+
assert.deepEqual(service.evictionCalls.map(call => call.location.workspaceID), ["one", "two"]);
|
|
151
|
+
});
|
|
152
|
+
it("uses the caller's pinned client for legacy location authorization", async () => {
|
|
153
|
+
const service = new ControlledSharedService();
|
|
154
|
+
const { manager } = createHarness(service);
|
|
155
|
+
const { workspace } = await manager.create(process.cwd());
|
|
156
|
+
const location = { directory: process.cwd(), workspaceID: "pinned-native" };
|
|
157
|
+
const calls = service.validationCalls.length;
|
|
158
|
+
const client = { location: { get: async (_input, options) => {
|
|
159
|
+
assert.deepEqual(JSON.parse(decodeURIComponent(options.headers["x-codenomad-location"])), location);
|
|
160
|
+
return location;
|
|
161
|
+
} } };
|
|
162
|
+
assert.equal(await manager.ownsLocation(workspace.id, location, client), true);
|
|
163
|
+
assert.equal(service.validationCalls.length, calls);
|
|
164
|
+
await manager.delete(workspace.id);
|
|
165
|
+
});
|
|
128
166
|
it("pins a bounded host CLI lifecycle with binary, platform, and startup environment identity", async () => {
|
|
129
167
|
const service = new ControlledSharedService();
|
|
130
168
|
let factoryCall;
|
|
@@ -423,7 +461,7 @@ describe("workspace manager shared service lifecycle", () => {
|
|
|
423
461
|
await deletion;
|
|
424
462
|
assert.deepEqual(harness.manager.list(), []);
|
|
425
463
|
assert.equal(harness.service.evictionCalls.length, 1);
|
|
426
|
-
assert.
|
|
464
|
+
assert.deepEqual(harness.service.evictionCalls[0]?.location, { directory: process.cwd() });
|
|
427
465
|
assert.equal(harness.service.evictionCalls[0]?.signal, undefined);
|
|
428
466
|
});
|
|
429
467
|
it("evicts a ready location on explicit final deletion without stopping the daemon", async () => {
|
|
@@ -433,7 +471,6 @@ describe("workspace manager shared service lifecycle", () => {
|
|
|
433
471
|
assert.equal(harness.service.evictionCalls.length, 1);
|
|
434
472
|
assert.deepEqual(harness.service.evictionCalls[0]?.location, {
|
|
435
473
|
directory: process.cwd(),
|
|
436
|
-
workspaceID: "location-1",
|
|
437
474
|
});
|
|
438
475
|
assert.equal(harness.service.shutdownCalls, 0);
|
|
439
476
|
});
|
|
@@ -593,7 +630,6 @@ describe("workspace manager shared service lifecycle", () => {
|
|
|
593
630
|
await assert.rejects(harness.manager.create(process.cwd()), /header lookup failed/);
|
|
594
631
|
assert.deepEqual(harness.service.evictionCalls.map(({ location }) => location), [{
|
|
595
632
|
directory: process.cwd(),
|
|
596
|
-
workspaceID: "location-1",
|
|
597
633
|
}]);
|
|
598
634
|
assert.equal(harness.manager.workspaces.size, 0);
|
|
599
635
|
});
|