@neuralnomads/codenomad-dev 0.20.0-dev-20260907-e9e94a67 → 0.20.0-dev-20260909-855d2ee7

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.
Files changed (79) hide show
  1. package/dist/server/__tests__/instance-proxy.test.js +14 -0
  2. package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
  3. package/dist/server/http-server.js +1 -1
  4. package/dist/server/http-server.js.map +1 -1
  5. package/package.json +1 -1
  6. package/public/assets/App-Nlt9zV-v.js +43 -0
  7. package/public/assets/App-Nlt9zV-v.js.map +1 -0
  8. package/public/assets/{FilesTab-CgfwF6tR.js → FilesTab-z7UrjcAQ.js} +3 -3
  9. package/public/assets/{FilesTab-CgfwF6tR.js.map → FilesTab-z7UrjcAQ.js.map} +1 -1
  10. package/public/assets/{GitChangesTab-r1JoAD9n.js → GitChangesTab-C04bYKhs.js} +3 -3
  11. package/public/assets/{GitChangesTab-r1JoAD9n.js.map → GitChangesTab-C04bYKhs.js.map} +1 -1
  12. package/public/assets/{SplitFilePanel-D9FfoZUZ.js → SplitFilePanel-B29MqCuU.js} +2 -2
  13. package/public/assets/{SplitFilePanel-D9FfoZUZ.js.map → SplitFilePanel-B29MqCuU.js.map} +1 -1
  14. package/public/assets/{StatusTab-DMnWj5WS.js → StatusTab-wUKfwnFf.js} +2 -2
  15. package/public/assets/{StatusTab-DMnWj5WS.js.map → StatusTab-wUKfwnFf.js.map} +1 -1
  16. package/public/assets/{align-justify-Dc1gjAkp.js → align-justify-glU678D9.js} +2 -2
  17. package/public/assets/{align-justify-Dc1gjAkp.js.map → align-justify-glU678D9.js.map} +1 -1
  18. package/public/assets/{bundle-full-CXK0RpEe.js → bundle-full-BrsCElYv.js} +2 -2
  19. package/public/assets/{bundle-full-CXK0RpEe.js.map → bundle-full-BrsCElYv.js.map} +1 -1
  20. package/public/assets/{client-state-DmImbmIC.js → client-state-j9Iu7F-E.js} +2 -2
  21. package/public/assets/{client-state-DmImbmIC.js.map → client-state-j9Iu7F-E.js.map} +1 -1
  22. package/public/assets/{diff-viewer-CbJWj99J.js → diff-viewer-B0VS1voD.js} +2 -2
  23. package/public/assets/{diff-viewer-CbJWj99J.js.map → diff-viewer-B0VS1voD.js.map} +1 -1
  24. package/public/assets/{index-C1AVy0gw.js → index-B6bX3AMT.js} +2 -2
  25. package/public/assets/{index-C1AVy0gw.js.map → index-B6bX3AMT.js.map} +1 -1
  26. package/public/assets/{index-Dggdc5Fz.js → index-BIRLnDWY.js} +2 -2
  27. package/public/assets/{index-Dggdc5Fz.js.map → index-BIRLnDWY.js.map} +1 -1
  28. package/public/assets/{index-xkTcWbMt.js → index-BuScpzpP.js} +2 -2
  29. package/public/assets/{index-xkTcWbMt.js.map → index-BuScpzpP.js.map} +1 -1
  30. package/public/assets/{index-BfORYhCR.js → index-BzAEHHap.js} +3 -3
  31. package/public/assets/index-BzAEHHap.js.map +1 -0
  32. package/public/assets/index-C-DZt-oz.css +1 -0
  33. package/public/assets/{index-C8aIk3bb.js → index-C9RXVQl9.js} +2 -2
  34. package/public/assets/{index-C8aIk3bb.js.map → index-C9RXVQl9.js.map} +1 -1
  35. package/public/assets/index-ClaHfu-1.js +2 -0
  36. package/public/assets/{index-Bv4cVEdt.js.map → index-ClaHfu-1.js.map} +1 -1
  37. package/public/assets/{index-UtSy15g1.js → index-DBx5htn3.js} +2 -2
  38. package/public/assets/{index-UtSy15g1.js.map → index-DBx5htn3.js.map} +1 -1
  39. package/public/assets/{index-AwBa5De4.js → index-DHHMf3u1.js} +2 -2
  40. package/public/assets/{index-AwBa5De4.js.map → index-DHHMf3u1.js.map} +1 -1
  41. package/public/assets/{index-CF7UTwOC.js → index-DN4Kstsd.js} +2 -2
  42. package/public/assets/{index-CF7UTwOC.js.map → index-DN4Kstsd.js.map} +1 -1
  43. package/public/assets/{index-D5cfewGV.js → index-DbMyNDyo.js} +2 -2
  44. package/public/assets/{index-D5cfewGV.js.map → index-DbMyNDyo.js.map} +1 -1
  45. package/public/assets/{index-kaTj6a0V.js → index-rcsmuqww.js} +2 -2
  46. package/public/assets/{index-kaTj6a0V.js.map → index-rcsmuqww.js.map} +1 -1
  47. package/public/assets/{index-BJSdILt0.js → index-uz2QFRlk.js} +2 -2
  48. package/public/assets/{index-BJSdILt0.js.map → index-uz2QFRlk.js.map} +1 -1
  49. package/public/assets/{loading-CLjF2dnt.js → loading-CYiiwb08.js} +2 -2
  50. package/public/assets/{loading-CLjF2dnt.js.map → loading-CYiiwb08.js.map} +1 -1
  51. package/public/assets/main-OmXs7qtG.js +48 -0
  52. package/public/assets/main-OmXs7qtG.js.map +1 -0
  53. package/public/assets/{markdown-DP0osupz.js → markdown-DWvSdCZz.js} +4 -4
  54. package/public/assets/{markdown-DP0osupz.js.map → markdown-DWvSdCZz.js.map} +1 -1
  55. package/public/assets/{monaco-viewer-BB3_mBkA.js → monaco-viewer-Cc9bWg7I.js} +2 -2
  56. package/public/assets/{monaco-viewer-BB3_mBkA.js.map → monaco-viewer-Cc9bWg7I.js.map} +1 -1
  57. package/public/assets/{startup-state-settings-card-Bc27wplD.js → startup-state-settings-card-2KHpBL8U.js} +2 -2
  58. package/public/assets/{startup-state-settings-card-Bc27wplD.js.map → startup-state-settings-card-2KHpBL8U.js.map} +1 -1
  59. package/public/assets/{terminal-square-4t6I40X6.js → terminal-square-lzHuj_of.js} +2 -2
  60. package/public/assets/{terminal-square-4t6I40X6.js.map → terminal-square-lzHuj_of.js.map} +1 -1
  61. package/public/assets/tool-call-DjkszeT4.js +60 -0
  62. package/public/assets/tool-call-DjkszeT4.js.map +1 -0
  63. package/public/assets/{unified-picker-CpvYPG8V.js → unified-picker-5JmIM6a0.js} +2 -2
  64. package/public/assets/{unified-picker-CpvYPG8V.js.map → unified-picker-5JmIM6a0.js.map} +1 -1
  65. package/public/assets/{wrap-text-Dq8UDb8D.js → wrap-text-N0Cav2Vp.js} +2 -2
  66. package/public/assets/{wrap-text-Dq8UDb8D.js.map → wrap-text-N0Cav2Vp.js.map} +1 -1
  67. package/public/index.html +4 -4
  68. package/public/loading.html +4 -4
  69. package/public/sw.js +1 -1
  70. package/public/sw.js.map +1 -1
  71. package/public/assets/App-lAZZOE--.js +0 -43
  72. package/public/assets/App-lAZZOE--.js.map +0 -1
  73. package/public/assets/index-BfORYhCR.js.map +0 -1
  74. package/public/assets/index-Bv4cVEdt.js +0 -2
  75. package/public/assets/index-CT42quXi.css +0 -1
  76. package/public/assets/main-CA9pw_Mr.js +0 -48
  77. package/public/assets/main-CA9pw_Mr.js.map +0 -1
  78. package/public/assets/tool-call-BIHyGWIy.js +0 -60
  79. package/public/assets/tool-call-BIHyGWIy.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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","sourcesContent":["import Fastify, { type FastifyInstance, type FastifyReply, type FastifyRequest } from \"fastify\"\nimport cors from \"@fastify/cors\"\nimport fastifyStatic from \"@fastify/static\"\nimport replyFrom from \"@fastify/reply-from\"\nimport fs from \"fs\"\nimport { connect as connectTcp, type Socket } from \"net\"\nimport path from \"path\"\nimport type { Readable } from \"stream\"\nimport { connect as connectTls, type TLSSocket } from \"tls\"\nimport { fetch } from \"undici\"\nimport type { Logger } from \"../logger\"\nimport { WorkspaceManager } from \"../workspaces/manager\"\nimport { isInvalidRequestError, isPtyNotFoundError, isSessionNotFoundError, isShellNotFoundError, type LocationRef, type OpenCodeClient } from \"@opencode-ai/client\"\n\nimport type { SettingsService } from \"../settings/service\"\nimport { FileSystemBrowser } from \"../filesystem/browser\"\nimport { EventBus } from \"../events/bus\"\nimport { registerWorkspaceRoutes } from \"./routes/workspaces\"\nimport { registerSettingsRoutes } from \"./routes/settings\"\nimport { registerFilesystemRoutes } from \"./routes/filesystem\"\nimport { registerConfigFileRoutes } from \"./routes/config-files\"\nimport { registerMetaRoutes } from \"./routes/meta\"\nimport { registerEventRoutes } from \"./routes/events\"\nimport { registerStorageRoutes } from \"./routes/storage\"\nimport { registerYoloRoutes } from \"./routes/yolo\"\nimport { registerWorktreeRoutes } from \"./routes/worktrees\"\nimport { registerSpeechRoutes } from \"./routes/speech\"\nimport { registerOpenCodeUpdateRoutes } from \"./routes/opencode-update\"\nimport { registerRemoteServerRoutes } from \"./routes/remote-servers\"\nimport { registerRemoteProxyRoutes } from \"./routes/remote-proxy\"\nimport { registerSideCarRoutes } from \"./routes/sidecars\"\nimport { registerPreviewRoutes } from \"./routes/previews\"\nimport { registerUsageRoutes } from \"./routes/usage\"\nimport { ServerMeta } from \"../api-types\"\nimport { InstanceStore } from \"../storage/instance-store\"\nimport type { AutoAcceptManager } from \"../permissions/auto-accept-manager\"\nimport type { AuthManager } from \"../auth/manager\"\nimport { registerAuthRoutes } from \"./routes/auth\"\nimport { sendUnauthorized, wantsHtml } from \"../auth/http-auth\"\nimport type { SpeechService } from \"../speech/service\"\nimport { ClientConnectionManager } from \"../clients/connection-manager\"\nimport type { SideCarManager } from \"../sidecars/manager\"\nimport type { PreviewManager } from \"../previews/manager\"\nimport { buildPreviewRuntimeBridge, rewritePreviewImportMap, rewritePreviewJavaScriptImports } from \"../previews/runtime-bridge\"\nimport type { RemoteProxySessionManager } from \"./remote-proxy\"\nimport { createOpenCodeUpdateService } from \"../opencode-update/service\"\nimport { WorktreeDeletionFence } from \"../workspaces/worktree-session-evacuation\"\nimport type { NativeParent } from \"../native-parent\"\nimport { isAutomationPluginRequest, registerAutomationPluginRoute } from \"./routes/automation-plugin\"\nimport { DeveloperCdp } from \"../developer-cdp\"\n\ninterface HttpServerDeps {\n bindHost: string\n bindPort: number\n /** When bindPort is 0, try this first. */\n defaultPort: number\n protocol: \"http\" | \"https\"\n httpsOptions?: { key: string | Buffer; cert: string | Buffer; ca?: string | Buffer }\n workspaceManager: WorkspaceManager\n settings: SettingsService\n fileSystemBrowser: FileSystemBrowser\n eventBus: EventBus\n serverMeta: ServerMeta\n instanceStore: InstanceStore\n speechService: SpeechService\n sidecarManager: SideCarManager\n previewManager: PreviewManager\n authManager: AuthManager\n clientConnectionManager: ClientConnectionManager\n remoteProxySessionManager: RemoteProxySessionManager\n yoloManager: AutoAcceptManager\n uiStaticDir: string\n uiDevServerUrl?: string\n logger: Logger\n nativeParent: NativeParent\n automationBridgeToken: string\n}\n\ninterface HttpServerStartResult {\n port: number\n url: string\n displayHost: string\n}\n\nexport function shouldRetryPreferredPort(error: unknown, autoPortRequested: boolean, platform = process.platform): boolean {\n if (!autoPortRequested) return false\n const code = (error as NodeJS.ErrnoException | undefined)?.code\n return code === \"EADDRINUSE\" || (platform === \"win32\" && code === \"EACCES\")\n}\n\nexport function createHttpServer(deps: HttpServerDeps) {\n // Fastify's type-level RawServer inference gets noisy when toggling HTTP vs HTTPS.\n // We keep the runtime behavior correct and cast the instance to a generic FastifyInstance.\n const app = Fastify(\n ({\n logger: false,\n ...(deps.protocol === \"https\" && deps.httpsOptions ? { https: deps.httpsOptions } : {}),\n } as unknown) as any,\n ) as unknown as FastifyInstance\n const proxyLogger = deps.logger.child({ component: \"proxy\" })\n const apiLogger = deps.logger.child({ component: \"http\" })\n const sseLogger = deps.logger.child({ component: \"sse\" })\n\n const sseClients = new Set<() => void>()\n const registerSseClient = (cleanup: () => void) => {\n sseClients.add(cleanup)\n return () => sseClients.delete(cleanup)\n }\n const closeSseClients = () => {\n for (const cleanup of Array.from(sseClients)) {\n cleanup()\n }\n sseClients.clear()\n }\n\n app.addHook(\"onRequest\", (request, _reply, done) => {\n ;(request as FastifyRequest & { __logMeta?: { start: bigint } }).__logMeta = {\n start: process.hrtime.bigint(),\n }\n done()\n })\n\n app.addHook(\"onResponse\", (request, reply, done) => {\n const meta = (request as FastifyRequest & { __logMeta?: { start: bigint } }).__logMeta\n const durationMs = meta ? Number((process.hrtime.bigint() - meta.start) / BigInt(1_000_000)) : undefined\n const base = {\n method: request.method,\n url: request.url,\n status: reply.statusCode,\n durationMs,\n }\n apiLogger.debug(base, \"HTTP request completed\")\n if (apiLogger.isLevelEnabled(\"trace\")) {\n apiLogger.trace({\n ...base,\n params: redactSecrets(request.params),\n query: redactSecrets(request.query),\n body: typeof request.body === \"string\" ? \"<redacted>\" : redactSecrets(request.body),\n }, \"HTTP request payload\")\n }\n done()\n })\n\n const allowedDevOrigins = new Set([\"http://localhost:3000\", \"http://127.0.0.1:3000\"])\n const isLoopbackHost = (host: string) => host === \"127.0.0.1\" || host === \"::1\" || host.startsWith(\"127.\")\n\n const getSelfOrigins = (): Set<string> => {\n const origins = new Set<string>()\n const candidates: Array<string | undefined> = [deps.serverMeta.localUrl, deps.serverMeta.remoteUrl]\n for (const candidate of candidates) {\n if (!candidate) continue\n try {\n origins.add(new URL(candidate).origin)\n } catch {\n // ignore\n }\n }\n for (const addr of deps.serverMeta.addresses ?? []) {\n try {\n origins.add(new URL(addr.remoteUrl).origin)\n } catch {\n // ignore\n }\n }\n return origins\n }\n\n app.register(cors, {\n origin: (origin, cb) => {\n if (!origin) {\n cb(null, true)\n return\n }\n\n const selfOrigins = getSelfOrigins()\n if (selfOrigins.has(origin)) {\n cb(null, true)\n return\n }\n\n if (origin === \"null\") {\n cb(null, true)\n return\n }\n\n if (allowedDevOrigins.has(origin)) {\n cb(null, true)\n return\n }\n\n // When we bind to a non-loopback host (e.g., 0.0.0.0 or LAN IP), allow cross-origin UI access.\n if (deps.bindHost === \"0.0.0.0\" || !isLoopbackHost(deps.bindHost)) {\n cb(null, true)\n return\n }\n\n\n cb(null, false)\n },\n credentials: true,\n })\n\n app.register(replyFrom, {\n contentTypesToEncode: [],\n undici: {\n connections: 16,\n pipelining: 1,\n bodyTimeout: 0,\n headersTimeout: 0,\n },\n })\n\n registerAuthRoutes(app, { authManager: deps.authManager })\n\n app.addHook(\"preHandler\", (request, reply, done) => {\n const rawUrl = request.raw.url ?? request.url\n const pathname = (rawUrl.split(\"?\")[0] ?? \"\").trim()\n\n const publicApiPaths = new Set([\"/api/auth/login\", \"/api/auth/token\", \"/api/auth/status\", \"/api/auth/logout\"])\n const publicPagePaths = new Set([\"/login\"])\n if (deps.authManager.isTokenBootstrapEnabled()) {\n publicPagePaths.add(\"/auth/token\")\n }\n\n const isLoopbackRemoteProxyDelete =\n request.method === \"DELETE\" &&\n pathname.startsWith(\"/api/remote-proxy/sessions/\") &&\n deps.authManager.isLoopbackRequest(request)\n\n const encodedPreviewToken = pathname.match(/^\\/previews\\/([^/]+)(?:\\/|$)/)?.[1]\n const hostPreviewToken = parsePreviewCapabilityHost(request.headers.host)\n let isPreviewCapability = false\n if (hostPreviewToken) {\n isPreviewCapability = Boolean(deps.previewManager.get(hostPreviewToken))\n } else if (encodedPreviewToken) {\n try {\n isPreviewCapability = Boolean(deps.previewManager.get(decodeURIComponent(encodedPreviewToken)))\n } catch {\n // Malformed capability paths remain subject to normal authentication.\n }\n }\n\n if (request.headers.origin === \"null\" && !isPreviewCapability) {\n reply.code(403).send({ error: \"Opaque origins may access preview capabilities only\" })\n return\n }\n\n const isAutomationBridge = isAutomationPluginRequest(request, {\n authManager: deps.authManager,\n bridgeToken: deps.automationBridgeToken,\n })\n if (publicApiPaths.has(pathname) || publicPagePaths.has(pathname) || isLoopbackRemoteProxyDelete || isPreviewCapability || isAutomationBridge) {\n done()\n return\n }\n\n const session = deps.authManager.getSessionFromRequest(request)\n\n const requiresAuthForApi = pathname.startsWith(\"/api/\") || pathname.startsWith(\"/workspaces/\") || pathname.startsWith(\"/sidecars/\") || pathname.startsWith(\"/previews/\")\n if (requiresAuthForApi && !session) {\n sendUnauthorized(request, reply)\n return\n }\n\n if (!session && wantsHtml(request)) {\n reply.redirect(\"/login\")\n return\n }\n\n done()\n })\n\n app.get(\"/\", async (request, reply) => {\n const session = deps.authManager.getSessionFromRequest(request)\n if (!session) {\n reply.redirect(\"/login\")\n return\n }\n\n if (deps.uiDevServerUrl) {\n await proxyToDevServer(request, reply, deps.uiDevServerUrl)\n return\n }\n\n const uiDir = deps.uiStaticDir\n const indexPath = path.join(uiDir, \"index.html\")\n if (uiDir && fs.existsSync(indexPath)) {\n reply.type(\"text/html\").send(fs.readFileSync(indexPath, \"utf-8\"))\n return\n }\n\n reply.code(404).send({ message: \"UI bundle missing\" })\n })\n\n const worktreeDeletionFence = new WorktreeDeletionFence()\n registerWorkspaceRoutes(app, { workspaceManager: deps.workspaceManager, worktreeDeletionFence })\n registerSettingsRoutes(app, { settings: deps.settings, logger: apiLogger })\n registerOpenCodeUpdateRoutes(app, {\n service: createOpenCodeUpdateService(deps.settings, deps.workspaceManager),\n logger: apiLogger,\n })\n registerFilesystemRoutes(app, { fileSystemBrowser: deps.fileSystemBrowser })\n registerConfigFileRoutes(app)\n registerMetaRoutes(app, { serverMeta: deps.serverMeta })\n registerEventRoutes(app, {\n eventBus: deps.eventBus,\n registerClient: registerSseClient,\n logger: sseLogger,\n connectionManager: deps.clientConnectionManager,\n })\n registerWorktreeRoutes(app, { workspaceManager: deps.workspaceManager, worktreeDeletionFence })\n registerStorageRoutes(app, {\n instanceStore: deps.instanceStore,\n eventBus: deps.eventBus,\n workspaceManager: deps.workspaceManager,\n })\n registerRemoteServerRoutes(app, { logger: apiLogger })\n registerRemoteProxyRoutes(app, { logger: proxyLogger, sessionManager: deps.remoteProxySessionManager })\n registerSpeechRoutes(app, { speechService: deps.speechService })\n registerSideCarRoutes(app, { sidecarManager: deps.sidecarManager })\n registerPreviewRoutes(app, { previewManager: deps.previewManager })\n const developerCdp = new DeveloperCdp()\n registerAutomationPluginRoute(app, {\n authManager: deps.authManager,\n bridgeToken: deps.automationBridgeToken,\n nativeParent: deps.nativeParent,\n developerCdp,\n workspaceManager: deps.workspaceManager,\n })\n app.addHook(\"onClose\", async () => developerCdp.close())\n registerUsageRoutes(app)\n registerSideCarProxyRoutes(app, { sidecarManager: deps.sidecarManager, logger: proxyLogger })\n registerPreviewProxyRoutes(app, { previewManager: deps.previewManager, logger: proxyLogger })\n setupSideCarWebSocketProxy(app, {\n sidecarManager: deps.sidecarManager,\n authManager: deps.authManager,\n logger: proxyLogger,\n })\n setupPreviewWebSocketProxy(app, {\n previewManager: deps.previewManager,\n authManager: deps.authManager,\n logger: proxyLogger,\n })\n registerYoloRoutes(app, { yoloManager: deps.yoloManager })\n registerInstanceProxyRoutes(app, { workspaceManager: deps.workspaceManager, logger: proxyLogger, worktreeDeletionFence })\n\n\n if (deps.uiDevServerUrl) {\n setupDevProxy(app, deps.uiDevServerUrl, deps.authManager, deps.previewManager, proxyLogger)\n } else {\n setupStaticUi(app, deps.uiStaticDir, deps.authManager, deps.previewManager, proxyLogger)\n }\n\n return {\n instance: app,\n start: async (): Promise<HttpServerStartResult> => {\n const attemptListen = async (requestedPort: number) => {\n const addressInfo = await app.listen({ port: requestedPort, host: deps.bindHost })\n return { addressInfo, requestedPort }\n }\n\n const autoPortRequested = deps.bindPort === 0\n const primaryPort = autoPortRequested ? deps.defaultPort : deps.bindPort\n\n let listenResult\n\n try {\n listenResult = await attemptListen(primaryPort)\n } catch (error) {\n if (!shouldRetryPreferredPort(error, autoPortRequested)) {\n throw error\n }\n deps.logger.warn({ err: error, port: primaryPort }, \"Preferred port unavailable, retrying on ephemeral port\")\n listenResult = await attemptListen(0)\n }\n\n let actualPort = listenResult.requestedPort\n\n if (typeof listenResult.addressInfo === \"string\") {\n try {\n const parsed = new URL(listenResult.addressInfo)\n actualPort = Number(parsed.port) || listenResult.requestedPort\n } catch {\n actualPort = listenResult.requestedPort\n }\n } else {\n const address = app.server.address()\n if (typeof address === \"object\" && address) {\n actualPort = address.port\n }\n }\n\n const displayHost = deps.bindHost === \"127.0.0.1\" ? \"localhost\" : deps.bindHost\n const serverUrl = `${deps.protocol}://${displayHost}:${actualPort}`\n\n deps.logger.info({ port: actualPort, host: deps.bindHost, protocol: deps.protocol }, \"HTTP server listening\")\n\n return { port: actualPort, url: serverUrl, displayHost }\n },\n stop: () => {\n closeSseClients()\n return app.close()\n },\n }\n}\n\nexport interface InstanceProxyWorkspaceManager {\n get(id: string): ReturnType<WorkspaceManager[\"get\"]>\n getSharedServiceEndpoint(id: string): ReturnType<WorkspaceManager[\"getSharedServiceEndpoint\"]>\n invalidateSharedServiceConnection?(): void\n getInstanceAuthorizationHeader(id: string): string | undefined\n getServiceDirectory?(id: string): string | undefined\n getServiceDirectoryForPath?(id: string, directory: string): Promise<string | undefined>\n getWorktreeIdentityForPath(id: string, directory: string): Promise<string | undefined>\n getServicePathForPath?(id: string, candidate: string): Promise<string | undefined>\n getSharedServiceClient(): Promise<OpenCodeClient>\n ownsLocation(id: string, location: LocationRef): ReturnType<WorkspaceManager[\"ownsLocation\"]>\n ownsLocationWorkspace(id: string, workspaceID: string): ReturnType<WorkspaceManager[\"ownsLocationWorkspace\"]>\n ownsDirectory(id: string, directory: string): Promise<boolean>\n ownsPath(id: string, candidate: string): Promise<boolean>\n}\n\ninterface InstanceProxyDeps {\n workspaceManager: InstanceProxyWorkspaceManager\n logger: Logger\n worktreeDeletionFence: WorktreeDeletionFence\n}\n\ninterface SideCarProxyDeps {\n sidecarManager: SideCarManager\n logger: Logger\n}\n\ninterface SideCarWebSocketProxyDeps extends SideCarProxyDeps {\n authManager: AuthManager\n}\n\ninterface PreviewProxyDeps {\n previewManager: PreviewManager\n logger: Logger\n}\n\ninterface PreviewWebSocketProxyDeps extends PreviewProxyDeps {\n authManager: AuthManager\n}\n\nfunction registerSideCarProxyRoutes(app: FastifyInstance, deps: SideCarProxyDeps) {\n const proxyBaseHandler = async (\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n ) => {\n await proxySideCarRequest({\n request,\n reply,\n sidecarManager: deps.sidecarManager,\n logger: deps.logger,\n pathSuffix: \"\",\n })\n }\n\n const proxyWildcardHandler = async (\n request: FastifyRequest<{ Params: { id: string; \"*\": string } }>,\n reply: FastifyReply,\n ) => {\n await proxySideCarRequest({\n request,\n reply,\n sidecarManager: deps.sidecarManager,\n logger: deps.logger,\n pathSuffix: request.params[\"*\"] ?? \"\",\n })\n }\n\n app.all(\"/sidecars/:id\", proxyBaseHandler)\n app.all(\"/sidecars/:id/*\", proxyWildcardHandler)\n}\n\nfunction registerPreviewProxyRoutes(app: FastifyInstance, deps: PreviewProxyDeps) {\n app.register(async (previewApp) => {\n previewApp.removeAllContentTypeParsers()\n previewApp.addContentTypeParser(\"*\", (_request, body, done) => done(null, body))\n const capabilityHost = /^[0-9a-f-]{36}\\.preview\\.localhost(?::\\d+)?$/i\n const hostHandler = async (request: FastifyRequest, reply: FastifyReply) => {\n const token = parsePreviewCapabilityHost(request.headers.host)\n if (!token) return reply.code(404).send({ error: \"Preview not found\" })\n const pathname = (request.raw.url ?? request.url ?? \"/\").split(\"?\")[0] ?? \"/\"\n await proxyPreviewRequest({\n request,\n reply,\n previewManager: deps.previewManager,\n logger: deps.logger,\n token,\n publicBase: \"\",\n pathSuffix: pathname.replace(/^\\/+/, \"\"),\n })\n }\n\n previewApp.all(\"/\", { constraints: { host: capabilityHost } }, hostHandler)\n previewApp.all(\"/*\", { constraints: { host: capabilityHost } }, hostHandler)\n previewApp.all(\"/previews/:token\", async (request: FastifyRequest<{ Params: { token: string } }>, reply) => {\n await proxyPreviewRequest({ request, reply, previewManager: deps.previewManager, logger: deps.logger, pathSuffix: \"\" })\n })\n previewApp.all(\"/previews/:token/*\", async (request: FastifyRequest<{ Params: { token: string; \"*\": string } }>, reply) => {\n await proxyPreviewRequest({\n request,\n reply,\n previewManager: deps.previewManager,\n logger: deps.logger,\n pathSuffix: request.params[\"*\"] ?? \"\",\n })\n })\n })\n}\n\nfunction setupSideCarWebSocketProxy(app: FastifyInstance, deps: SideCarWebSocketProxyDeps) {\n app.server.on(\"upgrade\", (request, socket, head) => {\n if (parsePreviewCapabilityHost(request.headers.host)) return\n const rawUrl = request.url ?? \"/\"\n const parsed = parseSideCarUpgradePath(rawUrl)\n if (!parsed) {\n return\n }\n\n void proxySideCarWebSocketUpgrade({\n request,\n socket: socket as Socket,\n head,\n sidecarId: parsed.sidecarId,\n incomingPath: parsed.pathname,\n search: parsed.search,\n sidecarManager: deps.sidecarManager,\n authManager: deps.authManager,\n logger: deps.logger,\n })\n })\n}\n\nfunction setupPreviewWebSocketProxy(app: FastifyInstance, deps: PreviewWebSocketProxyDeps) {\n app.server.on(\"upgrade\", (request, socket, head) => {\n const rawUrl = request.url ?? \"/\"\n const capabilityToken = parsePreviewCapabilityHost(request.headers.host)\n let parsed = parsePreviewUpgradePath(rawUrl)\n if (capabilityToken) {\n try {\n const url = new URL(rawUrl, \"http://localhost\")\n parsed = { token: capabilityToken, pathname: url.pathname, search: url.search }\n } catch {\n rejectUpgrade(socket as Socket, 400, \"Bad Request\")\n return\n }\n }\n if (!parsed) {\n return\n }\n\n void proxyPreviewWebSocketUpgrade({\n request,\n socket: socket as Socket,\n head,\n token: parsed.token,\n incomingPath: parsed.pathname,\n search: parsed.search,\n previewManager: deps.previewManager,\n authManager: deps.authManager,\n logger: deps.logger,\n })\n })\n}\n\nexport function registerInstanceProxyRoutes(app: FastifyInstance, deps: InstanceProxyDeps) {\n app.register(async (instance) => {\n instance.removeAllContentTypeParsers()\n instance.addContentTypeParser(\"application/json\", { parseAs: \"string\" }, (_req, body, done) => {\n try {\n done(null, body.length ? JSON.parse(body.toString()) : {})\n } catch {\n done(Object.assign(new Error(\"Invalid JSON request body\"), { statusCode: 400 }), undefined)\n }\n })\n instance.addContentTypeParser(\"*\", (req, body, done) => done(null, body))\n\n const proxyBaseHandler = async (\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n ) => {\n await proxyWorkspaceRequest({\n request,\n reply,\n workspaceManager: deps.workspaceManager,\n worktreeDeletionFence: deps.worktreeDeletionFence,\n pathSuffix: \"\",\n logger: deps.logger,\n })\n }\n\n const proxyWildcardHandler = async (\n request: FastifyRequest<{ Params: { id: string; \"*\": string } }>,\n reply: FastifyReply,\n ) => {\n await proxyWorkspaceRequest({\n request,\n reply,\n workspaceManager: deps.workspaceManager,\n worktreeDeletionFence: deps.worktreeDeletionFence,\n pathSuffix: request.params[\"*\"] ?? \"\",\n logger: deps.logger,\n })\n }\n\n instance.all(\"/workspaces/:id/instance\", proxyBaseHandler)\n instance.all(\"/workspaces/:id/instance/*\", proxyWildcardHandler)\n })\n}\n\nasync function proxyWorkspaceRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n workspaceManager: InstanceProxyWorkspaceManager\n worktreeDeletionFence: WorktreeDeletionFence\n logger: Logger\n pathSuffix?: string\n}) {\n const { request, reply, workspaceManager, logger, worktreeDeletionFence } = args\n const workspaceId = (request.params as { id: string }).id\n const workspace = workspaceManager.get(workspaceId)\n\n if (!workspace) {\n reply.code(404).send({ error: \"Workspace not found\" })\n return\n }\n\n const rawInstancePath = (request.raw.url ?? \"\").split(\"?\", 1)[0]?.match(/\\/instance(?:\\/(.*))?$/)?.[1] ?? \"\"\n if (/\\\\|%2f|%5c/i.test(rawInstancePath) || hasDotSegment(rawInstancePath)) {\n reply.code(400).send({ error: \"Invalid workspace instance path\" })\n return\n }\n const routeUrl = buildInstanceTargetUrl(\"http://127.0.0.1\", args.pathSuffix)\n if (!routeUrl) {\n reply.code(400).send({ error: \"Invalid workspace instance path\" })\n return\n }\n const pathname = decodeURIComponent(routeUrl.pathname)\n if (!isAllowedInstanceApiRoute(request.method, pathname)) {\n reply.code(403).send({ error: \"OpenCode route is not available through a workspace\" })\n return\n }\n\n const endpoint = await workspaceManager.getSharedServiceEndpoint(workspaceId)\n if (!endpoint) {\n reply.code(502).send({ error: \"OpenCode service is not ready\" })\n return\n }\n\n const targetUrl = buildInstanceTargetUrl(endpoint.url, args.pathSuffix)\n if (!targetUrl) {\n reply.code(400).send({ error: \"Invalid workspace instance path\" })\n return\n }\n appendIncomingQuery(targetUrl, request.raw.url ?? \"\")\n if (pathname.replace(/\\/+$/, \"\") === \"/api/session/active\") {\n if (request.method !== \"GET\") {\n reply.code(405).send({ error: \"Method not allowed\" })\n return\n }\n const client = await workspaceManager.getSharedServiceClient()\n const active = await client.session.active()\n const entries = await Promise.all(Object.entries(active).map(async ([sessionId, status]) => {\n try {\n const session = await client.session.get({ sessionID: sessionId })\n return await workspaceManager.ownsDirectory(workspaceId, session.location.directory) ? [sessionId, status] as const : null\n } catch {\n return null\n }\n }))\n reply.send(Object.fromEntries(entries.filter((entry): entry is NonNullable<typeof entry> => entry !== null)))\n return\n }\n if (pathname.replace(/\\/+$/, \"\") === \"/api/project\") {\n const projects = await (await workspaceManager.getSharedServiceClient()).project.list()\n const ownedProjects = await Promise.all(projects.map(async (project) => {\n if (!await workspaceManager.ownsDirectory(workspaceId, project.canonical)) return null\n const sandboxes = (await Promise.all(project.sandboxes.map(async (directory) => (\n await workspaceManager.ownsDirectory(workspaceId, directory) ? directory : null\n )))).filter((directory): directory is string => directory !== null)\n return { ...project, sandboxes }\n }))\n reply.send(ownedProjects.filter((project): project is NonNullable<typeof project> => project !== null))\n return\n }\n const sessionListHasScope = request.method === \"GET\"\n && pathname.replace(/\\/+$/, \"\") === \"/api/session\"\n && (targetUrl.searchParams.has(\"cursor\") || targetUrl.searchParams.has(\"project\") || targetUrl.searchParams.has(\"workspace\"))\n const sessionListScope = await authorizeSessionList(targetUrl, request.method, workspaceManager, workspaceId)\n if (sessionListScope !== \"allowed\") {\n reply.code(sessionListScope === \"invalid\" ? 400 : 403).send({ error: \"Session list does not belong to workspace\" })\n return\n }\n const serviceDirectory = workspaceManager.getServiceDirectory?.(workspaceId) ?? workspace.path\n let globalFormLocation: LocationRef | undefined\n if (isGlobalFormAction(pathname, request.method)) {\n const directoryHeader = request.headers[\"x-opencode-directory\"]\n const workspaceHeader = request.headers[\"x-opencode-workspace\"]\n if (Array.isArray(directoryHeader) || Array.isArray(workspaceHeader)) {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n let directory: string | undefined\n if (directoryHeader !== undefined) {\n try {\n directory = decodeURIComponent(directoryHeader)\n } catch {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n if (!directory.trim()) {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n }\n if (workspaceHeader !== undefined && !workspaceHeader.trim()) {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n if (directory !== undefined || workspaceHeader !== undefined) {\n globalFormLocation = {\n directory: directory ?? workspace.path,\n ...(workspaceHeader ? { workspaceID: workspaceHeader } : {}),\n }\n }\n }\n const imported = prepareSessionImport(\n pathname,\n request.method,\n stripLocationSelectors(targetUrl, request.body, workspace.path, serviceDirectory),\n serviceDirectory,\n )\n const requestLocations = readRequestDirectories(targetUrl, imported.body, workspace.path)\n if (globalFormLocation) {\n requestLocations.directories.push(globalFormLocation.directory)\n requestLocations.locations.push(globalFormLocation)\n }\n requestLocations.directories.push(...imported.directories)\n requestLocations.locations.push(...imported.locations)\n requestLocations.invalid ||= imported.invalid\n readNativeCwd(targetUrl, imported.body, requestLocations)\n const promptFiles = readPromptFilePaths(pathname, request.method, imported.body)\n if (requestLocations.invalid\n || !(await allDirectoriesOwned(workspaceManager, workspaceId, requestLocations.directories))\n || !(await allLocationsOwned(workspaceManager, workspaceId, requestLocations.locations))) {\n reply.code(requestLocations.invalid ? 400 : 403).send({ error: \"Location does not belong to workspace\" })\n return\n }\n const translatedDirectories = new Map<string, string>()\n for (const directory of new Set(requestLocations.directories)) {\n const translated = workspaceManager.getServiceDirectoryForPath\n ? await workspaceManager.getServiceDirectoryForPath(workspaceId, directory)\n : directory\n if (!translated) {\n reply.code(403).send({ error: \"Location does not belong to workspace\" })\n return\n }\n translatedDirectories.set(directory, translated)\n }\n const mutationIdentities = new Set<string>()\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n for (const directory of requestLocations.directories) {\n const identity = await workspaceManager.getWorktreeIdentityForPath(workspaceId, directory)\n if (!identity) {\n reply.code(403).send({ error: \"Location does not belong to workspace\" })\n return\n }\n mutationIdentities.add(identity)\n }\n }\n const serviceBody = replaceRequestDirectories(targetUrl, imported.body, translatedDirectories, pathname, request.method)\n if (promptFiles.invalid || !(await allPathsOwned(workspaceManager, workspaceId, promptFiles.paths))) {\n reply.code(promptFiles.invalid ? 400 : 403).send({ error: \"Prompt file does not belong to workspace\" })\n return\n }\n const translatedPromptPaths = new Map<string, string>()\n for (const candidate of new Set(promptFiles.paths)) {\n const translated = workspaceManager.getServicePathForPath\n ? await workspaceManager.getServicePathForPath(workspaceId, candidate)\n : candidate\n if (!translated) {\n reply.code(403).send({ error: \"Prompt file does not belong to workspace\" })\n return\n }\n translatedPromptPaths.set(candidate, translated)\n }\n const promptBody = replacePromptFileUris(serviceBody, translatedPromptPaths)\n\n const requestedDirectory = requestLocations.directories[0]\n const runtimeLocation = { directory: requestedDirectory ? translatedDirectories.get(requestedDirectory) ?? serviceDirectory : serviceDirectory }\n if (pathname.replace(/\\/+$/, \"\") === \"/api/pty\" && request.method === \"GET\") {\n const result = await (await workspaceManager.getSharedServiceClient()).pty.list({ location: runtimeLocation })\n const ownership = await Promise.all(result.data.map((pty) => workspaceManager.ownsDirectory(workspaceId, pty.cwd)))\n reply.send({ ...result, data: result.data.filter((_, index) => ownership[index]) })\n return\n }\n\n const ptyId = getPtyRouteId(pathname)\n if (ptyId) {\n try {\n const pty = await (await workspaceManager.getSharedServiceClient()).pty.get({ ptyID: ptyId, location: runtimeLocation })\n if (!(await workspaceManager.ownsDirectory(workspaceId, pty.data.cwd))) {\n reply.code(403).send({ error: \"PTY does not belong to workspace\" })\n return\n }\n } catch (error) {\n if (isPtyNotFoundError(error)) {\n reply.code(404).send({ error: \"PTY not found\" })\n return\n }\n throw error\n }\n }\n\n if (pathname.replace(/\\/+$/, \"\") === \"/api/shell\" && request.method === \"GET\") {\n const result = await (await workspaceManager.getSharedServiceClient()).shell.list({ location: runtimeLocation })\n const ownership = await Promise.all(result.data.map((shell) => workspaceManager.ownsDirectory(workspaceId, shell.cwd)))\n reply.send({ ...result, data: result.data.filter((_, index) => ownership[index]) })\n return\n }\n\n const shellId = getShellRouteId(pathname)\n if (shellId) {\n try {\n const shell = await (await workspaceManager.getSharedServiceClient()).shell.get({ id: shellId, location: runtimeLocation })\n if (!(await workspaceManager.ownsDirectory(workspaceId, shell.data.cwd))) {\n reply.code(403).send({ error: \"Shell does not belong to workspace\" })\n return\n }\n } catch (error) {\n if (isShellNotFoundError(error)) {\n reply.code(404).send({ error: \"Shell not found\" })\n return\n }\n throw error\n }\n }\n\n const sessionId = getSessionRouteId(pathname)\n if (sessionId && !isGlobalFormAction(pathname, request.method)) {\n let session\n try {\n session = await (await workspaceManager.getSharedServiceClient()).session.get({ sessionID: sessionId })\n } catch (error) {\n if (isInvalidRequestError(error)) {\n reply.code(400).send({ error: \"Invalid session ID\" })\n return\n }\n if (isSessionNotFoundError(error)) {\n reply.code(404).send({ error: \"Session not found\" })\n return\n }\n throw error\n }\n if (!(await workspaceManager.ownsDirectory(workspaceId, session.location.directory))) {\n reply.code(403).send({ error: \"Session does not belong to workspace\" })\n return\n }\n const sessionWorktree = await workspaceManager.getWorktreeIdentityForPath(workspaceId, session.location.directory)\n if (!sessionWorktree) {\n reply.code(403).send({ error: \"Session does not belong to workspace\" })\n return\n }\n mutationIdentities.add(sessionWorktree)\n }\n\n const body = applyDefaultWorkspaceLocation(targetUrl, promptBody, request.method, serviceDirectory, requestLocations.directories.length > 0 || sessionListHasScope, Boolean(sessionId) && !isGlobalFormAction(pathname, request.method))\n const instanceAuthHeader = workspaceManager.getInstanceAuthorizationHeader(workspaceId)\n const releaseMutation = request.method === \"GET\" || request.method === \"HEAD\"\n ? undefined\n : worktreeDeletionFence.enter([...mutationIdentities])\n if (request.method !== \"GET\" && request.method !== \"HEAD\" && !releaseMutation) {\n reply.code(409).send({ error: \"Worktree deletion is in progress\" })\n return\n }\n logger.debug({ workspaceId, method: request.method, targetUrl: targetUrl.toString() }, \"Proxying request to instance\")\n\n try {\n return reply.from(targetUrl.toString(), {\n ...(body !== request.body ? { body } : {}),\n rewriteRequestHeaders: (_originalRequest, headers) => {\n const outgoingHeaders = sanitizeInstanceProxyRequestHeaders(headers, instanceAuthHeader)\n if (globalFormLocation) {\n outgoingHeaders[\"x-opencode-directory\"] = encodeURIComponent(translatedDirectories.get(globalFormLocation.directory)!)\n if (globalFormLocation.workspaceID) outgoingHeaders[\"x-opencode-workspace\"] = globalFormLocation.workspaceID\n }\n\n if (logger.isLevelEnabled(\"trace\")) {\n logger.trace(\n {\n workspaceId,\n method: request.method,\n targetUrl: targetUrl.toString(),\n contentType: request.headers[\"content-type\"],\n headers: redactSecrets(outgoingHeaders),\n },\n \"Proxy -> OpenCode request\",\n )\n }\n\n return outgoingHeaders\n },\n rewriteHeaders: sanitizeInstanceProxyResponseHeaders,\n onResponse: (_proxyRequest, proxyReply, upstreamResponse) => {\n if (proxyReply.statusCode === 401) {\n workspaceManager.invalidateSharedServiceConnection?.()\n }\n const upstream = upstreamResponse as typeof upstreamResponse & { readableEnded?: boolean; destroyed?: boolean }\n const release = () => releaseMutation?.()\n if (upstream.readableEnded || upstream.destroyed) release()\n else {\n upstream.once(\"end\", release)\n upstream.once(\"close\", release)\n upstream.once(\"error\", release)\n }\n proxyReply.send(upstream)\n },\n onError: (proxyReply, { error }) => {\n workspaceManager.invalidateSharedServiceConnection?.()\n releaseMutation?.()\n logger.error({ err: error, workspaceId, targetUrl: targetUrl.toString() }, \"Failed to proxy workspace request\")\n if (!proxyReply.sent) {\n proxyReply.code(502).send({ error: \"Workspace instance proxy failed\" })\n }\n },\n })\n } catch (error) {\n releaseMutation?.()\n throw error\n }\n}\n\nfunction appendIncomingQuery(targetUrl: URL, incomingUrl: string): URL {\n const queryIndex = incomingUrl.indexOf(\"?\")\n const incomingSearch = queryIndex >= 0 ? incomingUrl.slice(queryIndex + 1) : \"\"\n for (const [key, value] of new URLSearchParams(incomingSearch)) targetUrl.searchParams.append(key, value)\n return targetUrl\n}\n\nfunction readRequestDirectories(\n targetUrl: URL,\n body: unknown,\n defaultDirectory: string,\n): { directories: string[]; locations: LocationRef[]; invalid: boolean } {\n const directories: string[] = []\n const locations: LocationRef[] = []\n let invalid = false\n for (const key of [\"location[directory]\", \"directory\"]) {\n for (const value of targetUrl.searchParams.getAll(key)) {\n if (value.trim()) directories.push(value)\n else invalid = true\n }\n }\n const queryWorkspaces = targetUrl.searchParams.getAll(\"location[workspace]\")\n const queryDirectories = targetUrl.searchParams.getAll(\"location[directory]\")\n if (queryWorkspaces.length > 1 || queryDirectories.length > 1) invalid = true\n if (queryWorkspaces.length === 1) {\n const workspaceID = queryWorkspaces[0]\n if (!workspaceID.trim()) invalid = true\n else locations.push({ directory: queryDirectories[0] ?? defaultDirectory, workspaceID })\n }\n if (targetUrl.pathname.replace(/\\/+$/, \"\") !== \"/api/session\" && targetUrl.searchParams.has(\"workspace\")) invalid = true\n if (targetUrl.searchParams.has(\"workspaceID\") || targetUrl.searchParams.has(\"location[workspaceID]\")) invalid = true\n\n if (body && typeof body === \"object\" && !Array.isArray(body) && !Buffer.isBuffer(body)) {\n const input = body as Record<string, unknown>\n if (\"directory\" in input) {\n if (typeof input.directory === \"string\" && input.directory.trim()) directories.push(input.directory)\n else invalid = true\n }\n if (\"location\" in input) {\n const location = input.location\n if (location && typeof location === \"object\" && !Array.isArray(location)) {\n const source = location as Record<string, unknown>\n const directory = source.directory\n if (typeof directory === \"string\" && directory.trim()) directories.push(directory)\n else invalid = true\n if (source.workspace !== undefined) invalid = true\n if (source.workspaceID !== undefined) {\n if (typeof source.workspaceID === \"string\" && source.workspaceID.trim() && typeof directory === \"string\" && directory.trim()) {\n locations.push({ directory, workspaceID: source.workspaceID })\n } else invalid = true\n }\n } else if (location !== null && location !== undefined) {\n invalid = true\n }\n }\n if (/^\\/api\\/session\\/[^/]+\\/move\\/?$/.test(targetUrl.pathname) && \"workspaceID\" in input) {\n if (typeof input.workspaceID === \"string\" && input.workspaceID.trim() && typeof input.directory === \"string\" && input.directory.trim()) {\n locations.push({ directory: input.directory, workspaceID: input.workspaceID })\n } else invalid = true\n } else if (\"workspaceID\" in input) {\n invalid = true\n }\n }\n return { directories, locations, invalid }\n}\n\nfunction readNativeCwd(\n targetUrl: URL,\n body: unknown,\n locations: { directories: string[]; locations: LocationRef[]; invalid: boolean },\n) {\n if (!/^\\/api\\/(?:shell|pty)\\/?$/.test(targetUrl.pathname) || !body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return\n const input = body as Record<string, unknown>\n if (!(\"cwd\" in input)) return\n if (typeof input.cwd === \"string\" && input.cwd.trim()) locations.directories.push(input.cwd)\n else locations.invalid = true\n}\n\nfunction sanitizeInstanceProxyRequestHeaders(\n headers: Record<string, string | string[] | undefined>,\n authorization: string | undefined,\n) {\n const blocked = new Set([\n \"authorization\", \"connection\", \"cookie\", \"forwarded\", \"host\", \"keep-alive\", \"proxy-authenticate\",\n \"proxy-authorization\", \"proxy-connection\", \"set-cookie\", \"te\", \"trailer\", \"transfer-encoding\", \"upgrade\",\n \"x-forwarded-for\", \"x-forwarded-host\", \"x-forwarded-port\", \"x-forwarded-proto\",\n ])\n const connection = headers.connection\n for (const name of (Array.isArray(connection) ? connection.join(\",\") : connection ?? \"\").split(\",\")) blocked.add(name.trim().toLowerCase())\n\n const result: Record<string, string | string[] | undefined> = {}\n for (const [key, value] of Object.entries(headers)) {\n const normalized = key.toLowerCase()\n if (!blocked.has(normalized) && !normalized.startsWith(\"x-opencode-\")) result[key] = value\n }\n if (authorization) result.authorization = authorization\n return result\n}\n\nfunction sanitizeInstanceProxyResponseHeaders(headers: Record<string, string | string[] | undefined>) {\n const blocked = new Set([\"proxy-authenticate\", \"set-cookie\", \"set-cookie2\", \"www-authenticate\"])\n return Object.fromEntries(Object.entries(headers).filter(([key]) => !blocked.has(key.toLowerCase())))\n}\n\nexport function redactSecrets(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (Array.isArray(value)) return value.map(redactSecrets)\n if (typeof value !== \"object\") return value\n if (Buffer.isBuffer(value)) return \"<redacted>\"\n if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) return \"<redacted>\"\n return Object.fromEntries(Object.entries(value).map(([key, entry]) => [\n key,\n /(authorization|cookie|key|code|token|password|secret)/i.test(key) ? \"<redacted>\" : redactSecrets(entry),\n ]))\n}\n\nasync function allDirectoriesOwned(manager: InstanceProxyWorkspaceManager, workspaceId: string, directories: string[]) {\n return (await Promise.all(directories.map((directory) => manager.ownsDirectory(workspaceId, directory)))).every(Boolean)\n}\n\nasync function allLocationsOwned(manager: InstanceProxyWorkspaceManager, workspaceId: string, locations: LocationRef[]) {\n const unique = new Map(locations.map((location) => [`${location.directory}\\0${location.workspaceID ?? \"\"}`, location]))\n return (await Promise.all([...unique.values()].map((location) => manager.ownsLocation(workspaceId, location)))).every(Boolean)\n}\n\nasync function allPathsOwned(manager: InstanceProxyWorkspaceManager, workspaceId: string, paths: string[]) {\n return (await Promise.all(paths.map((candidate) => manager.ownsPath(workspaceId, candidate)))).every(Boolean)\n}\n\nfunction applyDefaultWorkspaceLocation(\n targetUrl: URL,\n body: unknown,\n method: string,\n directory: string,\n hasLocation: boolean,\n sessionRoute: boolean,\n): unknown {\n if (hasLocation || sessionRoute) return body\n if (targetUrl.pathname === \"/api/session\" && method === \"GET\") {\n targetUrl.searchParams.set(\"directory\", directory)\n return body\n }\n if (targetUrl.pathname === \"/api/session\" && method === \"POST\") {\n const input = body && typeof body === \"object\" && !Array.isArray(body) && !Buffer.isBuffer(body)\n ? body as Record<string, unknown>\n : {}\n return { ...input, location: { directory } }\n }\n targetUrl.searchParams.set(\"location[directory]\", directory)\n return body\n}\n\nfunction getSessionRouteId(pathname: string): string | null {\n const match = pathname.match(/^\\/api\\/(?:experimental\\/)?session\\/([^/]+)(?:\\/|$)/)\n if (!match || match[1] === \"active\" || match[1] === \"import\") return null\n return match[1]\n}\n\nfunction isGlobalFormAction(pathname: string, method: string): boolean {\n return method === \"POST\" && /^\\/api\\/session\\/global\\/form\\/[^/]+\\/(?:reply|cancel)\\/?$/.test(pathname)\n}\n\nasync function authorizeSessionList(\n targetUrl: URL,\n method: string,\n manager: InstanceProxyWorkspaceManager,\n workspaceId: string,\n): Promise<\"allowed\" | \"invalid\" | \"foreign\"> {\n if (method !== \"GET\" || targetUrl.pathname.replace(/\\/+$/, \"\") !== \"/api/session\") return \"allowed\"\n const cursors = targetUrl.searchParams.getAll(\"cursor\")\n if (cursors.length > 1) return \"invalid\"\n if (cursors.length === 1) {\n const scope = decodeSessionListCursor(cursors[0])\n if (!scope) return \"invalid\"\n for (const key of [\"directory\", \"workspace\", \"location[directory]\", \"location[workspace]\", \"project\", \"subpath\"]) {\n targetUrl.searchParams.delete(key)\n }\n return ownsSessionListScope(manager, workspaceId, scope)\n }\n\n const projects = targetUrl.searchParams.getAll(\"project\")\n const subpaths = targetUrl.searchParams.getAll(\"subpath\")\n const workspaces = targetUrl.searchParams.getAll(\"workspace\")\n const directories = targetUrl.searchParams.getAll(\"directory\")\n if (projects.length > 1 || subpaths.length > 1 || workspaces.length > 1 || directories.length > 1\n || (subpaths.length && !projects.length)) return \"invalid\"\n const workspace = workspaces[0]\n const directory = directories[0]\n if ((workspace !== undefined && !workspace.trim()) || (directory !== undefined && !directory.trim())) return \"invalid\"\n if (!projects.length) {\n if (workspace && directory) return ownsSessionListScope(manager, workspaceId, { workspace, directory })\n if (workspace) return ownsSessionListScope(manager, workspaceId, { workspace })\n return \"allowed\"\n }\n const project = projects[0]\n const subpath = subpaths[0]\n if (!project || (subpath !== undefined && !isSafeRelativePath(subpath))) return \"invalid\"\n return ownsSessionListScope(manager, workspaceId, { ...(workspace ? { workspace } : {}), project, subpath })\n}\n\ntype SessionListScope = {\n workspace?: string\n directory?: string\n project?: string\n subpath?: string\n}\n\nfunction decodeSessionListCursor(cursor: string): SessionListScope | null {\n if (!cursor || !/^[A-Za-z0-9_-]+$/.test(cursor)) return null\n try {\n const value = JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf8\")) as Record<string, unknown>\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null\n const anchor = value.anchor as Record<string, unknown> | undefined\n if (!anchor || typeof anchor !== \"object\" || Array.isArray(anchor)\n || typeof anchor.id !== \"string\" || !anchor.id\n || typeof anchor.time !== \"number\" || !Number.isFinite(anchor.time)\n || (anchor.direction !== \"previous\" && anchor.direction !== \"next\")) return null\n if (value.workspace !== undefined && (typeof value.workspace !== \"string\" || !value.workspace.trim())) return null\n if (value.search !== undefined && typeof value.search !== \"string\") return null\n if (value.order !== undefined && value.order !== \"asc\" && value.order !== \"desc\") return null\n if (typeof value.directory === \"string\" && value.directory.trim() && value.project === undefined && value.subpath === undefined) {\n return { ...(typeof value.workspace === \"string\" ? { workspace: value.workspace } : {}), directory: value.directory }\n }\n if (typeof value.project === \"string\" && value.project.trim() && value.directory === undefined) {\n if (value.subpath === undefined) {\n return { ...(typeof value.workspace === \"string\" ? { workspace: value.workspace } : {}), project: value.project }\n }\n if (typeof value.subpath === \"string\" && isSafeRelativePath(value.subpath)) {\n return { ...(typeof value.workspace === \"string\" ? { workspace: value.workspace } : {}), project: value.project, subpath: value.subpath }\n }\n }\n if (typeof value.workspace === \"string\" && value.directory === undefined && value.project === undefined && value.subpath === undefined) {\n return { workspace: value.workspace }\n }\n return null\n } catch {\n return null\n }\n}\n\nfunction isSafeRelativePath(value: string): boolean {\n return value === \"\" || (!path.posix.isAbsolute(value) && !path.win32.isAbsolute(value) && !value.split(/[\\\\/]/).includes(\"..\"))\n}\n\nasync function ownsSessionListScope(\n manager: InstanceProxyWorkspaceManager,\n workspaceId: string,\n scope: SessionListScope,\n): Promise<\"allowed\" | \"foreign\"> {\n if (scope.directory) {\n const owned = scope.workspace\n ? await manager.ownsLocation(workspaceId, { directory: scope.directory, workspaceID: scope.workspace })\n : await manager.ownsDirectory(workspaceId, scope.directory)\n return owned ? \"allowed\" : \"foreign\"\n }\n if (!scope.project) return scope.workspace && await manager.ownsLocationWorkspace(workspaceId, scope.workspace) ? \"allowed\" : \"foreign\"\n const project = (await (await manager.getSharedServiceClient()).project.list()).find((candidate) => candidate.id === scope.project)\n if (!project) return \"foreign\"\n const directory = scope.subpath === undefined\n ? project.canonical\n : /^[A-Za-z]:[\\\\/]|^\\\\\\\\/.test(project.canonical)\n ? path.win32.resolve(project.canonical, scope.subpath)\n : path.posix.resolve(project.canonical, scope.subpath)\n const owned = scope.workspace\n ? await manager.ownsLocation(workspaceId, { directory, workspaceID: scope.workspace })\n : await manager.ownsDirectory(workspaceId, directory)\n return owned ? \"allowed\" : \"foreign\"\n}\n\nfunction getPtyRouteId(pathname: string): string | null {\n return pathname.replace(/\\/+$/, \"\").match(/^\\/api\\/pty\\/([^/]+)$/)?.[1] ?? null\n}\n\nfunction getShellRouteId(pathname: string): string | null {\n return pathname.replace(/\\/+$/, \"\").match(/^\\/api\\/shell\\/([^/]+)(?:\\/output|\\/timeout)?$/)?.[1] ?? null\n}\n\nfunction buildInstanceTargetUrl(endpoint: string, pathSuffix: string | undefined): URL | null {\n const suffix = pathSuffix ?? \"\"\n if (/\\\\|%2f|%5c/i.test(suffix) || hasDotSegment(suffix)) return null\n const targetUrl = new URL(endpoint)\n const origin = targetUrl.origin\n targetUrl.pathname = normalizeInstanceSuffix(suffix).split(\"/\").map(encodeURIComponent).join(\"/\")\n targetUrl.search = \"\"\n targetUrl.hash = \"\"\n return targetUrl.origin === origin ? targetUrl : null\n}\n\nfunction hasDotSegment(value: string): boolean {\n return value.split(\"/\").some((segment) => {\n let decoded = segment\n for (let depth = 0; depth < 3; depth++) {\n if (decoded === \".\" || decoded === \"..\") return true\n try {\n const next = decodeURIComponent(decoded)\n if (next === decoded) break\n decoded = next\n } catch {\n break\n }\n }\n return decoded === \".\" || decoded === \"..\"\n })\n}\n\nfunction isAllowedInstanceApiRoute(method: string, pathname: string): boolean {\n const route = pathname.replace(/\\/+$/, \"\")\n const allowed: Array<[string, RegExp]> = [\n [\"GET\", /^\\/api\\/(?:agent|command|config|integration|location|mcp|model|plugin|provider|reference|skill)$/],\n [\"GET\", /^\\/api\\/(?:mcp\\/resource|websearch\\/provider)$/],\n [\"GET\", /^\\/api\\/agent\\/[^/]+$/],\n [\"GET\", /^\\/api\\/model\\/default$/],\n [\"GET\", /^\\/api\\/(?:permission|question)\\/request$/],\n [\"GET\", /^\\/api\\/form\\/request$/],\n [\"GET\", /^\\/api\\/project\\/current$/],\n [\"GET\", /^\\/api\\/project$/],\n [\"GET\", /^\\/api\\/vcs(?:\\/status)?$/],\n [\"GET\", /^\\/api\\/fs\\/(?:list|read\\/.+)$/],\n [\"GET\", /^\\/api\\/(?:pty|shell)(?:\\/[^/]+(?:\\/output)?)?$/],\n [\"POST\", /^\\/api\\/(?:pty|shell)$/],\n [\"PUT\", /^\\/api\\/pty\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/pty\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/shell\\/[^/]+$/],\n [\"PATCH\", /^\\/api\\/shell\\/[^/]+\\/timeout$/],\n [\"POST\", /^\\/api\\/mcp\\/[^/]+\\/(?:connect|disconnect)$/],\n [\"DELETE\", /^\\/api\\/credential\\/[^/]+$/],\n [\"POST\", /^\\/api\\/integration\\/[^/]+\\/connect\\/(?:key|oauth|command)$/],\n [\"GET\", /^\\/api\\/integration\\/[^/]+\\/connect\\/(?:oauth|command)\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/integration\\/[^/]+\\/connect\\/(?:oauth|command)\\/[^/]+$/],\n [\"POST\", /^\\/api\\/integration\\/[^/]+\\/connect\\/oauth\\/[^/]+\\/complete$/],\n [\"GET\", /^\\/api\\/session(?:\\/active)?$/],\n [\"POST\", /^\\/api\\/session(?:\\/import)?$/],\n [\"GET\", /^\\/api\\/session\\/[^/]+(?:\\/message(?:\\/[^/]+)?)?$/],\n [\"PATCH\", /^\\/api\\/session\\/[^/]+\\/message\\/[^/]+$/],\n [\"GET\", /^\\/api\\/session\\/[^/]+\\/inbox$/],\n [\"GET\", /^\\/api\\/session\\/[^/]+\\/(?:permission|form)$/],\n [\"DELETE\", /^\\/api\\/session\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/session\\/[^/]+\\/inbox\\/[^/]+$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/(?:agent|model|rename|move|prompt|command|shell|compact|interrupt|background|fork)$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/inbox\\/[^/]+\\/(?:steer|queue)$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/revert\\/(?:stage|clear)$/],\n [\"PUT\", /^\\/api\\/session\\/[^/]+\\/instructions\\/entries\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/session\\/[^/]+\\/instructions\\/entries\\/[^/]+$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/permission\\/[^/]+\\/reply$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/question\\/[^/]+\\/(?:reply|reject)$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/form\\/[^/]+\\/(?:reply|cancel)$/],\n [\"GET\", /^\\/api\\/experimental\\/session\\/[^/]+\\/log$/],\n ]\n return allowed.some(([allowedMethod, pattern]) => method === allowedMethod && pattern.test(route))\n}\n\nfunction replaceRequestDirectories(\n targetUrl: URL,\n body: unknown,\n replacements: ReadonlyMap<string, string>,\n pathname: string,\n method: string,\n): unknown {\n for (const key of [\"directory\", \"location[directory]\"]) {\n const values = targetUrl.searchParams.getAll(key)\n if (!values.some((value) => replacements.has(value))) continue\n targetUrl.searchParams.delete(key)\n for (const value of values) targetUrl.searchParams.append(key, replacements.get(value) ?? value)\n }\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return body\n const replaceLocation = (value: unknown): unknown => {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) return value\n const location = value as Record<string, unknown>\n return typeof location.directory === \"string\" && replacements.has(location.directory)\n ? { ...location, directory: replacements.get(location.directory) }\n : value\n }\n const input = { ...(body as Record<string, unknown>) }\n for (const key of [\"directory\", \"cwd\"]) {\n const value = input[key]\n if (typeof value === \"string\" && replacements.has(value)) input[key] = replacements.get(value)\n }\n input.location = replaceLocation(input.location)\n if (pathname !== \"/api/session/import\" || method !== \"POST\") return input\n input.info = input.info && typeof input.info === \"object\" && !Array.isArray(input.info) && !Buffer.isBuffer(input.info)\n ? { ...(input.info as Record<string, unknown>), location: replaceLocation((input.info as Record<string, unknown>).location) }\n : input.info\n if (Array.isArray(input.messages)) {\n input.messages = input.messages.map((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) return value\n const message = value as Record<string, unknown>\n if (message.type !== \"location-switched\") return value\n const next: Record<string, unknown> = { ...message, location: replaceLocation(message.location) }\n if (message.previous && typeof message.previous === \"object\" && !Array.isArray(message.previous) && !Buffer.isBuffer(message.previous)) {\n next.previous = {\n ...(message.previous as Record<string, unknown>),\n location: replaceLocation((message.previous as Record<string, unknown>).location),\n }\n }\n return next\n })\n }\n return input\n}\n\nfunction stripLocationSelectors(targetUrl: URL, body: unknown, workspaceDirectory: string, serviceDirectory: string): unknown {\n for (const key of [\"directory\", \"location[directory]\"]) {\n const values = targetUrl.searchParams.getAll(key)\n if (values.includes(workspaceDirectory)) {\n targetUrl.searchParams.delete(key)\n for (const value of values) targetUrl.searchParams.append(key, value === workspaceDirectory ? serviceDirectory : value)\n }\n }\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return body\n const input = body as Record<string, unknown>\n const canonicalInput = { ...input }\n for (const key of [\"directory\", \"cwd\"]) {\n if (canonicalInput[key] === workspaceDirectory) canonicalInput[key] = serviceDirectory\n }\n const location = input.location\n if (!location || typeof location !== \"object\" || Array.isArray(location) || Buffer.isBuffer(location)) return canonicalInput\n const canonicalLocation = { ...(location as Record<string, unknown>) }\n if (canonicalLocation.directory === workspaceDirectory) canonicalLocation.directory = serviceDirectory\n return { ...canonicalInput, location: canonicalLocation }\n}\n\nfunction readPromptFilePaths(pathname: string, method: string, body: unknown) {\n const result = { paths: [] as string[], invalid: false }\n if (method !== \"POST\" || !/^\\/api\\/session\\/[^/]+\\/(?:prompt|command)\\/?$/.test(pathname)) return result\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return result\n const files = (body as Record<string, unknown>).files\n if (files === undefined) return result\n if (!Array.isArray(files)) return { paths: [], invalid: true }\n\n for (const file of files) {\n if (!file || typeof file !== \"object\" || Array.isArray(file) || Buffer.isBuffer(file)) {\n result.invalid = true\n continue\n }\n const uri = (file as Record<string, unknown>).uri\n if (typeof uri !== \"string\" || !uri.trim()) {\n result.invalid = true\n continue\n }\n const parsed = parsePromptFileUri(uri)\n if (parsed.invalid) result.invalid = true\n else if (parsed.path) result.paths.push(parsed.path)\n }\n return result\n}\n\nfunction parsePromptFileUri(value: string): { path?: string; invalid: boolean } {\n if (path.isAbsolute(value) || path.win32.isAbsolute(value)) return { path: value, invalid: value.includes(\"\\0\") }\n let uri: URL\n try {\n uri = new URL(value)\n } catch {\n return { invalid: true }\n }\n if ([\"data:\", \"http:\", \"https:\"].includes(uri.protocol)) return { invalid: false }\n if (uri.protocol !== \"file:\" || (uri.hostname && uri.hostname !== \"localhost\") || uri.search || uri.hash || /%2f|%5c/i.test(uri.pathname)) {\n return { invalid: true }\n }\n try {\n const decoded = decodeURIComponent(uri.pathname)\n const localPath = /^\\/[A-Za-z]:\\//.test(decoded) ? decoded.slice(1) : decoded\n return { path: localPath, invalid: !localPath || localPath.includes(\"\\0\") }\n } catch {\n return { invalid: true }\n }\n}\n\nfunction replacePromptFileUris(body: unknown, replacements: ReadonlyMap<string, string>): unknown {\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return body\n const input = body as Record<string, unknown>\n if (!Array.isArray(input.files)) return body\n return {\n ...input,\n files: input.files.map((file) => {\n if (!file || typeof file !== \"object\" || Array.isArray(file) || Buffer.isBuffer(file)) return file\n const source = file as Record<string, unknown>\n if (typeof source.uri !== \"string\" || !/^file:/i.test(source.uri)) return file\n const parsed = parsePromptFileUri(source.uri)\n const translated = parsed.path ? replacements.get(parsed.path) : undefined\n if (!translated || translated === parsed.path) return file\n const uri = new URL(\"file:///\")\n uri.pathname = translated.replace(/\\\\/g, \"/\")\n return { ...source, uri: uri.href }\n }),\n }\n}\n\nfunction prepareSessionImport(pathname: string, method: string, body: unknown, directory: string) {\n const result = { body, directories: [] as string[], locations: [] as LocationRef[], invalid: false }\n if (pathname !== \"/api/session/import\" || method !== \"POST\") return result\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) {\n result.invalid = true\n return result\n }\n\n const input = body as Record<string, unknown>\n const addLocation = (owner: Record<string, unknown>, key: string) => {\n const value = owner[key]\n if (value === null || value === undefined) {\n owner[key] = { directory }\n result.directories.push(directory)\n return\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) {\n result.invalid = true\n return\n }\n const location = value as Record<string, unknown>\n if (location.directory === null || location.directory === undefined) location.directory = directory\n if (typeof location.directory !== \"string\" || !location.directory.trim()) {\n result.invalid = true\n return\n }\n result.directories.push(location.directory)\n if (location.workspace !== undefined) result.invalid = true\n if (location.workspaceID !== undefined) {\n if (typeof location.workspaceID === \"string\" && location.workspaceID.trim()) {\n result.locations.push({ directory: location.directory, workspaceID: location.workspaceID })\n } else result.invalid = true\n }\n }\n\n addLocation(input, \"location\")\n if (input.info && typeof input.info === \"object\" && !Array.isArray(input.info) && !Buffer.isBuffer(input.info)) {\n addLocation(input.info as Record<string, unknown>, \"location\")\n }\n\n if (Array.isArray(input.messages)) {\n for (const value of input.messages) {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) continue\n const message = value as Record<string, unknown>\n if (message.type !== \"location-switched\") continue\n addLocation(message, \"location\")\n if (message.previous && typeof message.previous === \"object\" && !Array.isArray(message.previous) && !Buffer.isBuffer(message.previous)) {\n addLocation(message.previous as Record<string, unknown>, \"location\")\n }\n }\n }\n return result\n}\n\nfunction normalizeInstanceSuffix(pathSuffix: string | undefined) {\n if (!pathSuffix || pathSuffix === \"/\") {\n return \"/\"\n }\n const trimmed = pathSuffix.replace(/^\\/+/, \"\")\n return trimmed.length === 0 ? \"/\" : `/${trimmed}`\n}\n\nfunction setupStaticUi(\n app: FastifyInstance,\n uiDir: string,\n authManager: AuthManager,\n previewManager: PreviewManager,\n logger: Logger,\n) {\n if (!uiDir) {\n app.log.warn(\"UI static directory not provided; API endpoints only\")\n return\n }\n\n if (!fs.existsSync(uiDir)) {\n app.log.warn({ uiDir }, \"UI static directory missing; API endpoints only\")\n return\n }\n\n app.addHook(\"preHandler\", (request, reply, done) => {\n const session = authManager.getSessionFromRequest(request)\n if (session && proxyPreviewFallbackFromReferer(request, reply, previewManager, logger)) {\n return\n }\n done()\n })\n\n app.register(fastifyStatic, {\n root: uiDir,\n prefix: \"/\",\n decorateReply: false,\n })\n\n const indexPath = path.join(uiDir, \"index.html\")\n\n app.setNotFoundHandler((request: FastifyRequest, reply: FastifyReply) => {\n const url = request.raw.url ?? \"\"\n if (isApiRequest(url)) {\n reply.code(404).send({ message: \"Not Found\" })\n return\n }\n\n const session = authManager.getSessionFromRequest(request)\n if (session && proxyPreviewFallbackFromReferer(request, reply, previewManager, logger)) {\n return\n }\n\n if (!session && wantsHtml(request)) {\n reply.redirect(\"/login\")\n return\n }\n\n if (fs.existsSync(indexPath)) {\n reply.type(\"text/html\").send(fs.readFileSync(indexPath, \"utf-8\"))\n } else {\n reply.code(404).send({ message: \"UI bundle missing\" })\n }\n })\n}\n\nfunction setupDevProxy(\n app: FastifyInstance,\n upstreamBase: string,\n authManager: AuthManager,\n previewManager: PreviewManager,\n logger: Logger,\n) {\n app.log.info({ upstreamBase }, \"Proxying UI requests to development server\")\n app.setNotFoundHandler((request: FastifyRequest, reply: FastifyReply) => {\n const url = request.raw.url ?? \"\"\n if (isApiRequest(url)) {\n reply.code(404).send({ message: \"Not Found\" })\n return\n }\n\n const session = authManager.getSessionFromRequest(request)\n if (session && proxyPreviewFallbackFromReferer(request, reply, previewManager, logger)) {\n return\n }\n\n if (!session && wantsHtml(request)) {\n reply.redirect(\"/login\")\n return\n }\n\n void proxyToDevServer(request, reply, upstreamBase)\n })\n}\n\nfunction proxyPreviewFallbackFromReferer(\n request: FastifyRequest,\n reply: FastifyReply,\n previewManager: PreviewManager,\n logger: Logger,\n): boolean {\n const rawUrl = request.raw.url ?? request.url ?? \"\"\n const pathname = rawUrl.split(\"?\")[0] ?? \"\"\n if (!isPreviewFallbackPath(pathname)) {\n return false\n }\n\n const refererHeader = request.headers.referer ?? request.headers.referrer\n const referer = Array.isArray(refererHeader) ? refererHeader[0] : refererHeader\n if (!referer) {\n return false\n }\n\n const parsed = parsePreviewUpgradePath(referer)\n if (!parsed) {\n return false\n }\n\n void proxyPreviewAssetRequest({\n request,\n reply,\n previewManager,\n logger,\n token: parsed.token,\n })\n return true\n}\n\nfunction isPreviewFallbackPath(pathname: string): boolean {\n if (!pathname || pathname === \"/\") return false\n if (pathname.startsWith(\"/api/\") || pathname === \"/api\") return false\n if (pathname.startsWith(\"/workspaces/\")) return false\n if (pathname.startsWith(\"/sidecars/\")) return false\n if (pathname.startsWith(\"/previews/\")) return false\n if (pathname.startsWith(\"/auth/\") || pathname === \"/login\") return false\n return true\n}\n\nasync function proxyToDevServer(request: FastifyRequest, reply: FastifyReply, upstreamBase: string) {\n try {\n const targetUrl = new URL(request.raw.url ?? \"/\", upstreamBase)\n const response = await fetch(targetUrl, {\n method: request.method,\n headers: buildProxyHeaders(request.headers),\n })\n\n response.headers.forEach((value, key) => {\n reply.header(key, value)\n })\n\n reply.code(response.status)\n\n if (!response.body || request.method === \"HEAD\") {\n reply.send()\n return\n }\n\n const buffer = Buffer.from(await response.arrayBuffer())\n reply.send(buffer)\n } catch (error) {\n request.log.error({ err: error }, \"Failed to proxy UI request to dev server\")\n if (!reply.sent) {\n reply.code(502).send(\"UI dev server is unavailable\")\n }\n }\n}\n\nfunction isApiRequest(rawUrl: string | null | undefined) {\n if (!rawUrl) return false\n const pathname = rawUrl.split(\"?\")[0] ?? \"\"\n return pathname === \"/api\" || pathname.startsWith(\"/api/\")\n}\n\nfunction buildProxyHeaders(headers: FastifyRequest[\"headers\"]): Record<string, string> {\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (!value || key.toLowerCase() === \"host\") continue\n result[key] = Array.isArray(value) ? value.join(\",\") : value\n }\n return result\n}\n\nfunction getHeaderValue(headers: Record<string, string | string[] | undefined>, key: string): string | undefined {\n const value = headers[key.toLowerCase()]\n return Array.isArray(value) ? value[0] : value\n}\n\nfunction isHtmlContentType(contentType: string): boolean {\n const normalized = contentType.toLowerCase()\n return normalized.includes(\"text/html\") || normalized.includes(\"application/xhtml+xml\")\n}\n\nfunction isCssContentType(contentType: string): boolean {\n return contentType.toLowerCase().includes(\"text/css\")\n}\n\nfunction isJavaScriptContentType(contentType: string): boolean {\n const normalized = contentType.toLowerCase()\n return normalized.includes(\"javascript\") || normalized.includes(\"ecmascript\")\n}\n\nexport function rewritePreviewBodyUrls(body: string, publicBase: string, kind: \"html\" | \"css\" | \"js\", targetOrigin = \"http://localhost\"): string {\n if (kind === \"css\") {\n return rewriteCssPreviewUrls(body, publicBase)\n }\n if (kind === \"js\") {\n return rewritePreviewJavaScriptImports(body, publicBase)\n }\n\n const rewritten = rewriteCssPreviewUrls(\n body\n .replace(/\\b(src|href|action|poster|data)=([\"'])\\/(?!\\/)([^\"']*)\\2/gi, (_match, attr: string, quote: string, pathValue: string) => {\n return `${attr}=${quote}${publicBase}/${pathValue}${quote}`\n })\n .replace(/\\bsrcset=([\"'])([^\"']*)\\1/gi, (_match, quote: string, value: string) => {\n return `srcset=${quote}${rewriteSrcsetPreviewUrls(value, publicBase)}${quote}`\n }),\n publicBase,\n )\n const withInlineModules = rewritten.replace(/<script\\b([^>]*)>([\\s\\S]*?)<\\/script>/gi, (script, attributes: string, source: string) => {\n if (/\\btype\\s*=\\s*([\"'])module\\1/i.test(attributes)) {\n return script.replace(source, rewritePreviewJavaScriptImports(source, publicBase))\n }\n if (/\\btype\\s*=\\s*([\"'])importmap\\1/i.test(attributes)) {\n return script.replace(source, rewritePreviewImportMap(source, publicBase))\n }\n return script\n })\n const bridge = buildPreviewRuntimeBridge(publicBase, targetOrigin)\n return /<head(?:\\s[^>]*)?>/i.test(withInlineModules)\n ? withInlineModules.replace(/<head(\\s[^>]*)?>/i, `<head$1>${bridge}`)\n : `${bridge}${withInlineModules}`\n}\n\nfunction rewriteCssPreviewUrls(body: string, publicBase: string): string {\n return body.replace(/url\\((\\s*)([\"']?)\\/(?!\\/)([^\"')]+)\\2(\\s*)\\)/gi, (_match, before: string, quote: string, pathValue: string, after: string) => {\n return `url(${before}${quote}${publicBase}/${pathValue}${quote}${after})`\n })\n}\n\nfunction rewriteSrcsetPreviewUrls(value: string, publicBase: string): string {\n return value\n .split(\",\")\n .map((entry) => {\n const trimmed = entry.trimStart()\n if (!trimmed.startsWith(\"/\") || trimmed.startsWith(\"//\")) return entry\n const leading = entry.slice(0, entry.length - trimmed.length)\n return `${leading}${publicBase}${trimmed}`\n })\n .join(\",\")\n}\n\nasync function proxySideCarRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n sidecarManager: SideCarManager\n logger: Logger\n pathSuffix?: string\n}) {\n const sidecarId = (args.request.params as { id?: string }).id ?? \"\"\n const sidecar = await args.sidecarManager.get(sidecarId)\n if (!sidecar) {\n args.reply.code(404).send({ error: \"SideCar not found\" })\n return\n }\n\n const pathname = (args.request.raw.url ?? args.request.url ?? \"\").split(\"?\")[0] ?? \"\"\n const queryIndex = (args.request.raw.url ?? args.request.url ?? \"\").indexOf(\"?\")\n const search = queryIndex >= 0 ? (args.request.raw.url ?? args.request.url ?? \"\").slice(queryIndex) : \"\"\n const pathSuffix = args.pathSuffix ?? \"\"\n const requestPath = pathSuffix ? `${args.sidecarManager.buildProxyBasePath(sidecarId)}/${pathSuffix.replace(/^\\/+/, \"\")}` : args.sidecarManager.buildProxyBasePath(sidecarId)\n const targetPath = args.sidecarManager.buildTargetPath(sidecarId, requestPath, search)\n const targetOrigin = args.sidecarManager.buildTargetOrigin(sidecar)\n const targetUrl = `${targetOrigin}${targetPath}`\n args.logger.debug({ sidecarId: sidecar.id, targetUrl, pathname, prefixMode: sidecar.prefixMode }, \"Proxying request to SideCar\")\n\n await proxyTargetRequest({\n reply: args.reply,\n logger: args.logger,\n targetUrl,\n targetOrigin,\n logContext: { sidecarId: sidecar.id },\n errorMessage: \"SideCar proxy failed\",\n rewriteHeaders: (headers) => rewriteSideCarResponseHeaders(headers, sidecarId, targetOrigin, sidecar.prefixMode),\n })\n}\n\nasync function proxyPreviewRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n previewManager: PreviewManager\n logger: Logger\n token?: string\n publicBase?: string\n pathSuffix?: string\n}) {\n const token = args.token ?? (args.request.params as { token?: string }).token ?? \"\"\n const preview = args.previewManager.get(token)\n if (!preview) {\n args.reply.code(404).send({ error: \"Preview not found\" })\n return\n }\n\n const rawUrl = args.request.raw.url ?? args.request.url ?? \"\"\n const queryIndex = rawUrl.indexOf(\"?\")\n const search = queryIndex >= 0 ? rawUrl.slice(queryIndex) : \"\"\n const pathSuffix = args.pathSuffix ?? \"\"\n const publicBase = args.publicBase ?? args.previewManager.buildProxyBasePath(token)\n const requestPath = pathSuffix ? `${publicBase}/${pathSuffix.replace(/^\\/+/, \"\")}` : publicBase\n const targetUrl = args.previewManager.buildTargetUrl(token, requestPath, search)\n if (!targetUrl) {\n args.reply.code(404).send({ error: \"Preview not found\" })\n return\n }\n\n args.logger.debug({ previewToken: token, targetUrl: targetUrl.toString() }, \"Proxying request to preview\")\n await proxyPreviewTargetRequest({\n request: args.request,\n reply: args.reply,\n logger: args.logger,\n targetUrl: targetUrl.toString(),\n targetOrigin: targetUrl.origin,\n publicBase,\n logContext: { previewToken: token },\n errorMessage: \"Preview proxy failed\",\n rewriteHeaders: (headers) => rewritePreviewResponseHeaders(headers, token, targetUrl.origin, publicBase),\n })\n}\n\nasync function proxyPreviewAssetRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n previewManager: PreviewManager\n logger: Logger\n token: string\n}) {\n const rawUrl = args.request.raw.url ?? args.request.url ?? \"\"\n const queryIndex = rawUrl.indexOf(\"?\")\n const search = queryIndex >= 0 ? rawUrl.slice(queryIndex) : \"\"\n const pathname = rawUrl.split(\"?\")[0] ?? \"/\"\n const targetUrl = args.previewManager.buildTargetUrl(args.token, pathname, search)\n if (!targetUrl) {\n args.reply.code(404).send({ error: \"Preview not found\" })\n return\n }\n\n args.logger.debug({ previewToken: args.token, targetUrl: targetUrl.toString() }, \"Proxying preview fallback asset\")\n await proxyPreviewTargetRequest({\n request: args.request,\n reply: args.reply,\n logger: args.logger,\n targetUrl: targetUrl.toString(),\n targetOrigin: targetUrl.origin,\n publicBase: args.previewManager.buildProxyBasePath(args.token),\n logContext: { previewToken: args.token, previewFallback: true },\n errorMessage: \"Preview proxy failed\",\n rewriteHeaders: (headers) => rewritePreviewResponseHeaders(headers, args.token, targetUrl.origin),\n })\n}\n\nasync function proxyPreviewTargetRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n logger: Logger\n targetUrl: string\n targetOrigin: string\n publicBase: string\n logContext: Record<string, unknown>\n errorMessage: string\n rewriteHeaders: (headers: Record<string, string | string[] | undefined>) => Record<string, string | string[] | undefined>\n}) {\n let responseKind: \"html\" | \"css\" | \"js\" | null = null\n await args.reply.from(args.targetUrl, {\n rewriteRequestHeaders: (_originalRequest, headers) => {\n const next = sanitizeSideCarProxyRequestHeaders(headers as Record<string, string | string[] | undefined>, args.targetOrigin)\n delete next[\"accept-encoding\"]\n return next\n },\n rewriteHeaders: (headers) => {\n const next = args.rewriteHeaders(headers as Record<string, string | string[] | undefined>)\n const contentType = getHeaderValue(next, \"content-type\") ?? \"\"\n responseKind = isHtmlContentType(contentType) ? \"html\" : isCssContentType(contentType) ? \"css\" : isJavaScriptContentType(contentType) ? \"js\" : null\n if (responseKind) {\n delete next[\"content-length\"]\n delete next[\"content-encoding\"]\n }\n if (args.request.headers.origin === \"null\") {\n next[\"access-control-allow-origin\"] = \"null\"\n delete next[\"access-control-allow-credentials\"]\n }\n return next\n },\n onResponse: (_proxyRequest, proxyReply, upstreamResponse) => {\n const upstream = upstreamResponse as unknown as Readable\n if (!responseKind || args.request.method === \"HEAD\") {\n proxyReply.send(upstream)\n return\n }\n void (async () => {\n try {\n const chunks: Buffer[] = []\n for await (const chunk of upstream) chunks.push(Buffer.from(chunk))\n proxyReply.send(rewritePreviewBodyUrls(Buffer.concat(chunks).toString(), args.publicBase, responseKind!, args.targetOrigin))\n } catch (error) {\n args.logger.error({ ...args.logContext, err: error, targetUrl: args.targetUrl }, args.errorMessage)\n if (!proxyReply.sent) proxyReply.code(502).send({ error: args.errorMessage })\n }\n })()\n },\n onError: (proxyReply, { error }) => {\n args.logger.error({ ...args.logContext, err: error, targetUrl: args.targetUrl }, args.errorMessage)\n if (!proxyReply.sent) proxyReply.code(502).send({ error: args.errorMessage })\n },\n })\n}\n\nasync function proxyTargetRequest(args: {\n reply: FastifyReply\n logger: Logger\n targetUrl: string\n targetOrigin: string\n logContext: Record<string, unknown>\n errorMessage: string\n rewriteHeaders: (headers: Record<string, string | string[] | undefined>) => Record<string, string | string[] | undefined>\n}) {\n await args.reply.from(args.targetUrl, {\n rewriteRequestHeaders: (_originalRequest, headers) =>\n sanitizeSideCarProxyRequestHeaders(headers as Record<string, string | string[] | undefined>, args.targetOrigin),\n rewriteHeaders: args.rewriteHeaders,\n onError: (reply, { error }) => {\n args.logger.error({ ...args.logContext, err: error, targetUrl: args.targetUrl }, args.errorMessage)\n if (!reply.sent) {\n reply.code(502).send({ error: args.errorMessage })\n }\n },\n })\n}\n\nfunction parseSideCarUpgradePath(rawUrl: string): { sidecarId: string; pathname: string; search: string } | null {\n let parsed: URL\n try {\n parsed = new URL(rawUrl, \"http://localhost\")\n } catch {\n return null\n }\n\n const match = parsed.pathname.match(/^\\/sidecars\\/([^/]+)(?:\\/.*)?$/)\n if (!match) {\n return null\n }\n\n try {\n return {\n sidecarId: decodeURIComponent(match[1] ?? \"\"),\n pathname: parsed.pathname,\n search: parsed.search,\n }\n } catch {\n return null\n }\n}\n\nfunction parsePreviewUpgradePath(rawUrl: string): { token: string; pathname: string; search: string } | null {\n let parsed: URL\n try {\n parsed = new URL(rawUrl, \"http://localhost\")\n } catch {\n return null\n }\n\n const match = parsed.pathname.match(/^\\/previews\\/([^/]+)(?:\\/.*)?$/)\n if (!match) {\n return null\n }\n\n try {\n return {\n token: decodeURIComponent(match[1] ?? \"\"),\n pathname: parsed.pathname,\n search: parsed.search,\n }\n } catch {\n return null\n }\n}\n\nexport function parsePreviewCapabilityHost(host: string | undefined): string | null {\n const hostname = host?.replace(/:\\d+$/, \"\").toLowerCase() ?? \"\"\n return hostname.match(/^([0-9a-f-]{36})\\.preview\\.localhost$/)?.[1] ?? null\n}\n\nasync function proxySideCarWebSocketUpgrade(args: {\n request: import(\"http\").IncomingMessage\n socket: Socket\n head: Buffer\n sidecarId: string\n incomingPath: string\n search: string\n sidecarManager: SideCarManager\n authManager: AuthManager\n logger: Logger\n}) {\n const { request, socket, head, sidecarId, incomingPath, search, sidecarManager, authManager, logger } = args\n\n if (!isWebSocketUpgradeRequest(request)) {\n rejectUpgrade(socket, 400, \"Bad Request\")\n return\n }\n\n const session = authManager.getSessionFromHeaders(request.headers)\n if (!session) {\n rejectUpgrade(socket, 401, \"Unauthorized\")\n return\n }\n\n const sidecar = await sidecarManager.get(sidecarId)\n if (!sidecar) {\n rejectUpgrade(socket, 404, \"Not Found\")\n return\n }\n\n const targetOrigin = sidecarManager.buildTargetOrigin(sidecar)\n const targetPath = sidecarManager.buildTargetPath(sidecarId, incomingPath, search)\n const targetUrl = new URL(`${targetOrigin}${targetPath}`)\n logger.debug({ sidecarId, targetUrl: targetUrl.toString(), prefixMode: sidecar.prefixMode }, \"Proxying websocket to SideCar\")\n\n proxyTargetWebSocketUpgrade({\n request,\n socket,\n head,\n targetUrl,\n logger,\n logContext: { sidecarId },\n proxyLabel: \"SideCar\",\n })\n}\n\nasync function proxyPreviewWebSocketUpgrade(args: {\n request: import(\"http\").IncomingMessage\n socket: Socket\n head: Buffer\n token: string\n incomingPath: string\n search: string\n previewManager: PreviewManager\n authManager: AuthManager\n logger: Logger\n}) {\n const { request, socket, head, token, incomingPath, search, previewManager, authManager, logger } = args\n\n if (!isWebSocketUpgradeRequest(request)) {\n rejectUpgrade(socket, 400, \"Bad Request\")\n return\n }\n\n const session = authManager.getSessionFromHeaders(request.headers)\n if (!session && !previewManager.get(token)) {\n rejectUpgrade(socket, 401, \"Unauthorized\")\n return\n }\n\n const targetUrl = previewManager.buildTargetUrl(token, incomingPath, search)\n if (!targetUrl) {\n rejectUpgrade(socket, 404, \"Not Found\")\n return\n }\n\n logger.debug({ previewToken: token, targetUrl: targetUrl.toString() }, \"Proxying websocket to preview\")\n proxyTargetWebSocketUpgrade({\n request,\n socket,\n head,\n targetUrl,\n logger,\n logContext: { previewToken: token },\n proxyLabel: \"preview\",\n stripCookies: true,\n })\n}\n\nfunction proxyTargetWebSocketUpgrade(args: {\n request: import(\"http\").IncomingMessage\n socket: Socket\n head: Buffer\n targetUrl: URL\n logger: Logger\n logContext: Record<string, unknown>\n proxyLabel: string\n stripCookies?: boolean\n}) {\n const { request, socket, head, targetUrl, logger, logContext, proxyLabel, stripCookies } = args\n const { socket: upstream, readyEvent } = createSideCarUpstreamSocket(targetUrl)\n\n const closeBoth = () => {\n if (!socket.destroyed) {\n socket.destroy()\n }\n if (!upstream.destroyed) {\n upstream.destroy()\n }\n }\n\n upstream.once(\"error\", (error) => {\n logger.error({ ...logContext, err: error, targetUrl: targetUrl.toString() }, `Failed to proxy ${proxyLabel} websocket`)\n rejectUpgrade(socket, 502, \"Bad Gateway\")\n if (!upstream.destroyed) {\n upstream.destroy()\n }\n })\n\n socket.once(\"error\", (error) => {\n logger.debug({ ...logContext, err: error }, `${proxyLabel} websocket client socket errored`)\n if (!upstream.destroyed) {\n upstream.destroy()\n }\n })\n\n upstream.once(readyEvent, () => {\n try {\n upstream.write(buildSideCarWebSocketRequest(request, targetUrl, { stripCookies }))\n if (head.length > 0) {\n upstream.write(head)\n }\n upstream.pipe(socket)\n socket.pipe(upstream)\n } catch (error) {\n logger.error({ ...logContext, err: error, targetUrl: targetUrl.toString() }, `Failed to forward ${proxyLabel} websocket upgrade`)\n closeBoth()\n }\n })\n\n upstream.once(\"close\", () => {\n if (!socket.destroyed) {\n socket.end()\n }\n })\n\n socket.once(\"close\", () => {\n if (!upstream.destroyed) {\n upstream.end()\n }\n })\n}\n\nfunction createSideCarUpstreamSocket(targetUrl: URL): { socket: Socket | TLSSocket; readyEvent: \"connect\" | \"secureConnect\" } {\n const port = Number(targetUrl.port || (targetUrl.protocol === \"https:\" ? 443 : 80))\n if (targetUrl.protocol === \"https:\") {\n return {\n socket: connectTls({\n host: targetUrl.hostname,\n port,\n servername: targetUrl.hostname,\n }),\n readyEvent: \"secureConnect\",\n }\n }\n return {\n socket: connectTcp(port, targetUrl.hostname),\n readyEvent: \"connect\",\n }\n}\n\nfunction buildSideCarWebSocketRequest(\n request: import(\"http\").IncomingMessage,\n targetUrl: URL,\n options?: { stripCookies?: boolean },\n): string {\n const pathWithQuery = `${targetUrl.pathname}${targetUrl.search}`\n const requestLine = `${request.method ?? \"GET\"} ${pathWithQuery} HTTP/${request.httpVersion}\\r\\n`\n const headerLines: string[] = []\n const rawHeaders = request.rawHeaders ?? []\n const blockedHeaders = getBlockedSideCarRequestHeaders()\n\n for (let index = 0; index < rawHeaders.length; index += 2) {\n const key = rawHeaders[index]\n const value = rawHeaders[index + 1]\n if (!key || value === undefined) continue\n const lower = key.toLowerCase()\n if (blockedHeaders.has(lower)) continue\n if (options?.stripCookies && lower === \"cookie\") continue\n if (lower === \"origin\") {\n headerLines.push(`Origin: ${targetUrl.origin}\\r\\n`)\n continue\n }\n headerLines.push(`${key}: ${value}\\r\\n`)\n }\n\n const hostValue = targetUrl.port ? `${targetUrl.hostname}:${targetUrl.port}` : targetUrl.hostname\n headerLines.push(`Host: ${hostValue}\\r\\n`)\n headerLines.push(\"\\r\\n\")\n\n return requestLine + headerLines.join(\"\")\n}\n\nfunction isWebSocketUpgradeRequest(request: import(\"http\").IncomingMessage): boolean {\n const upgrade = request.headers.upgrade\n if (typeof upgrade !== \"string\" || upgrade.toLowerCase() !== \"websocket\") {\n return false\n }\n const connection = request.headers.connection\n const connectionValue = Array.isArray(connection) ? connection.join(\",\") : connection ?? \"\"\n return connectionValue.toLowerCase().split(\",\").map((part) => part.trim()).includes(\"upgrade\")\n}\n\nfunction rejectUpgrade(socket: Socket, statusCode: number, statusText: string) {\n if (socket.destroyed) {\n return\n }\n socket.write(`HTTP/1.1 ${statusCode} ${statusText}\\r\\nConnection: close\\r\\nContent-Length: 0\\r\\n\\r\\n`)\n socket.destroy()\n}\n\nfunction rewriteSideCarResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n sidecarId: string,\n targetOrigin: string,\n prefixMode: \"strip\" | \"preserve\",\n) {\n if (prefixMode === \"preserve\") {\n return headers\n }\n\n const next = { ...headers }\n const locationHeader = next.location\n const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader\n if (!location) {\n return next\n }\n\n const publicBase = `/sidecars/${encodeURIComponent(sidecarId)}`\n\n if (location.startsWith(\"/\")) {\n next.location = `${publicBase}${location}`\n return next\n }\n\n try {\n const parsed = new URL(location)\n if (parsed.origin === targetOrigin) {\n next.location = `${publicBase}${parsed.pathname}${parsed.search}${parsed.hash}`\n }\n } catch {\n // Relative redirects should continue to resolve against the public sidecar path.\n }\n\n return next\n}\n\nfunction rewritePreviewResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n token: string,\n targetOrigin: string,\n publicBase = `/previews/${encodeURIComponent(token)}`,\n) {\n const next = { ...headers }\n delete next[\"x-frame-options\"]\n delete next[\"content-security-policy\"]\n delete next[\"content-security-policy-report-only\"]\n delete next[\"set-cookie\"]\n delete next[\"set-cookie2\"]\n\n const locationHeader = next.location\n const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader\n if (!location) {\n return next\n }\n\n if (location.startsWith(\"//\")) {\n const parsed = new URL(location, targetOrigin)\n next.location = parsed.origin === targetOrigin\n ? `${publicBase}${parsed.pathname}${parsed.search}${parsed.hash}`\n : parsed.href\n return next\n }\n if (location.startsWith(\"/\")) {\n next.location = `${publicBase}${location}`\n return next\n }\n\n try {\n const parsed = new URL(location)\n if (parsed.origin === targetOrigin) {\n next.location = `${publicBase}${parsed.pathname}${parsed.search}${parsed.hash}`\n }\n } catch {\n // Relative redirects should continue to resolve against the current preview path.\n }\n\n return next\n}\n\nfunction sanitizeSideCarProxyRequestHeaders(\n headers: Record<string, string | string[] | undefined>,\n targetOrigin: string,\n): Record<string, string | string[] | undefined> {\n const blockedHeaders = getBlockedSideCarRequestHeaders()\n const next: Record<string, string | string[] | undefined> = {}\n\n for (const [key, value] of Object.entries(headers)) {\n if (!value) continue\n if (blockedHeaders.has(key.toLowerCase())) continue\n next[key] = value\n }\n\n next.origin = targetOrigin\n return next\n}\n\nfunction getBlockedSideCarRequestHeaders(): Set<string> {\n return new Set([\n \"host\",\n \"expect\",\n \"authorization\",\n \"proxy-authorization\",\n \"forwarded\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-port\",\n \"x-forwarded-proto\",\n ])\n}\n"]}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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","sourcesContent":["import Fastify, { type FastifyInstance, type FastifyReply, type FastifyRequest } from \"fastify\"\nimport cors from \"@fastify/cors\"\nimport fastifyStatic from \"@fastify/static\"\nimport replyFrom from \"@fastify/reply-from\"\nimport fs from \"fs\"\nimport { connect as connectTcp, type Socket } from \"net\"\nimport path from \"path\"\nimport type { Readable } from \"stream\"\nimport { connect as connectTls, type TLSSocket } from \"tls\"\nimport { fetch } from \"undici\"\nimport type { Logger } from \"../logger\"\nimport { WorkspaceManager } from \"../workspaces/manager\"\nimport { isInvalidRequestError, isPtyNotFoundError, isSessionNotFoundError, isShellNotFoundError, type LocationRef, type OpenCodeClient } from \"@opencode-ai/client\"\n\nimport type { SettingsService } from \"../settings/service\"\nimport { FileSystemBrowser } from \"../filesystem/browser\"\nimport { EventBus } from \"../events/bus\"\nimport { registerWorkspaceRoutes } from \"./routes/workspaces\"\nimport { registerSettingsRoutes } from \"./routes/settings\"\nimport { registerFilesystemRoutes } from \"./routes/filesystem\"\nimport { registerConfigFileRoutes } from \"./routes/config-files\"\nimport { registerMetaRoutes } from \"./routes/meta\"\nimport { registerEventRoutes } from \"./routes/events\"\nimport { registerStorageRoutes } from \"./routes/storage\"\nimport { registerYoloRoutes } from \"./routes/yolo\"\nimport { registerWorktreeRoutes } from \"./routes/worktrees\"\nimport { registerSpeechRoutes } from \"./routes/speech\"\nimport { registerOpenCodeUpdateRoutes } from \"./routes/opencode-update\"\nimport { registerRemoteServerRoutes } from \"./routes/remote-servers\"\nimport { registerRemoteProxyRoutes } from \"./routes/remote-proxy\"\nimport { registerSideCarRoutes } from \"./routes/sidecars\"\nimport { registerPreviewRoutes } from \"./routes/previews\"\nimport { registerUsageRoutes } from \"./routes/usage\"\nimport { ServerMeta } from \"../api-types\"\nimport { InstanceStore } from \"../storage/instance-store\"\nimport type { AutoAcceptManager } from \"../permissions/auto-accept-manager\"\nimport type { AuthManager } from \"../auth/manager\"\nimport { registerAuthRoutes } from \"./routes/auth\"\nimport { sendUnauthorized, wantsHtml } from \"../auth/http-auth\"\nimport type { SpeechService } from \"../speech/service\"\nimport { ClientConnectionManager } from \"../clients/connection-manager\"\nimport type { SideCarManager } from \"../sidecars/manager\"\nimport type { PreviewManager } from \"../previews/manager\"\nimport { buildPreviewRuntimeBridge, rewritePreviewImportMap, rewritePreviewJavaScriptImports } from \"../previews/runtime-bridge\"\nimport type { RemoteProxySessionManager } from \"./remote-proxy\"\nimport { createOpenCodeUpdateService } from \"../opencode-update/service\"\nimport { WorktreeDeletionFence } from \"../workspaces/worktree-session-evacuation\"\nimport type { NativeParent } from \"../native-parent\"\nimport { isAutomationPluginRequest, registerAutomationPluginRoute } from \"./routes/automation-plugin\"\nimport { DeveloperCdp } from \"../developer-cdp\"\n\ninterface HttpServerDeps {\n bindHost: string\n bindPort: number\n /** When bindPort is 0, try this first. */\n defaultPort: number\n protocol: \"http\" | \"https\"\n httpsOptions?: { key: string | Buffer; cert: string | Buffer; ca?: string | Buffer }\n workspaceManager: WorkspaceManager\n settings: SettingsService\n fileSystemBrowser: FileSystemBrowser\n eventBus: EventBus\n serverMeta: ServerMeta\n instanceStore: InstanceStore\n speechService: SpeechService\n sidecarManager: SideCarManager\n previewManager: PreviewManager\n authManager: AuthManager\n clientConnectionManager: ClientConnectionManager\n remoteProxySessionManager: RemoteProxySessionManager\n yoloManager: AutoAcceptManager\n uiStaticDir: string\n uiDevServerUrl?: string\n logger: Logger\n nativeParent: NativeParent\n automationBridgeToken: string\n}\n\ninterface HttpServerStartResult {\n port: number\n url: string\n displayHost: string\n}\n\nexport function shouldRetryPreferredPort(error: unknown, autoPortRequested: boolean, platform = process.platform): boolean {\n if (!autoPortRequested) return false\n const code = (error as NodeJS.ErrnoException | undefined)?.code\n return code === \"EADDRINUSE\" || (platform === \"win32\" && code === \"EACCES\")\n}\n\nexport function createHttpServer(deps: HttpServerDeps) {\n // Fastify's type-level RawServer inference gets noisy when toggling HTTP vs HTTPS.\n // We keep the runtime behavior correct and cast the instance to a generic FastifyInstance.\n const app = Fastify(\n ({\n logger: false,\n ...(deps.protocol === \"https\" && deps.httpsOptions ? { https: deps.httpsOptions } : {}),\n } as unknown) as any,\n ) as unknown as FastifyInstance\n const proxyLogger = deps.logger.child({ component: \"proxy\" })\n const apiLogger = deps.logger.child({ component: \"http\" })\n const sseLogger = deps.logger.child({ component: \"sse\" })\n\n const sseClients = new Set<() => void>()\n const registerSseClient = (cleanup: () => void) => {\n sseClients.add(cleanup)\n return () => sseClients.delete(cleanup)\n }\n const closeSseClients = () => {\n for (const cleanup of Array.from(sseClients)) {\n cleanup()\n }\n sseClients.clear()\n }\n\n app.addHook(\"onRequest\", (request, _reply, done) => {\n ;(request as FastifyRequest & { __logMeta?: { start: bigint } }).__logMeta = {\n start: process.hrtime.bigint(),\n }\n done()\n })\n\n app.addHook(\"onResponse\", (request, reply, done) => {\n const meta = (request as FastifyRequest & { __logMeta?: { start: bigint } }).__logMeta\n const durationMs = meta ? Number((process.hrtime.bigint() - meta.start) / BigInt(1_000_000)) : undefined\n const base = {\n method: request.method,\n url: request.url,\n status: reply.statusCode,\n durationMs,\n }\n apiLogger.debug(base, \"HTTP request completed\")\n if (apiLogger.isLevelEnabled(\"trace\")) {\n apiLogger.trace({\n ...base,\n params: redactSecrets(request.params),\n query: redactSecrets(request.query),\n body: typeof request.body === \"string\" ? \"<redacted>\" : redactSecrets(request.body),\n }, \"HTTP request payload\")\n }\n done()\n })\n\n const allowedDevOrigins = new Set([\"http://localhost:3000\", \"http://127.0.0.1:3000\"])\n const isLoopbackHost = (host: string) => host === \"127.0.0.1\" || host === \"::1\" || host.startsWith(\"127.\")\n\n const getSelfOrigins = (): Set<string> => {\n const origins = new Set<string>()\n const candidates: Array<string | undefined> = [deps.serverMeta.localUrl, deps.serverMeta.remoteUrl]\n for (const candidate of candidates) {\n if (!candidate) continue\n try {\n origins.add(new URL(candidate).origin)\n } catch {\n // ignore\n }\n }\n for (const addr of deps.serverMeta.addresses ?? []) {\n try {\n origins.add(new URL(addr.remoteUrl).origin)\n } catch {\n // ignore\n }\n }\n return origins\n }\n\n app.register(cors, {\n origin: (origin, cb) => {\n if (!origin) {\n cb(null, true)\n return\n }\n\n const selfOrigins = getSelfOrigins()\n if (selfOrigins.has(origin)) {\n cb(null, true)\n return\n }\n\n if (origin === \"null\") {\n cb(null, true)\n return\n }\n\n if (allowedDevOrigins.has(origin)) {\n cb(null, true)\n return\n }\n\n // When we bind to a non-loopback host (e.g., 0.0.0.0 or LAN IP), allow cross-origin UI access.\n if (deps.bindHost === \"0.0.0.0\" || !isLoopbackHost(deps.bindHost)) {\n cb(null, true)\n return\n }\n\n\n cb(null, false)\n },\n credentials: true,\n })\n\n app.register(replyFrom, {\n contentTypesToEncode: [],\n undici: {\n connections: 16,\n pipelining: 1,\n bodyTimeout: 0,\n headersTimeout: 0,\n },\n })\n\n registerAuthRoutes(app, { authManager: deps.authManager })\n\n app.addHook(\"preHandler\", (request, reply, done) => {\n const rawUrl = request.raw.url ?? request.url\n const pathname = (rawUrl.split(\"?\")[0] ?? \"\").trim()\n\n const publicApiPaths = new Set([\"/api/auth/login\", \"/api/auth/token\", \"/api/auth/status\", \"/api/auth/logout\"])\n const publicPagePaths = new Set([\"/login\"])\n if (deps.authManager.isTokenBootstrapEnabled()) {\n publicPagePaths.add(\"/auth/token\")\n }\n\n const isLoopbackRemoteProxyDelete =\n request.method === \"DELETE\" &&\n pathname.startsWith(\"/api/remote-proxy/sessions/\") &&\n deps.authManager.isLoopbackRequest(request)\n\n const encodedPreviewToken = pathname.match(/^\\/previews\\/([^/]+)(?:\\/|$)/)?.[1]\n const hostPreviewToken = parsePreviewCapabilityHost(request.headers.host)\n let isPreviewCapability = false\n if (hostPreviewToken) {\n isPreviewCapability = Boolean(deps.previewManager.get(hostPreviewToken))\n } else if (encodedPreviewToken) {\n try {\n isPreviewCapability = Boolean(deps.previewManager.get(decodeURIComponent(encodedPreviewToken)))\n } catch {\n // Malformed capability paths remain subject to normal authentication.\n }\n }\n\n if (request.headers.origin === \"null\" && !isPreviewCapability) {\n reply.code(403).send({ error: \"Opaque origins may access preview capabilities only\" })\n return\n }\n\n const isAutomationBridge = isAutomationPluginRequest(request, {\n authManager: deps.authManager,\n bridgeToken: deps.automationBridgeToken,\n })\n if (publicApiPaths.has(pathname) || publicPagePaths.has(pathname) || isLoopbackRemoteProxyDelete || isPreviewCapability || isAutomationBridge) {\n done()\n return\n }\n\n const session = deps.authManager.getSessionFromRequest(request)\n\n const requiresAuthForApi = pathname.startsWith(\"/api/\") || pathname.startsWith(\"/workspaces/\") || pathname.startsWith(\"/sidecars/\") || pathname.startsWith(\"/previews/\")\n if (requiresAuthForApi && !session) {\n sendUnauthorized(request, reply)\n return\n }\n\n if (!session && wantsHtml(request)) {\n reply.redirect(\"/login\")\n return\n }\n\n done()\n })\n\n app.get(\"/\", async (request, reply) => {\n const session = deps.authManager.getSessionFromRequest(request)\n if (!session) {\n reply.redirect(\"/login\")\n return\n }\n\n if (deps.uiDevServerUrl) {\n await proxyToDevServer(request, reply, deps.uiDevServerUrl)\n return\n }\n\n const uiDir = deps.uiStaticDir\n const indexPath = path.join(uiDir, \"index.html\")\n if (uiDir && fs.existsSync(indexPath)) {\n reply.type(\"text/html\").send(fs.readFileSync(indexPath, \"utf-8\"))\n return\n }\n\n reply.code(404).send({ message: \"UI bundle missing\" })\n })\n\n const worktreeDeletionFence = new WorktreeDeletionFence()\n registerWorkspaceRoutes(app, { workspaceManager: deps.workspaceManager, worktreeDeletionFence })\n registerSettingsRoutes(app, { settings: deps.settings, logger: apiLogger })\n registerOpenCodeUpdateRoutes(app, {\n service: createOpenCodeUpdateService(deps.settings, deps.workspaceManager),\n logger: apiLogger,\n })\n registerFilesystemRoutes(app, { fileSystemBrowser: deps.fileSystemBrowser })\n registerConfigFileRoutes(app)\n registerMetaRoutes(app, { serverMeta: deps.serverMeta })\n registerEventRoutes(app, {\n eventBus: deps.eventBus,\n registerClient: registerSseClient,\n logger: sseLogger,\n connectionManager: deps.clientConnectionManager,\n })\n registerWorktreeRoutes(app, { workspaceManager: deps.workspaceManager, worktreeDeletionFence })\n registerStorageRoutes(app, {\n instanceStore: deps.instanceStore,\n eventBus: deps.eventBus,\n workspaceManager: deps.workspaceManager,\n })\n registerRemoteServerRoutes(app, { logger: apiLogger })\n registerRemoteProxyRoutes(app, { logger: proxyLogger, sessionManager: deps.remoteProxySessionManager })\n registerSpeechRoutes(app, { speechService: deps.speechService })\n registerSideCarRoutes(app, { sidecarManager: deps.sidecarManager })\n registerPreviewRoutes(app, { previewManager: deps.previewManager })\n const developerCdp = new DeveloperCdp()\n registerAutomationPluginRoute(app, {\n authManager: deps.authManager,\n bridgeToken: deps.automationBridgeToken,\n nativeParent: deps.nativeParent,\n developerCdp,\n workspaceManager: deps.workspaceManager,\n })\n app.addHook(\"onClose\", async () => developerCdp.close())\n registerUsageRoutes(app)\n registerSideCarProxyRoutes(app, { sidecarManager: deps.sidecarManager, logger: proxyLogger })\n registerPreviewProxyRoutes(app, { previewManager: deps.previewManager, logger: proxyLogger })\n setupSideCarWebSocketProxy(app, {\n sidecarManager: deps.sidecarManager,\n authManager: deps.authManager,\n logger: proxyLogger,\n })\n setupPreviewWebSocketProxy(app, {\n previewManager: deps.previewManager,\n authManager: deps.authManager,\n logger: proxyLogger,\n })\n registerYoloRoutes(app, { yoloManager: deps.yoloManager })\n registerInstanceProxyRoutes(app, { workspaceManager: deps.workspaceManager, logger: proxyLogger, worktreeDeletionFence })\n\n\n if (deps.uiDevServerUrl) {\n setupDevProxy(app, deps.uiDevServerUrl, deps.authManager, deps.previewManager, proxyLogger)\n } else {\n setupStaticUi(app, deps.uiStaticDir, deps.authManager, deps.previewManager, proxyLogger)\n }\n\n return {\n instance: app,\n start: async (): Promise<HttpServerStartResult> => {\n const attemptListen = async (requestedPort: number) => {\n const addressInfo = await app.listen({ port: requestedPort, host: deps.bindHost })\n return { addressInfo, requestedPort }\n }\n\n const autoPortRequested = deps.bindPort === 0\n const primaryPort = autoPortRequested ? deps.defaultPort : deps.bindPort\n\n let listenResult\n\n try {\n listenResult = await attemptListen(primaryPort)\n } catch (error) {\n if (!shouldRetryPreferredPort(error, autoPortRequested)) {\n throw error\n }\n deps.logger.warn({ err: error, port: primaryPort }, \"Preferred port unavailable, retrying on ephemeral port\")\n listenResult = await attemptListen(0)\n }\n\n let actualPort = listenResult.requestedPort\n\n if (typeof listenResult.addressInfo === \"string\") {\n try {\n const parsed = new URL(listenResult.addressInfo)\n actualPort = Number(parsed.port) || listenResult.requestedPort\n } catch {\n actualPort = listenResult.requestedPort\n }\n } else {\n const address = app.server.address()\n if (typeof address === \"object\" && address) {\n actualPort = address.port\n }\n }\n\n const displayHost = deps.bindHost === \"127.0.0.1\" ? \"localhost\" : deps.bindHost\n const serverUrl = `${deps.protocol}://${displayHost}:${actualPort}`\n\n deps.logger.info({ port: actualPort, host: deps.bindHost, protocol: deps.protocol }, \"HTTP server listening\")\n\n return { port: actualPort, url: serverUrl, displayHost }\n },\n stop: () => {\n closeSseClients()\n return app.close()\n },\n }\n}\n\nexport interface InstanceProxyWorkspaceManager {\n get(id: string): ReturnType<WorkspaceManager[\"get\"]>\n getSharedServiceEndpoint(id: string): ReturnType<WorkspaceManager[\"getSharedServiceEndpoint\"]>\n invalidateSharedServiceConnection?(): void\n getInstanceAuthorizationHeader(id: string): string | undefined\n getServiceDirectory?(id: string): string | undefined\n getServiceDirectoryForPath?(id: string, directory: string): Promise<string | undefined>\n getWorktreeIdentityForPath(id: string, directory: string): Promise<string | undefined>\n getServicePathForPath?(id: string, candidate: string): Promise<string | undefined>\n getSharedServiceClient(): Promise<OpenCodeClient>\n ownsLocation(id: string, location: LocationRef): ReturnType<WorkspaceManager[\"ownsLocation\"]>\n ownsLocationWorkspace(id: string, workspaceID: string): ReturnType<WorkspaceManager[\"ownsLocationWorkspace\"]>\n ownsDirectory(id: string, directory: string): Promise<boolean>\n ownsPath(id: string, candidate: string): Promise<boolean>\n}\n\ninterface InstanceProxyDeps {\n workspaceManager: InstanceProxyWorkspaceManager\n logger: Logger\n worktreeDeletionFence: WorktreeDeletionFence\n}\n\ninterface SideCarProxyDeps {\n sidecarManager: SideCarManager\n logger: Logger\n}\n\ninterface SideCarWebSocketProxyDeps extends SideCarProxyDeps {\n authManager: AuthManager\n}\n\ninterface PreviewProxyDeps {\n previewManager: PreviewManager\n logger: Logger\n}\n\ninterface PreviewWebSocketProxyDeps extends PreviewProxyDeps {\n authManager: AuthManager\n}\n\nfunction registerSideCarProxyRoutes(app: FastifyInstance, deps: SideCarProxyDeps) {\n const proxyBaseHandler = async (\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n ) => {\n await proxySideCarRequest({\n request,\n reply,\n sidecarManager: deps.sidecarManager,\n logger: deps.logger,\n pathSuffix: \"\",\n })\n }\n\n const proxyWildcardHandler = async (\n request: FastifyRequest<{ Params: { id: string; \"*\": string } }>,\n reply: FastifyReply,\n ) => {\n await proxySideCarRequest({\n request,\n reply,\n sidecarManager: deps.sidecarManager,\n logger: deps.logger,\n pathSuffix: request.params[\"*\"] ?? \"\",\n })\n }\n\n app.all(\"/sidecars/:id\", proxyBaseHandler)\n app.all(\"/sidecars/:id/*\", proxyWildcardHandler)\n}\n\nfunction registerPreviewProxyRoutes(app: FastifyInstance, deps: PreviewProxyDeps) {\n app.register(async (previewApp) => {\n previewApp.removeAllContentTypeParsers()\n previewApp.addContentTypeParser(\"*\", (_request, body, done) => done(null, body))\n const capabilityHost = /^[0-9a-f-]{36}\\.preview\\.localhost(?::\\d+)?$/i\n const hostHandler = async (request: FastifyRequest, reply: FastifyReply) => {\n const token = parsePreviewCapabilityHost(request.headers.host)\n if (!token) return reply.code(404).send({ error: \"Preview not found\" })\n const pathname = (request.raw.url ?? request.url ?? \"/\").split(\"?\")[0] ?? \"/\"\n await proxyPreviewRequest({\n request,\n reply,\n previewManager: deps.previewManager,\n logger: deps.logger,\n token,\n publicBase: \"\",\n pathSuffix: pathname.replace(/^\\/+/, \"\"),\n })\n }\n\n previewApp.all(\"/\", { constraints: { host: capabilityHost } }, hostHandler)\n previewApp.all(\"/*\", { constraints: { host: capabilityHost } }, hostHandler)\n previewApp.all(\"/previews/:token\", async (request: FastifyRequest<{ Params: { token: string } }>, reply) => {\n await proxyPreviewRequest({ request, reply, previewManager: deps.previewManager, logger: deps.logger, pathSuffix: \"\" })\n })\n previewApp.all(\"/previews/:token/*\", async (request: FastifyRequest<{ Params: { token: string; \"*\": string } }>, reply) => {\n await proxyPreviewRequest({\n request,\n reply,\n previewManager: deps.previewManager,\n logger: deps.logger,\n pathSuffix: request.params[\"*\"] ?? \"\",\n })\n })\n })\n}\n\nfunction setupSideCarWebSocketProxy(app: FastifyInstance, deps: SideCarWebSocketProxyDeps) {\n app.server.on(\"upgrade\", (request, socket, head) => {\n if (parsePreviewCapabilityHost(request.headers.host)) return\n const rawUrl = request.url ?? \"/\"\n const parsed = parseSideCarUpgradePath(rawUrl)\n if (!parsed) {\n return\n }\n\n void proxySideCarWebSocketUpgrade({\n request,\n socket: socket as Socket,\n head,\n sidecarId: parsed.sidecarId,\n incomingPath: parsed.pathname,\n search: parsed.search,\n sidecarManager: deps.sidecarManager,\n authManager: deps.authManager,\n logger: deps.logger,\n })\n })\n}\n\nfunction setupPreviewWebSocketProxy(app: FastifyInstance, deps: PreviewWebSocketProxyDeps) {\n app.server.on(\"upgrade\", (request, socket, head) => {\n const rawUrl = request.url ?? \"/\"\n const capabilityToken = parsePreviewCapabilityHost(request.headers.host)\n let parsed = parsePreviewUpgradePath(rawUrl)\n if (capabilityToken) {\n try {\n const url = new URL(rawUrl, \"http://localhost\")\n parsed = { token: capabilityToken, pathname: url.pathname, search: url.search }\n } catch {\n rejectUpgrade(socket as Socket, 400, \"Bad Request\")\n return\n }\n }\n if (!parsed) {\n return\n }\n\n void proxyPreviewWebSocketUpgrade({\n request,\n socket: socket as Socket,\n head,\n token: parsed.token,\n incomingPath: parsed.pathname,\n search: parsed.search,\n previewManager: deps.previewManager,\n authManager: deps.authManager,\n logger: deps.logger,\n })\n })\n}\n\nexport function registerInstanceProxyRoutes(app: FastifyInstance, deps: InstanceProxyDeps) {\n app.register(async (instance) => {\n instance.removeAllContentTypeParsers()\n instance.addContentTypeParser(\"application/json\", { parseAs: \"string\" }, (_req, body, done) => {\n try {\n done(null, body.length ? JSON.parse(body.toString()) : {})\n } catch {\n done(Object.assign(new Error(\"Invalid JSON request body\"), { statusCode: 400 }), undefined)\n }\n })\n instance.addContentTypeParser(\"*\", (req, body, done) => done(null, body))\n\n const proxyBaseHandler = async (\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n ) => {\n await proxyWorkspaceRequest({\n request,\n reply,\n workspaceManager: deps.workspaceManager,\n worktreeDeletionFence: deps.worktreeDeletionFence,\n pathSuffix: \"\",\n logger: deps.logger,\n })\n }\n\n const proxyWildcardHandler = async (\n request: FastifyRequest<{ Params: { id: string; \"*\": string } }>,\n reply: FastifyReply,\n ) => {\n await proxyWorkspaceRequest({\n request,\n reply,\n workspaceManager: deps.workspaceManager,\n worktreeDeletionFence: deps.worktreeDeletionFence,\n pathSuffix: request.params[\"*\"] ?? \"\",\n logger: deps.logger,\n })\n }\n\n instance.all(\"/workspaces/:id/instance\", proxyBaseHandler)\n instance.all(\"/workspaces/:id/instance/*\", proxyWildcardHandler)\n })\n}\n\nasync function proxyWorkspaceRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n workspaceManager: InstanceProxyWorkspaceManager\n worktreeDeletionFence: WorktreeDeletionFence\n logger: Logger\n pathSuffix?: string\n}) {\n const { request, reply, workspaceManager, logger, worktreeDeletionFence } = args\n const workspaceId = (request.params as { id: string }).id\n const workspace = workspaceManager.get(workspaceId)\n\n if (!workspace) {\n reply.code(404).send({ error: \"Workspace not found\" })\n return\n }\n\n const rawInstancePath = (request.raw.url ?? \"\").split(\"?\", 1)[0]?.match(/\\/instance(?:\\/(.*))?$/)?.[1] ?? \"\"\n if (/\\\\|%2f|%5c/i.test(rawInstancePath) || hasDotSegment(rawInstancePath)) {\n reply.code(400).send({ error: \"Invalid workspace instance path\" })\n return\n }\n const routeUrl = buildInstanceTargetUrl(\"http://127.0.0.1\", args.pathSuffix)\n if (!routeUrl) {\n reply.code(400).send({ error: \"Invalid workspace instance path\" })\n return\n }\n const pathname = decodeURIComponent(routeUrl.pathname)\n if (!isAllowedInstanceApiRoute(request.method, pathname)) {\n reply.code(403).send({ error: \"OpenCode route is not available through a workspace\" })\n return\n }\n\n const endpoint = await workspaceManager.getSharedServiceEndpoint(workspaceId)\n if (!endpoint) {\n reply.code(502).send({ error: \"OpenCode service is not ready\" })\n return\n }\n\n const targetUrl = buildInstanceTargetUrl(endpoint.url, args.pathSuffix)\n if (!targetUrl) {\n reply.code(400).send({ error: \"Invalid workspace instance path\" })\n return\n }\n appendIncomingQuery(targetUrl, request.raw.url ?? \"\")\n if (pathname.replace(/\\/+$/, \"\") === \"/api/session/active\") {\n if (request.method !== \"GET\") {\n reply.code(405).send({ error: \"Method not allowed\" })\n return\n }\n const client = await workspaceManager.getSharedServiceClient()\n const active = await client.session.active()\n const entries = await Promise.all(Object.entries(active).map(async ([sessionId, status]) => {\n try {\n const session = await client.session.get({ sessionID: sessionId })\n return await workspaceManager.ownsDirectory(workspaceId, session.location.directory) ? [sessionId, status] as const : null\n } catch {\n return null\n }\n }))\n reply.send(Object.fromEntries(entries.filter((entry): entry is NonNullable<typeof entry> => entry !== null)))\n return\n }\n if (pathname.replace(/\\/+$/, \"\") === \"/api/project\") {\n const projects = await (await workspaceManager.getSharedServiceClient()).project.list()\n const ownedProjects = await Promise.all(projects.map(async (project) => {\n if (!await workspaceManager.ownsDirectory(workspaceId, project.canonical)) return null\n const sandboxes = (await Promise.all(project.sandboxes.map(async (directory) => (\n await workspaceManager.ownsDirectory(workspaceId, directory) ? directory : null\n )))).filter((directory): directory is string => directory !== null)\n return { ...project, sandboxes }\n }))\n reply.send(ownedProjects.filter((project): project is NonNullable<typeof project> => project !== null))\n return\n }\n const sessionListHasScope = request.method === \"GET\"\n && pathname.replace(/\\/+$/, \"\") === \"/api/session\"\n && (targetUrl.searchParams.has(\"cursor\") || targetUrl.searchParams.has(\"project\") || targetUrl.searchParams.has(\"workspace\"))\n const sessionListScope = await authorizeSessionList(targetUrl, request.method, workspaceManager, workspaceId)\n if (sessionListScope !== \"allowed\") {\n reply.code(sessionListScope === \"invalid\" ? 400 : 403).send({ error: \"Session list does not belong to workspace\" })\n return\n }\n const serviceDirectory = workspaceManager.getServiceDirectory?.(workspaceId) ?? workspace.path\n let globalFormLocation: LocationRef | undefined\n if (isGlobalFormAction(pathname, request.method)) {\n const directoryHeader = request.headers[\"x-opencode-directory\"]\n const workspaceHeader = request.headers[\"x-opencode-workspace\"]\n if (Array.isArray(directoryHeader) || Array.isArray(workspaceHeader)) {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n let directory: string | undefined\n if (directoryHeader !== undefined) {\n try {\n directory = decodeURIComponent(directoryHeader)\n } catch {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n if (!directory.trim()) {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n }\n if (workspaceHeader !== undefined && !workspaceHeader.trim()) {\n reply.code(400).send({ error: \"Invalid Form location\" })\n return\n }\n if (directory !== undefined || workspaceHeader !== undefined) {\n globalFormLocation = {\n directory: directory ?? workspace.path,\n ...(workspaceHeader ? { workspaceID: workspaceHeader } : {}),\n }\n }\n }\n const imported = prepareSessionImport(\n pathname,\n request.method,\n stripLocationSelectors(targetUrl, request.body, workspace.path, serviceDirectory),\n serviceDirectory,\n )\n const requestLocations = readRequestDirectories(targetUrl, imported.body, workspace.path)\n if (globalFormLocation) {\n requestLocations.directories.push(globalFormLocation.directory)\n requestLocations.locations.push(globalFormLocation)\n }\n requestLocations.directories.push(...imported.directories)\n requestLocations.locations.push(...imported.locations)\n requestLocations.invalid ||= imported.invalid\n readNativeCwd(targetUrl, imported.body, requestLocations)\n const promptFiles = readPromptFilePaths(pathname, request.method, imported.body)\n if (requestLocations.invalid\n || !(await allDirectoriesOwned(workspaceManager, workspaceId, requestLocations.directories))\n || !(await allLocationsOwned(workspaceManager, workspaceId, requestLocations.locations))) {\n reply.code(requestLocations.invalid ? 400 : 403).send({ error: \"Location does not belong to workspace\" })\n return\n }\n const translatedDirectories = new Map<string, string>()\n for (const directory of new Set(requestLocations.directories)) {\n const translated = workspaceManager.getServiceDirectoryForPath\n ? await workspaceManager.getServiceDirectoryForPath(workspaceId, directory)\n : directory\n if (!translated) {\n reply.code(403).send({ error: \"Location does not belong to workspace\" })\n return\n }\n translatedDirectories.set(directory, translated)\n }\n const mutationIdentities = new Set<string>()\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n for (const directory of requestLocations.directories) {\n const identity = await workspaceManager.getWorktreeIdentityForPath(workspaceId, directory)\n if (!identity) {\n reply.code(403).send({ error: \"Location does not belong to workspace\" })\n return\n }\n mutationIdentities.add(identity)\n }\n }\n const serviceBody = replaceRequestDirectories(targetUrl, imported.body, translatedDirectories, pathname, request.method)\n if (promptFiles.invalid || !(await allPathsOwned(workspaceManager, workspaceId, promptFiles.paths))) {\n reply.code(promptFiles.invalid ? 400 : 403).send({ error: \"Prompt file does not belong to workspace\" })\n return\n }\n const translatedPromptPaths = new Map<string, string>()\n for (const candidate of new Set(promptFiles.paths)) {\n const translated = workspaceManager.getServicePathForPath\n ? await workspaceManager.getServicePathForPath(workspaceId, candidate)\n : candidate\n if (!translated) {\n reply.code(403).send({ error: \"Prompt file does not belong to workspace\" })\n return\n }\n translatedPromptPaths.set(candidate, translated)\n }\n const promptBody = replacePromptFileUris(serviceBody, translatedPromptPaths)\n\n const requestedDirectory = requestLocations.directories[0]\n const runtimeLocation = { directory: requestedDirectory ? translatedDirectories.get(requestedDirectory) ?? serviceDirectory : serviceDirectory }\n if (pathname.replace(/\\/+$/, \"\") === \"/api/pty\" && request.method === \"GET\") {\n const result = await (await workspaceManager.getSharedServiceClient()).pty.list({ location: runtimeLocation })\n const ownership = await Promise.all(result.data.map((pty) => workspaceManager.ownsDirectory(workspaceId, pty.cwd)))\n reply.send({ ...result, data: result.data.filter((_, index) => ownership[index]) })\n return\n }\n\n const ptyId = getPtyRouteId(pathname)\n if (ptyId) {\n try {\n const pty = await (await workspaceManager.getSharedServiceClient()).pty.get({ ptyID: ptyId, location: runtimeLocation })\n if (!(await workspaceManager.ownsDirectory(workspaceId, pty.data.cwd))) {\n reply.code(403).send({ error: \"PTY does not belong to workspace\" })\n return\n }\n } catch (error) {\n if (isPtyNotFoundError(error)) {\n reply.code(404).send({ error: \"PTY not found\" })\n return\n }\n throw error\n }\n }\n\n if (pathname.replace(/\\/+$/, \"\") === \"/api/shell\" && request.method === \"GET\") {\n const result = await (await workspaceManager.getSharedServiceClient()).shell.list({ location: runtimeLocation })\n const ownership = await Promise.all(result.data.map((shell) => workspaceManager.ownsDirectory(workspaceId, shell.cwd)))\n reply.send({ ...result, data: result.data.filter((_, index) => ownership[index]) })\n return\n }\n\n const shellId = getShellRouteId(pathname)\n if (shellId) {\n try {\n const shell = await (await workspaceManager.getSharedServiceClient()).shell.get({ id: shellId, location: runtimeLocation })\n if (!(await workspaceManager.ownsDirectory(workspaceId, shell.data.cwd))) {\n reply.code(403).send({ error: \"Shell does not belong to workspace\" })\n return\n }\n } catch (error) {\n if (isShellNotFoundError(error)) {\n reply.code(404).send({ error: \"Shell not found\" })\n return\n }\n throw error\n }\n }\n\n const sessionId = getSessionRouteId(pathname)\n if (sessionId && !isGlobalFormAction(pathname, request.method)) {\n let session\n try {\n session = await (await workspaceManager.getSharedServiceClient()).session.get({ sessionID: sessionId })\n } catch (error) {\n if (isInvalidRequestError(error)) {\n reply.code(400).send({ error: \"Invalid session ID\" })\n return\n }\n if (isSessionNotFoundError(error)) {\n reply.code(404).send({ error: \"Session not found\" })\n return\n }\n throw error\n }\n if (!(await workspaceManager.ownsDirectory(workspaceId, session.location.directory))) {\n reply.code(403).send({ error: \"Session does not belong to workspace\" })\n return\n }\n const sessionWorktree = await workspaceManager.getWorktreeIdentityForPath(workspaceId, session.location.directory)\n if (!sessionWorktree) {\n reply.code(403).send({ error: \"Session does not belong to workspace\" })\n return\n }\n mutationIdentities.add(sessionWorktree)\n }\n\n const body = applyDefaultWorkspaceLocation(targetUrl, promptBody, request.method, serviceDirectory, requestLocations.directories.length > 0 || sessionListHasScope, Boolean(sessionId) && !isGlobalFormAction(pathname, request.method))\n const instanceAuthHeader = workspaceManager.getInstanceAuthorizationHeader(workspaceId)\n const releaseMutation = request.method === \"GET\" || request.method === \"HEAD\"\n ? undefined\n : worktreeDeletionFence.enter([...mutationIdentities])\n if (request.method !== \"GET\" && request.method !== \"HEAD\" && !releaseMutation) {\n reply.code(409).send({ error: \"Worktree deletion is in progress\" })\n return\n }\n logger.debug({ workspaceId, method: request.method, targetUrl: targetUrl.toString() }, \"Proxying request to instance\")\n\n try {\n return reply.from(targetUrl.toString(), {\n ...(body !== request.body ? { body } : {}),\n rewriteRequestHeaders: (_originalRequest, headers) => {\n const outgoingHeaders = sanitizeInstanceProxyRequestHeaders(headers, instanceAuthHeader)\n if (globalFormLocation) {\n outgoingHeaders[\"x-opencode-directory\"] = encodeURIComponent(translatedDirectories.get(globalFormLocation.directory)!)\n if (globalFormLocation.workspaceID) outgoingHeaders[\"x-opencode-workspace\"] = globalFormLocation.workspaceID\n }\n\n if (logger.isLevelEnabled(\"trace\")) {\n logger.trace(\n {\n workspaceId,\n method: request.method,\n targetUrl: targetUrl.toString(),\n contentType: request.headers[\"content-type\"],\n headers: redactSecrets(outgoingHeaders),\n },\n \"Proxy -> OpenCode request\",\n )\n }\n\n return outgoingHeaders\n },\n rewriteHeaders: sanitizeInstanceProxyResponseHeaders,\n onResponse: (_proxyRequest, proxyReply, upstreamResponse) => {\n if (proxyReply.statusCode === 401) {\n workspaceManager.invalidateSharedServiceConnection?.()\n }\n const upstream = upstreamResponse as typeof upstreamResponse & { readableEnded?: boolean; destroyed?: boolean }\n const release = () => releaseMutation?.()\n if (upstream.readableEnded || upstream.destroyed) release()\n else {\n upstream.once(\"end\", release)\n upstream.once(\"close\", release)\n upstream.once(\"error\", release)\n }\n proxyReply.send(upstream)\n },\n onError: (proxyReply, { error }) => {\n workspaceManager.invalidateSharedServiceConnection?.()\n releaseMutation?.()\n logger.error({ err: error, workspaceId, targetUrl: targetUrl.toString() }, \"Failed to proxy workspace request\")\n if (!proxyReply.sent) {\n proxyReply.code(502).send({ error: \"Workspace instance proxy failed\" })\n }\n },\n })\n } catch (error) {\n releaseMutation?.()\n throw error\n }\n}\n\nfunction appendIncomingQuery(targetUrl: URL, incomingUrl: string): URL {\n const queryIndex = incomingUrl.indexOf(\"?\")\n const incomingSearch = queryIndex >= 0 ? incomingUrl.slice(queryIndex + 1) : \"\"\n for (const [key, value] of new URLSearchParams(incomingSearch)) targetUrl.searchParams.append(key, value)\n return targetUrl\n}\n\nfunction readRequestDirectories(\n targetUrl: URL,\n body: unknown,\n defaultDirectory: string,\n): { directories: string[]; locations: LocationRef[]; invalid: boolean } {\n const directories: string[] = []\n const locations: LocationRef[] = []\n let invalid = false\n for (const key of [\"location[directory]\", \"directory\"]) {\n for (const value of targetUrl.searchParams.getAll(key)) {\n if (value.trim()) directories.push(value)\n else invalid = true\n }\n }\n const queryWorkspaces = targetUrl.searchParams.getAll(\"location[workspace]\")\n const queryDirectories = targetUrl.searchParams.getAll(\"location[directory]\")\n if (queryWorkspaces.length > 1 || queryDirectories.length > 1) invalid = true\n if (queryWorkspaces.length === 1) {\n const workspaceID = queryWorkspaces[0]\n if (!workspaceID.trim()) invalid = true\n else locations.push({ directory: queryDirectories[0] ?? defaultDirectory, workspaceID })\n }\n if (targetUrl.pathname.replace(/\\/+$/, \"\") !== \"/api/session\" && targetUrl.searchParams.has(\"workspace\")) invalid = true\n if (targetUrl.searchParams.has(\"workspaceID\") || targetUrl.searchParams.has(\"location[workspaceID]\")) invalid = true\n\n if (body && typeof body === \"object\" && !Array.isArray(body) && !Buffer.isBuffer(body)) {\n const input = body as Record<string, unknown>\n if (\"directory\" in input) {\n if (typeof input.directory === \"string\" && input.directory.trim()) directories.push(input.directory)\n else invalid = true\n }\n if (\"location\" in input) {\n const location = input.location\n if (location && typeof location === \"object\" && !Array.isArray(location)) {\n const source = location as Record<string, unknown>\n const directory = source.directory\n if (typeof directory === \"string\" && directory.trim()) directories.push(directory)\n else invalid = true\n if (source.workspace !== undefined) invalid = true\n if (source.workspaceID !== undefined) {\n if (typeof source.workspaceID === \"string\" && source.workspaceID.trim() && typeof directory === \"string\" && directory.trim()) {\n locations.push({ directory, workspaceID: source.workspaceID })\n } else invalid = true\n }\n } else if (location !== null && location !== undefined) {\n invalid = true\n }\n }\n if (/^\\/api\\/session\\/[^/]+\\/move\\/?$/.test(targetUrl.pathname) && \"workspaceID\" in input) {\n if (typeof input.workspaceID === \"string\" && input.workspaceID.trim() && typeof input.directory === \"string\" && input.directory.trim()) {\n locations.push({ directory: input.directory, workspaceID: input.workspaceID })\n } else invalid = true\n } else if (\"workspaceID\" in input) {\n invalid = true\n }\n }\n return { directories, locations, invalid }\n}\n\nfunction readNativeCwd(\n targetUrl: URL,\n body: unknown,\n locations: { directories: string[]; locations: LocationRef[]; invalid: boolean },\n) {\n if (!/^\\/api\\/(?:shell|pty)\\/?$/.test(targetUrl.pathname) || !body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return\n const input = body as Record<string, unknown>\n if (!(\"cwd\" in input)) return\n if (typeof input.cwd === \"string\" && input.cwd.trim()) locations.directories.push(input.cwd)\n else locations.invalid = true\n}\n\nfunction sanitizeInstanceProxyRequestHeaders(\n headers: Record<string, string | string[] | undefined>,\n authorization: string | undefined,\n) {\n const blocked = new Set([\n \"authorization\", \"connection\", \"cookie\", \"forwarded\", \"host\", \"keep-alive\", \"proxy-authenticate\",\n \"proxy-authorization\", \"proxy-connection\", \"set-cookie\", \"te\", \"trailer\", \"transfer-encoding\", \"upgrade\",\n \"x-forwarded-for\", \"x-forwarded-host\", \"x-forwarded-port\", \"x-forwarded-proto\",\n ])\n const connection = headers.connection\n for (const name of (Array.isArray(connection) ? connection.join(\",\") : connection ?? \"\").split(\",\")) blocked.add(name.trim().toLowerCase())\n\n const result: Record<string, string | string[] | undefined> = {}\n for (const [key, value] of Object.entries(headers)) {\n const normalized = key.toLowerCase()\n if (!blocked.has(normalized) && !normalized.startsWith(\"x-opencode-\")) result[key] = value\n }\n if (authorization) result.authorization = authorization\n return result\n}\n\nfunction sanitizeInstanceProxyResponseHeaders(headers: Record<string, string | string[] | undefined>) {\n const blocked = new Set([\"proxy-authenticate\", \"set-cookie\", \"set-cookie2\", \"www-authenticate\"])\n return Object.fromEntries(Object.entries(headers).filter(([key]) => !blocked.has(key.toLowerCase())))\n}\n\nexport function redactSecrets(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (Array.isArray(value)) return value.map(redactSecrets)\n if (typeof value !== \"object\") return value\n if (Buffer.isBuffer(value)) return \"<redacted>\"\n if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) return \"<redacted>\"\n return Object.fromEntries(Object.entries(value).map(([key, entry]) => [\n key,\n /(authorization|cookie|key|code|token|password|secret)/i.test(key) ? \"<redacted>\" : redactSecrets(entry),\n ]))\n}\n\nasync function allDirectoriesOwned(manager: InstanceProxyWorkspaceManager, workspaceId: string, directories: string[]) {\n return (await Promise.all(directories.map((directory) => manager.ownsDirectory(workspaceId, directory)))).every(Boolean)\n}\n\nasync function allLocationsOwned(manager: InstanceProxyWorkspaceManager, workspaceId: string, locations: LocationRef[]) {\n const unique = new Map(locations.map((location) => [`${location.directory}\\0${location.workspaceID ?? \"\"}`, location]))\n return (await Promise.all([...unique.values()].map((location) => manager.ownsLocation(workspaceId, location)))).every(Boolean)\n}\n\nasync function allPathsOwned(manager: InstanceProxyWorkspaceManager, workspaceId: string, paths: string[]) {\n return (await Promise.all(paths.map((candidate) => manager.ownsPath(workspaceId, candidate)))).every(Boolean)\n}\n\nfunction applyDefaultWorkspaceLocation(\n targetUrl: URL,\n body: unknown,\n method: string,\n directory: string,\n hasLocation: boolean,\n sessionRoute: boolean,\n): unknown {\n if (hasLocation || sessionRoute) return body\n if (targetUrl.pathname === \"/api/session\" && method === \"GET\") {\n targetUrl.searchParams.set(\"directory\", directory)\n return body\n }\n if (targetUrl.pathname === \"/api/session\" && method === \"POST\") {\n const input = body && typeof body === \"object\" && !Array.isArray(body) && !Buffer.isBuffer(body)\n ? body as Record<string, unknown>\n : {}\n return { ...input, location: { directory } }\n }\n targetUrl.searchParams.set(\"location[directory]\", directory)\n return body\n}\n\nfunction getSessionRouteId(pathname: string): string | null {\n const match = pathname.match(/^\\/api\\/(?:experimental\\/)?session\\/([^/]+)(?:\\/|$)/)\n if (!match || match[1] === \"active\" || match[1] === \"import\") return null\n return match[1]\n}\n\nfunction isGlobalFormAction(pathname: string, method: string): boolean {\n return method === \"POST\" && /^\\/api\\/session\\/global\\/form\\/[^/]+\\/(?:reply|cancel)\\/?$/.test(pathname)\n}\n\nasync function authorizeSessionList(\n targetUrl: URL,\n method: string,\n manager: InstanceProxyWorkspaceManager,\n workspaceId: string,\n): Promise<\"allowed\" | \"invalid\" | \"foreign\"> {\n if (method !== \"GET\" || targetUrl.pathname.replace(/\\/+$/, \"\") !== \"/api/session\") return \"allowed\"\n const cursors = targetUrl.searchParams.getAll(\"cursor\")\n if (cursors.length > 1) return \"invalid\"\n if (cursors.length === 1) {\n const scope = decodeSessionListCursor(cursors[0])\n if (!scope) return \"invalid\"\n for (const key of [\"directory\", \"workspace\", \"location[directory]\", \"location[workspace]\", \"project\", \"subpath\"]) {\n targetUrl.searchParams.delete(key)\n }\n return ownsSessionListScope(manager, workspaceId, scope)\n }\n\n const projects = targetUrl.searchParams.getAll(\"project\")\n const subpaths = targetUrl.searchParams.getAll(\"subpath\")\n const workspaces = targetUrl.searchParams.getAll(\"workspace\")\n const directories = targetUrl.searchParams.getAll(\"directory\")\n if (projects.length > 1 || subpaths.length > 1 || workspaces.length > 1 || directories.length > 1\n || (subpaths.length && !projects.length)) return \"invalid\"\n const workspace = workspaces[0]\n const directory = directories[0]\n if ((workspace !== undefined && !workspace.trim()) || (directory !== undefined && !directory.trim())) return \"invalid\"\n if (!projects.length) {\n if (workspace && directory) return ownsSessionListScope(manager, workspaceId, { workspace, directory })\n if (workspace) return ownsSessionListScope(manager, workspaceId, { workspace })\n return \"allowed\"\n }\n const project = projects[0]\n const subpath = subpaths[0]\n if (!project || (subpath !== undefined && !isSafeRelativePath(subpath))) return \"invalid\"\n return ownsSessionListScope(manager, workspaceId, { ...(workspace ? { workspace } : {}), project, subpath })\n}\n\ntype SessionListScope = {\n workspace?: string\n directory?: string\n project?: string\n subpath?: string\n}\n\nfunction decodeSessionListCursor(cursor: string): SessionListScope | null {\n if (!cursor || !/^[A-Za-z0-9_-]+$/.test(cursor)) return null\n try {\n const value = JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf8\")) as Record<string, unknown>\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null\n const anchor = value.anchor as Record<string, unknown> | undefined\n if (!anchor || typeof anchor !== \"object\" || Array.isArray(anchor)\n || typeof anchor.id !== \"string\" || !anchor.id\n || typeof anchor.time !== \"number\" || !Number.isFinite(anchor.time)\n || (anchor.direction !== \"previous\" && anchor.direction !== \"next\")) return null\n if (value.workspace !== undefined && (typeof value.workspace !== \"string\" || !value.workspace.trim())) return null\n if (value.search !== undefined && typeof value.search !== \"string\") return null\n if (value.order !== undefined && value.order !== \"asc\" && value.order !== \"desc\") return null\n if (typeof value.directory === \"string\" && value.directory.trim() && value.project === undefined && value.subpath === undefined) {\n return { ...(typeof value.workspace === \"string\" ? { workspace: value.workspace } : {}), directory: value.directory }\n }\n if (typeof value.project === \"string\" && value.project.trim() && value.directory === undefined) {\n if (value.subpath === undefined) {\n return { ...(typeof value.workspace === \"string\" ? { workspace: value.workspace } : {}), project: value.project }\n }\n if (typeof value.subpath === \"string\" && isSafeRelativePath(value.subpath)) {\n return { ...(typeof value.workspace === \"string\" ? { workspace: value.workspace } : {}), project: value.project, subpath: value.subpath }\n }\n }\n if (typeof value.workspace === \"string\" && value.directory === undefined && value.project === undefined && value.subpath === undefined) {\n return { workspace: value.workspace }\n }\n return null\n } catch {\n return null\n }\n}\n\nfunction isSafeRelativePath(value: string): boolean {\n return value === \"\" || (!path.posix.isAbsolute(value) && !path.win32.isAbsolute(value) && !value.split(/[\\\\/]/).includes(\"..\"))\n}\n\nasync function ownsSessionListScope(\n manager: InstanceProxyWorkspaceManager,\n workspaceId: string,\n scope: SessionListScope,\n): Promise<\"allowed\" | \"foreign\"> {\n if (scope.directory) {\n const owned = scope.workspace\n ? await manager.ownsLocation(workspaceId, { directory: scope.directory, workspaceID: scope.workspace })\n : await manager.ownsDirectory(workspaceId, scope.directory)\n return owned ? \"allowed\" : \"foreign\"\n }\n if (!scope.project) return scope.workspace && await manager.ownsLocationWorkspace(workspaceId, scope.workspace) ? \"allowed\" : \"foreign\"\n const project = (await (await manager.getSharedServiceClient()).project.list()).find((candidate) => candidate.id === scope.project)\n if (!project) return \"foreign\"\n const directory = scope.subpath === undefined\n ? project.canonical\n : /^[A-Za-z]:[\\\\/]|^\\\\\\\\/.test(project.canonical)\n ? path.win32.resolve(project.canonical, scope.subpath)\n : path.posix.resolve(project.canonical, scope.subpath)\n const owned = scope.workspace\n ? await manager.ownsLocation(workspaceId, { directory, workspaceID: scope.workspace })\n : await manager.ownsDirectory(workspaceId, directory)\n return owned ? \"allowed\" : \"foreign\"\n}\n\nfunction getPtyRouteId(pathname: string): string | null {\n return pathname.replace(/\\/+$/, \"\").match(/^\\/api\\/pty\\/([^/]+)$/)?.[1] ?? null\n}\n\nfunction getShellRouteId(pathname: string): string | null {\n return pathname.replace(/\\/+$/, \"\").match(/^\\/api\\/shell\\/([^/]+)(?:\\/output|\\/timeout)?$/)?.[1] ?? null\n}\n\nfunction buildInstanceTargetUrl(endpoint: string, pathSuffix: string | undefined): URL | null {\n const suffix = pathSuffix ?? \"\"\n if (/\\\\|%2f|%5c/i.test(suffix) || hasDotSegment(suffix)) return null\n const targetUrl = new URL(endpoint)\n const origin = targetUrl.origin\n targetUrl.pathname = normalizeInstanceSuffix(suffix).split(\"/\").map(encodeURIComponent).join(\"/\")\n targetUrl.search = \"\"\n targetUrl.hash = \"\"\n return targetUrl.origin === origin ? targetUrl : null\n}\n\nfunction hasDotSegment(value: string): boolean {\n return value.split(\"/\").some((segment) => {\n let decoded = segment\n for (let depth = 0; depth < 3; depth++) {\n if (decoded === \".\" || decoded === \"..\") return true\n try {\n const next = decodeURIComponent(decoded)\n if (next === decoded) break\n decoded = next\n } catch {\n break\n }\n }\n return decoded === \".\" || decoded === \"..\"\n })\n}\n\nfunction isAllowedInstanceApiRoute(method: string, pathname: string): boolean {\n const route = pathname.replace(/\\/+$/, \"\")\n const allowed: Array<[string, RegExp]> = [\n [\"GET\", /^\\/api\\/(?:agent|command|config|integration|location|mcp|model|plugin|provider|reference|skill)$/],\n [\"GET\", /^\\/api\\/(?:mcp\\/resource|websearch\\/provider)$/],\n [\"GET\", /^\\/api\\/agent\\/[^/]+$/],\n [\"GET\", /^\\/api\\/model\\/default$/],\n [\"GET\", /^\\/api\\/(?:permission|question)\\/request$/],\n [\"GET\", /^\\/api\\/form\\/request$/],\n [\"GET\", /^\\/api\\/project\\/current$/],\n [\"GET\", /^\\/api\\/project$/],\n [\"GET\", /^\\/api\\/vcs(?:\\/status)?$/],\n [\"GET\", /^\\/api\\/fs\\/(?:list|read\\/.+)$/],\n [\"GET\", /^\\/api\\/(?:pty|shell)(?:\\/[^/]+(?:\\/output)?)?$/],\n [\"POST\", /^\\/api\\/(?:pty|shell)$/],\n [\"PUT\", /^\\/api\\/pty\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/pty\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/shell\\/[^/]+$/],\n [\"PATCH\", /^\\/api\\/shell\\/[^/]+\\/timeout$/],\n [\"POST\", /^\\/api\\/mcp\\/[^/]+\\/(?:connect|disconnect)$/],\n [\"DELETE\", /^\\/api\\/credential\\/[^/]+$/],\n [\"POST\", /^\\/api\\/integration\\/[^/]+\\/connect\\/(?:key|oauth|command)$/],\n [\"GET\", /^\\/api\\/integration\\/[^/]+\\/connect\\/(?:oauth|command)\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/integration\\/[^/]+\\/connect\\/(?:oauth|command)\\/[^/]+$/],\n [\"POST\", /^\\/api\\/integration\\/[^/]+\\/connect\\/oauth\\/[^/]+\\/complete$/],\n [\"GET\", /^\\/api\\/session(?:\\/active)?$/],\n [\"POST\", /^\\/api\\/session(?:\\/import)?$/],\n [\"GET\", /^\\/api\\/session\\/[^/]+(?:\\/message(?:\\/[^/]+)?)?$/],\n [\"PATCH\", /^\\/api\\/session\\/[^/]+\\/message\\/[^/]+$/],\n [\"GET\", /^\\/api\\/session\\/[^/]+\\/inbox$/],\n [\"GET\", /^\\/api\\/session\\/[^/]+\\/(?:permission|form)$/],\n [\"DELETE\", /^\\/api\\/session\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/session\\/[^/]+\\/inbox\\/[^/]+$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/(?:agent|model|rename|move|prompt|command|shell|compact|interrupt|wait|background|fork)$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/inbox\\/[^/]+\\/(?:steer|queue)$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/revert\\/(?:stage|clear)$/],\n [\"PUT\", /^\\/api\\/session\\/[^/]+\\/instructions\\/entries\\/[^/]+$/],\n [\"DELETE\", /^\\/api\\/session\\/[^/]+\\/instructions\\/entries\\/[^/]+$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/permission\\/[^/]+\\/reply$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/question\\/[^/]+\\/(?:reply|reject)$/],\n [\"POST\", /^\\/api\\/session\\/[^/]+\\/form\\/[^/]+\\/(?:reply|cancel)$/],\n [\"GET\", /^\\/api\\/experimental\\/session\\/[^/]+\\/log$/],\n ]\n return allowed.some(([allowedMethod, pattern]) => method === allowedMethod && pattern.test(route))\n}\n\nfunction replaceRequestDirectories(\n targetUrl: URL,\n body: unknown,\n replacements: ReadonlyMap<string, string>,\n pathname: string,\n method: string,\n): unknown {\n for (const key of [\"directory\", \"location[directory]\"]) {\n const values = targetUrl.searchParams.getAll(key)\n if (!values.some((value) => replacements.has(value))) continue\n targetUrl.searchParams.delete(key)\n for (const value of values) targetUrl.searchParams.append(key, replacements.get(value) ?? value)\n }\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return body\n const replaceLocation = (value: unknown): unknown => {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) return value\n const location = value as Record<string, unknown>\n return typeof location.directory === \"string\" && replacements.has(location.directory)\n ? { ...location, directory: replacements.get(location.directory) }\n : value\n }\n const input = { ...(body as Record<string, unknown>) }\n for (const key of [\"directory\", \"cwd\"]) {\n const value = input[key]\n if (typeof value === \"string\" && replacements.has(value)) input[key] = replacements.get(value)\n }\n input.location = replaceLocation(input.location)\n if (pathname !== \"/api/session/import\" || method !== \"POST\") return input\n input.info = input.info && typeof input.info === \"object\" && !Array.isArray(input.info) && !Buffer.isBuffer(input.info)\n ? { ...(input.info as Record<string, unknown>), location: replaceLocation((input.info as Record<string, unknown>).location) }\n : input.info\n if (Array.isArray(input.messages)) {\n input.messages = input.messages.map((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) return value\n const message = value as Record<string, unknown>\n if (message.type !== \"location-switched\") return value\n const next: Record<string, unknown> = { ...message, location: replaceLocation(message.location) }\n if (message.previous && typeof message.previous === \"object\" && !Array.isArray(message.previous) && !Buffer.isBuffer(message.previous)) {\n next.previous = {\n ...(message.previous as Record<string, unknown>),\n location: replaceLocation((message.previous as Record<string, unknown>).location),\n }\n }\n return next\n })\n }\n return input\n}\n\nfunction stripLocationSelectors(targetUrl: URL, body: unknown, workspaceDirectory: string, serviceDirectory: string): unknown {\n for (const key of [\"directory\", \"location[directory]\"]) {\n const values = targetUrl.searchParams.getAll(key)\n if (values.includes(workspaceDirectory)) {\n targetUrl.searchParams.delete(key)\n for (const value of values) targetUrl.searchParams.append(key, value === workspaceDirectory ? serviceDirectory : value)\n }\n }\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return body\n const input = body as Record<string, unknown>\n const canonicalInput = { ...input }\n for (const key of [\"directory\", \"cwd\"]) {\n if (canonicalInput[key] === workspaceDirectory) canonicalInput[key] = serviceDirectory\n }\n const location = input.location\n if (!location || typeof location !== \"object\" || Array.isArray(location) || Buffer.isBuffer(location)) return canonicalInput\n const canonicalLocation = { ...(location as Record<string, unknown>) }\n if (canonicalLocation.directory === workspaceDirectory) canonicalLocation.directory = serviceDirectory\n return { ...canonicalInput, location: canonicalLocation }\n}\n\nfunction readPromptFilePaths(pathname: string, method: string, body: unknown) {\n const result = { paths: [] as string[], invalid: false }\n if (method !== \"POST\" || !/^\\/api\\/session\\/[^/]+\\/(?:prompt|command)\\/?$/.test(pathname)) return result\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return result\n const files = (body as Record<string, unknown>).files\n if (files === undefined) return result\n if (!Array.isArray(files)) return { paths: [], invalid: true }\n\n for (const file of files) {\n if (!file || typeof file !== \"object\" || Array.isArray(file) || Buffer.isBuffer(file)) {\n result.invalid = true\n continue\n }\n const uri = (file as Record<string, unknown>).uri\n if (typeof uri !== \"string\" || !uri.trim()) {\n result.invalid = true\n continue\n }\n const parsed = parsePromptFileUri(uri)\n if (parsed.invalid) result.invalid = true\n else if (parsed.path) result.paths.push(parsed.path)\n }\n return result\n}\n\nfunction parsePromptFileUri(value: string): { path?: string; invalid: boolean } {\n if (path.isAbsolute(value) || path.win32.isAbsolute(value)) return { path: value, invalid: value.includes(\"\\0\") }\n let uri: URL\n try {\n uri = new URL(value)\n } catch {\n return { invalid: true }\n }\n if ([\"data:\", \"http:\", \"https:\"].includes(uri.protocol)) return { invalid: false }\n if (uri.protocol !== \"file:\" || (uri.hostname && uri.hostname !== \"localhost\") || uri.search || uri.hash || /%2f|%5c/i.test(uri.pathname)) {\n return { invalid: true }\n }\n try {\n const decoded = decodeURIComponent(uri.pathname)\n const localPath = /^\\/[A-Za-z]:\\//.test(decoded) ? decoded.slice(1) : decoded\n return { path: localPath, invalid: !localPath || localPath.includes(\"\\0\") }\n } catch {\n return { invalid: true }\n }\n}\n\nfunction replacePromptFileUris(body: unknown, replacements: ReadonlyMap<string, string>): unknown {\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) return body\n const input = body as Record<string, unknown>\n if (!Array.isArray(input.files)) return body\n return {\n ...input,\n files: input.files.map((file) => {\n if (!file || typeof file !== \"object\" || Array.isArray(file) || Buffer.isBuffer(file)) return file\n const source = file as Record<string, unknown>\n if (typeof source.uri !== \"string\" || !/^file:/i.test(source.uri)) return file\n const parsed = parsePromptFileUri(source.uri)\n const translated = parsed.path ? replacements.get(parsed.path) : undefined\n if (!translated || translated === parsed.path) return file\n const uri = new URL(\"file:///\")\n uri.pathname = translated.replace(/\\\\/g, \"/\")\n return { ...source, uri: uri.href }\n }),\n }\n}\n\nfunction prepareSessionImport(pathname: string, method: string, body: unknown, directory: string) {\n const result = { body, directories: [] as string[], locations: [] as LocationRef[], invalid: false }\n if (pathname !== \"/api/session/import\" || method !== \"POST\") return result\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Buffer.isBuffer(body)) {\n result.invalid = true\n return result\n }\n\n const input = body as Record<string, unknown>\n const addLocation = (owner: Record<string, unknown>, key: string) => {\n const value = owner[key]\n if (value === null || value === undefined) {\n owner[key] = { directory }\n result.directories.push(directory)\n return\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) {\n result.invalid = true\n return\n }\n const location = value as Record<string, unknown>\n if (location.directory === null || location.directory === undefined) location.directory = directory\n if (typeof location.directory !== \"string\" || !location.directory.trim()) {\n result.invalid = true\n return\n }\n result.directories.push(location.directory)\n if (location.workspace !== undefined) result.invalid = true\n if (location.workspaceID !== undefined) {\n if (typeof location.workspaceID === \"string\" && location.workspaceID.trim()) {\n result.locations.push({ directory: location.directory, workspaceID: location.workspaceID })\n } else result.invalid = true\n }\n }\n\n addLocation(input, \"location\")\n if (input.info && typeof input.info === \"object\" && !Array.isArray(input.info) && !Buffer.isBuffer(input.info)) {\n addLocation(input.info as Record<string, unknown>, \"location\")\n }\n\n if (Array.isArray(input.messages)) {\n for (const value of input.messages) {\n if (!value || typeof value !== \"object\" || Array.isArray(value) || Buffer.isBuffer(value)) continue\n const message = value as Record<string, unknown>\n if (message.type !== \"location-switched\") continue\n addLocation(message, \"location\")\n if (message.previous && typeof message.previous === \"object\" && !Array.isArray(message.previous) && !Buffer.isBuffer(message.previous)) {\n addLocation(message.previous as Record<string, unknown>, \"location\")\n }\n }\n }\n return result\n}\n\nfunction normalizeInstanceSuffix(pathSuffix: string | undefined) {\n if (!pathSuffix || pathSuffix === \"/\") {\n return \"/\"\n }\n const trimmed = pathSuffix.replace(/^\\/+/, \"\")\n return trimmed.length === 0 ? \"/\" : `/${trimmed}`\n}\n\nfunction setupStaticUi(\n app: FastifyInstance,\n uiDir: string,\n authManager: AuthManager,\n previewManager: PreviewManager,\n logger: Logger,\n) {\n if (!uiDir) {\n app.log.warn(\"UI static directory not provided; API endpoints only\")\n return\n }\n\n if (!fs.existsSync(uiDir)) {\n app.log.warn({ uiDir }, \"UI static directory missing; API endpoints only\")\n return\n }\n\n app.addHook(\"preHandler\", (request, reply, done) => {\n const session = authManager.getSessionFromRequest(request)\n if (session && proxyPreviewFallbackFromReferer(request, reply, previewManager, logger)) {\n return\n }\n done()\n })\n\n app.register(fastifyStatic, {\n root: uiDir,\n prefix: \"/\",\n decorateReply: false,\n })\n\n const indexPath = path.join(uiDir, \"index.html\")\n\n app.setNotFoundHandler((request: FastifyRequest, reply: FastifyReply) => {\n const url = request.raw.url ?? \"\"\n if (isApiRequest(url)) {\n reply.code(404).send({ message: \"Not Found\" })\n return\n }\n\n const session = authManager.getSessionFromRequest(request)\n if (session && proxyPreviewFallbackFromReferer(request, reply, previewManager, logger)) {\n return\n }\n\n if (!session && wantsHtml(request)) {\n reply.redirect(\"/login\")\n return\n }\n\n if (fs.existsSync(indexPath)) {\n reply.type(\"text/html\").send(fs.readFileSync(indexPath, \"utf-8\"))\n } else {\n reply.code(404).send({ message: \"UI bundle missing\" })\n }\n })\n}\n\nfunction setupDevProxy(\n app: FastifyInstance,\n upstreamBase: string,\n authManager: AuthManager,\n previewManager: PreviewManager,\n logger: Logger,\n) {\n app.log.info({ upstreamBase }, \"Proxying UI requests to development server\")\n app.setNotFoundHandler((request: FastifyRequest, reply: FastifyReply) => {\n const url = request.raw.url ?? \"\"\n if (isApiRequest(url)) {\n reply.code(404).send({ message: \"Not Found\" })\n return\n }\n\n const session = authManager.getSessionFromRequest(request)\n if (session && proxyPreviewFallbackFromReferer(request, reply, previewManager, logger)) {\n return\n }\n\n if (!session && wantsHtml(request)) {\n reply.redirect(\"/login\")\n return\n }\n\n void proxyToDevServer(request, reply, upstreamBase)\n })\n}\n\nfunction proxyPreviewFallbackFromReferer(\n request: FastifyRequest,\n reply: FastifyReply,\n previewManager: PreviewManager,\n logger: Logger,\n): boolean {\n const rawUrl = request.raw.url ?? request.url ?? \"\"\n const pathname = rawUrl.split(\"?\")[0] ?? \"\"\n if (!isPreviewFallbackPath(pathname)) {\n return false\n }\n\n const refererHeader = request.headers.referer ?? request.headers.referrer\n const referer = Array.isArray(refererHeader) ? refererHeader[0] : refererHeader\n if (!referer) {\n return false\n }\n\n const parsed = parsePreviewUpgradePath(referer)\n if (!parsed) {\n return false\n }\n\n void proxyPreviewAssetRequest({\n request,\n reply,\n previewManager,\n logger,\n token: parsed.token,\n })\n return true\n}\n\nfunction isPreviewFallbackPath(pathname: string): boolean {\n if (!pathname || pathname === \"/\") return false\n if (pathname.startsWith(\"/api/\") || pathname === \"/api\") return false\n if (pathname.startsWith(\"/workspaces/\")) return false\n if (pathname.startsWith(\"/sidecars/\")) return false\n if (pathname.startsWith(\"/previews/\")) return false\n if (pathname.startsWith(\"/auth/\") || pathname === \"/login\") return false\n return true\n}\n\nasync function proxyToDevServer(request: FastifyRequest, reply: FastifyReply, upstreamBase: string) {\n try {\n const targetUrl = new URL(request.raw.url ?? \"/\", upstreamBase)\n const response = await fetch(targetUrl, {\n method: request.method,\n headers: buildProxyHeaders(request.headers),\n })\n\n response.headers.forEach((value, key) => {\n reply.header(key, value)\n })\n\n reply.code(response.status)\n\n if (!response.body || request.method === \"HEAD\") {\n reply.send()\n return\n }\n\n const buffer = Buffer.from(await response.arrayBuffer())\n reply.send(buffer)\n } catch (error) {\n request.log.error({ err: error }, \"Failed to proxy UI request to dev server\")\n if (!reply.sent) {\n reply.code(502).send(\"UI dev server is unavailable\")\n }\n }\n}\n\nfunction isApiRequest(rawUrl: string | null | undefined) {\n if (!rawUrl) return false\n const pathname = rawUrl.split(\"?\")[0] ?? \"\"\n return pathname === \"/api\" || pathname.startsWith(\"/api/\")\n}\n\nfunction buildProxyHeaders(headers: FastifyRequest[\"headers\"]): Record<string, string> {\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (!value || key.toLowerCase() === \"host\") continue\n result[key] = Array.isArray(value) ? value.join(\",\") : value\n }\n return result\n}\n\nfunction getHeaderValue(headers: Record<string, string | string[] | undefined>, key: string): string | undefined {\n const value = headers[key.toLowerCase()]\n return Array.isArray(value) ? value[0] : value\n}\n\nfunction isHtmlContentType(contentType: string): boolean {\n const normalized = contentType.toLowerCase()\n return normalized.includes(\"text/html\") || normalized.includes(\"application/xhtml+xml\")\n}\n\nfunction isCssContentType(contentType: string): boolean {\n return contentType.toLowerCase().includes(\"text/css\")\n}\n\nfunction isJavaScriptContentType(contentType: string): boolean {\n const normalized = contentType.toLowerCase()\n return normalized.includes(\"javascript\") || normalized.includes(\"ecmascript\")\n}\n\nexport function rewritePreviewBodyUrls(body: string, publicBase: string, kind: \"html\" | \"css\" | \"js\", targetOrigin = \"http://localhost\"): string {\n if (kind === \"css\") {\n return rewriteCssPreviewUrls(body, publicBase)\n }\n if (kind === \"js\") {\n return rewritePreviewJavaScriptImports(body, publicBase)\n }\n\n const rewritten = rewriteCssPreviewUrls(\n body\n .replace(/\\b(src|href|action|poster|data)=([\"'])\\/(?!\\/)([^\"']*)\\2/gi, (_match, attr: string, quote: string, pathValue: string) => {\n return `${attr}=${quote}${publicBase}/${pathValue}${quote}`\n })\n .replace(/\\bsrcset=([\"'])([^\"']*)\\1/gi, (_match, quote: string, value: string) => {\n return `srcset=${quote}${rewriteSrcsetPreviewUrls(value, publicBase)}${quote}`\n }),\n publicBase,\n )\n const withInlineModules = rewritten.replace(/<script\\b([^>]*)>([\\s\\S]*?)<\\/script>/gi, (script, attributes: string, source: string) => {\n if (/\\btype\\s*=\\s*([\"'])module\\1/i.test(attributes)) {\n return script.replace(source, rewritePreviewJavaScriptImports(source, publicBase))\n }\n if (/\\btype\\s*=\\s*([\"'])importmap\\1/i.test(attributes)) {\n return script.replace(source, rewritePreviewImportMap(source, publicBase))\n }\n return script\n })\n const bridge = buildPreviewRuntimeBridge(publicBase, targetOrigin)\n return /<head(?:\\s[^>]*)?>/i.test(withInlineModules)\n ? withInlineModules.replace(/<head(\\s[^>]*)?>/i, `<head$1>${bridge}`)\n : `${bridge}${withInlineModules}`\n}\n\nfunction rewriteCssPreviewUrls(body: string, publicBase: string): string {\n return body.replace(/url\\((\\s*)([\"']?)\\/(?!\\/)([^\"')]+)\\2(\\s*)\\)/gi, (_match, before: string, quote: string, pathValue: string, after: string) => {\n return `url(${before}${quote}${publicBase}/${pathValue}${quote}${after})`\n })\n}\n\nfunction rewriteSrcsetPreviewUrls(value: string, publicBase: string): string {\n return value\n .split(\",\")\n .map((entry) => {\n const trimmed = entry.trimStart()\n if (!trimmed.startsWith(\"/\") || trimmed.startsWith(\"//\")) return entry\n const leading = entry.slice(0, entry.length - trimmed.length)\n return `${leading}${publicBase}${trimmed}`\n })\n .join(\",\")\n}\n\nasync function proxySideCarRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n sidecarManager: SideCarManager\n logger: Logger\n pathSuffix?: string\n}) {\n const sidecarId = (args.request.params as { id?: string }).id ?? \"\"\n const sidecar = await args.sidecarManager.get(sidecarId)\n if (!sidecar) {\n args.reply.code(404).send({ error: \"SideCar not found\" })\n return\n }\n\n const pathname = (args.request.raw.url ?? args.request.url ?? \"\").split(\"?\")[0] ?? \"\"\n const queryIndex = (args.request.raw.url ?? args.request.url ?? \"\").indexOf(\"?\")\n const search = queryIndex >= 0 ? (args.request.raw.url ?? args.request.url ?? \"\").slice(queryIndex) : \"\"\n const pathSuffix = args.pathSuffix ?? \"\"\n const requestPath = pathSuffix ? `${args.sidecarManager.buildProxyBasePath(sidecarId)}/${pathSuffix.replace(/^\\/+/, \"\")}` : args.sidecarManager.buildProxyBasePath(sidecarId)\n const targetPath = args.sidecarManager.buildTargetPath(sidecarId, requestPath, search)\n const targetOrigin = args.sidecarManager.buildTargetOrigin(sidecar)\n const targetUrl = `${targetOrigin}${targetPath}`\n args.logger.debug({ sidecarId: sidecar.id, targetUrl, pathname, prefixMode: sidecar.prefixMode }, \"Proxying request to SideCar\")\n\n await proxyTargetRequest({\n reply: args.reply,\n logger: args.logger,\n targetUrl,\n targetOrigin,\n logContext: { sidecarId: sidecar.id },\n errorMessage: \"SideCar proxy failed\",\n rewriteHeaders: (headers) => rewriteSideCarResponseHeaders(headers, sidecarId, targetOrigin, sidecar.prefixMode),\n })\n}\n\nasync function proxyPreviewRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n previewManager: PreviewManager\n logger: Logger\n token?: string\n publicBase?: string\n pathSuffix?: string\n}) {\n const token = args.token ?? (args.request.params as { token?: string }).token ?? \"\"\n const preview = args.previewManager.get(token)\n if (!preview) {\n args.reply.code(404).send({ error: \"Preview not found\" })\n return\n }\n\n const rawUrl = args.request.raw.url ?? args.request.url ?? \"\"\n const queryIndex = rawUrl.indexOf(\"?\")\n const search = queryIndex >= 0 ? rawUrl.slice(queryIndex) : \"\"\n const pathSuffix = args.pathSuffix ?? \"\"\n const publicBase = args.publicBase ?? args.previewManager.buildProxyBasePath(token)\n const requestPath = pathSuffix ? `${publicBase}/${pathSuffix.replace(/^\\/+/, \"\")}` : publicBase\n const targetUrl = args.previewManager.buildTargetUrl(token, requestPath, search)\n if (!targetUrl) {\n args.reply.code(404).send({ error: \"Preview not found\" })\n return\n }\n\n args.logger.debug({ previewToken: token, targetUrl: targetUrl.toString() }, \"Proxying request to preview\")\n await proxyPreviewTargetRequest({\n request: args.request,\n reply: args.reply,\n logger: args.logger,\n targetUrl: targetUrl.toString(),\n targetOrigin: targetUrl.origin,\n publicBase,\n logContext: { previewToken: token },\n errorMessage: \"Preview proxy failed\",\n rewriteHeaders: (headers) => rewritePreviewResponseHeaders(headers, token, targetUrl.origin, publicBase),\n })\n}\n\nasync function proxyPreviewAssetRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n previewManager: PreviewManager\n logger: Logger\n token: string\n}) {\n const rawUrl = args.request.raw.url ?? args.request.url ?? \"\"\n const queryIndex = rawUrl.indexOf(\"?\")\n const search = queryIndex >= 0 ? rawUrl.slice(queryIndex) : \"\"\n const pathname = rawUrl.split(\"?\")[0] ?? \"/\"\n const targetUrl = args.previewManager.buildTargetUrl(args.token, pathname, search)\n if (!targetUrl) {\n args.reply.code(404).send({ error: \"Preview not found\" })\n return\n }\n\n args.logger.debug({ previewToken: args.token, targetUrl: targetUrl.toString() }, \"Proxying preview fallback asset\")\n await proxyPreviewTargetRequest({\n request: args.request,\n reply: args.reply,\n logger: args.logger,\n targetUrl: targetUrl.toString(),\n targetOrigin: targetUrl.origin,\n publicBase: args.previewManager.buildProxyBasePath(args.token),\n logContext: { previewToken: args.token, previewFallback: true },\n errorMessage: \"Preview proxy failed\",\n rewriteHeaders: (headers) => rewritePreviewResponseHeaders(headers, args.token, targetUrl.origin),\n })\n}\n\nasync function proxyPreviewTargetRequest(args: {\n request: FastifyRequest\n reply: FastifyReply\n logger: Logger\n targetUrl: string\n targetOrigin: string\n publicBase: string\n logContext: Record<string, unknown>\n errorMessage: string\n rewriteHeaders: (headers: Record<string, string | string[] | undefined>) => Record<string, string | string[] | undefined>\n}) {\n let responseKind: \"html\" | \"css\" | \"js\" | null = null\n await args.reply.from(args.targetUrl, {\n rewriteRequestHeaders: (_originalRequest, headers) => {\n const next = sanitizeSideCarProxyRequestHeaders(headers as Record<string, string | string[] | undefined>, args.targetOrigin)\n delete next[\"accept-encoding\"]\n return next\n },\n rewriteHeaders: (headers) => {\n const next = args.rewriteHeaders(headers as Record<string, string | string[] | undefined>)\n const contentType = getHeaderValue(next, \"content-type\") ?? \"\"\n responseKind = isHtmlContentType(contentType) ? \"html\" : isCssContentType(contentType) ? \"css\" : isJavaScriptContentType(contentType) ? \"js\" : null\n if (responseKind) {\n delete next[\"content-length\"]\n delete next[\"content-encoding\"]\n }\n if (args.request.headers.origin === \"null\") {\n next[\"access-control-allow-origin\"] = \"null\"\n delete next[\"access-control-allow-credentials\"]\n }\n return next\n },\n onResponse: (_proxyRequest, proxyReply, upstreamResponse) => {\n const upstream = upstreamResponse as unknown as Readable\n if (!responseKind || args.request.method === \"HEAD\") {\n proxyReply.send(upstream)\n return\n }\n void (async () => {\n try {\n const chunks: Buffer[] = []\n for await (const chunk of upstream) chunks.push(Buffer.from(chunk))\n proxyReply.send(rewritePreviewBodyUrls(Buffer.concat(chunks).toString(), args.publicBase, responseKind!, args.targetOrigin))\n } catch (error) {\n args.logger.error({ ...args.logContext, err: error, targetUrl: args.targetUrl }, args.errorMessage)\n if (!proxyReply.sent) proxyReply.code(502).send({ error: args.errorMessage })\n }\n })()\n },\n onError: (proxyReply, { error }) => {\n args.logger.error({ ...args.logContext, err: error, targetUrl: args.targetUrl }, args.errorMessage)\n if (!proxyReply.sent) proxyReply.code(502).send({ error: args.errorMessage })\n },\n })\n}\n\nasync function proxyTargetRequest(args: {\n reply: FastifyReply\n logger: Logger\n targetUrl: string\n targetOrigin: string\n logContext: Record<string, unknown>\n errorMessage: string\n rewriteHeaders: (headers: Record<string, string | string[] | undefined>) => Record<string, string | string[] | undefined>\n}) {\n await args.reply.from(args.targetUrl, {\n rewriteRequestHeaders: (_originalRequest, headers) =>\n sanitizeSideCarProxyRequestHeaders(headers as Record<string, string | string[] | undefined>, args.targetOrigin),\n rewriteHeaders: args.rewriteHeaders,\n onError: (reply, { error }) => {\n args.logger.error({ ...args.logContext, err: error, targetUrl: args.targetUrl }, args.errorMessage)\n if (!reply.sent) {\n reply.code(502).send({ error: args.errorMessage })\n }\n },\n })\n}\n\nfunction parseSideCarUpgradePath(rawUrl: string): { sidecarId: string; pathname: string; search: string } | null {\n let parsed: URL\n try {\n parsed = new URL(rawUrl, \"http://localhost\")\n } catch {\n return null\n }\n\n const match = parsed.pathname.match(/^\\/sidecars\\/([^/]+)(?:\\/.*)?$/)\n if (!match) {\n return null\n }\n\n try {\n return {\n sidecarId: decodeURIComponent(match[1] ?? \"\"),\n pathname: parsed.pathname,\n search: parsed.search,\n }\n } catch {\n return null\n }\n}\n\nfunction parsePreviewUpgradePath(rawUrl: string): { token: string; pathname: string; search: string } | null {\n let parsed: URL\n try {\n parsed = new URL(rawUrl, \"http://localhost\")\n } catch {\n return null\n }\n\n const match = parsed.pathname.match(/^\\/previews\\/([^/]+)(?:\\/.*)?$/)\n if (!match) {\n return null\n }\n\n try {\n return {\n token: decodeURIComponent(match[1] ?? \"\"),\n pathname: parsed.pathname,\n search: parsed.search,\n }\n } catch {\n return null\n }\n}\n\nexport function parsePreviewCapabilityHost(host: string | undefined): string | null {\n const hostname = host?.replace(/:\\d+$/, \"\").toLowerCase() ?? \"\"\n return hostname.match(/^([0-9a-f-]{36})\\.preview\\.localhost$/)?.[1] ?? null\n}\n\nasync function proxySideCarWebSocketUpgrade(args: {\n request: import(\"http\").IncomingMessage\n socket: Socket\n head: Buffer\n sidecarId: string\n incomingPath: string\n search: string\n sidecarManager: SideCarManager\n authManager: AuthManager\n logger: Logger\n}) {\n const { request, socket, head, sidecarId, incomingPath, search, sidecarManager, authManager, logger } = args\n\n if (!isWebSocketUpgradeRequest(request)) {\n rejectUpgrade(socket, 400, \"Bad Request\")\n return\n }\n\n const session = authManager.getSessionFromHeaders(request.headers)\n if (!session) {\n rejectUpgrade(socket, 401, \"Unauthorized\")\n return\n }\n\n const sidecar = await sidecarManager.get(sidecarId)\n if (!sidecar) {\n rejectUpgrade(socket, 404, \"Not Found\")\n return\n }\n\n const targetOrigin = sidecarManager.buildTargetOrigin(sidecar)\n const targetPath = sidecarManager.buildTargetPath(sidecarId, incomingPath, search)\n const targetUrl = new URL(`${targetOrigin}${targetPath}`)\n logger.debug({ sidecarId, targetUrl: targetUrl.toString(), prefixMode: sidecar.prefixMode }, \"Proxying websocket to SideCar\")\n\n proxyTargetWebSocketUpgrade({\n request,\n socket,\n head,\n targetUrl,\n logger,\n logContext: { sidecarId },\n proxyLabel: \"SideCar\",\n })\n}\n\nasync function proxyPreviewWebSocketUpgrade(args: {\n request: import(\"http\").IncomingMessage\n socket: Socket\n head: Buffer\n token: string\n incomingPath: string\n search: string\n previewManager: PreviewManager\n authManager: AuthManager\n logger: Logger\n}) {\n const { request, socket, head, token, incomingPath, search, previewManager, authManager, logger } = args\n\n if (!isWebSocketUpgradeRequest(request)) {\n rejectUpgrade(socket, 400, \"Bad Request\")\n return\n }\n\n const session = authManager.getSessionFromHeaders(request.headers)\n if (!session && !previewManager.get(token)) {\n rejectUpgrade(socket, 401, \"Unauthorized\")\n return\n }\n\n const targetUrl = previewManager.buildTargetUrl(token, incomingPath, search)\n if (!targetUrl) {\n rejectUpgrade(socket, 404, \"Not Found\")\n return\n }\n\n logger.debug({ previewToken: token, targetUrl: targetUrl.toString() }, \"Proxying websocket to preview\")\n proxyTargetWebSocketUpgrade({\n request,\n socket,\n head,\n targetUrl,\n logger,\n logContext: { previewToken: token },\n proxyLabel: \"preview\",\n stripCookies: true,\n })\n}\n\nfunction proxyTargetWebSocketUpgrade(args: {\n request: import(\"http\").IncomingMessage\n socket: Socket\n head: Buffer\n targetUrl: URL\n logger: Logger\n logContext: Record<string, unknown>\n proxyLabel: string\n stripCookies?: boolean\n}) {\n const { request, socket, head, targetUrl, logger, logContext, proxyLabel, stripCookies } = args\n const { socket: upstream, readyEvent } = createSideCarUpstreamSocket(targetUrl)\n\n const closeBoth = () => {\n if (!socket.destroyed) {\n socket.destroy()\n }\n if (!upstream.destroyed) {\n upstream.destroy()\n }\n }\n\n upstream.once(\"error\", (error) => {\n logger.error({ ...logContext, err: error, targetUrl: targetUrl.toString() }, `Failed to proxy ${proxyLabel} websocket`)\n rejectUpgrade(socket, 502, \"Bad Gateway\")\n if (!upstream.destroyed) {\n upstream.destroy()\n }\n })\n\n socket.once(\"error\", (error) => {\n logger.debug({ ...logContext, err: error }, `${proxyLabel} websocket client socket errored`)\n if (!upstream.destroyed) {\n upstream.destroy()\n }\n })\n\n upstream.once(readyEvent, () => {\n try {\n upstream.write(buildSideCarWebSocketRequest(request, targetUrl, { stripCookies }))\n if (head.length > 0) {\n upstream.write(head)\n }\n upstream.pipe(socket)\n socket.pipe(upstream)\n } catch (error) {\n logger.error({ ...logContext, err: error, targetUrl: targetUrl.toString() }, `Failed to forward ${proxyLabel} websocket upgrade`)\n closeBoth()\n }\n })\n\n upstream.once(\"close\", () => {\n if (!socket.destroyed) {\n socket.end()\n }\n })\n\n socket.once(\"close\", () => {\n if (!upstream.destroyed) {\n upstream.end()\n }\n })\n}\n\nfunction createSideCarUpstreamSocket(targetUrl: URL): { socket: Socket | TLSSocket; readyEvent: \"connect\" | \"secureConnect\" } {\n const port = Number(targetUrl.port || (targetUrl.protocol === \"https:\" ? 443 : 80))\n if (targetUrl.protocol === \"https:\") {\n return {\n socket: connectTls({\n host: targetUrl.hostname,\n port,\n servername: targetUrl.hostname,\n }),\n readyEvent: \"secureConnect\",\n }\n }\n return {\n socket: connectTcp(port, targetUrl.hostname),\n readyEvent: \"connect\",\n }\n}\n\nfunction buildSideCarWebSocketRequest(\n request: import(\"http\").IncomingMessage,\n targetUrl: URL,\n options?: { stripCookies?: boolean },\n): string {\n const pathWithQuery = `${targetUrl.pathname}${targetUrl.search}`\n const requestLine = `${request.method ?? \"GET\"} ${pathWithQuery} HTTP/${request.httpVersion}\\r\\n`\n const headerLines: string[] = []\n const rawHeaders = request.rawHeaders ?? []\n const blockedHeaders = getBlockedSideCarRequestHeaders()\n\n for (let index = 0; index < rawHeaders.length; index += 2) {\n const key = rawHeaders[index]\n const value = rawHeaders[index + 1]\n if (!key || value === undefined) continue\n const lower = key.toLowerCase()\n if (blockedHeaders.has(lower)) continue\n if (options?.stripCookies && lower === \"cookie\") continue\n if (lower === \"origin\") {\n headerLines.push(`Origin: ${targetUrl.origin}\\r\\n`)\n continue\n }\n headerLines.push(`${key}: ${value}\\r\\n`)\n }\n\n const hostValue = targetUrl.port ? `${targetUrl.hostname}:${targetUrl.port}` : targetUrl.hostname\n headerLines.push(`Host: ${hostValue}\\r\\n`)\n headerLines.push(\"\\r\\n\")\n\n return requestLine + headerLines.join(\"\")\n}\n\nfunction isWebSocketUpgradeRequest(request: import(\"http\").IncomingMessage): boolean {\n const upgrade = request.headers.upgrade\n if (typeof upgrade !== \"string\" || upgrade.toLowerCase() !== \"websocket\") {\n return false\n }\n const connection = request.headers.connection\n const connectionValue = Array.isArray(connection) ? connection.join(\",\") : connection ?? \"\"\n return connectionValue.toLowerCase().split(\",\").map((part) => part.trim()).includes(\"upgrade\")\n}\n\nfunction rejectUpgrade(socket: Socket, statusCode: number, statusText: string) {\n if (socket.destroyed) {\n return\n }\n socket.write(`HTTP/1.1 ${statusCode} ${statusText}\\r\\nConnection: close\\r\\nContent-Length: 0\\r\\n\\r\\n`)\n socket.destroy()\n}\n\nfunction rewriteSideCarResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n sidecarId: string,\n targetOrigin: string,\n prefixMode: \"strip\" | \"preserve\",\n) {\n if (prefixMode === \"preserve\") {\n return headers\n }\n\n const next = { ...headers }\n const locationHeader = next.location\n const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader\n if (!location) {\n return next\n }\n\n const publicBase = `/sidecars/${encodeURIComponent(sidecarId)}`\n\n if (location.startsWith(\"/\")) {\n next.location = `${publicBase}${location}`\n return next\n }\n\n try {\n const parsed = new URL(location)\n if (parsed.origin === targetOrigin) {\n next.location = `${publicBase}${parsed.pathname}${parsed.search}${parsed.hash}`\n }\n } catch {\n // Relative redirects should continue to resolve against the public sidecar path.\n }\n\n return next\n}\n\nfunction rewritePreviewResponseHeaders(\n headers: Record<string, string | string[] | undefined>,\n token: string,\n targetOrigin: string,\n publicBase = `/previews/${encodeURIComponent(token)}`,\n) {\n const next = { ...headers }\n delete next[\"x-frame-options\"]\n delete next[\"content-security-policy\"]\n delete next[\"content-security-policy-report-only\"]\n delete next[\"set-cookie\"]\n delete next[\"set-cookie2\"]\n\n const locationHeader = next.location\n const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader\n if (!location) {\n return next\n }\n\n if (location.startsWith(\"//\")) {\n const parsed = new URL(location, targetOrigin)\n next.location = parsed.origin === targetOrigin\n ? `${publicBase}${parsed.pathname}${parsed.search}${parsed.hash}`\n : parsed.href\n return next\n }\n if (location.startsWith(\"/\")) {\n next.location = `${publicBase}${location}`\n return next\n }\n\n try {\n const parsed = new URL(location)\n if (parsed.origin === targetOrigin) {\n next.location = `${publicBase}${parsed.pathname}${parsed.search}${parsed.hash}`\n }\n } catch {\n // Relative redirects should continue to resolve against the current preview path.\n }\n\n return next\n}\n\nfunction sanitizeSideCarProxyRequestHeaders(\n headers: Record<string, string | string[] | undefined>,\n targetOrigin: string,\n): Record<string, string | string[] | undefined> {\n const blockedHeaders = getBlockedSideCarRequestHeaders()\n const next: Record<string, string | string[] | undefined> = {}\n\n for (const [key, value] of Object.entries(headers)) {\n if (!value) continue\n if (blockedHeaders.has(key.toLowerCase())) continue\n next[key] = value\n }\n\n next.origin = targetOrigin\n return next\n}\n\nfunction getBlockedSideCarRequestHeaders(): Set<string> {\n return new Set([\n \"host\",\n \"expect\",\n \"authorization\",\n \"proxy-authorization\",\n \"forwarded\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-port\",\n \"x-forwarded-proto\",\n ])\n}\n"]}