@neuralnomads/codenomad-dev 0.20.0-dev-20260909-855d2ee7 → 0.20.0-dev-20260911-ea37f97b
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/dist/api-types.js.map +1 -1
- package/dist/index.js +42 -31
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +9 -1
- package/dist/index.test.js.map +1 -1
- package/dist/opencode/pruning-installation.js +65 -0
- package/dist/opencode/pruning-installation.js.map +1 -0
- package/dist/opencode/pruning-installation.test.js +101 -0
- package/dist/opencode/pruning-installation.test.js.map +1 -0
- package/dist/opencode/pruning-lifecycle.js +66 -0
- package/dist/opencode/pruning-lifecycle.js.map +1 -0
- package/dist/opencode/session-pruning/claim-fence.js +33 -0
- package/dist/opencode/session-pruning/claim-fence.js.map +1 -0
- package/dist/opencode/session-pruning/claim-fence.test.js +104 -0
- package/dist/opencode/session-pruning/claim-fence.test.js.map +1 -0
- package/dist/opencode/session-pruning/contract.js +40 -0
- package/dist/opencode/session-pruning/contract.js.map +1 -0
- package/dist/opencode/session-pruning/database-path.js +17 -0
- package/dist/opencode/session-pruning/database-path.js.map +1 -0
- package/dist/opencode/session-pruning/database-path.test.js +22 -0
- package/dist/opencode/session-pruning/database-path.test.js.map +1 -0
- package/dist/opencode/session-pruning/desktop-plugin.js +14 -0
- package/dist/opencode/session-pruning/desktop-plugin.js.map +1 -0
- package/dist/opencode/session-pruning/index.js +2 -0
- package/dist/opencode/session-pruning/index.js.map +1 -0
- package/dist/opencode/session-pruning/isolated-store.js +18 -0
- package/dist/opencode/session-pruning/isolated-store.js.map +1 -0
- package/dist/opencode/session-pruning/planner.js +36 -0
- package/dist/opencode/session-pruning/planner.js.map +1 -0
- package/dist/opencode/session-pruning/plugin.js +45 -0
- package/dist/opencode/session-pruning/plugin.js.map +1 -0
- package/dist/opencode/session-pruning/presence.js +42 -0
- package/dist/opencode/session-pruning/presence.js.map +1 -0
- package/dist/opencode/session-pruning/preview-store.js +21 -0
- package/dist/opencode/session-pruning/preview-store.js.map +1 -0
- package/dist/opencode/session-pruning/pruning.test.js +172 -0
- package/dist/opencode/session-pruning/pruning.test.js.map +1 -0
- package/dist/opencode/session-pruning/revision.js +18 -0
- package/dist/opencode/session-pruning/revision.js.map +1 -0
- package/dist/opencode/session-pruning/service.js +56 -0
- package/dist/opencode/session-pruning/service.js.map +1 -0
- package/dist/opencode/session-pruning/service.test.js +74 -0
- package/dist/opencode/session-pruning/service.test.js.map +1 -0
- package/dist/opencode/session-pruning/storage-path.js +6 -0
- package/dist/opencode/session-pruning/storage-path.js.map +1 -0
- package/dist/opencode/session-pruning/transaction.js +53 -0
- package/dist/opencode/session-pruning/transaction.js.map +1 -0
- package/dist/opencode/session-pruning/tui-reload.js +84 -0
- package/dist/opencode/session-pruning/tui-reload.js.map +1 -0
- package/dist/opencode/session-pruning/tui-reload.native.js +269 -0
- package/dist/opencode/session-pruning/tui-reload.native.js.map +1 -0
- package/dist/opencode/session-pruning/tui-reload.test.js +71 -0
- package/dist/opencode/session-pruning/tui-reload.test.js.map +1 -0
- package/dist/opencode/session-pruning/tui.js +12 -0
- package/dist/opencode/session-pruning/tui.js.map +1 -0
- package/dist/plugins/session-pruning/plugin.mjs +26559 -0
- package/dist/server/__tests__/instance-proxy.test.js +10 -5
- package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
- package/dist/server/__tests__/listener-base-url.test.js +26 -1
- package/dist/server/__tests__/listener-base-url.test.js.map +1 -1
- package/dist/server/__tests__/network-addresses.test.js +40 -0
- package/dist/server/__tests__/network-addresses.test.js.map +1 -1
- package/dist/server/__tests__/network-host.test.js +34 -0
- package/dist/server/__tests__/network-host.test.js.map +1 -0
- package/dist/server/__tests__/tls-ipv6.test.js +54 -0
- package/dist/server/__tests__/tls-ipv6.test.js.map +1 -0
- package/dist/server/http-server.js +8 -6
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/listener-base-url.js +12 -3
- package/dist/server/listener-base-url.js.map +1 -1
- package/dist/server/network-addresses.js +20 -42
- package/dist/server/network-addresses.js.map +1 -1
- package/dist/server/network-host.js +62 -0
- package/dist/server/network-host.js.map +1 -0
- package/dist/server/routes/meta.js +2 -4
- package/dist/server/routes/meta.js.map +1 -1
- package/dist/server/routes/session-pruning.js +45 -0
- package/dist/server/routes/session-pruning.js.map +1 -0
- package/dist/server/routes/session-pruning.test.js +98 -0
- package/dist/server/routes/session-pruning.test.js.map +1 -0
- package/dist/server/tls.js +52 -32
- package/dist/server/tls.js.map +1 -1
- package/dist/workspaces/manager.js +1 -0
- package/dist/workspaces/manager.js.map +1 -1
- package/package.json +6 -3
- package/public/assets/App-0-FcHzPS.js +44 -0
- package/public/assets/App-0-FcHzPS.js.map +1 -0
- package/public/assets/FilesTab-CRpGDs1B.js +3 -0
- package/public/assets/{FilesTab-z7UrjcAQ.js.map → FilesTab-CRpGDs1B.js.map} +1 -1
- package/public/assets/{GitChangesTab-C04bYKhs.js → GitChangesTab-DxFebTiq.js} +3 -3
- package/public/assets/{GitChangesTab-C04bYKhs.js.map → GitChangesTab-DxFebTiq.js.map} +1 -1
- package/public/assets/{SplitFilePanel-B29MqCuU.js → SplitFilePanel-DgTMrrO-.js} +2 -2
- package/public/assets/{SplitFilePanel-B29MqCuU.js.map → SplitFilePanel-DgTMrrO-.js.map} +1 -1
- package/public/assets/{StatusTab-wUKfwnFf.js → StatusTab-LKUA9cbH.js} +2 -2
- package/public/assets/{StatusTab-wUKfwnFf.js.map → StatusTab-LKUA9cbH.js.map} +1 -1
- package/public/assets/{align-justify-glU678D9.js → align-justify-v_yPXSys.js} +2 -2
- package/public/assets/{align-justify-glU678D9.js.map → align-justify-v_yPXSys.js.map} +1 -1
- package/public/assets/{bundle-full-BrsCElYv.js → bundle-full-HzL_Jtqk.js} +2 -2
- package/public/assets/{bundle-full-BrsCElYv.js.map → bundle-full-HzL_Jtqk.js.map} +1 -1
- package/public/assets/{client-state-j9Iu7F-E.js → client-state-CF-PJ0GG.js} +2 -2
- package/public/assets/{client-state-j9Iu7F-E.js.map → client-state-CF-PJ0GG.js.map} +1 -1
- package/public/assets/{diff-viewer-B0VS1voD.js → diff-viewer-BFDQBDVy.js} +2 -2
- package/public/assets/{diff-viewer-B0VS1voD.js.map → diff-viewer-BFDQBDVy.js.map} +1 -1
- package/public/assets/index-8iPlm2r0.js +2 -0
- package/public/assets/index-8iPlm2r0.js.map +1 -0
- package/public/assets/index-B185mC7m.js +2 -0
- package/public/assets/index-B185mC7m.js.map +1 -0
- package/public/assets/index-Bbj1xF8i.js +2 -0
- package/public/assets/index-Bbj1xF8i.js.map +1 -0
- package/public/assets/index-BsmFN3k1.js +2 -0
- package/public/assets/index-BsmFN3k1.js.map +1 -0
- package/public/assets/index-Bz_OQJYA.css +1 -0
- package/public/assets/index-C52CfqK3.js +2 -0
- package/public/assets/index-C52CfqK3.js.map +1 -0
- package/public/assets/index-CHYmKl10.js +2 -0
- package/public/assets/index-CHYmKl10.js.map +1 -0
- package/public/assets/index-CTKYD_VJ.js +2 -0
- package/public/assets/index-CTKYD_VJ.js.map +1 -0
- package/public/assets/index-D2UHSOG5.js +2 -0
- package/public/assets/{index-ClaHfu-1.js.map → index-D2UHSOG5.js.map} +1 -1
- package/public/assets/index-DDoB_Z36.js +2 -0
- package/public/assets/index-DDoB_Z36.js.map +1 -0
- package/public/assets/{index-BzAEHHap.js → index-DcwAtZw-.js} +3 -3
- package/public/assets/index-DcwAtZw-.js.map +1 -0
- package/public/assets/index-DxUD3RYr.js +2 -0
- package/public/assets/index-DxUD3RYr.js.map +1 -0
- package/public/assets/{index-B6bX3AMT.js → index-RK9gf0uk.js} +2 -2
- package/public/assets/{index-B6bX3AMT.js.map → index-RK9gf0uk.js.map} +1 -1
- package/public/assets/{loading-CYiiwb08.js → loading-BSB82snY.js} +2 -2
- package/public/assets/{loading-CYiiwb08.js.map → loading-BSB82snY.js.map} +1 -1
- package/public/assets/main-CZztwrfv.js +48 -0
- package/public/assets/main-CZztwrfv.js.map +1 -0
- package/public/assets/{markdown-DWvSdCZz.js → markdown-DtidoL2Z.js} +4 -4
- package/public/assets/{markdown-DWvSdCZz.js.map → markdown-DtidoL2Z.js.map} +1 -1
- package/public/assets/{monaco-viewer-Cc9bWg7I.js → monaco-viewer-CpxDfB-6.js} +2 -2
- package/public/assets/monaco-viewer-CpxDfB-6.js.map +1 -0
- package/public/assets/{startup-state-settings-card-2KHpBL8U.js → startup-state-settings-card-BY741Rt0.js} +2 -2
- package/public/assets/{startup-state-settings-card-2KHpBL8U.js.map → startup-state-settings-card-BY741Rt0.js.map} +1 -1
- package/public/assets/{terminal-square-lzHuj_of.js → terminal-square-BdC_jwm3.js} +2 -2
- package/public/assets/{terminal-square-lzHuj_of.js.map → terminal-square-BdC_jwm3.js.map} +1 -1
- package/public/assets/{tool-call-DjkszeT4.js → tool-call-DbtCsJ4x.js} +10 -10
- package/public/assets/{tool-call-DjkszeT4.js.map → tool-call-DbtCsJ4x.js.map} +1 -1
- package/public/assets/{unified-picker-5JmIM6a0.js → unified-picker-C0eo1chJ.js} +2 -2
- package/public/assets/{unified-picker-5JmIM6a0.js.map → unified-picker-C0eo1chJ.js.map} +1 -1
- package/public/assets/{wrap-text-N0Cav2Vp.js → wrap-text-BuMtdvMx.js} +2 -2
- package/public/assets/{wrap-text-N0Cav2Vp.js.map → wrap-text-BuMtdvMx.js.map} +1 -1
- package/public/index.html +4 -4
- package/public/loading.html +4 -4
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/public/assets/App-Nlt9zV-v.js +0 -43
- package/public/assets/App-Nlt9zV-v.js.map +0 -1
- package/public/assets/FilesTab-z7UrjcAQ.js +0 -3
- package/public/assets/index-BIRLnDWY.js +0 -2
- package/public/assets/index-BIRLnDWY.js.map +0 -1
- package/public/assets/index-BuScpzpP.js +0 -2
- package/public/assets/index-BuScpzpP.js.map +0 -1
- package/public/assets/index-BzAEHHap.js.map +0 -1
- package/public/assets/index-C-DZt-oz.css +0 -1
- package/public/assets/index-C9RXVQl9.js +0 -2
- package/public/assets/index-C9RXVQl9.js.map +0 -1
- package/public/assets/index-ClaHfu-1.js +0 -2
- package/public/assets/index-DBx5htn3.js +0 -2
- package/public/assets/index-DBx5htn3.js.map +0 -1
- package/public/assets/index-DHHMf3u1.js +0 -2
- package/public/assets/index-DHHMf3u1.js.map +0 -1
- package/public/assets/index-DN4Kstsd.js +0 -2
- package/public/assets/index-DN4Kstsd.js.map +0 -1
- package/public/assets/index-DbMyNDyo.js +0 -2
- package/public/assets/index-DbMyNDyo.js.map +0 -1
- package/public/assets/index-rcsmuqww.js +0 -2
- package/public/assets/index-rcsmuqww.js.map +0 -1
- package/public/assets/index-uz2QFRlk.js +0 -2
- package/public/assets/index-uz2QFRlk.js.map +0 -1
- package/public/assets/main-OmXs7qtG.js +0 -48
- package/public/assets/main-OmXs7qtG.js.map +0 -1
- package/public/assets/monaco-viewer-Cc9bWg7I.js.map +0 -1
package/dist/server/tls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../../src/server/tls.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\"\nimport fs from \"fs\"\nimport path from \"path\"\nimport { createRequire } from \"module\"\nimport type { Logger } from \"../logger\"\n\nconst require = createRequire(import.meta.url)\n\ntype Forge = typeof import(\"node-forge\")\n\nfunction loadForge(): Forge {\n // node-forge is CJS in many installs; require keeps this compatible with our ESM output.\n return require(\"node-forge\") as Forge\n}\n\nexport interface ResolvedHttpsOptions {\n httpsOptions: { key: string | Buffer; cert: string | Buffer; ca?: string | Buffer }\n /** Path to CA certificate suitable for NODE_EXTRA_CA_CERTS. */\n caCertPath?: string\n mode: \"provided\" | \"generated\"\n}\n\nexport interface ResolveHttpsOptionsArgs {\n enabled: boolean\n configDir: string\n host: string\n tlsKeyPath?: string\n tlsCertPath?: string\n tlsCaPath?: string\n tlsSANs?: string\n logger: Logger\n}\n\nconst LEAF_VALIDITY_DAYS = 30\nconst ROTATE_IF_EXPIRES_WITHIN_DAYS = 3\n\nconst CA_VALIDITY_DAYS = 365\n\nexport function resolveHttpsOptions(args: ResolveHttpsOptionsArgs): ResolvedHttpsOptions | null {\n if (!args.enabled) {\n return null\n }\n\n const hasProvided = Boolean(args.tlsKeyPath && args.tlsCertPath)\n if (hasProvided) {\n const key = fs.readFileSync(args.tlsKeyPath!, \"utf-8\")\n const cert = fs.readFileSync(args.tlsCertPath!, \"utf-8\")\n const ca = args.tlsCaPath ? fs.readFileSync(args.tlsCaPath, \"utf-8\") : undefined\n return {\n httpsOptions: { key, cert, ca },\n caCertPath: args.tlsCaPath,\n mode: \"provided\",\n }\n }\n\n return ensureGeneratedTls(args)\n}\n\nfunction ensureGeneratedTls(args: ResolveHttpsOptionsArgs): ResolvedHttpsOptions {\n const tlsDir = path.join(args.configDir, \"tls\")\n const caKeyPath = path.join(tlsDir, \"ca-key.pem\")\n const caCertPath = path.join(tlsDir, \"ca-cert.pem\")\n const keyPath = path.join(tlsDir, \"server-key.pem\")\n const certPath = path.join(tlsDir, \"server-cert.pem\")\n\n fs.mkdirSync(tlsDir, { recursive: true })\n\n const shouldRotateLeaf = () => {\n try {\n if (!fs.existsSync(certPath)) return true\n const pem = fs.readFileSync(certPath, \"utf-8\")\n const x509 = new crypto.X509Certificate(pem)\n const validToMs = Date.parse(x509.validTo)\n if (!Number.isFinite(validToMs)) return true\n const rotateAt = validToMs - ROTATE_IF_EXPIRES_WITHIN_DAYS * 24 * 60 * 60 * 1000\n return Date.now() >= rotateAt\n } catch {\n return true\n }\n }\n\n const shouldRotateCa = () => {\n try {\n if (!fs.existsSync(caCertPath)) return true\n const pem = fs.readFileSync(caCertPath, \"utf-8\")\n const x509 = new crypto.X509Certificate(pem)\n const validToMs = Date.parse(x509.validTo)\n if (!Number.isFinite(validToMs)) return true\n // CA rotates only when expired.\n return Date.now() >= validToMs\n } catch {\n return true\n }\n }\n\n if (shouldRotateCa() || !fs.existsSync(caKeyPath)) {\n const { caKeyPem, caCertPem } = generateCaCertificate()\n writePemFile(caKeyPath, caKeyPem, 0o600)\n writePemFile(caCertPath, caCertPem, 0o644)\n args.logger.info({ caCertPath }, \"Generated self-signed CodeNomad CA certificate\")\n }\n\n if (shouldRotateLeaf() || !fs.existsSync(keyPath)) {\n const caKeyPem = fs.readFileSync(caKeyPath, \"utf-8\")\n const caCertPem = fs.readFileSync(caCertPath, \"utf-8\")\n\n const { keyPem, certPem } = generateServerCertificate({\n host: args.host,\n tlsSANs: args.tlsSANs,\n caKeyPem,\n caCertPem,\n })\n\n writePemFile(keyPath, keyPem, 0o600)\n writePemFile(certPath, certPem, 0o644)\n args.logger.info({ certPath }, \"Generated CodeNomad HTTPS certificate\")\n }\n\n const key = fs.readFileSync(keyPath, \"utf-8\")\n const cert = fs.readFileSync(certPath, \"utf-8\")\n const ca = fs.readFileSync(caCertPath, \"utf-8\")\n\n // Present the CA as part of the chain.\n const chainedCert = `${cert.trim()}\\n${ca.trim()}\\n`\n\n return {\n httpsOptions: {\n key,\n cert: chainedCert,\n },\n caCertPath,\n mode: \"generated\",\n }\n}\n\nfunction writePemFile(filePath: string, content: string, mode: number) {\n fs.writeFileSync(filePath, content, { encoding: \"utf-8\", mode })\n try {\n fs.chmodSync(filePath, mode)\n } catch {\n // best effort on platforms that ignore chmod\n }\n}\n\nfunction generateCaCertificate(): { caKeyPem: string; caCertPem: string } {\n const forge = loadForge()\n\n const keys = forge.pki.rsa.generateKeyPair(2048)\n const cert = forge.pki.createCertificate()\n cert.publicKey = keys.publicKey\n cert.serialNumber = crypto.randomBytes(16).toString(\"hex\")\n\n const now = new Date()\n const notBefore = new Date(now.getTime() - 60_000)\n const notAfter = new Date(now.getTime() + CA_VALIDITY_DAYS * 24 * 60 * 60 * 1000)\n cert.validity.notBefore = notBefore\n cert.validity.notAfter = notAfter\n\n const attrs = [{ name: \"commonName\", value: \"CodeNomad Local CA\" }]\n cert.setSubject(attrs)\n cert.setIssuer(attrs)\n\n cert.setExtensions([\n { name: \"basicConstraints\", cA: true },\n { name: \"keyUsage\", keyCertSign: true, cRLSign: true, digitalSignature: true },\n { name: \"subjectKeyIdentifier\" },\n ])\n\n cert.sign(keys.privateKey, forge.md.sha256.create())\n\n return {\n caKeyPem: forge.pki.privateKeyToPem(keys.privateKey),\n caCertPem: forge.pki.certificateToPem(cert),\n }\n}\n\nfunction generateServerCertificate(args: {\n host: string\n tlsSANs?: string\n caKeyPem: string\n caCertPem: string\n}): { keyPem: string; certPem: string } {\n const forge = loadForge()\n\n const caKey = forge.pki.privateKeyFromPem(args.caKeyPem)\n const caCert = forge.pki.certificateFromPem(args.caCertPem)\n\n const keys = forge.pki.rsa.generateKeyPair(2048)\n const cert = forge.pki.createCertificate()\n cert.publicKey = keys.publicKey\n cert.serialNumber = crypto.randomBytes(16).toString(\"hex\")\n\n const now = new Date()\n const notBefore = new Date(now.getTime() - 60_000)\n const notAfter = new Date(now.getTime() + LEAF_VALIDITY_DAYS * 24 * 60 * 60 * 1000)\n cert.validity.notBefore = notBefore\n cert.validity.notAfter = notAfter\n\n const commonName = pickCommonName(args.host)\n cert.setSubject([{ name: \"commonName\", value: commonName }])\n cert.setIssuer(caCert.subject.attributes)\n\n const san = buildSubjectAltNames(args.host, args.tlsSANs)\n\n cert.setExtensions([\n { name: \"basicConstraints\", cA: false },\n { name: \"keyUsage\", digitalSignature: true, keyEncipherment: true },\n { name: \"extKeyUsage\", serverAuth: true },\n { name: \"subjectAltName\", altNames: san },\n { name: \"subjectKeyIdentifier\" },\n ])\n\n cert.sign(caKey, forge.md.sha256.create())\n\n return {\n keyPem: forge.pki.privateKeyToPem(keys.privateKey),\n certPem: forge.pki.certificateToPem(cert),\n }\n}\n\nfunction pickCommonName(host: string): string {\n if (!host || host === \"0.0.0.0\") {\n return \"localhost\"\n }\n if (host === \"127.0.0.1\") {\n return \"localhost\"\n }\n return host\n}\n\nfunction buildSubjectAltNames(host: string, tlsSANs?: string): Array<{ type: number; value?: string; ip?: string }> {\n const dns = new Set<string>()\n const ips = new Set<string>()\n\n dns.add(\"localhost\")\n ips.add(\"127.0.0.1\")\n\n if (host && host !== \"0.0.0.0\") {\n if (isIPv4(host)) {\n ips.add(host)\n } else {\n dns.add(host)\n }\n }\n\n for (const token of splitList(tlsSANs)) {\n if (isIPv4(token)) {\n ips.add(token)\n } else if (token) {\n dns.add(token)\n }\n }\n\n const altNames: Array<{ type: number; value?: string; ip?: string }> = []\n\n // 2 = DNS, 7 = IP\n for (const name of Array.from(dns)) {\n altNames.push({ type: 2, value: name })\n }\n for (const ip of Array.from(ips)) {\n altNames.push({ type: 7, ip })\n }\n\n return altNames\n}\n\nfunction splitList(input: string | undefined): string[] {\n if (!input) return []\n return input\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n}\n\nfunction isIPv4(value: string): boolean {\n const parts = value.split(\".\")\n if (parts.length !== 4) return false\n return parts.every((part) => {\n if (!/^[0-9]+$/.test(part)) return false\n const num = Number(part)\n return Number.isInteger(num) && num >= 0 && num <= 255\n })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../../src/server/tls.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\"\nimport fs from \"fs\"\nimport path from \"path\"\nimport { createRequire } from \"module\"\nimport { isIP } from \"node:net\"\nimport type { Logger } from \"../logger\"\nimport { isWildcardHost, normalizeNetworkHost, stripIPv6Zone } from \"./network-host\"\n\nconst require = createRequire(import.meta.url)\n\ntype Forge = typeof import(\"node-forge\")\n\nfunction loadForge(): Forge {\n // node-forge is CJS in many installs; require keeps this compatible with our ESM output.\n return require(\"node-forge\") as Forge\n}\n\nexport interface ResolvedHttpsOptions {\n httpsOptions: { key: string | Buffer; cert: string | Buffer; ca?: string | Buffer }\n /** Path to CA certificate suitable for NODE_EXTRA_CA_CERTS. */\n caCertPath?: string\n mode: \"provided\" | \"generated\"\n}\n\nexport interface ResolveHttpsOptionsArgs {\n enabled: boolean\n configDir: string\n host: string\n tlsKeyPath?: string\n tlsCertPath?: string\n tlsCaPath?: string\n tlsSANs?: string\n logger: Logger\n}\n\nconst LEAF_VALIDITY_DAYS = 30\nconst ROTATE_IF_EXPIRES_WITHIN_DAYS = 3\n\nconst CA_VALIDITY_DAYS = 365\n\nexport function resolveHttpsOptions(args: ResolveHttpsOptionsArgs): ResolvedHttpsOptions | null {\n if (!args.enabled) {\n return null\n }\n\n const hasProvided = Boolean(args.tlsKeyPath && args.tlsCertPath)\n if (hasProvided) {\n const key = fs.readFileSync(args.tlsKeyPath!, \"utf-8\")\n const cert = fs.readFileSync(args.tlsCertPath!, \"utf-8\")\n const ca = args.tlsCaPath ? fs.readFileSync(args.tlsCaPath, \"utf-8\") : undefined\n return {\n httpsOptions: { key, cert, ca },\n caCertPath: args.tlsCaPath,\n mode: \"provided\",\n }\n }\n\n return ensureGeneratedTls(args)\n}\n\nfunction ensureGeneratedTls(args: ResolveHttpsOptionsArgs): ResolvedHttpsOptions {\n const tlsDir = path.join(args.configDir, \"tls\")\n const caKeyPath = path.join(tlsDir, \"ca-key.pem\")\n const caCertPath = path.join(tlsDir, \"ca-cert.pem\")\n const keyPath = path.join(tlsDir, \"server-key.pem\")\n const certPath = path.join(tlsDir, \"server-cert.pem\")\n\n fs.mkdirSync(tlsDir, { recursive: true })\n\n const shouldRotateLeaf = () => {\n try {\n if (!fs.existsSync(certPath)) return true\n const pem = fs.readFileSync(certPath, \"utf-8\")\n const certificate = new crypto.X509Certificate(pem)\n const validToMs = Date.parse(certificate.validTo)\n if (!Number.isFinite(validToMs)) return true\n const rotateAt = validToMs - ROTATE_IF_EXPIRES_WITHIN_DAYS * 24 * 60 * 60 * 1000\n return Date.now() >= rotateAt || !certificateCoversRequiredSans(certificate, args.host, args.tlsSANs)\n } catch {\n return true\n }\n }\n\n const shouldRotateCa = () => {\n try {\n if (!fs.existsSync(caCertPath)) return true\n const pem = fs.readFileSync(caCertPath, \"utf-8\")\n const x509 = new crypto.X509Certificate(pem)\n const validToMs = Date.parse(x509.validTo)\n if (!Number.isFinite(validToMs)) return true\n // CA rotates only when expired.\n return Date.now() >= validToMs\n } catch {\n return true\n }\n }\n\n if (shouldRotateCa() || !fs.existsSync(caKeyPath)) {\n const { caKeyPem, caCertPem } = generateCaCertificate()\n writePemFile(caKeyPath, caKeyPem, 0o600)\n writePemFile(caCertPath, caCertPem, 0o644)\n args.logger.info({ caCertPath }, \"Generated self-signed CodeNomad CA certificate\")\n }\n\n if (shouldRotateLeaf() || !fs.existsSync(keyPath)) {\n const caKeyPem = fs.readFileSync(caKeyPath, \"utf-8\")\n const caCertPem = fs.readFileSync(caCertPath, \"utf-8\")\n\n const { keyPem, certPem } = generateServerCertificate({\n host: args.host,\n tlsSANs: args.tlsSANs,\n caKeyPem,\n caCertPem,\n })\n\n writePemFile(keyPath, keyPem, 0o600)\n writePemFile(certPath, certPem, 0o644)\n args.logger.info({ certPath }, \"Generated CodeNomad HTTPS certificate\")\n }\n\n const key = fs.readFileSync(keyPath, \"utf-8\")\n const cert = fs.readFileSync(certPath, \"utf-8\")\n const ca = fs.readFileSync(caCertPath, \"utf-8\")\n\n // Present the CA as part of the chain.\n const chainedCert = `${cert.trim()}\\n${ca.trim()}\\n`\n\n return {\n httpsOptions: {\n key,\n cert: chainedCert,\n },\n caCertPath,\n mode: \"generated\",\n }\n}\n\nfunction writePemFile(filePath: string, content: string, mode: number) {\n fs.writeFileSync(filePath, content, { encoding: \"utf-8\", mode })\n try {\n fs.chmodSync(filePath, mode)\n } catch {\n // best effort on platforms that ignore chmod\n }\n}\n\nfunction generateCaCertificate(): { caKeyPem: string; caCertPem: string } {\n const forge = loadForge()\n\n const keys = forge.pki.rsa.generateKeyPair(2048)\n const cert = forge.pki.createCertificate()\n cert.publicKey = keys.publicKey\n cert.serialNumber = crypto.randomBytes(16).toString(\"hex\")\n\n const now = new Date()\n const notBefore = new Date(now.getTime() - 60_000)\n const notAfter = new Date(now.getTime() + CA_VALIDITY_DAYS * 24 * 60 * 60 * 1000)\n cert.validity.notBefore = notBefore\n cert.validity.notAfter = notAfter\n\n const attrs = [{ name: \"commonName\", value: \"CodeNomad Local CA\" }]\n cert.setSubject(attrs)\n cert.setIssuer(attrs)\n\n cert.setExtensions([\n { name: \"basicConstraints\", cA: true },\n { name: \"keyUsage\", keyCertSign: true, cRLSign: true, digitalSignature: true },\n { name: \"subjectKeyIdentifier\" },\n ])\n\n cert.sign(keys.privateKey, forge.md.sha256.create())\n\n return {\n caKeyPem: forge.pki.privateKeyToPem(keys.privateKey),\n caCertPem: forge.pki.certificateToPem(cert),\n }\n}\n\nfunction generateServerCertificate(args: {\n host: string\n tlsSANs?: string\n caKeyPem: string\n caCertPem: string\n}): { keyPem: string; certPem: string } {\n const forge = loadForge()\n\n const caKey = forge.pki.privateKeyFromPem(args.caKeyPem)\n const caCert = forge.pki.certificateFromPem(args.caCertPem)\n\n const keys = forge.pki.rsa.generateKeyPair(2048)\n const cert = forge.pki.createCertificate()\n cert.publicKey = keys.publicKey\n cert.serialNumber = crypto.randomBytes(16).toString(\"hex\")\n\n const now = new Date()\n const notBefore = new Date(now.getTime() - 60_000)\n const notAfter = new Date(now.getTime() + LEAF_VALIDITY_DAYS * 24 * 60 * 60 * 1000)\n cert.validity.notBefore = notBefore\n cert.validity.notAfter = notAfter\n\n const commonName = pickCommonName(args.host)\n cert.setSubject([{ name: \"commonName\", value: commonName }])\n cert.setIssuer(caCert.subject.attributes)\n\n const san = buildSubjectAltNames(args.host, args.tlsSANs)\n\n cert.setExtensions([\n { name: \"basicConstraints\", cA: false },\n { name: \"keyUsage\", digitalSignature: true, keyEncipherment: true },\n { name: \"extKeyUsage\", serverAuth: true },\n { name: \"subjectAltName\", altNames: san },\n { name: \"subjectKeyIdentifier\" },\n ])\n\n cert.sign(caKey, forge.md.sha256.create())\n\n return {\n keyPem: forge.pki.privateKeyToPem(keys.privateKey),\n certPem: forge.pki.certificateToPem(cert),\n }\n}\n\nfunction pickCommonName(host: string): string {\n const normalizedHost = normalizeCertificateHost(host)\n if (!normalizedHost || isWildcardHost(normalizedHost)) {\n return \"localhost\"\n }\n if (normalizedHost === \"127.0.0.1\") {\n return \"localhost\"\n }\n return normalizedHost\n}\n\nfunction buildSubjectAltNames(host: string, tlsSANs?: string): Array<{ type: number; value?: string; ip?: string }> {\n const { dns, ips } = resolveRequiredSubjectAltNames(host, tlsSANs)\n const altNames: Array<{ type: number; value?: string; ip?: string }> = []\n\n // 2 = DNS, 7 = IP\n for (const name of dns) {\n altNames.push({ type: 2, value: name })\n }\n for (const ip of ips) {\n altNames.push({ type: 7, ip })\n }\n\n return altNames\n}\n\nfunction resolveRequiredSubjectAltNames(host: string, tlsSANs?: string): { dns: Set<string>; ips: Set<string> } {\n const dns = new Set<string>()\n const ips = new Set<string>()\n\n dns.add(\"localhost\")\n ips.add(\"127.0.0.1\")\n\n const normalizedHost = normalizeCertificateHost(host)\n if (isWildcardHost(normalizedHost) && isIP(normalizedHost) === 6) {\n ips.add(\"::1\")\n } else if (normalizedHost) {\n if (isIP(normalizedHost)) {\n ips.add(normalizedHost)\n } else {\n dns.add(normalizedHost)\n }\n }\n\n for (const token of splitList(tlsSANs)) {\n const normalizedToken = normalizeCertificateHost(token)\n if (isIP(normalizedToken)) {\n ips.add(normalizedToken)\n } else if (normalizedToken) {\n dns.add(normalizedToken)\n }\n }\n\n return { dns, ips }\n}\n\nfunction normalizeCertificateHost(host: string): string {\n return normalizeNetworkHost(stripIPv6Zone(host))\n}\n\nfunction certificateCoversRequiredSans(certificate: crypto.X509Certificate, host: string, tlsSANs?: string): boolean {\n const { dns, ips } = resolveRequiredSubjectAltNames(host, tlsSANs)\n const existingDns = new Set(\n (certificate.subjectAltName ?? \"\")\n .split(/,\\s*/)\n .filter((entry) => entry.startsWith(\"DNS:\"))\n .map((entry) => entry.slice(4).toLowerCase()),\n )\n\n for (const name of dns) {\n if (!existingDns.has(name.toLowerCase())) return false\n }\n for (const ip of ips) {\n if (!certificate.checkIP(ip)) return false\n }\n return true\n}\n\nfunction splitList(input: string | undefined): string[] {\n if (!input) return []\n return input\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n}\n"]}
|
|
@@ -415,6 +415,7 @@ export class WorkspaceManager {
|
|
|
415
415
|
const startupEnvironment = launch.kind === "wsl"
|
|
416
416
|
? await this.wslStartupEnvironment(this.serviceStartupEnvironment(), launch.distro, launchDeadlineAt)
|
|
417
417
|
: this.serviceStartupEnvironment();
|
|
418
|
+
await this.options.prepareSessionPruning?.(launch, startupEnvironment);
|
|
418
419
|
const serviceOptions = {
|
|
419
420
|
kind: "lifecycle",
|
|
420
421
|
identity: launch.kind === "host"
|
|
@@ -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 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 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-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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neuralnomads/codenomad-dev",
|
|
3
|
-
"version": "0.20.0-dev-
|
|
3
|
+
"version": "0.20.0-dev-20260911-ea37f97b",
|
|
4
4
|
"description": "CodeNomad Server",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -17,10 +17,11 @@
|
|
|
17
17
|
"codenomad": "dist/bin.js"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"build": "npm run build:ui && npm run prepare-ui && tsc -p tsconfig.json && node ./scripts/copy-auth-pages.mjs",
|
|
20
|
+
"build": "npm run build:ui && npm run prepare-ui && tsc -p tsconfig.json && node ./scripts/copy-auth-pages.mjs && npm run build:pruning",
|
|
21
|
+
"build:pruning": "node ./scripts/build-session-pruning.mjs",
|
|
21
22
|
"build:ui": "npm run build --prefix ../ui",
|
|
22
23
|
"prepare-ui": "node ./scripts/copy-ui-dist.mjs",
|
|
23
|
-
"dev": "cross-env CODENOMAD_DEV=1 CODENOMAD_SERVER_PASSWORD=codenomad-dev CLI_UI_DEV_SERVER=http://localhost:3000 CLI_HTTPS=false CLI_HTTP=true tsx src/index.ts",
|
|
24
|
+
"dev": "npm run build:pruning && cross-env CODENOMAD_DEV=1 CODENOMAD_SERVER_PASSWORD=codenomad-dev CLI_UI_DEV_SERVER=http://localhost:3000 CLI_HTTPS=false CLI_HTTP=true tsx src/index.ts",
|
|
24
25
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
@@ -40,6 +41,8 @@
|
|
|
40
41
|
"zod": "^3.23.8"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
44
|
+
"esbuild": "^0.25.12",
|
|
45
|
+
"@opencode/plugin": "beta",
|
|
43
46
|
"@types/node-forge": "^1.3.14",
|
|
44
47
|
"@types/yauzl": "^2.10.0",
|
|
45
48
|
"cross-env": "^7.0.3",
|