opensteer 0.9.5 → 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-7LQL5YUR.js → chunk-3OHKIPBD.js} +571 -738
- package/dist/chunk-3OHKIPBD.js.map +1 -0
- package/dist/chunk-52UNH5UW.js +458 -0
- package/dist/chunk-52UNH5UW.js.map +1 -0
- package/dist/{chunk-GSCQQKZZ.js → chunk-PJXN7HED.js} +334 -18
- package/dist/chunk-PJXN7HED.js.map +1 -0
- package/dist/{chunk-ZRF7WMS3.js → chunk-R33BXCMQ.js} +16 -7
- package/dist/chunk-R33BXCMQ.js.map +1 -0
- package/dist/{chunk-T5P2QGZ3.js → chunk-U4BUCIZ4.js} +153 -12
- package/dist/chunk-U4BUCIZ4.js.map +1 -0
- package/dist/cli/bin.cjs +1421 -824
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.js +286 -129
- package/dist/cli/bin.js.map +1 -1
- package/dist/index.cjs +1117 -703
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +58 -53
- package/dist/index.d.ts +58 -53
- package/dist/index.js +4 -4
- package/dist/local-view/public/assets/app.js +10 -1
- package/dist/local-view/serve-entry.cjs +6815 -1272
- package/dist/local-view/serve-entry.cjs.map +1 -1
- package/dist/local-view/serve-entry.js +2 -2
- package/dist/opensteer-CY2QUJEG.js +6 -0
- package/dist/{opensteer-T2JENADR.js.map → opensteer-CY2QUJEG.js.map} +1 -1
- package/dist/{session-control-M3JD7ZKA.js → session-control-FIP6ZJLH.js} +4 -4
- package/dist/{session-control-M3JD7ZKA.js.map → session-control-FIP6ZJLH.js.map} +1 -1
- package/package.json +7 -7
- package/dist/chunk-7D45QUZ3.js +0 -332
- package/dist/chunk-7D45QUZ3.js.map +0 -1
- package/dist/chunk-7LQL5YUR.js.map +0 -1
- package/dist/chunk-GSCQQKZZ.js.map +0 -1
- package/dist/chunk-T5P2QGZ3.js.map +0 -1
- package/dist/chunk-ZRF7WMS3.js.map +0 -1
- package/dist/opensteer-T2JENADR.js +0 -6
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-browser/browser-brands.ts","../src/local-browser/chrome-discovery.ts","../src/local-browser/cdp-discovery.ts","../../runtime-core/src/json.ts","../../runtime-core/src/internal/filesystem.ts","../src/live-session.ts","../src/local-view/runtime-dir.ts","../src/local-view/session-manifest.ts","../src/local-browser/process-owner.ts","../src/local-view/service-state.ts"],"names":["join","existsSync","resolve","execFileSync","path","rm","homedir","createHash","PROCESS_LIST_MAX_BUFFER_BYTES","PS_COMMAND_ENV","readFile"],"mappings":"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","file":"chunk-T5P2QGZ3.js","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nimport { expandHome, firstExistingPath, resolveBinaryFromPath } from \"./chrome-discovery.js\";\n\nconst PROCESS_LIST_MAX_BUFFER_BYTES = 16 * 1024 * 1024;\nconst PS_COMMAND_ENV = { ...process.env, LC_ALL: \"C\" };\nconst WINDOWS_PROGRAM_FILES = process.env.PROGRAMFILES ?? \"C:\\\\Program Files\";\nconst WINDOWS_PROGRAM_FILES_X86 = process.env[\"PROGRAMFILES(X86)\"] ?? \"C:\\\\Program Files (x86)\";\n\nexport type BrowserBrandId =\n | \"chrome\"\n | \"chrome-canary\"\n | \"chromium\"\n | \"brave\"\n | \"edge\"\n | \"vivaldi\"\n | \"helium\";\n\nexport interface BrowserBrandPlatformConfig {\n readonly executableCandidates: readonly (string | null)[];\n readonly userDataDir: string;\n readonly bundleId?: string;\n readonly processNames: readonly string[];\n}\n\nexport interface BrowserBrandRecord {\n readonly id: BrowserBrandId;\n readonly displayName: string;\n readonly darwin?: BrowserBrandPlatformConfig;\n readonly win32?: BrowserBrandPlatformConfig;\n readonly linux?: BrowserBrandPlatformConfig;\n}\n\nexport interface InstalledBrowserBrand {\n readonly brand: BrowserBrandRecord;\n readonly brandId: BrowserBrandId;\n readonly displayName: string;\n readonly executablePath: string;\n readonly userDataDir: string;\n}\n\nconst BROWSER_BRANDS: readonly BrowserBrandRecord[] = [\n {\n id: \"chrome\",\n displayName: \"Google Chrome\",\n darwin: {\n executableCandidates: [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"],\n userDataDir: \"~/Library/Application Support/Google/Chrome\",\n bundleId: \"com.google.Chrome\",\n processNames: [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Google/Chrome/User Data\",\n processNames: [\"/google/chrome/application/chrome.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n \"/opt/google/chrome/chrome\",\n resolveBinaryFromPath(\"google-chrome\"),\n resolveBinaryFromPath(\"google-chrome-stable\"),\n ],\n userDataDir: \"~/.config/google-chrome\",\n processNames: [\"/google-chrome\", \"/google-chrome-stable\", \"/opt/google/chrome/chrome\"],\n },\n },\n {\n id: \"chrome-canary\",\n displayName: \"Google Chrome Canary\",\n darwin: {\n executableCandidates: [\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n ],\n userDataDir: \"~/Library/Application Support/Google/Chrome Canary\",\n bundleId: \"com.google.Chrome.canary\",\n processNames: [\"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\"],\n },\n win32: {\n executableCandidates: [\n join(\"~\", \"AppData\", \"Local\", \"Google\", \"Chrome SxS\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Google/Chrome SxS/User Data\",\n processNames: [\"/google/chrome sxs/application/chrome.exe\"],\n },\n },\n {\n id: \"edge\",\n displayName: \"Microsoft Edge\",\n darwin: {\n executableCandidates: [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"],\n userDataDir: \"~/Library/Application Support/Microsoft Edge\",\n bundleId: \"com.microsoft.edgemac\",\n processNames: [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Microsoft/Edge/User Data\",\n processNames: [\"/microsoft/edge/application/msedge.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/microsoft-edge\",\n \"/usr/bin/microsoft-edge-stable\",\n \"/opt/microsoft/msedge/msedge\",\n resolveBinaryFromPath(\"microsoft-edge\"),\n resolveBinaryFromPath(\"microsoft-edge-stable\"),\n ],\n userDataDir: \"~/.config/microsoft-edge\",\n processNames: [\"/microsoft-edge\", \"/microsoft-edge-stable\", \"/opt/microsoft/msedge/msedge\"],\n },\n },\n {\n id: \"brave\",\n displayName: \"Brave Browser\",\n darwin: {\n executableCandidates: [\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\"],\n userDataDir: \"~/Library/Application Support/BraveSoftware/Brave-Browser\",\n bundleId: \"com.brave.Browser\",\n processNames: [\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n join(\n WINDOWS_PROGRAM_FILES_X86,\n \"BraveSoftware\",\n \"Brave-Browser\",\n \"Application\",\n \"brave.exe\",\n ),\n join(\"~\", \"AppData\", \"Local\", \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n ],\n userDataDir: \"~/AppData/Local/BraveSoftware/Brave-Browser/User Data\",\n processNames: [\"/bravesoftware/brave-browser/application/brave.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/brave-browser\",\n \"/opt/brave.com/brave/brave-browser\",\n resolveBinaryFromPath(\"brave-browser\"),\n ],\n userDataDir: \"~/.config/BraveSoftware/Brave-Browser\",\n processNames: [\"/brave-browser\", \"/opt/brave.com/brave/brave-browser\"],\n },\n },\n {\n id: \"vivaldi\",\n displayName: \"Vivaldi\",\n darwin: {\n executableCandidates: [\"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi\"],\n userDataDir: \"~/Library/Application Support/Vivaldi\",\n bundleId: \"com.vivaldi.Vivaldi\",\n processNames: [\"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Vivaldi/User Data\",\n processNames: [\"/vivaldi/application/vivaldi.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/vivaldi\",\n \"/usr/bin/vivaldi-stable\",\n \"/opt/vivaldi/vivaldi\",\n resolveBinaryFromPath(\"vivaldi\"),\n resolveBinaryFromPath(\"vivaldi-stable\"),\n ],\n userDataDir: \"~/.config/vivaldi\",\n processNames: [\"/vivaldi\", \"/vivaldi-stable\", \"/opt/vivaldi/vivaldi\"],\n },\n },\n {\n id: \"helium\",\n displayName: \"Helium\",\n darwin: {\n executableCandidates: [\"/Applications/Helium.app/Contents/MacOS/Helium\"],\n userDataDir: \"~/Library/Application Support/net.imput.helium\",\n processNames: [\"/Applications/Helium.app/Contents/MacOS/Helium\"],\n },\n },\n {\n id: \"chromium\",\n displayName: \"Chromium\",\n darwin: {\n executableCandidates: [\"/Applications/Chromium.app/Contents/MacOS/Chromium\"],\n userDataDir: \"~/Library/Application Support/Chromium\",\n bundleId: \"org.chromium.Chromium\",\n processNames: [\"/Applications/Chromium.app/Contents/MacOS/Chromium\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Chromium\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Chromium/User Data\",\n processNames: [\"/chromium/application/chrome.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n resolveBinaryFromPath(\"chromium\"),\n resolveBinaryFromPath(\"chromium-browser\"),\n ],\n userDataDir: \"~/.config/chromium\",\n processNames: [\"/chromium\", \"/chromium-browser\"],\n },\n },\n] as const;\n\nexport function getAllBrowserBrands(): readonly BrowserBrandRecord[] {\n return BROWSER_BRANDS;\n}\n\nexport function getBrowserBrand(id: BrowserBrandId): BrowserBrandRecord {\n const brand = BROWSER_BRANDS.find((candidate) => candidate.id === id);\n if (!brand) {\n throw new Error(`Unknown browser brand \"${id}\".`);\n }\n return brand;\n}\n\nexport function resolveBrandPlatformConfig(\n brand: BrowserBrandRecord,\n platform: NodeJS.Platform = process.platform,\n): BrowserBrandPlatformConfig | undefined {\n if (platform === \"darwin\") {\n return brand.darwin;\n }\n if (platform === \"win32\") {\n return brand.win32;\n }\n if (platform === \"linux\") {\n return brand.linux;\n }\n return undefined;\n}\n\nexport function detectInstalledBrowserBrands(): readonly InstalledBrowserBrand[] {\n const installations: InstalledBrowserBrand[] = [];\n\n for (const brand of BROWSER_BRANDS) {\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n continue;\n }\n\n const executablePath = firstExistingPath(\n resolveExecutableCandidates(platformConfig.executableCandidates),\n );\n if (!executablePath) {\n continue;\n }\n\n installations.push({\n brand,\n brandId: brand.id,\n displayName: brand.displayName,\n executablePath,\n userDataDir: resolve(expandHome(platformConfig.userDataDir)),\n });\n }\n\n return installations;\n}\n\nexport function resolveBrandExecutablePath(\n brand: BrowserBrandRecord,\n explicitPath?: string,\n): string {\n if (explicitPath !== undefined) {\n const resolvedPath = resolve(expandHome(explicitPath));\n if (!existsSync(resolvedPath)) {\n throw new Error(`${brand.displayName} executable was not found at \"${resolvedPath}\".`);\n }\n return resolvedPath;\n }\n\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n throw new Error(`${brand.displayName} is not supported on ${process.platform}.`);\n }\n\n const resolvedPath = firstExistingPath(\n resolveExecutableCandidates(platformConfig.executableCandidates),\n );\n if (!resolvedPath) {\n throw new Error(\n `Could not find a ${brand.displayName} executable. Pass --executable-path or browser.executablePath.`,\n );\n }\n return resolvedPath;\n}\n\nexport function resolveBrandUserDataDir(brand: BrowserBrandRecord, explicitDir?: string): string {\n if (explicitDir !== undefined) {\n return resolve(expandHome(explicitDir));\n }\n\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n throw new Error(`${brand.displayName} is not supported on ${process.platform}.`);\n }\n\n return resolve(expandHome(platformConfig.userDataDir));\n}\n\nexport function isBrandProcess(brand: BrowserBrandRecord, commandLine: string): boolean {\n const normalizedCommand = normalizeCommand(commandLine);\n if (!normalizedCommand) {\n return false;\n }\n if (normalizedCommand.includes(\"crashpad_handler\")) {\n return false;\n }\n if (/\\s--type=/.test(normalizedCommand)) {\n return false;\n }\n\n return getBrandProcessMarkers(brand).some((marker) => normalizedCommand.includes(marker));\n}\n\nexport function findBrandProcess(brand: BrowserBrandRecord): {\n readonly pid: number;\n} | null {\n for (const processEntry of listProcesses()) {\n if (isBrandProcess(brand, processEntry.commandLine)) {\n return { pid: processEntry.pid };\n }\n }\n\n return null;\n}\n\nfunction getBrandProcessMarkers(brand: BrowserBrandRecord): readonly string[] {\n const markers = new Set<string>();\n\n for (const config of [brand.darwin, brand.win32, brand.linux]) {\n if (!config) {\n continue;\n }\n\n for (const processName of config.processNames) {\n const normalized = normalizeCommand(processName);\n if (normalized) {\n markers.add(normalized);\n }\n }\n\n for (const candidate of config.executableCandidates) {\n if (!candidate) {\n continue;\n }\n\n const normalized = normalizeCommand(resolve(expandHome(candidate)));\n if (normalized) {\n markers.add(normalized);\n }\n }\n }\n\n return [...markers];\n}\n\nfunction resolveExecutableCandidates(\n candidates: readonly (string | null)[],\n): readonly (string | null)[] {\n return candidates.map((candidate) => (candidate ? resolve(expandHome(candidate)) : null));\n}\n\nfunction listProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n if (process.platform === \"win32\") {\n return listWindowsProcesses();\n }\n return listUnixProcesses();\n}\n\nfunction listUnixProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n try {\n const output = execFileSync(\"ps\", [\"-A\", \"-o\", \"pid=,command=\"], {\n encoding: \"utf8\",\n env: PS_COMMAND_ENV,\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => {\n const match = /^(\\d+)\\s+(.*)$/.exec(line);\n if (!match) {\n return null;\n }\n\n const pid = Number.parseInt(match[1] ?? \"\", 10);\n const commandLine = match[2]?.trim() ?? \"\";\n if (!Number.isInteger(pid) || pid <= 0 || commandLine.length === 0) {\n return null;\n }\n\n return {\n pid,\n commandLine,\n };\n })\n .filter(\n (entry): entry is { readonly pid: number; readonly commandLine: string } => entry !== null,\n )\n .sort((left, right) => left.pid - right.pid);\n } catch {\n return [];\n }\n}\n\nfunction listWindowsProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n try {\n const output = execFileSync(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-Command\",\n \"Get-CimInstance Win32_Process | Select-Object ProcessId,CommandLine | ConvertTo-Json -Compress\",\n ],\n {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n if (!output) {\n return [];\n }\n\n const parsed = JSON.parse(output) as\n | {\n readonly ProcessId?: unknown;\n readonly CommandLine?: unknown;\n }\n | readonly {\n readonly ProcessId?: unknown;\n readonly CommandLine?: unknown;\n }[];\n const records = Array.isArray(parsed) ? parsed : [parsed];\n\n return records\n .map((record) => {\n const pid = Number(record.ProcessId);\n const commandLine = typeof record.CommandLine === \"string\" ? record.CommandLine.trim() : \"\";\n if (!Number.isInteger(pid) || pid <= 0 || commandLine.length === 0) {\n return null;\n }\n\n return {\n pid,\n commandLine,\n };\n })\n .filter(\n (entry): entry is { readonly pid: number; readonly commandLine: string } => entry !== null,\n )\n .sort((left, right) => left.pid - right.pid);\n } catch {\n return [];\n }\n}\n\nfunction normalizeCommand(value: string): string {\n return value.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\n\nimport { detectInstalledBrowserBrands } from \"./browser-brands.js\";\nimport type {\n LocalBrowserInstallation,\n LocalChromeInstallation,\n LocalChromeProfileDescriptor,\n} from \"./types.js\";\n\nexport function expandHome(value: string): string {\n if (value === \"~\" || value.startsWith(\"~/\")) {\n return join(homedir(), value.slice(1));\n }\n return value;\n}\n\nexport function resolveChromeUserDataDir(userDataDir: string | undefined): string {\n if (userDataDir !== undefined) {\n return resolve(expandHome(userDataDir));\n }\n\n const installation = detectLocalChromeInstallations().find(\n (candidate) =>\n existsSync(join(candidate.userDataDir, \"Local State\")) || candidate.executablePath !== null,\n );\n if (!installation) {\n throw new Error(\"Could not find a local Chrome or Chromium profile directory.\");\n }\n return installation.userDataDir;\n}\n\nexport function resolveChromeExecutablePath(executablePath: string | undefined): string {\n if (executablePath !== undefined) {\n const resolvedPath = resolve(expandHome(executablePath));\n if (!existsSync(resolvedPath)) {\n throw new Error(`Chrome executable was not found at \"${resolvedPath}\".`);\n }\n return resolvedPath;\n }\n\n const chromeInstallation = detectLocalChromeInstallations().find(\n (installation) => installation.brand === \"chrome\" && installation.executablePath !== null,\n );\n if (chromeInstallation?.executablePath) {\n return chromeInstallation.executablePath;\n }\n\n const brandedInstallation = detectInstalledBrowserBrands()[0];\n if (brandedInstallation) {\n return brandedInstallation.executablePath;\n }\n\n throw new Error(\n \"Could not find a Chrome or Chromium executable. Pass browser.executablePath or --executable-path.\",\n );\n}\n\nfunction detectLocalChromeInstallations(): readonly LocalChromeInstallation[] {\n if (process.platform === \"darwin\") {\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n ]),\n userDataDir: join(homedir(), \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\"/Applications/Chromium.app/Contents/MacOS/Chromium\"]),\n userDataDir: join(homedir(), \"Library\", \"Application Support\", \"Chromium\"),\n },\n ];\n }\n\n if (process.platform === \"win32\") {\n const programFiles = process.env.PROGRAMFILES ?? \"C:\\\\Program Files\";\n const programFilesX86 = process.env[\"PROGRAMFILES(X86)\"] ?? \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\");\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n join(programFiles, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n ]),\n userDataDir: join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\n join(programFiles, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Chromium\", \"Application\", \"chrome.exe\"),\n ]),\n userDataDir: join(localAppData, \"Chromium\", \"User Data\"),\n },\n ];\n }\n\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n resolveBinaryFromPath(\"google-chrome\"),\n resolveBinaryFromPath(\"google-chrome-stable\"),\n ]),\n userDataDir: join(homedir(), \".config\", \"google-chrome\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n resolveBinaryFromPath(\"chromium\"),\n resolveBinaryFromPath(\"chromium-browser\"),\n ]),\n userDataDir: join(homedir(), \".config\", \"chromium\"),\n },\n ];\n}\n\nexport function detectLocalBrowserInstallations(): readonly LocalBrowserInstallation[] {\n return detectInstalledBrowserBrands().map((installation) => ({\n brand: installation.brandId,\n executablePath: installation.executablePath,\n userDataDir: installation.userDataDir,\n }));\n}\n\nexport function listLocalChromeProfiles(\n userDataDir = resolveChromeUserDataDir(undefined),\n): readonly LocalChromeProfileDescriptor[] {\n const resolvedUserDataDir = resolve(expandHome(userDataDir));\n const localStatePath = join(resolvedUserDataDir, \"Local State\");\n if (!existsSync(localStatePath)) {\n return [];\n }\n\n try {\n const raw = JSON.parse(readFileSync(localStatePath, \"utf8\")) as {\n readonly profile?: {\n readonly info_cache?: Record<string, unknown>;\n };\n };\n const infoCache = raw.profile?.info_cache;\n if (!infoCache || typeof infoCache !== \"object\") {\n return [];\n }\n\n return Object.entries(infoCache)\n .map(([directory, info]) => {\n const record =\n info && typeof info === \"object\" && !Array.isArray(info)\n ? (info as Record<string, unknown>)\n : {};\n const name =\n typeof record.name === \"string\" && record.name.trim().length > 0\n ? record.name.trim()\n : directory || basename(directory);\n return {\n directory,\n name,\n userDataDir: resolvedUserDataDir,\n };\n })\n .filter((profile) => profile.directory.trim().length > 0)\n .sort((left, right) => left.directory.localeCompare(right.directory));\n } catch {\n return [];\n }\n}\n\nexport function readDevToolsActivePort(userDataDir: string): {\n readonly port: number;\n readonly webSocketPath: string;\n} | null {\n const devToolsPath = join(userDataDir, \"DevToolsActivePort\");\n if (!existsSync(devToolsPath)) {\n return null;\n }\n\n try {\n const lines = readFileSync(devToolsPath, \"utf8\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const port = Number.parseInt(lines[0] ?? \"\", 10);\n if (!Number.isInteger(port) || port <= 0) {\n return null;\n }\n\n return {\n port,\n webSocketPath: lines[1] ?? \"/devtools/browser\",\n };\n } catch {\n return null;\n }\n}\n\nexport function firstExistingPath(\n candidates: readonly (string | null | undefined)[],\n): string | null {\n for (const candidate of candidates) {\n if (candidate && existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport function resolveBinaryFromPath(name: string): string | null {\n try {\n const output = execFileSync(\"which\", [name], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return output.length > 0 ? output : null;\n } catch {\n return null;\n }\n}\n","import { detectLocalBrowserInstallations, readDevToolsActivePort } from \"./chrome-discovery.js\";\nimport type { InspectedCdpEndpoint, LocalCdpBrowserCandidate } from \"./types.js\";\n\nconst DEFAULT_DISCOVERY_TIMEOUT_MS = 2_000;\nconst DISCOVERY_FALLBACK_PORT = 9222;\n\ninterface InspectCdpEndpointInput {\n readonly endpoint: string;\n readonly headers?: Readonly<Record<string, string>>;\n readonly timeoutMs?: number;\n}\n\ninterface ProbeCdpEndpointInput extends InspectCdpEndpointInput {\n readonly fallbackBrowserWebSocketPath?: string;\n}\n\ninterface NormalizedProbeTarget {\n readonly fallbackBrowserWebSocketUrl?: string;\n readonly httpUrl: URL;\n}\n\ninterface CdpVersionResponse {\n readonly Browser?: string;\n readonly \"Protocol-Version\"?: string;\n readonly webSocketDebuggerUrl?: string;\n}\n\nexport class OpensteerAttachAmbiguousError extends Error {\n readonly code = \"attach-ambiguous\";\n\n constructor(readonly candidates: readonly LocalCdpBrowserCandidate[]) {\n super(\n \"Multiple running Chromium DevTools endpoints were discovered. Specify the desired endpoint explicitly.\",\n );\n this.name = \"OpensteerAttachAmbiguousError\";\n }\n}\n\nexport async function inspectCdpEndpoint(\n input: InspectCdpEndpointInput,\n): Promise<InspectedCdpEndpoint> {\n const inspected = await probeCdpEndpoint(input);\n if (inspected === null) {\n throw new Error(`Could not inspect CDP endpoint \"${input.endpoint}\".`);\n }\n return inspected;\n}\n\nexport async function discoverLocalCdpBrowsers(\n input: {\n readonly timeoutMs?: number;\n } = {},\n): Promise<readonly LocalCdpBrowserCandidate[]> {\n const timeoutMs = input.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;\n const candidates: LocalCdpBrowserCandidate[] = [];\n\n for (const installation of detectLocalBrowserInstallations()) {\n const activePort = readDevToolsActivePort(installation.userDataDir);\n if (!activePort) {\n continue;\n }\n\n const inspected = await probeCdpEndpoint({\n endpoint: `http://127.0.0.1:${String(activePort.port)}`,\n timeoutMs,\n fallbackBrowserWebSocketPath: activePort.webSocketPath,\n });\n if (inspected === null) {\n continue;\n }\n\n candidates.push({\n ...inspected,\n source: \"devtools-active-port\",\n installationBrand: installation.brand,\n userDataDir: installation.userDataDir,\n });\n }\n\n const fallbackCandidate = await probeCdpEndpoint({\n endpoint: String(DISCOVERY_FALLBACK_PORT),\n timeoutMs,\n });\n if (fallbackCandidate !== null) {\n candidates.push({\n ...fallbackCandidate,\n source: \"fallback-port\",\n });\n }\n\n return dedupeAndSortCandidates(candidates);\n}\n\nexport async function selectAttachBrowserCandidate(\n input: {\n readonly timeoutMs?: number;\n } = {},\n): Promise<LocalCdpBrowserCandidate> {\n const candidates = await discoverLocalCdpBrowsers(input);\n if (candidates.length === 0) {\n throw new Error(\n \"No running Chromium browser instance found. Enable remote debugging or specify an attach endpoint explicitly.\",\n );\n }\n\n const highestPriority = Math.max(...candidates.map(getAttachCandidatePriority));\n const winners = candidates.filter(\n (candidate) => getAttachCandidatePriority(candidate) === highestPriority,\n );\n if (winners.length === 1) {\n return winners[0]!;\n }\n\n throw new OpensteerAttachAmbiguousError(candidates);\n}\n\nasync function probeCdpEndpoint(\n input: ProbeCdpEndpointInput,\n): Promise<InspectedCdpEndpoint | null> {\n const trimmedEndpoint = input.endpoint.trim();\n if (!trimmedEndpoint) {\n return null;\n }\n\n const target = normalizeProbeTarget(trimmedEndpoint);\n const timeoutMs = input.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;\n\n const versionPayload = await fetchJson<CdpVersionResponse>(\n new URL(\"/json/version\", target.httpUrl),\n input.headers,\n timeoutMs,\n );\n if (versionPayload !== null) {\n const payload = versionPayload;\n if (\n typeof payload.webSocketDebuggerUrl === \"string\" &&\n payload.webSocketDebuggerUrl.length > 0\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: rewriteBrowserWebSocketHost(\n payload.webSocketDebuggerUrl,\n target.httpUrl,\n ),\n httpUrl: target.httpUrl,\n ...(payload.Browser === undefined ? {} : { browser: payload.Browser }),\n ...(payload[\"Protocol-Version\"] === undefined\n ? {}\n : { protocolVersion: payload[\"Protocol-Version\"] }),\n });\n }\n }\n\n const listPayload = await fetchJson<\n readonly {\n readonly type?: unknown;\n readonly webSocketDebuggerUrl?: unknown;\n }[]\n >(new URL(\"/json/list\", target.httpUrl), input.headers, timeoutMs);\n if (listPayload !== null) {\n const browserTarget =\n listPayload.find((candidate) => candidate.type === \"browser\") ??\n listPayload.find((candidate) => typeof candidate.webSocketDebuggerUrl === \"string\");\n if (typeof browserTarget?.webSocketDebuggerUrl === \"string\") {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: rewriteBrowserWebSocketHost(\n browserTarget.webSocketDebuggerUrl,\n target.httpUrl,\n ),\n httpUrl: target.httpUrl,\n });\n }\n }\n\n if (\n input.fallbackBrowserWebSocketPath !== undefined &&\n (await isHttpEndpointReachable(target.httpUrl, timeoutMs))\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: buildBrowserWebSocketUrl(\n target.httpUrl,\n input.fallbackBrowserWebSocketPath,\n ),\n httpUrl: target.httpUrl,\n });\n }\n\n if (\n target.fallbackBrowserWebSocketUrl !== undefined &&\n (await isHttpEndpointReachable(target.httpUrl, timeoutMs))\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: target.fallbackBrowserWebSocketUrl,\n httpUrl: target.httpUrl,\n });\n }\n\n return null;\n}\n\nfunction dedupeAndSortCandidates(\n candidates: readonly LocalCdpBrowserCandidate[],\n): readonly LocalCdpBrowserCandidate[] {\n const deduped = new Map<string, LocalCdpBrowserCandidate>();\n\n for (const candidate of [...candidates].sort(compareCandidates)) {\n const existing = deduped.get(candidate.endpoint);\n if (!existing || compareCandidates(candidate, existing) < 0) {\n deduped.set(candidate.endpoint, candidate);\n }\n }\n\n return [...deduped.values()].sort(compareCandidates);\n}\n\nfunction compareCandidates(\n left: LocalCdpBrowserCandidate,\n right: LocalCdpBrowserCandidate,\n): number {\n return (\n getAttachCandidatePriority(right) - getAttachCandidatePriority(left) ||\n left.endpoint.localeCompare(right.endpoint) ||\n (left.userDataDir ?? \"\").localeCompare(right.userDataDir ?? \"\")\n );\n}\n\nfunction getAttachCandidatePriority(candidate: LocalCdpBrowserCandidate): number {\n return candidate.source === \"devtools-active-port\" ? 2 : 1;\n}\n\nfunction createInspectedCdpEndpoint(input: {\n readonly browser?: string;\n readonly browserWebSocketUrl: string;\n readonly httpUrl: URL;\n readonly protocolVersion?: string;\n}): InspectedCdpEndpoint {\n const port = readPort(input.httpUrl);\n return {\n endpoint: input.browserWebSocketUrl,\n ...(input.browser === undefined ? {} : { browser: input.browser }),\n ...(input.protocolVersion === undefined ? {} : { protocolVersion: input.protocolVersion }),\n httpUrl: input.httpUrl.toString(),\n ...(port === undefined ? {} : { port }),\n };\n}\n\nfunction normalizeProbeTarget(endpoint: string): NormalizedProbeTarget {\n if (/^\\d+$/.test(endpoint)) {\n return {\n httpUrl: new URL(`http://127.0.0.1:${endpoint}`),\n };\n }\n\n if (endpoint.startsWith(\"ws://\") || endpoint.startsWith(\"wss://\")) {\n const url = new URL(endpoint);\n return {\n fallbackBrowserWebSocketUrl: url.toString(),\n httpUrl: new URL(`${url.protocol === \"wss:\" ? \"https:\" : \"http:\"}//${url.host}`),\n };\n }\n\n try {\n const url =\n endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")\n ? new URL(endpoint)\n : new URL(`http://${endpoint}`);\n return {\n httpUrl: new URL(`${url.protocol}//${url.host}`),\n };\n } catch {\n throw new Error(`Invalid CDP endpoint \"${endpoint}\".`);\n }\n}\n\nasync function fetchJson<T>(\n url: URL,\n headers: Readonly<Record<string, string>> | undefined,\n timeoutMs: number,\n): Promise<T | null> {\n const response = await fetch(url, {\n ...(headers === undefined ? {} : { headers }),\n signal: AbortSignal.timeout(timeoutMs),\n }).catch(() => null);\n if (!response?.ok) {\n return null;\n }\n\n return (await response.json()) as T;\n}\n\nasync function isHttpEndpointReachable(url: URL, timeoutMs: number): Promise<boolean> {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(timeoutMs),\n }).catch(() => null);\n return response !== null;\n}\n\nfunction buildBrowserWebSocketUrl(httpUrl: URL, webSocketPath: string): string {\n const protocol = httpUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return `${protocol}//${httpUrl.host}${normalizeWebSocketPath(webSocketPath)}`;\n}\n\nfunction normalizeWebSocketPath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nfunction rewriteBrowserWebSocketHost(browserWsUrl: string, requestedUrl: URL): string {\n try {\n const parsed = new URL(browserWsUrl);\n parsed.protocol = requestedUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n parsed.hostname = requestedUrl.hostname;\n parsed.port = requestedUrl.port;\n return parsed.toString();\n } catch {\n return browserWsUrl;\n }\n}\n\nfunction readPort(url: URL): number | undefined {\n const port = Number.parseInt(url.port, 10);\n return Number.isInteger(port) && port > 0 ? port : undefined;\n}\n","export type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\nexport type JsonArray = readonly JsonValue[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction canonicalizeJsonValue(value: unknown, path: string): JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new TypeError(`${path} must be a finite JSON number`);\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry, index) => canonicalizeJsonValue(entry, `${path}[${index}]`));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(`${path} must be a plain JSON object`);\n }\n\n const sorted = Object.keys(value).sort((left, right) => left.localeCompare(right));\n const result: Record<string, JsonValue> = {};\n\n for (const key of sorted) {\n const entry = value[key];\n if (entry === undefined) {\n throw new TypeError(`${path}.${key} must not be undefined`);\n }\n\n result[key] = canonicalizeJsonValue(entry, `${path}.${key}`);\n }\n\n return result;\n}\n\nexport function toCanonicalJsonValue(value: unknown): JsonValue {\n return canonicalizeJsonValue(value, \"value\");\n}\n\nexport function canonicalJsonString(value: unknown): string {\n return JSON.stringify(toCanonicalJsonValue(value));\n}\n\nexport function stableJsonString(value: unknown): string {\n return `${JSON.stringify(toCanonicalJsonValue(value), null, 2)}\\n`;\n}\n","import { access, mkdir, open, readFile, readdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { stableJsonString } from \"../json.js\";\n\nconst LOCK_RETRY_DELAYS_MS = [1, 2, 5, 10, 20, 50] as const;\n\nexport function normalizeNonEmptyString(name: string, value: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new TypeError(`${name} must not be empty`);\n }\n\n return normalized;\n}\n\nexport function normalizeTimestamp(name: string, value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n\n return value;\n}\n\nexport function encodePathSegment(value: string): string {\n return encodeURIComponent(normalizeNonEmptyString(\"path segment\", value));\n}\n\nexport function joinStoragePath(...segments: readonly string[]): string {\n return segments.join(\"/\");\n}\n\nexport function resolveStoragePath(rootPath: string, relativePath: string): string {\n if (path.isAbsolute(relativePath)) {\n throw new TypeError(`storage path ${relativePath} must be relative`);\n }\n\n const segments = relativePath.split(\"/\");\n if (segments.length === 0 || segments.some((segment) => segment.length === 0)) {\n throw new TypeError(`storage path ${relativePath} is invalid`);\n }\n\n for (const segment of segments) {\n if (segment === \".\" || segment === \"..\") {\n throw new TypeError(`storage path ${relativePath} must not contain path traversal`);\n }\n }\n\n return path.join(rootPath, ...segments);\n}\n\nexport async function ensureDirectory(directoryPath: string): Promise<void> {\n await mkdir(directoryPath, { recursive: true });\n}\n\nexport async function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T;\n}\n\nexport async function writeJsonFileAtomic(filePath: string, value: unknown): Promise<void> {\n await writeTextFileAtomic(filePath, stableJsonString(value));\n}\n\nasync function writeTextFileAtomic(filePath: string, value: string): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n const temporaryPath = `${filePath}.${randomUUID()}.tmp`;\n\n await writeFile(temporaryPath, value, \"utf8\");\n await rename(temporaryPath, filePath);\n}\n\nexport async function writeJsonFileExclusive(filePath: string, value: unknown): Promise<void> {\n await writeTextFileExclusive(filePath, stableJsonString(value));\n}\n\nasync function writeTextFileExclusive(filePath: string, value: string): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n const handle = await open(filePath, \"wx\");\n\n try {\n await handle.writeFile(value, \"utf8\");\n } finally {\n await handle.close();\n }\n}\n\nexport async function writeBufferIfMissing(filePath: string, value: Uint8Array): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n\n try {\n const handle = await open(filePath, \"wx\");\n try {\n await handle.writeFile(value);\n } finally {\n await handle.close();\n }\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nexport async function readBinaryFile(filePath: string): Promise<Uint8Array> {\n return new Uint8Array(await readFile(filePath));\n}\n\nexport async function listJsonFiles(directoryPath: string): Promise<readonly string[]> {\n if (!(await pathExists(directoryPath))) {\n return [];\n }\n\n return (await readdir(directoryPath))\n .filter((entry) => entry.endsWith(\".json\"))\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport function sha256Hex(value: Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function filePathToUri(filePath: string): string {\n return pathToFileURL(filePath).toString();\n}\n\nexport function fileUriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return (error as NodeJS.ErrnoException | undefined)?.code === \"EEXIST\";\n}\n\nexport async function withFilesystemLock<T>(lockPath: string, task: () => Promise<T>): Promise<T> {\n await ensureDirectory(path.dirname(lockPath));\n\n let attempt = 0;\n while (true) {\n try {\n await mkdir(lockPath);\n break;\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n throw error;\n }\n\n const delayMs = LOCK_RETRY_DELAYS_MS[Math.min(attempt, LOCK_RETRY_DELAYS_MS.length - 1)];\n attempt += 1;\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n try {\n return await task();\n } finally {\n await rm(lockPath, { recursive: true, force: true });\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { OpensteerSessionCapabilities } from \"@opensteer/protocol\";\n\nimport { pathExists, readJsonFile, writeJsonFileAtomic } from \"./internal/filesystem.js\";\n\nexport const OPENSTEER_LIVE_SESSION_LAYOUT = \"opensteer-session\";\nexport const OPENSTEER_LIVE_SESSION_VERSION = 1;\n\nexport type OpensteerLiveSessionProvider = \"local\" | \"cloud\";\n\ninterface PersistedSessionRecordBase {\n readonly layout: typeof OPENSTEER_LIVE_SESSION_LAYOUT;\n readonly version: typeof OPENSTEER_LIVE_SESSION_VERSION;\n readonly provider: OpensteerLiveSessionProvider;\n readonly workspace?: string;\n readonly updatedAt: number;\n readonly activePageRef?: string;\n readonly reconnectable?: boolean;\n readonly capabilities?: OpensteerSessionCapabilities;\n}\n\nexport interface PersistedLocalBrowserSessionRecord extends PersistedSessionRecordBase {\n readonly provider: \"local\";\n readonly engine: \"playwright\" | \"abp\";\n readonly endpoint?: string;\n readonly baseUrl?: string;\n readonly remoteDebuggingUrl?: string;\n readonly sessionDir?: string;\n readonly pid: number;\n readonly startedAt: number;\n readonly executablePath?: string;\n readonly userDataDir: string;\n}\n\nexport interface PersistedCloudSessionRecord extends PersistedSessionRecordBase {\n readonly provider: \"cloud\";\n readonly sessionId: string;\n readonly startedAt: number;\n}\n\nexport type PersistedSessionRecord =\n | PersistedLocalBrowserSessionRecord\n | PersistedCloudSessionRecord;\n\nexport function resolveLiveSessionRecordPath(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): string {\n return path.join(rootPath, \"live\", provider === \"local\" ? \"local.json\" : \"cloud.json\");\n}\n\nexport function resolveLocalSessionRecordPath(rootPath: string): string {\n return resolveLiveSessionRecordPath(rootPath, \"local\");\n}\n\nexport function resolveCloudSessionRecordPath(rootPath: string): string {\n return resolveLiveSessionRecordPath(rootPath, \"cloud\");\n}\n\nexport async function readPersistedSessionRecord(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): Promise<PersistedSessionRecord | undefined> {\n const sessionPath = resolveLiveSessionRecordPath(rootPath, provider);\n if (!(await pathExists(sessionPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedSessionRecord>>(sessionPath);\n if (provider === \"local\" && isPersistedLocalBrowserSessionRecord(parsed)) {\n return parsed;\n }\n if (provider === \"cloud\" && isPersistedCloudSessionRecord(parsed)) {\n return parsed;\n }\n return undefined;\n}\n\nexport async function readPersistedCloudSessionRecord(\n rootPath: string,\n): Promise<PersistedCloudSessionRecord | undefined> {\n const record = await readPersistedSessionRecord(rootPath, \"cloud\");\n return record?.provider === \"cloud\" ? record : undefined;\n}\n\nexport async function readPersistedLocalBrowserSessionRecord(\n rootPath: string,\n): Promise<PersistedLocalBrowserSessionRecord | undefined> {\n const record = await readPersistedSessionRecord(rootPath, \"local\");\n return record?.provider === \"local\" ? record : undefined;\n}\n\nexport async function writePersistedSessionRecord(\n rootPath: string,\n record: PersistedSessionRecord,\n): Promise<void> {\n await writeJsonFileAtomic(resolveLiveSessionRecordPath(rootPath, record.provider), record);\n}\n\nexport async function clearPersistedSessionRecord(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): Promise<void> {\n await rm(resolveLiveSessionRecordPath(rootPath, provider), { force: true });\n}\n\nfunction isPersistedCloudSessionRecord(\n value: Partial<PersistedCloudSessionRecord> | Partial<PersistedSessionRecord>,\n): value is PersistedCloudSessionRecord {\n return (\n value.layout === OPENSTEER_LIVE_SESSION_LAYOUT &&\n value.version === OPENSTEER_LIVE_SESSION_VERSION &&\n value.provider === \"cloud\" &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n\nfunction isPersistedLocalBrowserSessionRecord(\n value: Partial<PersistedLocalBrowserSessionRecord> | Partial<PersistedSessionRecord>,\n): value is PersistedLocalBrowserSessionRecord {\n return (\n value.layout === OPENSTEER_LIVE_SESSION_LAYOUT &&\n value.version === OPENSTEER_LIVE_SESSION_VERSION &&\n value.provider === \"local\" &&\n (value.engine === \"playwright\" || value.engine === \"abp\") &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt) &&\n typeof value.userDataDir === \"string\" &&\n value.userDataDir.length > 0\n );\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport function resolveOpensteerStateDir(): string {\n const explicit = process.env.OPENSTEER_HOME?.trim();\n if (explicit) {\n return path.resolve(explicit);\n }\n\n if (process.platform === \"win32\") {\n return path.join(\n process.env.LOCALAPPDATA ?? path.join(homedir(), \"AppData\", \"Local\"),\n \"Opensteer\",\n );\n }\n\n if (process.platform === \"darwin\") {\n return path.join(homedir(), \"Library\", \"Application Support\", \"Opensteer\");\n }\n\n return path.join(\n process.env.XDG_STATE_HOME ?? path.join(homedir(), \".local\", \"state\"),\n \"opensteer\",\n );\n}\n\nexport function resolveLocalViewRootDir(): string {\n return path.join(resolveOpensteerStateDir(), \"local-view\");\n}\n\nexport function resolveLocalViewPreferencesPath(): string {\n return path.join(resolveLocalViewRootDir(), \"preferences.json\");\n}\n\nexport function resolveLocalViewServiceDir(): string {\n return path.join(resolveLocalViewRootDir(), \"service\");\n}\n\nexport function resolveLocalViewSessionsDir(): string {\n return path.join(resolveLocalViewRootDir(), \"sessions\");\n}\n\nexport function resolveLocalViewServiceLockDir(): string {\n return path.join(resolveLocalViewServiceDir(), \"startup.lock\");\n}\n\nexport function resolveLocalViewServiceStatePath(): string {\n return path.join(resolveLocalViewServiceDir(), \"state.json\");\n}\n","import { createHash } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { OpensteerSessionOwnership } from \"@opensteer/protocol\";\n\nimport {\n ensureDirectory,\n listJsonFiles,\n pathExists,\n readJsonFile,\n writeJsonFileAtomic,\n} from \"../internal/filesystem.js\";\nimport type { PersistedLocalBrowserSessionRecord } from \"../live-session.js\";\nimport { resolveLocalViewSessionsDir } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT = \"opensteer-local-view-session\";\nexport const OPENSTEER_LOCAL_VIEW_SESSION_VERSION = 1;\n\nexport interface PersistedLocalViewSessionManifest {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_SESSION_VERSION;\n readonly sessionId: string;\n readonly rootPath: string;\n readonly workspace?: string;\n readonly engine: PersistedLocalBrowserSessionRecord[\"engine\"];\n readonly ownership: OpensteerSessionOwnership;\n readonly pid: number;\n readonly startedAt: number;\n readonly updatedAt: number;\n}\n\nexport function buildLocalViewSessionId(input: {\n readonly rootPath: string;\n readonly pid: number;\n readonly startedAt: number;\n}): string {\n const hash = createHash(\"sha256\")\n .update(`${input.rootPath}\\n${String(input.pid)}\\n${String(input.startedAt)}`)\n .digest(\"hex\");\n return `local_${hash.slice(0, 24)}`;\n}\n\nexport function createLocalViewSessionManifest(input: {\n readonly rootPath: string;\n readonly workspace?: string;\n readonly live: PersistedLocalBrowserSessionRecord;\n readonly ownership: OpensteerSessionOwnership;\n}): PersistedLocalViewSessionManifest {\n return {\n layout: OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT,\n version: OPENSTEER_LOCAL_VIEW_SESSION_VERSION,\n sessionId: buildLocalViewSessionId({\n rootPath: input.rootPath,\n pid: input.live.pid,\n startedAt: input.live.startedAt,\n }),\n rootPath: input.rootPath,\n ...(input.workspace === undefined ? {} : { workspace: input.workspace }),\n engine: input.live.engine,\n ownership: input.ownership,\n pid: input.live.pid,\n startedAt: input.live.startedAt,\n updatedAt: Date.now(),\n };\n}\n\nexport async function writeLocalViewSessionManifest(\n manifest: PersistedLocalViewSessionManifest,\n): Promise<void> {\n await ensureDirectory(resolveLocalViewSessionsDir());\n await writeJsonFileAtomic(resolveLocalViewSessionManifestPath(manifest.sessionId), manifest);\n}\n\nexport async function deleteLocalViewSessionManifest(sessionId: string): Promise<void> {\n await rm(resolveLocalViewSessionManifestPath(sessionId), { force: true }).catch(() => undefined);\n}\n\nexport async function readLocalViewSessionManifest(\n sessionId: string,\n): Promise<PersistedLocalViewSessionManifest | undefined> {\n const manifestPath = resolveLocalViewSessionManifestPath(sessionId);\n if (!(await pathExists(manifestPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewSessionManifest>>(manifestPath);\n return isPersistedLocalViewSessionManifest(parsed) ? parsed : undefined;\n}\n\nexport async function listLocalViewSessionManifests(): Promise<\n readonly PersistedLocalViewSessionManifest[]\n> {\n const directoryPath = resolveLocalViewSessionsDir();\n const fileNames = await listJsonFiles(directoryPath);\n const manifests = await Promise.all(\n fileNames.map(async (fileName) => {\n const parsed = await readJsonFile<Partial<PersistedLocalViewSessionManifest>>(\n path.join(directoryPath, fileName),\n ).catch(() => undefined);\n return isPersistedLocalViewSessionManifest(parsed) ? parsed : undefined;\n }),\n );\n return manifests\n .filter((manifest): manifest is PersistedLocalViewSessionManifest => manifest !== undefined)\n .sort(\n (left, right) =>\n left.startedAt - right.startedAt || left.sessionId.localeCompare(right.sessionId),\n );\n}\n\nexport function resolveLocalViewSessionManifestPath(sessionId: string): string {\n return path.join(resolveLocalViewSessionsDir(), `${sessionId}.json`);\n}\n\nfunction isPersistedLocalViewSessionManifest(\n value: Partial<PersistedLocalViewSessionManifest> | null | undefined,\n): value is PersistedLocalViewSessionManifest {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_SESSION_VERSION &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.rootPath === \"string\" &&\n value.rootPath.length > 0 &&\n (value.engine === \"playwright\" || value.engine === \"abp\") &&\n (value.ownership === \"owned\" ||\n value.ownership === \"attached\" ||\n value.ownership === \"managed\") &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst PROCESS_STARTED_AT_MS = Math.floor(Date.now() - process.uptime() * 1_000);\nconst PROCESS_START_TIME_TOLERANCE_MS = 1_000;\nconst PROCESS_LIST_MAX_BUFFER_BYTES = 16 * 1024 * 1024;\nconst PS_COMMAND_ENV = { ...process.env, LC_ALL: \"C\" };\nconst LINUX_STAT_START_TIME_FIELD_INDEX = 19;\n\nexport interface ProcessOwner {\n readonly pid: number;\n readonly processStartedAtMs: number;\n}\n\nexport type ProcessLiveness = \"live\" | \"dead\" | \"unknown\";\n\nexport const CURRENT_PROCESS_OWNER: ProcessOwner = {\n pid: process.pid,\n processStartedAtMs: PROCESS_STARTED_AT_MS,\n};\n\nlet linuxClockTicksPerSecondPromise: Promise<number | null> | null = null;\n\nexport function parseProcessOwner(value: unknown): ProcessOwner | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const parsed = value as Partial<ProcessOwner>;\n const pid = Number(parsed.pid);\n const processStartedAtMs = Number(parsed.processStartedAtMs);\n if (!Number.isInteger(pid) || pid <= 0) {\n return null;\n }\n if (!Number.isInteger(processStartedAtMs) || processStartedAtMs <= 0) {\n return null;\n }\n\n return {\n pid,\n processStartedAtMs,\n };\n}\n\nexport function processOwnersEqual(left: ProcessOwner | null, right: ProcessOwner | null): boolean {\n if (!left || !right) {\n return left === right;\n }\n\n return left.pid === right.pid && left.processStartedAtMs === right.processStartedAtMs;\n}\n\nexport async function getProcessLiveness(owner: ProcessOwner): Promise<ProcessLiveness> {\n if (\n owner.pid === process.pid &&\n hasMatchingProcessStartTime(owner.processStartedAtMs, PROCESS_STARTED_AT_MS)\n ) {\n return \"live\";\n }\n\n const startedAtMs = await readProcessStartedAtMs(owner.pid);\n if (typeof startedAtMs === \"number\") {\n return hasMatchingProcessStartTime(owner.processStartedAtMs, startedAtMs) ? \"live\" : \"dead\";\n }\n\n return isProcessRunning(owner.pid) ? \"unknown\" : \"dead\";\n}\n\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code =\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\"\n ? error.code\n : undefined;\n return code !== \"ESRCH\";\n }\n}\n\nexport async function readProcessOwner(pid: number): Promise<ProcessOwner | null> {\n const processStartedAtMs = await readProcessStartedAtMs(pid);\n if (processStartedAtMs === null) {\n return null;\n }\n\n return {\n pid,\n processStartedAtMs,\n };\n}\n\nfunction hasMatchingProcessStartTime(\n expectedStartedAtMs: number,\n actualStartedAtMs: number,\n): boolean {\n return Math.abs(expectedStartedAtMs - actualStartedAtMs) <= PROCESS_START_TIME_TOLERANCE_MS;\n}\n\nasync function readProcessStartedAtMs(pid: number): Promise<number | null> {\n if (pid <= 0) {\n return null;\n }\n\n if (process.platform === \"linux\") {\n return readLinuxProcessStartedAtMs(pid);\n }\n\n if (process.platform === \"win32\") {\n return readWindowsProcessStartedAtMs(pid);\n }\n\n return readPsProcessStartedAtMs(pid);\n}\n\nasync function readLinuxProcessStartedAtMs(pid: number): Promise<number | null> {\n let statRaw: string;\n try {\n statRaw = await readFile(`/proc/${String(pid)}/stat`, \"utf8\");\n } catch {\n return null;\n }\n\n const startTicks = parseLinuxProcessStartTicks(statRaw);\n if (startTicks === null) {\n return null;\n }\n\n const [bootTimeMs, clockTicksPerSecond] = await Promise.all([\n readLinuxBootTimeMs(),\n readLinuxClockTicksPerSecond(),\n ]);\n if (bootTimeMs === null || clockTicksPerSecond === null) {\n return null;\n }\n\n return Math.floor(bootTimeMs + (startTicks * 1_000) / clockTicksPerSecond);\n}\n\nfunction parseLinuxProcessStartTicks(statRaw: string): number | null {\n const closingParenIndex = statRaw.lastIndexOf(\")\");\n if (closingParenIndex === -1) {\n return null;\n }\n\n const fields = statRaw\n .slice(closingParenIndex + 2)\n .trim()\n .split(/\\s+/);\n const startTicks = Number(fields[LINUX_STAT_START_TIME_FIELD_INDEX]);\n return Number.isFinite(startTicks) && startTicks >= 0 ? startTicks : null;\n}\n\nasync function readLinuxBootTimeMs(): Promise<number | null> {\n try {\n const statRaw = await readFile(\"/proc/stat\", \"utf8\");\n const bootTimeLine = statRaw.split(\"\\n\").find((line) => line.startsWith(\"btime \"));\n if (!bootTimeLine) {\n return null;\n }\n\n const bootTimeSeconds = Number.parseInt(bootTimeLine.slice(\"btime \".length), 10);\n return Number.isFinite(bootTimeSeconds) ? bootTimeSeconds * 1_000 : null;\n } catch {\n return null;\n }\n}\n\nasync function readLinuxClockTicksPerSecond(): Promise<number | null> {\n if (!linuxClockTicksPerSecondPromise) {\n linuxClockTicksPerSecondPromise = execFileAsync(\"getconf\", [\"CLK_TCK\"], {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n })\n .then(({ stdout }) => {\n const value = Number.parseInt(stdout.trim(), 10);\n return Number.isFinite(value) && value > 0 ? value : null;\n })\n .catch(() => null);\n }\n\n return linuxClockTicksPerSecondPromise;\n}\n\nasync function readWindowsProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-Command\",\n `(Get-Process -Id ${String(pid)}).StartTime.ToUniversalTime().ToString(\"o\")`,\n ],\n {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n },\n );\n const isoTimestamp = stdout.trim();\n if (!isoTimestamp) {\n return null;\n }\n const startedAtMs = Date.parse(isoTimestamp);\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n\nasync function readPsProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env: PS_COMMAND_ENV,\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n });\n const startedAt = stdout.trim();\n if (!startedAt) {\n return null;\n }\n\n const startedAtMs = Date.parse(startedAt.replace(/\\s+/g, \" \"));\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n","import { rm } from \"node:fs/promises\";\n\nimport { pathExists, readJsonFile, writeJsonFileAtomic } from \"../internal/filesystem.js\";\nimport { getProcessLiveness, type ProcessLiveness } from \"../local-browser/process-owner.js\";\nimport { resolveLocalViewServiceStatePath } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT = \"opensteer-local-view-service\";\nexport const OPENSTEER_LOCAL_VIEW_SERVICE_VERSION = 3;\n\nexport interface PersistedLocalViewServiceState {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_SERVICE_VERSION;\n readonly pid: number;\n readonly processStartedAtMs: number;\n readonly startedAt: number;\n readonly port: number;\n readonly token: string;\n readonly url: string;\n}\n\nexport async function readLocalViewServiceState(): Promise<\n PersistedLocalViewServiceState | undefined\n> {\n const statePath = resolveLocalViewServiceStatePath();\n if (!(await pathExists(statePath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewServiceState>>(statePath);\n if (!isPersistedLocalViewServiceState(parsed)) {\n return undefined;\n }\n\n return parsed;\n}\n\nexport async function writeLocalViewServiceState(\n state: PersistedLocalViewServiceState,\n): Promise<void> {\n await writeJsonFileAtomic(resolveLocalViewServiceStatePath(), state);\n}\n\nexport async function clearLocalViewServiceState(\n match:\n | {\n readonly pid: number;\n readonly token: string;\n }\n | undefined = undefined,\n): Promise<void> {\n if (match !== undefined) {\n const current = await readLocalViewServiceState();\n if (current === undefined || current.pid !== match.pid || current.token !== match.token) {\n return;\n }\n }\n\n await rm(resolveLocalViewServiceStatePath(), { force: true });\n}\n\nexport async function isLocalViewServiceStateLive(\n state: PersistedLocalViewServiceState | undefined,\n): Promise<boolean> {\n return (await getLocalViewServiceStateLiveness(state)) !== \"dead\";\n}\n\nexport async function getLocalViewServiceStateLiveness(\n state: PersistedLocalViewServiceState | undefined,\n): Promise<ProcessLiveness> {\n if (state === undefined) {\n return \"dead\";\n }\n\n return getProcessLiveness({\n pid: state.pid,\n processStartedAtMs: state.processStartedAtMs,\n });\n}\n\nfunction isPersistedLocalViewServiceState(\n value: Partial<PersistedLocalViewServiceState> | null | undefined,\n): value is PersistedLocalViewServiceState {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_SERVICE_VERSION &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.processStartedAtMs === \"number\" &&\n Number.isFinite(value.processStartedAtMs) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.port === \"number\" &&\n Number.isFinite(value.port) &&\n typeof value.token === \"string\" &&\n value.token.length > 0 &&\n typeof value.url === \"string\" &&\n value.url.length > 0\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-view/resolve-browser-websocket.ts","../src/local-view/discovery.ts","../src/local-view/runtime-state.ts","../src/local-view/ws-types.ts","../src/local-view/cdp-proxy.ts","../src/local-view/tab-state-tracker.ts","../src/local-view/view-stream-capture-policy.ts","../src/local-view/view-stream-protocol.ts","../src/local-view/view-stream.ts","../src/local-view/server.ts","../src/local-view/serve.ts"],"names":["path","wsModule","WebSocket","url","randomBytes"],"mappings":"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","file":"chunk-ZRF7WMS3.js","sourcesContent":["import { inspectCdpEndpoint } from \"../local-browser/cdp-discovery.js\";\nimport type { PersistedLocalBrowserSessionRecord } from \"../live-session.js\";\n\nexport async function resolveBrowserWebSocketUrl(\n record: PersistedLocalBrowserSessionRecord,\n): Promise<string> {\n if (record.engine === \"playwright\") {\n if (!record.endpoint) {\n throw new Error(\"Local Playwright session is missing a browser WebSocket endpoint.\");\n }\n return record.endpoint;\n }\n\n if (!record.remoteDebuggingUrl) {\n throw new Error(\"Local ABP session is missing a remote debugging URL.\");\n }\n\n const inspected = await inspectCdpEndpoint({\n endpoint: record.remoteDebuggingUrl,\n timeoutMs: 5_000,\n });\n return inspected.endpoint;\n}\n","import path from \"node:path\";\n\nimport type { OpensteerLocalViewSessionSummary } from \"@opensteer/protocol\";\n\nimport { pathExists } from \"../internal/filesystem.js\";\nimport {\n readPersistedLocalBrowserSessionRecord,\n type PersistedLocalBrowserSessionRecord,\n} from \"../live-session.js\";\nimport { isProcessRunning } from \"../local-browser/process-owner.js\";\nimport {\n deleteLocalViewSessionManifest,\n listLocalViewSessionManifests,\n readLocalViewSessionManifest,\n type PersistedLocalViewSessionManifest,\n} from \"./session-manifest.js\";\nimport { resolveBrowserWebSocketUrl } from \"./resolve-browser-websocket.js\";\n\nexport interface ResolvedLocalViewSession {\n readonly manifest: PersistedLocalViewSessionManifest;\n readonly record: PersistedLocalBrowserSessionRecord;\n readonly browserWebSocketUrl: string;\n}\n\nexport async function listResolvedLocalViewSessions(): Promise<\n readonly OpensteerLocalViewSessionSummary[]\n> {\n const manifests = await listLocalViewSessionManifests();\n const resolved = await Promise.all(manifests.map((manifest) => resolveSessionSummary(manifest)));\n return resolved\n .filter((session): session is OpensteerLocalViewSessionSummary => session !== undefined)\n .sort(\n (left, right) => right.startedAt - left.startedAt || left.label.localeCompare(right.label),\n );\n}\n\nexport async function resolveLocalViewSession(\n sessionId: string,\n): Promise<ResolvedLocalViewSession | undefined> {\n const manifest = await readLocalViewSessionManifest(sessionId);\n if (!manifest) {\n return undefined;\n }\n\n return readResolvedLocalViewSession(manifest);\n}\n\nasync function resolveSessionSummary(\n manifest: PersistedLocalViewSessionManifest,\n): Promise<OpensteerLocalViewSessionSummary | undefined> {\n const record = await readLiveRecord(manifest);\n if (!record) {\n await deleteLocalViewSessionManifest(manifest.sessionId);\n return undefined;\n }\n\n const browserName = record.executablePath\n ? path.basename(record.executablePath).replace(/\\.[A-Za-z0-9]+$/u, \"\")\n : undefined;\n\n return {\n sessionId: manifest.sessionId,\n label: manifest.workspace ?? (path.basename(manifest.rootPath) || manifest.sessionId),\n status: isProcessRunning(record.pid) ? \"live\" : \"stale\",\n ...(manifest.workspace === undefined ? {} : { workspace: manifest.workspace }),\n rootPath: manifest.rootPath,\n engine: record.engine,\n ownership: manifest.ownership,\n pid: record.pid,\n startedAt: record.startedAt,\n ...(browserName === undefined ? {} : { browserName }),\n };\n}\n\nasync function readResolvedLocalViewSession(\n manifest: PersistedLocalViewSessionManifest,\n): Promise<ResolvedLocalViewSession | undefined> {\n const record = await readLiveRecord(manifest);\n if (!record) {\n await deleteLocalViewSessionManifest(manifest.sessionId);\n return undefined;\n }\n\n const browserWebSocketUrl = await resolveBrowserWebSocketUrl(record).catch(() => undefined);\n if (!browserWebSocketUrl) {\n return undefined;\n }\n\n return {\n manifest,\n record,\n browserWebSocketUrl,\n };\n}\n\nasync function readLiveRecord(\n manifest: PersistedLocalViewSessionManifest,\n): Promise<PersistedLocalBrowserSessionRecord | undefined> {\n if (!(await pathExists(manifest.rootPath))) {\n return undefined;\n }\n\n const record = await readPersistedLocalBrowserSessionRecord(manifest.rootPath);\n if (!record) {\n return undefined;\n }\n\n if (\n record.pid !== manifest.pid ||\n record.startedAt !== manifest.startedAt ||\n !isProcessRunning(record.pid)\n ) {\n return undefined;\n }\n\n return record;\n}\n","export interface PageActivationIntent {\n readonly targetId: string;\n readonly ts: number;\n}\n\nexport class LocalViewRuntimeState {\n private readonly activationIntentBySessionId = new Map<string, PageActivationIntent>();\n\n setPageActivationIntent(sessionId: string, targetId: string): void {\n this.activationIntentBySessionId.set(sessionId, {\n targetId,\n ts: Date.now(),\n });\n }\n\n getPageActivationIntent(sessionId: string): PageActivationIntent | undefined {\n return this.activationIntentBySessionId.get(sessionId);\n }\n\n clearPageActivationIntent(sessionId: string, targetId?: string): void {\n const current = this.activationIntentBySessionId.get(sessionId);\n if (!current) {\n return;\n }\n if (targetId !== undefined && current.targetId !== targetId) {\n return;\n }\n this.activationIntentBySessionId.delete(sessionId);\n }\n}\n","import type { IncomingMessage } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\n\nimport * as wsModule from \"ws\";\nimport WebSocket from \"ws\";\n\nexport interface LocalViewSocket {\n readonly readyState: number;\n readonly bufferedAmount: number;\n on(event: \"open\" | \"close\", listener: () => void): this;\n on(event: \"message\", listener: (data: WebSocket.RawData, isBinary: boolean) => void): this;\n on(event: \"error\", listener: (error: Error) => void): this;\n off(event: \"close\", listener: () => void): this;\n off(event: \"message\", listener: (data: WebSocket.RawData, isBinary: boolean) => void): this;\n send(\n data: WebSocket.RawData,\n options?: {\n readonly binary?: boolean;\n },\n callback?: (error?: Error) => void,\n ): void;\n close(code?: number, data?: string | Buffer): void;\n}\n\nexport interface LocalViewSocketServer {\n readonly clients: Set<LocalViewSocket>;\n on(\n event: \"connection\",\n listener: (socket: LocalViewSocket, request: IncomingMessage) => void,\n ): this;\n handleUpgrade(\n request: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n callback: (socket: LocalViewSocket) => void,\n ): void;\n emit(event: \"connection\", socket: LocalViewSocket, request: IncomingMessage): boolean;\n close(callback?: () => void): void;\n}\n\ninterface LocalViewSocketServerConstructor {\n new (options?: { readonly noServer?: boolean }): LocalViewSocketServer;\n}\n\nexport const LocalViewWebSocketServer = (\n wsModule as unknown as {\n readonly WebSocketServer: LocalViewSocketServerConstructor;\n }\n).WebSocketServer;\n","import type { IncomingMessage } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\n\nimport WebSocket from \"ws\";\n\nimport { resolveLocalViewSession } from \"./discovery.js\";\nimport { LocalViewRuntimeState } from \"./runtime-state.js\";\nimport {\n LocalViewWebSocketServer,\n type LocalViewSocket,\n type LocalViewSocketServer,\n} from \"./ws-types.js\";\n\nconst DEFAULT_MAX_PENDING_CLIENT_BUFFER_BYTES = 1_000_000;\nconst DEFAULT_UPSTREAM_OPEN_TIMEOUT_MS = 10_000;\n\nexport interface LocalViewCdpProxyDeps {\n readonly runtimeState: LocalViewRuntimeState;\n readonly createUpstreamSocket?: (url: string) => LocalViewSocket;\n readonly maxPendingClientBufferBytes?: number;\n readonly upstreamOpenTimeoutMs?: number;\n}\n\nexport class LocalViewCdpProxy {\n private readonly wss: LocalViewSocketServer;\n private readonly createUpstreamSocket: (url: string) => LocalViewSocket;\n private readonly maxPendingClientBufferBytes: number;\n private readonly upstreamOpenTimeoutMs: number;\n\n constructor(private readonly deps: LocalViewCdpProxyDeps) {\n this.wss = new LocalViewWebSocketServer({ noServer: true });\n this.createUpstreamSocket =\n deps.createUpstreamSocket ?? ((url) => new WebSocket(url) as unknown as LocalViewSocket);\n this.maxPendingClientBufferBytes =\n deps.maxPendingClientBufferBytes ?? DEFAULT_MAX_PENDING_CLIENT_BUFFER_BYTES;\n this.upstreamOpenTimeoutMs = deps.upstreamOpenTimeoutMs ?? DEFAULT_UPSTREAM_OPEN_TIMEOUT_MS;\n }\n\n handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void {\n const url = new URL(req.url || \"/\", \"http://localhost\");\n const parts = url.pathname.split(\"/\").filter(Boolean);\n const isCdpPath = parts.length === 3 && parts[0] === \"ws\" && parts[1] === \"cdp\";\n if (!isCdpPath) {\n socket.destroy();\n return;\n }\n\n const sessionId = parts[2]!;\n this.wss.handleUpgrade(req, socket, head, (clientSocket) => {\n void this.bindProxy(clientSocket, sessionId).catch(() => {\n safeCloseSocket(clientSocket);\n });\n });\n }\n\n close(): void {\n for (const client of this.wss.clients) {\n safeCloseSocket(client);\n }\n this.wss.close();\n }\n\n private async bindProxy(clientSocket: LocalViewSocket, sessionId: string): Promise<void> {\n const resolved = await resolveLocalViewSession(sessionId);\n if (!resolved) {\n safeCloseSocket(clientSocket);\n return;\n }\n\n const upstream = this.createUpstreamSocket(resolved.browserWebSocketUrl);\n const pendingCreateTargetCommandIds = new Set<number>();\n const pendingAttachTargetCommandTargetIds = new Map<number, string>();\n const targetIdByAttachedSessionId = new Map<string, string>();\n const pendingClientMessages: Array<{\n readonly data: WebSocket.RawData;\n readonly isBinary: boolean;\n }> = [];\n let pendingClientBufferBytes = 0;\n let closed = false;\n let upstreamOpenTimeout: NodeJS.Timeout | null = null;\n\n const closeConnection = () => {\n if (closed) {\n return;\n }\n closed = true;\n if (upstreamOpenTimeout) {\n clearTimeout(upstreamOpenTimeout);\n upstreamOpenTimeout = null;\n }\n pendingClientMessages.length = 0;\n pendingClientBufferBytes = 0;\n safeCloseSocket(upstream);\n safeCloseSocket(clientSocket);\n };\n\n upstreamOpenTimeout = setTimeout(() => {\n if (upstream.readyState === WebSocket.OPEN) {\n return;\n }\n closeConnection();\n }, this.upstreamOpenTimeoutMs);\n\n clientSocket.on(\"message\", (data: WebSocket.RawData, isBinary: boolean) => {\n const outboundData = data;\n\n if (!isBinary) {\n const message = parseCdpProtocolMessage(data);\n if (message) {\n const activatedTargetId = readActivateTargetCommandTargetId(message);\n if (activatedTargetId) {\n this.deps.runtimeState.setPageActivationIntent(sessionId, activatedTargetId);\n }\n\n const createTargetCommandId = readCreateTargetCommandId(message);\n if (createTargetCommandId !== null) {\n pendingCreateTargetCommandIds.add(createTargetCommandId);\n }\n\n const attachTargetCommand = readAttachTargetCommand(message);\n if (attachTargetCommand) {\n pendingAttachTargetCommandTargetIds.set(\n attachTargetCommand.id,\n attachTargetCommand.targetId,\n );\n }\n\n const interactionTargetId = readInteractionTargetId(message, targetIdByAttachedSessionId);\n if (interactionTargetId) {\n this.deps.runtimeState.setPageActivationIntent(sessionId, interactionTargetId);\n }\n }\n }\n\n if (upstream.readyState === WebSocket.OPEN) {\n upstream.send(outboundData, { binary: isBinary });\n return;\n }\n if (upstream.readyState !== WebSocket.CONNECTING) {\n closeConnection();\n return;\n }\n\n const sizeBytes = rawDataSizeBytes(outboundData);\n if (pendingClientBufferBytes + sizeBytes > this.maxPendingClientBufferBytes) {\n closeConnection();\n return;\n }\n pendingClientMessages.push({ data: outboundData, isBinary });\n pendingClientBufferBytes += sizeBytes;\n });\n\n upstream.on(\"open\", () => {\n if (upstreamOpenTimeout) {\n clearTimeout(upstreamOpenTimeout);\n upstreamOpenTimeout = null;\n }\n for (const pendingMessage of pendingClientMessages.splice(0)) {\n upstream.send(pendingMessage.data, { binary: pendingMessage.isBinary });\n }\n pendingClientBufferBytes = 0;\n });\n\n upstream.on(\"message\", (data: WebSocket.RawData, isBinary: boolean) => {\n if (!isBinary) {\n const message = parseCdpProtocolMessage(data);\n if (message) {\n const createdTargetId = readCreateTargetResultTargetId(\n message,\n pendingCreateTargetCommandIds,\n );\n if (createdTargetId) {\n this.deps.runtimeState.setPageActivationIntent(sessionId, createdTargetId);\n }\n\n const attachedTarget = readAttachTargetResult(\n message,\n pendingAttachTargetCommandTargetIds,\n );\n if (attachedTarget) {\n targetIdByAttachedSessionId.set(attachedTarget.sessionId, attachedTarget.targetId);\n }\n\n const detachedSessionId = readDetachedTargetSessionId(message);\n if (detachedSessionId) {\n targetIdByAttachedSessionId.delete(detachedSessionId);\n }\n }\n }\n\n if (clientSocket.readyState === WebSocket.OPEN) {\n clientSocket.send(data, { binary: isBinary });\n }\n });\n\n clientSocket.on(\"close\", closeConnection);\n clientSocket.on(\"error\", closeConnection);\n upstream.on(\"close\", closeConnection);\n upstream.on(\"error\", closeConnection);\n }\n}\n\ninterface ParsedCdpProtocolMessage {\n readonly id?: number;\n readonly method?: string;\n readonly sessionId?: string;\n readonly params?: Record<string, unknown>;\n readonly result?: Record<string, unknown>;\n}\n\nfunction parseCdpProtocolMessage(data: WebSocket.RawData): ParsedCdpProtocolMessage | null {\n try {\n const parsed = JSON.parse(rawDataToString(data)) as ParsedCdpProtocolMessage | null;\n return parsed && typeof parsed === \"object\" ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction readCreateTargetCommandId(message: ParsedCdpProtocolMessage): number | null {\n return message.method === \"Target.createTarget\" && typeof message.id === \"number\"\n ? message.id\n : null;\n}\n\nfunction readCreateTargetResultTargetId(\n message: ParsedCdpProtocolMessage,\n pendingCommandIds: Set<number>,\n): string | null {\n if (typeof message.id !== \"number\" || !pendingCommandIds.has(message.id)) {\n return null;\n }\n pendingCommandIds.delete(message.id);\n const targetId = message.result?.targetId;\n return typeof targetId === \"string\" && targetId.length > 0 ? targetId : null;\n}\n\nfunction readActivateTargetCommandTargetId(message: ParsedCdpProtocolMessage): string | null {\n const targetId =\n message.method === \"Target.activateTarget\" ? message.params?.targetId : undefined;\n return typeof targetId === \"string\" && targetId.length > 0 ? targetId : null;\n}\n\nfunction readAttachTargetCommand(message: ParsedCdpProtocolMessage): {\n readonly id: number;\n readonly targetId: string;\n} | null {\n if (message.method !== \"Target.attachToTarget\" || typeof message.id !== \"number\") {\n return null;\n }\n const targetId = message.params?.targetId;\n if (typeof targetId !== \"string\" || targetId.length === 0) {\n return null;\n }\n return {\n id: message.id,\n targetId,\n };\n}\n\nfunction readAttachTargetResult(\n message: ParsedCdpProtocolMessage,\n pendingTargetIds: Map<number, string>,\n): {\n readonly sessionId: string;\n readonly targetId: string;\n} | null {\n if (typeof message.id !== \"number\") {\n return null;\n }\n const targetId = pendingTargetIds.get(message.id);\n if (!targetId) {\n return null;\n }\n pendingTargetIds.delete(message.id);\n const sessionId = message.result?.sessionId;\n if (typeof sessionId !== \"string\" || sessionId.length === 0) {\n return null;\n }\n return {\n sessionId,\n targetId,\n };\n}\n\nfunction readInteractionTargetId(\n message: ParsedCdpProtocolMessage,\n targetIdByAttachedSessionId: Map<string, string>,\n): string | null {\n const sessionId = message.sessionId;\n if (typeof sessionId !== \"string\" || sessionId.length === 0) {\n return null;\n }\n if (\n !message.method ||\n (!message.method.startsWith(\"Input.\") && !message.method.startsWith(\"Page.\"))\n ) {\n return null;\n }\n return targetIdByAttachedSessionId.get(sessionId) ?? null;\n}\n\nfunction readDetachedTargetSessionId(message: ParsedCdpProtocolMessage): string | null {\n if (message.method !== \"Target.detachedFromTarget\") {\n return null;\n }\n const sessionId = message.params?.sessionId;\n return typeof sessionId === \"string\" && sessionId.length > 0 ? sessionId : null;\n}\n\nfunction rawDataToString(data: WebSocket.RawData): string {\n if (typeof data === \"string\") {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data).toString(\"utf8\");\n }\n if (Array.isArray(data)) {\n return Buffer.concat(data).toString(\"utf8\");\n }\n return data.toString(\"utf8\");\n}\n\nfunction rawDataSizeBytes(data: WebSocket.RawData): number {\n if (typeof data === \"string\") {\n return Buffer.byteLength(data);\n }\n if (data instanceof ArrayBuffer) {\n return data.byteLength;\n }\n if (Array.isArray(data)) {\n return data.reduce((total, entry) => total + entry.byteLength, 0);\n }\n return data.byteLength;\n}\n\nfunction safeCloseSocket(socket: LocalViewSocket): void {\n try {\n socket.close();\n } catch {}\n}\n","import type { BrowserContext, Page } from \"playwright\";\n\nimport type { OpensteerViewStreamTab } from \"@opensteer/protocol\";\n\nimport { LocalViewRuntimeState } from \"./runtime-state.js\";\n\ninterface CachedPageMetadata {\n readonly title: string;\n readonly targetId: string | undefined;\n}\n\nconst ACTIVATION_INTENT_DISCOVERY_GRACE_MS = 2_000;\n\nexport interface TabStateTrackerDeps {\n readonly browserContext: BrowserContext;\n readonly sessionId: string;\n readonly pollMs: number;\n readonly runtimeState: LocalViewRuntimeState;\n readonly onTabsChanged: (payload: {\n readonly tabs: readonly OpensteerViewStreamTab[];\n readonly activeTabIndex: number;\n }) => void;\n readonly onActivePageChanged: (page: Page) => void;\n}\n\nexport class TabStateTracker {\n private readonly deps: TabStateTrackerDeps;\n private timer: NodeJS.Timeout | null = null;\n private running = false;\n private lastActivePage: Page | null = null;\n private lastTabsSignature = \"\";\n private tickInFlight = false;\n private readonly metadataByPage = new Map<Page, CachedPageMetadata>();\n private readonly targetIdByPage = new WeakMap<Page, string>();\n private readonly pageCleanupByPage = new Map<Page, () => void>();\n private boundContextCleanup: (() => void) | null = null;\n\n constructor(deps: TabStateTrackerDeps) {\n this.deps = deps;\n }\n\n start(): void {\n if (this.running) {\n return;\n }\n this.running = true;\n this.bindContextEvents();\n void this.reconcile({\n includeFocus: true,\n refreshMetadata: true,\n });\n }\n\n stop(): void {\n this.running = false;\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.boundContextCleanup?.();\n this.boundContextCleanup = null;\n for (const cleanup of this.pageCleanupByPage.values()) {\n cleanup();\n }\n this.pageCleanupByPage.clear();\n this.metadataByPage.clear();\n }\n\n private bindContextEvents(): void {\n if (this.boundContextCleanup) {\n this.syncTrackedPages(this.deps.browserContext.pages());\n this.updatePolling(this.deps.browserContext.pages().length);\n return;\n }\n\n const onPage = (page: Page) => {\n this.syncTrackedPages(this.deps.browserContext.pages());\n this.updatePolling(this.deps.browserContext.pages().length);\n this.attachPageListeners(page);\n void this.reconcile({\n includeFocus: true,\n refreshMetadata: true,\n });\n };\n\n this.deps.browserContext.on(\"page\", onPage);\n this.boundContextCleanup = () => {\n this.deps.browserContext.off(\"page\", onPage);\n };\n\n this.syncTrackedPages(this.deps.browserContext.pages());\n this.updatePolling(this.deps.browserContext.pages().length);\n }\n\n private syncTrackedPages(pages: readonly Page[]): void {\n const nextPages = new Set(pages);\n\n for (const [page, cleanup] of this.pageCleanupByPage.entries()) {\n if (nextPages.has(page)) {\n continue;\n }\n cleanup();\n this.pageCleanupByPage.delete(page);\n this.metadataByPage.delete(page);\n }\n\n for (const page of pages) {\n this.attachPageListeners(page);\n }\n }\n\n private attachPageListeners(page: Page): void {\n if (this.pageCleanupByPage.has(page)) {\n return;\n }\n\n const refreshMetadata = () => {\n void this.reconcile({\n includeFocus: false,\n refreshMetadata: true,\n });\n };\n const handleClose = () => {\n this.pageCleanupByPage.get(page)?.();\n this.pageCleanupByPage.delete(page);\n this.metadataByPage.delete(page);\n void this.reconcile({\n includeFocus: true,\n refreshMetadata: true,\n });\n };\n\n page.on(\"close\", handleClose);\n page.on(\"domcontentloaded\", refreshMetadata);\n page.on(\"load\", refreshMetadata);\n page.on(\"framenavigated\", refreshMetadata);\n\n this.pageCleanupByPage.set(page, () => {\n page.off(\"close\", handleClose);\n page.off(\"domcontentloaded\", refreshMetadata);\n page.off(\"load\", refreshMetadata);\n page.off(\"framenavigated\", refreshMetadata);\n });\n }\n\n private updatePolling(pageCount: number): void {\n const shouldPoll = this.running && pageCount > 0;\n if (!shouldPoll) {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n return;\n }\n\n if (this.timer) {\n return;\n }\n\n this.timer = setInterval(() => {\n const trackedPageCount = this.deps.browserContext.pages().length;\n void this.reconcile({\n includeFocus: trackedPageCount > 1,\n refreshMetadata: true,\n });\n }, this.deps.pollMs);\n }\n\n private async reconcile(args: {\n readonly includeFocus: boolean;\n readonly refreshMetadata: boolean;\n }): Promise<void> {\n if (!this.running || this.tickInFlight) {\n return;\n }\n this.tickInFlight = true;\n\n try {\n this.bindContextEvents();\n const pages = this.deps.browserContext.pages();\n this.syncTrackedPages(pages);\n this.updatePolling(pages.length);\n const preferredActivePage = this.lastActivePage ?? pages[0] ?? null;\n\n const pageStates = await Promise.all(\n pages.map(async (page, index) => {\n const metadata = await this.readPageMetadata(page, {\n refresh: args.refreshMetadata,\n });\n const focusState = args.includeFocus\n ? await this.readFocusState(page)\n : {\n isVisible: page === preferredActivePage,\n hasFocus: page === preferredActivePage,\n };\n\n return {\n page,\n index,\n targetId: metadata.targetId,\n url: page.url(),\n title: metadata.title,\n isVisible: focusState.isVisible,\n hasFocus: focusState.hasFocus,\n };\n }),\n );\n\n const activePage = this.pickActivePage(\n pageStates,\n this.lastActivePage,\n preferredActivePage,\n this.resolveIntentPage(pageStates),\n );\n if (activePage && activePage !== this.lastActivePage) {\n this.lastActivePage = activePage;\n this.deps.onActivePageChanged(activePage);\n }\n\n const tabs = pageStates.map((state) => ({\n index: state.index,\n ...(state.targetId === undefined ? {} : { targetId: state.targetId }),\n url: state.url,\n title: state.title,\n active: activePage ? state.page === activePage : false,\n })) satisfies OpensteerViewStreamTab[];\n const activeTabIndex = tabs.findIndex((tab) => tab.active);\n const signature = JSON.stringify({\n activeTabIndex,\n tabs: tabs.map((tab) => ({\n index: tab.index,\n targetId: tab.targetId,\n url: tab.url,\n title: tab.title,\n active: tab.active,\n })),\n });\n\n if (signature !== this.lastTabsSignature) {\n this.lastTabsSignature = signature;\n this.deps.onTabsChanged({\n tabs,\n activeTabIndex,\n });\n }\n } finally {\n this.tickInFlight = false;\n }\n }\n\n private async readPageMetadata(\n page: Page,\n options: {\n readonly refresh: boolean;\n },\n ): Promise<CachedPageMetadata> {\n const cached = this.metadataByPage.get(page);\n if (cached && !options.refresh) {\n return cached;\n }\n\n const [title, targetId] = await Promise.all([\n page.title().catch(() => cached?.title ?? \"\"),\n this.resolveTargetId(page).catch(() => cached?.targetId),\n ]);\n const nextMetadata = {\n title,\n targetId: targetId ?? undefined,\n } satisfies CachedPageMetadata;\n this.metadataByPage.set(page, nextMetadata);\n return nextMetadata;\n }\n\n private async resolveTargetId(page: Page): Promise<string | null> {\n const cached = this.targetIdByPage.get(page);\n if (cached) {\n return cached;\n }\n\n const cdp = await page.context().newCDPSession(page);\n try {\n const result = (await cdp.send(\"Target.getTargetInfo\")) as {\n readonly targetInfo?: {\n readonly targetId?: unknown;\n };\n } | null;\n const targetId = result?.targetInfo?.targetId;\n if (typeof targetId === \"string\" && targetId.length > 0) {\n this.targetIdByPage.set(page, targetId);\n return targetId;\n }\n return null;\n } finally {\n await cdp.detach().catch(() => undefined);\n }\n }\n\n private async readFocusState(page: Page): Promise<{\n readonly isVisible: boolean;\n readonly hasFocus: boolean;\n }> {\n try {\n const result = (await page.evaluate(() => ({\n visibilityState: (\n globalThis as {\n readonly document?: {\n readonly visibilityState?: unknown;\n };\n }\n ).document?.visibilityState,\n hasFocus:\n (\n globalThis as {\n readonly document?: {\n readonly hasFocus?: (() => boolean) | undefined;\n };\n }\n ).document?.hasFocus?.() ?? false,\n }))) as {\n readonly visibilityState?: unknown;\n readonly hasFocus?: unknown;\n };\n return {\n isVisible: result.visibilityState === \"visible\",\n hasFocus: result.hasFocus === true,\n };\n } catch {\n return {\n isVisible: false,\n hasFocus: false,\n };\n }\n }\n\n private pickActivePage(\n pageStates: Array<{\n readonly page: Page;\n readonly targetId: string | undefined;\n readonly isVisible: boolean;\n readonly hasFocus: boolean;\n }>,\n lastActivePage: Page | null,\n fallbackPage: Page | null,\n intent: { readonly page: Page } | null,\n ): Page | null {\n if (intent) {\n return intent.page;\n }\n\n const focusedVisiblePages = pageStates.filter((state) => state.isVisible && state.hasFocus);\n if (focusedVisiblePages.length === 1) {\n return focusedVisiblePages[0]?.page ?? null;\n }\n\n const visiblePages = pageStates.filter((state) => state.isVisible);\n if (visiblePages.length === 1) {\n return visiblePages[0]?.page ?? null;\n }\n\n const lastActivePageState = lastActivePage\n ? (pageStates.find((state) => state.page === lastActivePage) ?? null)\n : null;\n if (\n lastActivePageState &&\n ((focusedVisiblePages.length > 1 &&\n lastActivePageState.isVisible &&\n lastActivePageState.hasFocus) ||\n (visiblePages.length > 1 && lastActivePageState.isVisible) ||\n visiblePages.length === 0)\n ) {\n return lastActivePage;\n }\n\n const fallbackPageState = fallbackPage\n ? (pageStates.find((state) => state.page === fallbackPage) ?? null)\n : null;\n if (\n fallbackPageState &&\n ((focusedVisiblePages.length > 1 &&\n fallbackPageState.isVisible &&\n fallbackPageState.hasFocus) ||\n (visiblePages.length > 1 && fallbackPageState.isVisible))\n ) {\n return fallbackPage;\n }\n\n if (focusedVisiblePages.length > 0) {\n return focusedVisiblePages[0]?.page ?? null;\n }\n\n if (visiblePages.length > 0) {\n return visiblePages[0]?.page ?? null;\n }\n\n if (lastActivePageState) {\n return lastActivePageState.page;\n }\n\n if (fallbackPageState) {\n return fallbackPageState.page;\n }\n\n return pageStates[0]?.page ?? null;\n }\n\n private resolveIntentPage(\n pageStates: Array<{\n readonly page: Page;\n readonly targetId: string | undefined;\n }>,\n ): { readonly page: Page } | null {\n const intent = this.deps.runtimeState.getPageActivationIntent(this.deps.sessionId);\n if (!intent) {\n return null;\n }\n\n const matched = pageStates.find((state) => state.targetId === intent.targetId);\n if (!matched) {\n if (Date.now() - intent.ts > ACTIVATION_INTENT_DISCOVERY_GRACE_MS) {\n this.deps.runtimeState.clearPageActivationIntent(this.deps.sessionId, intent.targetId);\n }\n return null;\n }\n\n this.deps.runtimeState.clearPageActivationIntent(this.deps.sessionId, intent.targetId);\n return { page: matched.page };\n }\n}\n","import type { OpensteerViewport } from \"@opensteer/protocol\";\n\nexport interface RequestedStreamSize {\n readonly width: number;\n readonly height: number;\n}\n\nconst MIN_CAPTURE_DIMENSION_PX = 100;\nconst MAX_CAPTURE_DIMENSION_PX = 8_192;\nconst CAPTURE_BUCKET_PX = 64;\n\nexport function selectScreencastSize(args: {\n readonly viewport: OpensteerViewport;\n readonly requestedSizes: readonly RequestedStreamSize[];\n}): RequestedStreamSize | null {\n const viewport = normalizeViewport(args.viewport);\n if (!viewport) {\n return null;\n }\n\n let maxRequestedWidth = 0;\n let maxRequestedHeight = 0;\n for (const requestedSize of args.requestedSizes) {\n const normalized = normalizeRequestedSize(requestedSize);\n if (!normalized) {\n return null;\n }\n maxRequestedWidth = Math.max(maxRequestedWidth, normalized.width);\n maxRequestedHeight = Math.max(maxRequestedHeight, normalized.height);\n }\n\n if (\n maxRequestedWidth < MIN_CAPTURE_DIMENSION_PX ||\n maxRequestedHeight < MIN_CAPTURE_DIMENSION_PX\n ) {\n return null;\n }\n\n const desiredScale = Math.max(\n maxRequestedWidth / viewport.width,\n maxRequestedHeight / viewport.height,\n );\n if (desiredScale >= 1) {\n return viewport;\n }\n\n const landscape = viewport.width >= viewport.height;\n const sourcePrimary = landscape ? viewport.width : viewport.height;\n const sourceSecondary = landscape ? viewport.height : viewport.width;\n const nextPrimary = bucketDimension(sourcePrimary * desiredScale);\n const nextSecondary = clampDimension(Math.round((nextPrimary / sourcePrimary) * sourceSecondary));\n if (!nextSecondary) {\n return null;\n }\n\n return landscape\n ? { width: nextPrimary, height: nextSecondary }\n : { width: nextSecondary, height: nextPrimary };\n}\n\nfunction normalizeViewport(viewport: OpensteerViewport): RequestedStreamSize | null {\n const width = clampDimension(viewport.width);\n const height = clampDimension(viewport.height);\n return width && height ? { width, height } : null;\n}\n\nfunction normalizeRequestedSize(requestedSize: RequestedStreamSize): RequestedStreamSize | null {\n const width = clampDimension(requestedSize.width);\n const height = clampDimension(requestedSize.height);\n return width && height ? { width, height } : null;\n}\n\nfunction clampDimension(value: number): number | null {\n if (!Number.isFinite(value)) {\n return null;\n }\n\n const normalized = Math.floor(value);\n if (normalized < MIN_CAPTURE_DIMENSION_PX) {\n return null;\n }\n\n return Math.min(MAX_CAPTURE_DIMENSION_PX, normalized);\n}\n\nfunction bucketDimension(value: number): number {\n const bucketed =\n Math.ceil(Math.max(MIN_CAPTURE_DIMENSION_PX, value) / CAPTURE_BUCKET_PX) * CAPTURE_BUCKET_PX;\n return Math.min(MAX_CAPTURE_DIMENSION_PX, bucketed);\n}\n","import type {\n OpensteerViewStreamClientMessage,\n OpensteerViewStreamControlMessage,\n OpensteerViewStreamTab,\n} from \"@opensteer/protocol\";\nimport WebSocket from \"ws\";\n\nimport type { LocalViewSocket } from \"./ws-types.js\";\n\nexport function buildHelloMessage(args: {\n readonly sessionId: string;\n readonly fps: number;\n readonly quality: number;\n readonly viewport: {\n readonly width: number;\n readonly height: number;\n };\n}): OpensteerViewStreamControlMessage {\n return {\n type: \"hello\",\n sessionId: args.sessionId,\n ts: Date.now(),\n mimeType: \"image/jpeg\",\n fps: args.fps,\n quality: args.quality,\n viewport: args.viewport,\n };\n}\n\nexport function buildTabsMessage(args: {\n readonly sessionId: string;\n readonly tabs: readonly OpensteerViewStreamTab[];\n readonly activeTabIndex: number;\n}): OpensteerViewStreamControlMessage {\n return {\n type: \"tabs\",\n sessionId: args.sessionId,\n ts: Date.now(),\n tabs: args.tabs,\n activeTabIndex: args.activeTabIndex,\n };\n}\n\nexport function buildStatusMessage(args: {\n readonly sessionId: string;\n readonly status: string;\n}): OpensteerViewStreamControlMessage {\n return {\n type: \"status\",\n sessionId: args.sessionId,\n ts: Date.now(),\n status: args.status,\n };\n}\n\nexport function buildErrorMessage(args: {\n readonly sessionId: string;\n readonly error: string;\n}): OpensteerViewStreamControlMessage {\n return {\n type: \"error\",\n sessionId: args.sessionId,\n ts: Date.now(),\n error: args.error,\n };\n}\n\nexport function sendControlMessage(\n ws: LocalViewSocket,\n message: OpensteerViewStreamControlMessage,\n): void {\n if (ws.readyState !== WebSocket.OPEN) {\n return;\n }\n try {\n ws.send(JSON.stringify(message), { binary: false });\n } catch {}\n}\n\nexport function parseViewClientMessage(raw: string): OpensteerViewStreamClientMessage | null {\n try {\n const parsed = JSON.parse(raw) as Partial<OpensteerViewStreamClientMessage> | null;\n if (parsed?.type !== \"stream-config\") {\n return null;\n }\n\n const renderWidth = normalizeRenderDimension(parsed.renderWidth);\n const renderHeight = normalizeRenderDimension(parsed.renderHeight);\n if (renderWidth === null || renderHeight === null) {\n return null;\n }\n\n return {\n type: \"stream-config\",\n renderWidth,\n renderHeight,\n };\n } catch {\n return null;\n }\n}\n\nfunction normalizeRenderDimension(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n\n const normalized = Math.floor(value);\n if (normalized < 100) {\n return null;\n }\n\n return Math.min(8_192, normalized);\n}\n","import type { Page, Browser, BrowserContext, CDPSession } from \"playwright\";\nimport WebSocket, { type RawData } from \"ws\";\n\nimport type { OpensteerViewport, OpensteerViewStreamTab } from \"@opensteer/protocol\";\n\nimport { resolveLocalViewSession } from \"./discovery.js\";\nimport { LocalViewRuntimeState } from \"./runtime-state.js\";\nimport { TabStateTracker } from \"./tab-state-tracker.js\";\nimport { selectScreencastSize, type RequestedStreamSize } from \"./view-stream-capture-policy.js\";\nimport {\n buildErrorMessage,\n buildHelloMessage,\n buildStatusMessage,\n buildTabsMessage,\n parseViewClientMessage,\n sendControlMessage,\n} from \"./view-stream-protocol.js\";\nimport type { LocalViewSocket } from \"./ws-types.js\";\n\nconst INITIAL_FRAME_CAPTURE_ATTEMPTS = 3;\nconst INITIAL_FRAME_CAPTURE_RETRY_DELAY_MS = 150;\nconst TAB_STATE_POLL_MS = 1_000;\nconst CLIENT_FRAME_FLUSH_RETRY_MS = 16;\n\ninterface ClientStreamState {\n requestedRenderSize: RequestedStreamSize | null;\n frameSendInFlight: boolean;\n pendingFrameBuffer: Buffer | null;\n pendingFlushTimer: NodeJS.Timeout | null;\n}\n\nexport interface LocalViewStreamHubDeps {\n readonly runtimeState: LocalViewRuntimeState;\n readonly maxFps: number;\n readonly quality: number;\n readonly maxClientBufferBytes: number;\n}\n\nexport class LocalViewStreamHub {\n private readonly deps: LocalViewStreamHubDeps;\n private readonly producers = new Map<string, SessionViewStreamProducer>();\n\n constructor(deps: LocalViewStreamHubDeps) {\n this.deps = deps;\n }\n\n attachClient(sessionId: string, ws: LocalViewSocket): void {\n let producer = this.producers.get(sessionId);\n if (!producer) {\n producer = new SessionViewStreamProducer({\n sessionId,\n runtimeState: this.deps.runtimeState,\n maxFps: this.deps.maxFps,\n quality: this.deps.quality,\n maxClientBufferBytes: this.deps.maxClientBufferBytes,\n onDrained: () => {\n this.producers.delete(sessionId);\n },\n });\n this.producers.set(sessionId, producer);\n }\n\n producer.addClient(ws);\n }\n}\n\ninterface SessionViewStreamProducerDeps {\n readonly sessionId: string;\n readonly runtimeState: LocalViewRuntimeState;\n readonly maxFps: number;\n readonly quality: number;\n readonly maxClientBufferBytes: number;\n readonly onDrained: () => void;\n}\n\nclass SessionViewStreamProducer {\n private readonly deps: SessionViewStreamProducerDeps;\n private readonly clients = new Set<LocalViewSocket>();\n private readonly clientStateBySocket = new Map<LocalViewSocket, ClientStreamState>();\n private readonly frameIntervalMs: number;\n private tracker: TabStateTracker | null = null;\n private browser: Browser | null = null;\n private browserDisconnectedHandler: ((browser: Browser) => void) | null = null;\n private context: BrowserContext | null = null;\n private cdpSession: CDPSession | null = null;\n private screencastHandler:\n | ((event: { readonly data: string; readonly sessionId: number }) => void)\n | null = null;\n private pageLifecycleCleanup: (() => void) | null = null;\n private activePage: Page | null = null;\n private activeViewport: OpensteerViewport | null = null;\n private activeScreencastSizeKey: string | null = null;\n private pendingFrameAckTimer: NodeJS.Timeout | null = null;\n private starting: Promise<void> | null = null;\n private started = false;\n private rebinding: Promise<void> = Promise.resolve();\n private stopped = false;\n private lastFrameSentAt = 0;\n private lastFrameBuffer: Buffer | null = null;\n private lastTabsPayload: {\n readonly tabs: readonly OpensteerViewStreamTab[];\n readonly activeTabIndex: number;\n } | null = null;\n\n constructor(deps: SessionViewStreamProducerDeps) {\n this.deps = deps;\n this.frameIntervalMs = Math.max(1, Math.floor(1000 / Math.max(1, deps.maxFps)));\n }\n\n addClient(ws: LocalViewSocket): void {\n if (this.stopped) {\n ws.close(1011, \"View stream is unavailable.\");\n return;\n }\n\n this.clients.add(ws);\n this.clientStateBySocket.set(ws, {\n requestedRenderSize: null,\n frameSendInFlight: false,\n pendingFrameBuffer: null,\n pendingFlushTimer: null,\n });\n\n if (this.activeViewport) {\n sendControlMessage(\n ws,\n buildHelloMessage({\n sessionId: this.deps.sessionId,\n fps: this.deps.maxFps,\n quality: this.deps.quality,\n viewport: this.activeViewport,\n }),\n );\n }\n if (this.lastTabsPayload) {\n sendControlMessage(\n ws,\n buildTabsMessage({\n sessionId: this.deps.sessionId,\n tabs: this.lastTabsPayload.tabs,\n activeTabIndex: this.lastTabsPayload.activeTabIndex,\n }),\n );\n }\n if (this.lastFrameBuffer) {\n const queued = this.enqueueFrameForClient(ws, this.lastFrameBuffer);\n if (!queued) {\n this.removeClient(ws);\n return;\n }\n }\n\n ws.on(\"close\", () => {\n this.removeClient(ws);\n });\n ws.on(\"error\", () => {\n this.removeClient(ws);\n });\n ws.on(\"message\", (raw: RawData, isBinary: boolean) => {\n if (isBinary) {\n return;\n }\n const message = parseViewClientMessage(readTextFrame(raw));\n if (message?.type !== \"stream-config\") {\n return;\n }\n\n const nextSize = {\n width: message.renderWidth,\n height: message.renderHeight,\n };\n const clientState = this.clientStateBySocket.get(ws);\n if (!clientState) {\n return;\n }\n const priorSize = clientState.requestedRenderSize;\n if (priorSize?.width === nextSize.width && priorSize?.height === nextSize.height) {\n return;\n }\n clientState.requestedRenderSize = nextSize;\n this.maybeRebindForStreamConfigChange();\n });\n\n void this.ensureStarted();\n }\n\n private maybeRebindForStreamConfigChange(): void {\n if (!this.activePage || !this.started || this.stopped) {\n return;\n }\n\n const nextSizeKey = this.getRequestedScreencastSizeKey();\n if (nextSizeKey === this.activeScreencastSizeKey) {\n return;\n }\n\n void this.queueBindToPage(this.activePage, { force: true }).catch(() => undefined);\n }\n\n private removeClient(ws: LocalViewSocket): void {\n this.clients.delete(ws);\n const clientState = this.clientStateBySocket.get(ws);\n if (clientState?.pendingFlushTimer) {\n clearTimeout(clientState.pendingFlushTimer);\n }\n this.clientStateBySocket.delete(ws);\n if (this.clients.size === 0) {\n void this.stop();\n return;\n }\n this.maybeRebindForStreamConfigChange();\n }\n\n private async ensureStarted(): Promise<void> {\n if (this.stopped || this.started) {\n return;\n }\n if (this.starting) {\n return this.starting;\n }\n\n this.starting = this.start()\n .then(() => {\n if (!this.stopped) {\n this.started = true;\n }\n })\n .finally(() => {\n this.starting = null;\n });\n\n try {\n await this.starting;\n } catch {\n this.broadcastControl(\n buildErrorMessage({\n sessionId: this.deps.sessionId,\n error: \"Failed to start live browser stream.\",\n }),\n );\n this.closeAllClients(1011, \"View stream failed\");\n await this.stop();\n }\n }\n\n private async start(): Promise<void> {\n const session = await this.connectSession();\n this.broadcastControl(\n buildStatusMessage({\n sessionId: this.deps.sessionId,\n status: \"starting\",\n }),\n );\n\n this.browser = session.browser;\n this.browserDisconnectedHandler = () => {\n if (this.stopped) {\n return;\n }\n this.browserDisconnectedHandler = null;\n this.broadcastControl(\n buildErrorMessage({\n sessionId: this.deps.sessionId,\n error: \"Live browser stream disconnected.\",\n }),\n );\n this.closeAllClients(1011, \"View stream failed\");\n void this.stop();\n };\n this.browser.once(\"disconnected\", this.browserDisconnectedHandler);\n\n this.context = session.context;\n this.activePage = session.page;\n this.activeViewport = await readViewportForPage(session.page);\n if (this.stopped) {\n return;\n }\n if (this.activeViewport) {\n this.broadcastControl(\n buildHelloMessage({\n sessionId: this.deps.sessionId,\n fps: this.deps.maxFps,\n quality: this.deps.quality,\n viewport: this.activeViewport,\n }),\n );\n }\n\n this.tracker = new TabStateTracker({\n browserContext: session.context,\n sessionId: this.deps.sessionId,\n pollMs: TAB_STATE_POLL_MS,\n runtimeState: this.deps.runtimeState,\n onActivePageChanged: (page) => {\n this.activePage = page;\n void this.queueBindToPage(page).catch(() => undefined);\n },\n onTabsChanged: ({ tabs, activeTabIndex }) => {\n this.lastTabsPayload = { tabs, activeTabIndex };\n this.broadcastControl(\n buildTabsMessage({\n sessionId: this.deps.sessionId,\n tabs,\n activeTabIndex,\n }),\n );\n },\n });\n this.tracker.start();\n\n await this.queueBindToPage(session.page);\n if (this.stopped) {\n return;\n }\n this.broadcastControl(\n buildStatusMessage({\n sessionId: this.deps.sessionId,\n status: \"live\",\n }),\n );\n }\n\n private queueBindToPage(\n page: Page,\n options: {\n readonly force?: boolean;\n } = {},\n ): Promise<void> {\n this.rebinding = this.rebinding\n .catch(() => undefined)\n .then(() => this.bindToPage(page, options));\n return this.rebinding;\n }\n\n private async bindToPage(\n page: Page,\n options: {\n readonly force?: boolean;\n } = {},\n ): Promise<void> {\n if (this.stopped) {\n return;\n }\n const requestedSizeKey = this.getRequestedScreencastSizeKey();\n if (\n !options.force &&\n this.activePage === page &&\n this.cdpSession &&\n this.activeScreencastSizeKey === requestedSizeKey\n ) {\n return;\n }\n\n await this.stopScreencast();\n if (this.stopped) {\n return;\n }\n\n const context = this.context;\n if (!context) {\n throw new Error(\"Browser context is unavailable.\");\n }\n const requestedSize = this.getRequestedScreencastSize();\n this.activePage = page;\n this.activeScreencastSizeKey = requestedSizeKey;\n this.activeViewport = await readViewportForPage(page);\n if (this.activeViewport) {\n this.broadcastControl(\n buildHelloMessage({\n sessionId: this.deps.sessionId,\n fps: this.deps.maxFps,\n quality: this.deps.quality,\n viewport: this.activeViewport,\n }),\n );\n }\n\n const cdpSession = await context.newCDPSession(page);\n if (this.stopped) {\n await cdpSession.detach().catch(() => undefined);\n return;\n }\n this.cdpSession = cdpSession;\n\n const onFrame = (event: { readonly data: string; readonly sessionId: number }) => {\n void this.handleScreencastFrame(event);\n };\n this.screencastHandler = onFrame;\n\n cdpSession.on(\"Page.screencastFrame\", onFrame);\n await cdpSession.send(\"Page.enable\");\n await cdpSession.send(\"Page.startScreencast\", {\n format: \"jpeg\",\n quality: this.deps.quality,\n everyNthFrame: 1,\n ...(requestedSize\n ? {\n maxWidth: requestedSize.width,\n maxHeight: requestedSize.height,\n }\n : {}),\n });\n this.bindPageLifecycleFrameRefresh(page, cdpSession);\n void this.seedInitialFrame(cdpSession).catch(() => undefined);\n }\n\n private async connectSession(): Promise<{\n readonly browser: Browser;\n readonly context: BrowserContext;\n readonly page: Page;\n }> {\n const resolved = await resolveLocalViewSession(this.deps.sessionId);\n if (!resolved) {\n throw new Error(`Local view session ${this.deps.sessionId} is unavailable.`);\n }\n\n const browser = await connectPlaywrightChromiumBrowser({\n url: resolved.browserWebSocketUrl,\n });\n try {\n const context = browser.contexts()[0];\n if (!context) {\n throw new Error(\"Connected browser did not expose a Chromium browser context.\");\n }\n\n const page = context.pages()[0] ?? (await context.newPage());\n return {\n browser,\n context,\n page,\n };\n } catch (error) {\n await disconnectPlaywrightChromiumBrowser(browser).catch(() => undefined);\n throw error;\n }\n }\n\n private async handleScreencastFrame(event: {\n readonly data: string;\n readonly sessionId: number;\n }): Promise<void> {\n const cdpSession = this.cdpSession;\n if (!cdpSession || this.stopped) {\n return;\n }\n\n const frameBuffer = Buffer.from(event.data, \"base64\");\n this.lastFrameBuffer = frameBuffer;\n\n const now = Date.now();\n const delayMs = Math.max(0, this.frameIntervalMs - (now - this.lastFrameSentAt));\n if (delayMs === 0) {\n this.flushScreencastFrame({\n cdpSession,\n sessionId: event.sessionId,\n frameBuffer,\n });\n return;\n }\n\n if (this.pendingFrameAckTimer !== null) {\n return;\n }\n\n this.pendingFrameAckTimer = setTimeout(() => {\n this.pendingFrameAckTimer = null;\n if (this.stopped || this.cdpSession !== cdpSession) {\n return;\n }\n this.flushScreencastFrame({\n cdpSession,\n sessionId: event.sessionId,\n frameBuffer,\n });\n }, delayMs);\n }\n\n private flushScreencastFrame(args: {\n readonly cdpSession: CDPSession;\n readonly sessionId: number;\n readonly frameBuffer: Buffer;\n }): void {\n this.lastFrameSentAt = Date.now();\n this.broadcastFrame(args.frameBuffer);\n void args.cdpSession\n .send(\"Page.screencastFrameAck\", { sessionId: args.sessionId })\n .catch(() => undefined);\n }\n\n private broadcastFrame(frameBuffer: Buffer): void {\n for (const client of this.clients) {\n if (!this.enqueueFrameForClient(client, frameBuffer)) {\n this.removeClient(client);\n }\n }\n\n if (this.clients.size === 0) {\n void this.stop();\n }\n }\n\n private enqueueFrameForClient(client: LocalViewSocket, frameBuffer: Buffer): boolean {\n if (client.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n const clientState = this.clientStateBySocket.get(client);\n if (!clientState) {\n return false;\n }\n\n clientState.pendingFrameBuffer = frameBuffer;\n this.flushQueuedFrameToClient(client);\n return true;\n }\n\n private flushQueuedFrameToClient(client: LocalViewSocket): void {\n if (client.readyState !== WebSocket.OPEN) {\n this.removeClient(client);\n return;\n }\n\n const clientState = this.clientStateBySocket.get(client);\n if (!clientState || clientState.frameSendInFlight || !clientState.pendingFrameBuffer) {\n return;\n }\n\n if (clientState.pendingFlushTimer) {\n clearTimeout(clientState.pendingFlushTimer);\n clientState.pendingFlushTimer = null;\n }\n\n if (client.bufferedAmount > this.deps.maxClientBufferBytes) {\n clientState.pendingFlushTimer = setTimeout(() => {\n clientState.pendingFlushTimer = null;\n this.flushQueuedFrameToClient(client);\n }, CLIENT_FRAME_FLUSH_RETRY_MS);\n return;\n }\n\n const frameBuffer = clientState.pendingFrameBuffer;\n clientState.pendingFrameBuffer = null;\n clientState.frameSendInFlight = true;\n\n try {\n client.send(frameBuffer, { binary: true }, (error?: Error) => {\n const latestClientState = this.clientStateBySocket.get(client);\n if (latestClientState) {\n latestClientState.frameSendInFlight = false;\n }\n if (error) {\n this.removeClient(client);\n return;\n }\n this.flushQueuedFrameToClient(client);\n });\n } catch {\n clientState.frameSendInFlight = false;\n this.removeClient(client);\n }\n }\n\n private broadcastControl(message: Parameters<typeof sendControlMessage>[1]): void {\n for (const client of this.clients) {\n sendControlMessage(client, message);\n }\n }\n\n private closeAllClients(code: number, reason: string): void {\n for (const client of this.clients) {\n try {\n client.close(code, reason);\n } catch {}\n }\n this.clients.clear();\n for (const clientState of this.clientStateBySocket.values()) {\n if (clientState.pendingFlushTimer) {\n clearTimeout(clientState.pendingFlushTimer);\n }\n }\n this.clientStateBySocket.clear();\n }\n\n private async stop(): Promise<void> {\n if (this.stopped) {\n return;\n }\n this.stopped = true;\n this.started = false;\n\n if (this.tracker) {\n this.tracker.stop();\n this.tracker = null;\n }\n await this.rebinding.catch(() => undefined);\n await this.stopScreencast();\n const browser = this.browser;\n const browserDisconnectedHandler = this.browserDisconnectedHandler;\n this.browser = null;\n this.browserDisconnectedHandler = null;\n this.context = null;\n this.activePage = null;\n if (browser) {\n if (browserDisconnectedHandler) {\n browser.off(\"disconnected\", browserDisconnectedHandler);\n }\n await disconnectPlaywrightChromiumBrowser(browser).catch(() => undefined);\n }\n this.deps.onDrained();\n }\n\n private async stopScreencast(): Promise<void> {\n const cdpSession = this.cdpSession;\n const handler = this.screencastHandler;\n const pageLifecycleCleanup = this.pageLifecycleCleanup;\n\n this.cdpSession = null;\n this.screencastHandler = null;\n this.pageLifecycleCleanup = null;\n this.activeScreencastSizeKey = null;\n if (this.pendingFrameAckTimer !== null) {\n clearTimeout(this.pendingFrameAckTimer);\n this.pendingFrameAckTimer = null;\n }\n\n pageLifecycleCleanup?.();\n\n if (!cdpSession) {\n return;\n }\n\n if (handler) {\n cdpSession.off(\"Page.screencastFrame\", handler);\n }\n\n await cdpSession.send(\"Page.stopScreencast\").catch(() => undefined);\n await cdpSession.detach().catch(() => undefined);\n }\n\n private bindPageLifecycleFrameRefresh(page: Page, cdpSession: CDPSession): void {\n this.pageLifecycleCleanup?.();\n\n const refresh = () => {\n void this.refreshPageFrame(page, cdpSession).catch(() => undefined);\n };\n\n page.on(\"domcontentloaded\", refresh);\n page.on(\"load\", refresh);\n page.on(\"framenavigated\", refresh);\n this.pageLifecycleCleanup = () => {\n page.off(\"domcontentloaded\", refresh);\n page.off(\"load\", refresh);\n page.off(\"framenavigated\", refresh);\n };\n }\n\n private async refreshPageFrame(page: Page, cdpSession: CDPSession): Promise<void> {\n if (this.stopped || this.cdpSession !== cdpSession || this.activePage !== page) {\n return;\n }\n\n const viewport = await readViewportForPage(page);\n if (viewport && this.cdpSession === cdpSession && this.activePage === page) {\n this.activeViewport = viewport;\n this.broadcastControl(\n buildHelloMessage({\n sessionId: this.deps.sessionId,\n fps: this.deps.maxFps,\n quality: this.deps.quality,\n viewport,\n }),\n );\n }\n\n if (this.stopped || this.cdpSession !== cdpSession || this.activePage !== page) {\n return;\n }\n await this.seedInitialFrame(cdpSession);\n }\n\n private async seedInitialFrame(cdpSession: CDPSession): Promise<void> {\n let lastError: unknown = null;\n\n for (let attempt = 1; attempt <= INITIAL_FRAME_CAPTURE_ATTEMPTS; attempt += 1) {\n if (this.stopped || this.cdpSession !== cdpSession) {\n return;\n }\n\n try {\n const screenshotData = await this.captureCurrentFrame(cdpSession);\n if (this.stopped || this.cdpSession !== cdpSession) {\n return;\n }\n\n const frameBuffer = Buffer.from(screenshotData, \"base64\");\n this.lastFrameBuffer = frameBuffer;\n this.lastFrameSentAt = Date.now();\n this.broadcastFrame(frameBuffer);\n return;\n } catch (error) {\n lastError = error;\n }\n\n if (attempt < INITIAL_FRAME_CAPTURE_ATTEMPTS) {\n await new Promise((resolve) => setTimeout(resolve, INITIAL_FRAME_CAPTURE_RETRY_DELAY_MS));\n }\n }\n\n if (lastError instanceof Error) {\n throw lastError;\n }\n\n throw new Error(\"Failed to capture initial stream screenshot.\");\n }\n\n private async captureCurrentFrame(cdpSession: CDPSession): Promise<string> {\n const primaryParams = {\n format: \"jpeg\" as const,\n quality: this.deps.quality,\n optimizeForSpeed: true as const,\n };\n try {\n const result = (await cdpSession.send(\"Page.captureScreenshot\", primaryParams)) as {\n readonly data?: unknown;\n } | null;\n if (result && typeof result.data === \"string\" && result.data.length > 0) {\n return result.data;\n }\n } catch {}\n\n const fallbackResult = (await cdpSession.send(\"Page.captureScreenshot\", {\n format: \"jpeg\",\n quality: this.deps.quality,\n })) as {\n readonly data?: unknown;\n } | null;\n if (\n !fallbackResult ||\n typeof fallbackResult.data !== \"string\" ||\n fallbackResult.data.length === 0\n ) {\n throw new Error(\"Failed to capture initial stream screenshot.\");\n }\n\n return fallbackResult.data;\n }\n\n private getRequestedScreencastSize(): RequestedStreamSize | null {\n if (this.clients.size === 0 || !this.activeViewport) {\n return null;\n }\n\n const requestedSizes: RequestedStreamSize[] = [];\n for (const client of this.clients) {\n const requestedSize = this.clientStateBySocket.get(client)?.requestedRenderSize ?? null;\n if (!requestedSize) {\n return null;\n }\n requestedSizes.push(requestedSize);\n }\n\n return selectScreencastSize({\n viewport: this.activeViewport,\n requestedSizes,\n });\n }\n\n private getRequestedScreencastSizeKey(): string | null {\n const size = this.getRequestedScreencastSize();\n return size ? `${size.width}x${size.height}` : null;\n }\n}\n\nasync function readViewportForPage(page: Page): Promise<OpensteerViewport | null> {\n const cdp = await page.context().newCDPSession(page);\n try {\n const result = (await cdp.send(\"Page.getLayoutMetrics\")) as {\n readonly cssVisualViewport?: {\n readonly clientWidth?: unknown;\n readonly clientHeight?: unknown;\n };\n readonly cssLayoutViewport?: {\n readonly clientWidth?: unknown;\n readonly clientHeight?: unknown;\n };\n readonly visualViewport?: {\n readonly clientWidth?: unknown;\n readonly clientHeight?: unknown;\n };\n readonly layoutViewport?: {\n readonly clientWidth?: unknown;\n readonly clientHeight?: unknown;\n };\n } | null;\n const candidates = [\n result?.cssVisualViewport,\n result?.cssLayoutViewport,\n result?.visualViewport,\n result?.layoutViewport,\n ];\n\n for (const candidate of candidates) {\n const width = normalizeViewportDimension(candidate?.clientWidth);\n const height = normalizeViewportDimension(candidate?.clientHeight);\n if (width !== null && height !== null) {\n return { width, height };\n }\n }\n return null;\n } catch {\n const viewportSize = page.viewportSize();\n if (!viewportSize) {\n return null;\n }\n const width = normalizeViewportDimension(viewportSize.width);\n const height = normalizeViewportDimension(viewportSize.height);\n return width !== null && height !== null ? { width, height } : null;\n } finally {\n await cdp.detach().catch(() => undefined);\n }\n}\n\nfunction normalizeViewportDimension(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n\n const normalized = Math.floor(value);\n if (normalized < 100) {\n return null;\n }\n return Math.min(8_192, normalized);\n}\n\nfunction readTextFrame(raw: RawData): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n if (raw instanceof ArrayBuffer) {\n return Buffer.from(raw).toString(\"utf8\");\n }\n if (Array.isArray(raw)) {\n return Buffer.concat(raw).toString(\"utf8\");\n }\n return raw.toString(\"utf8\");\n}\n\nasync function connectPlaywrightChromiumBrowser(input: { readonly url: string }): Promise<Browser> {\n const { connectPlaywrightChromiumBrowser: connect } =\n await import(\"@opensteer/engine-playwright\");\n return connect(input);\n}\n\nasync function disconnectPlaywrightChromiumBrowser(browser: Browser): Promise<void> {\n const { disconnectPlaywrightChromiumBrowser: disconnect } =\n await import(\"@opensteer/engine-playwright\");\n await disconnect(browser);\n}\n","import { randomBytes } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { once } from \"node:events\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type {\n OpensteerLocalViewSessionCloseResponse,\n OpensteerLocalViewSessionsResponse,\n OpensteerSessionAccessGrantResponse,\n} from \"@opensteer/protocol\";\n\nimport { listResolvedLocalViewSessions, resolveLocalViewSession } from \"./discovery.js\";\nimport { LocalViewCdpProxy } from \"./cdp-proxy.js\";\nimport { CURRENT_PROCESS_OWNER } from \"../local-browser/process-owner.js\";\nimport { LocalViewRuntimeState } from \"./runtime-state.js\";\nimport { clearLocalViewServiceState } from \"./service-state.js\";\nimport {\n OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT,\n OPENSTEER_LOCAL_VIEW_SERVICE_VERSION,\n writeLocalViewServiceState,\n} from \"./service-state.js\";\nimport { LocalViewStreamHub } from \"./view-stream.js\";\nimport { LocalViewWebSocketServer } from \"./ws-types.js\";\n\nconst DEFAULT_MAX_FPS = 12;\nconst DEFAULT_QUALITY = 75;\nconst DEFAULT_MAX_CLIENT_BUFFER_BYTES = 512 * 1024;\nconst LOCAL_VIEW_ACCESS_EXPIRES_AT = Number.MAX_SAFE_INTEGER;\n\nexport interface LocalViewServer {\n readonly url: string;\n readonly token: string;\n close(): Promise<void>;\n}\n\nexport async function startLocalViewServer(\n input: {\n readonly port?: number;\n readonly token?: string;\n readonly onClosed?: () => void | Promise<void>;\n } = {},\n): Promise<LocalViewServer> {\n const token = input.token ?? randomBytes(24).toString(\"hex\");\n const runtimeState = new LocalViewRuntimeState();\n const viewStreamHub = new LocalViewStreamHub({\n runtimeState,\n maxFps: DEFAULT_MAX_FPS,\n quality: DEFAULT_QUALITY,\n maxClientBufferBytes: DEFAULT_MAX_CLIENT_BUFFER_BYTES,\n });\n const cdpProxy = new LocalViewCdpProxy({\n runtimeState,\n });\n\n const httpServer = createServer((request, response) => {\n void handleHttpRequest({ request, response, token, shutdown: closeServer }).catch(() => {\n if (!response.headersSent && !response.writableEnded) {\n writeJson(response, 500, { error: \"Internal server error.\" });\n return;\n }\n response.destroy();\n });\n });\n\n const viewWss = new LocalViewWebSocketServer({ noServer: true });\n viewWss.on(\"connection\", (ws, request: IncomingMessage) => {\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n const parts = url.pathname.split(\"/\").filter(Boolean);\n const sessionId = parts[2];\n if (!sessionId) {\n ws.close(1008, \"Session id is required.\");\n return;\n }\n viewStreamHub.attachClient(sessionId, ws);\n });\n\n httpServer.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url ?? \"/\", \"http://localhost\");\n const tokenParam = url.searchParams.get(\"token\");\n if (tokenParam !== token || !isAllowedOrigin(request.headers.origin)) {\n socket.destroy();\n return;\n }\n\n const parts = url.pathname.split(\"/\").filter(Boolean);\n if (parts[0] !== \"ws\" || parts.length !== 3) {\n socket.destroy();\n return;\n }\n\n if (parts[1] === \"view\") {\n viewWss.handleUpgrade(request, socket, head, (ws) => {\n viewWss.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (parts[1] === \"cdp\") {\n cdpProxy.handleUpgrade(request, socket, head);\n return;\n }\n\n socket.destroy();\n });\n\n let closePromise: Promise<void> | undefined;\n async function closeServer(): Promise<void> {\n closePromise ??= (async () => {\n viewWss.clients.forEach((client) => {\n try {\n client.close();\n } catch {}\n });\n viewWss.close();\n cdpProxy.close();\n httpServer.close();\n await once(httpServer, \"close\");\n await clearLocalViewServiceState({ pid: process.pid, token });\n await input.onClosed?.();\n })();\n await closePromise;\n }\n\n httpServer.listen(input.port ?? 0, \"127.0.0.1\");\n await once(httpServer, \"listening\");\n const address = httpServer.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Failed to resolve the local view server address.\");\n }\n\n const url = `http://127.0.0.1:${String(address.port)}`;\n await writeLocalViewServiceState({\n layout: OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT,\n version: OPENSTEER_LOCAL_VIEW_SERVICE_VERSION,\n pid: process.pid,\n processStartedAtMs: CURRENT_PROCESS_OWNER.processStartedAtMs,\n startedAt: Date.now(),\n port: address.port,\n token,\n url,\n });\n\n return {\n url,\n token,\n close: closeServer,\n };\n}\n\nasync function handleHttpRequest(args: {\n readonly request: IncomingMessage;\n readonly response: ServerResponse;\n readonly token: string;\n readonly shutdown: () => Promise<void>;\n}): Promise<void> {\n const url = new URL(args.request.url ?? \"/\", \"http://localhost\");\n\n if (url.pathname === \"/api/health\") {\n if (!isAuthorizedApiRequest(args.request, args.token)) {\n writeJson(args.response, 401, { error: \"Unauthorized.\" });\n return;\n }\n writeJson(args.response, 200, { ok: true });\n return;\n }\n\n if (url.pathname === \"/api/sessions\") {\n if (!isAuthorizedApiRequest(args.request, args.token)) {\n writeJson(args.response, 401, { error: \"Unauthorized.\" });\n return;\n }\n const sessions = await listResolvedLocalViewSessions();\n const payload: OpensteerLocalViewSessionsResponse = { sessions };\n writeJson(args.response, 200, payload);\n return;\n }\n\n if (url.pathname === \"/api/service/stop\") {\n if (!isAuthorizedApiRequest(args.request, args.token)) {\n writeJson(args.response, 401, { error: \"Unauthorized.\" });\n return;\n }\n if (args.request.method !== \"POST\") {\n writeJson(args.response, 405, { error: \"Method not allowed.\" });\n return;\n }\n\n args.response.once(\"finish\", () => {\n void args.shutdown();\n });\n writeJson(args.response, 200, { stopped: true });\n return;\n }\n\n const accessMatch = url.pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/access$/u);\n if (accessMatch) {\n if (!isAuthorizedApiRequest(args.request, args.token)) {\n writeJson(args.response, 401, { error: \"Unauthorized.\" });\n return;\n }\n const sessionId = decodeURIComponent(accessMatch[1]!);\n if (!(await resolveLocalViewSession(sessionId))) {\n writeJson(args.response, 404, { error: \"Session not found.\" });\n return;\n }\n const payload: OpensteerSessionAccessGrantResponse = {\n sessionId,\n expiresAt: LOCAL_VIEW_ACCESS_EXPIRES_AT,\n grants: {\n view: {\n kind: \"view\",\n transport: \"ws\",\n url: `${resolveWsBaseUrl(args.request)}/ws/view/${encodeURIComponent(sessionId)}`,\n token: args.token,\n expiresAt: LOCAL_VIEW_ACCESS_EXPIRES_AT,\n },\n cdp: {\n kind: \"cdp\",\n transport: \"ws\",\n url: `${resolveWsBaseUrl(args.request)}/ws/cdp/${encodeURIComponent(sessionId)}`,\n token: args.token,\n expiresAt: LOCAL_VIEW_ACCESS_EXPIRES_AT,\n },\n },\n };\n writeJson(args.response, 200, payload);\n return;\n }\n\n const closeMatch = url.pathname.match(/^\\/api\\/sessions\\/([^/]+)\\/close$/u);\n if (closeMatch) {\n if (!isAuthorizedApiRequest(args.request, args.token)) {\n writeJson(args.response, 401, { error: \"Unauthorized.\" });\n return;\n }\n if (args.request.method !== \"POST\") {\n writeJson(args.response, 405, { error: \"Method not allowed.\" });\n return;\n }\n\n const sessionId = decodeURIComponent(closeMatch[1]!);\n const { closeLocalViewSessionBrowser, LocalViewSessionCloseError } =\n await import(\"./session-control.js\");\n try {\n await closeLocalViewSessionBrowser(sessionId);\n } catch (error) {\n if (error instanceof LocalViewSessionCloseError) {\n writeJson(args.response, error.statusCode, { error: error.message });\n return;\n }\n throw error;\n }\n\n const payload: OpensteerLocalViewSessionCloseResponse = {\n sessionId,\n closed: true,\n };\n writeJson(args.response, 200, payload);\n return;\n }\n\n if (url.pathname === \"/favicon.ico\") {\n args.response.statusCode = 204;\n args.response.end();\n return;\n }\n\n if (\n url.pathname === \"/\" ||\n url.pathname.startsWith(\"/assets/\") ||\n url.pathname.startsWith(\"/images/\")\n ) {\n await serveStaticAsset(args.response, url.pathname, args.token);\n return;\n }\n\n args.response.statusCode = 404;\n args.response.end(\"not found\");\n}\n\nasync function serveStaticAsset(\n response: ServerResponse,\n pathname: string,\n token: string,\n): Promise<void> {\n const publicDir = resolveLocalViewPublicDir();\n const relativePath = pathname === \"/\" ? \"index.html\" : pathname.slice(1);\n const assetPath = path.resolve(publicDir, relativePath);\n const relativeAssetPath = path.relative(publicDir, assetPath);\n if (\n relativeAssetPath.startsWith(\"..\") ||\n path.isAbsolute(relativeAssetPath) ||\n !existsSync(assetPath)\n ) {\n response.statusCode = 404;\n response.end(\"not found\");\n return;\n }\n\n if (relativePath === \"index.html\") {\n const html = await readFile(assetPath, \"utf8\");\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\");\n response.setHeader(\"cache-control\", \"no-store\");\n response.end(\n html.replace(\n \"__OPENSTEER_LOCAL_BOOTSTRAP_JSON__\",\n JSON.stringify({\n apiBasePath: \"/api\",\n token,\n }),\n ),\n );\n return;\n }\n\n response.setHeader(\"content-type\", guessContentType(assetPath));\n response.setHeader(\"cache-control\", \"no-store\");\n response.end(await readFile(assetPath));\n}\n\nfunction resolveLocalViewPublicDir(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"local-view\", \"public\"),\n path.resolve(moduleDir, \"public\"),\n path.resolve(moduleDir, \"..\", \"local-view\", \"public\"),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n throw new Error(`Could not resolve local view public assets from ${moduleDir}.`);\n}\n\nfunction isAuthorizedApiRequest(request: IncomingMessage, token: string): boolean {\n return (\n request.headers[\"x-opensteer-local-token\"] === token && isAllowedOrigin(request.headers.origin)\n );\n}\n\nfunction isAllowedOrigin(origin: string | undefined): boolean {\n if (origin === undefined) {\n return true;\n }\n try {\n const url = new URL(origin);\n const host = url.hostname;\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"::1\" || host === \"[::1]\";\n } catch {\n return false;\n }\n}\n\nfunction resolveWsBaseUrl(request: IncomingMessage): string {\n const host = request.headers.host ?? \"127.0.0.1\";\n return `ws://${host}`;\n}\n\nfunction writeJson(response: ServerResponse, statusCode: number, value: unknown): void {\n response.statusCode = statusCode;\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n response.end(JSON.stringify(value));\n}\n\nfunction guessContentType(assetPath: string): string {\n if (assetPath.endsWith(\".css\")) {\n return \"text/css; charset=utf-8\";\n }\n if (assetPath.endsWith(\".js\")) {\n return \"application/javascript; charset=utf-8\";\n }\n if (assetPath.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (assetPath.endsWith(\".json\")) {\n return \"application/json; charset=utf-8\";\n }\n if (assetPath.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (assetPath.endsWith(\".ico\")) {\n return \"image/x-icon\";\n }\n return \"application/octet-stream\";\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport { startLocalViewServer } from \"./server.js\";\n\nexport async function runLocalViewService(): Promise<void> {\n const server = await startLocalViewServer({\n token: process.env.OPENSTEER_LOCAL_VIEW_BOOT_TOKEN ?? randomBytes(24).toString(\"hex\"),\n onClosed: () => {\n process.exit(0);\n },\n });\n\n const handleShutdownSignal = () => {\n void server.close();\n };\n process.once(\"SIGINT\", handleShutdownSignal);\n process.once(\"SIGTERM\", handleShutdownSignal);\n\n await new Promise<void>(() => undefined);\n}\n"]}
|