opendevbrowser 0.0.11 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -28
  3. package/dist/chunk-JVBMT2O5.js +7173 -0
  4. package/dist/chunk-JVBMT2O5.js.map +1 -0
  5. package/dist/cli/index.js +3690 -275
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/index.js +1080 -2857
  8. package/dist/index.js.map +1 -1
  9. package/dist/opendevbrowser.js +1080 -2857
  10. package/dist/opendevbrowser.js.map +1 -1
  11. package/extension/dist/annotate-content.css +237 -0
  12. package/extension/dist/annotate-content.js +934 -0
  13. package/extension/dist/background.js +1291 -8
  14. package/extension/dist/logging.js +50 -0
  15. package/extension/dist/ops/dom-bridge.js +355 -0
  16. package/extension/dist/ops/ops-runtime.js +1249 -0
  17. package/extension/dist/ops/ops-session-store.js +189 -0
  18. package/extension/dist/ops/redaction.js +52 -0
  19. package/extension/dist/ops/snapshot-builder.js +4 -0
  20. package/extension/dist/ops/snapshot-shared.js +220 -0
  21. package/extension/dist/popup.js +398 -21
  22. package/extension/dist/relay-settings.js +3 -1
  23. package/extension/dist/services/CDPRouter.js +501 -103
  24. package/extension/dist/services/ConnectionManager.js +464 -57
  25. package/extension/dist/services/NativePortManager.js +182 -0
  26. package/extension/dist/services/RelayClient.js +227 -26
  27. package/extension/dist/services/TabManager.js +81 -0
  28. package/extension/dist/services/TargetSessionMap.js +146 -0
  29. package/extension/dist/services/cdp-router-commands.js +203 -0
  30. package/extension/dist/services/url-restrictions.js +41 -0
  31. package/extension/dist/types.js +3 -1
  32. package/extension/icons/icon128.png +0 -0
  33. package/extension/icons/icon16.png +0 -0
  34. package/extension/icons/icon32.png +0 -0
  35. package/extension/icons/icon48.png +0 -0
  36. package/extension/manifest.json +17 -3
  37. package/extension/popup.html +469 -65
  38. package/package.json +2 -2
  39. package/skills/AGENTS.md +34 -61
  40. package/skills/data-extraction/SKILL.md +95 -103
  41. package/skills/form-testing/SKILL.md +75 -82
  42. package/skills/login-automation/SKILL.md +76 -66
  43. package/skills/opendevbrowser-best-practices/SKILL.md +90 -49
  44. package/skills/opendevbrowser-continuity-ledger/SKILL.md +57 -23
  45. package/dist/chunk-R5VUZEUU.js +0 -128
  46. package/dist/chunk-R5VUZEUU.js.map +0 -1
  47. package/extension/dist/popup.jsx +0 -150
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extension-extractor.ts","../src/browser/script-runner.ts","../src/browser/browser-manager.ts","../src/cache/paths.ts","../src/cache/chrome-locator.ts","../src/cache/downloader.ts","../src/devtools/console-tracker.ts","../src/devtools/network-tracker.ts","../src/export/css-extract.ts","../src/export/dom-capture.ts","../src/export/react-emitter.ts","../src/snapshot/refs.ts","../src/snapshot/ops-snapshot.ts","../src/snapshot/snapshotter.ts","../src/utils/endpoint-validation.ts","../src/relay/relay-endpoints.ts","../src/browser/session-store.ts","../src/browser/target-manager.ts","../src/browser/ops-browser-manager.ts","../src/browser/ops-client.ts","../src/relay/protocol.ts","../src/browser/annotation-manager.ts","../src/annotate/direct-annotator.ts","../src/config.ts","../src/utils/crypto.ts","../src/utils/fs.ts","../src/relay/relay-server.ts","../src/skills/skill-loader.ts","../src/core/bootstrap.ts","../src/cli/daemon.ts","../src/cli/daemon-state.ts","../src/cli/utils/http.ts","../src/cli/daemon-commands.ts","../src/cli/errors.ts","../src/cli/daemon-status.ts","../src/cli/daemon-client.ts","../src/annotate/output.ts"],"sourcesContent":["import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync, rmSync, renameSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst EXTENSION_DIR_NAME = \"opendevbrowser\";\nconst VERSION_FILE = \".version\";\n\nfunction getConfigDir(): string {\n return join(homedir(), \".config\", \"opencode\", EXTENSION_DIR_NAME, \"extension\");\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkgPath = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch (error) {\n console.warn(\"[opendevbrowser] Failed to read package.json for extension version:\", error);\n return \"0.0.0\";\n }\n}\n\nfunction getInstalledVersion(destDir: string): string | null {\n try {\n const versionPath = join(destDir, VERSION_FILE);\n if (existsSync(versionPath)) {\n return readFileSync(versionPath, \"utf-8\").trim();\n }\n } catch (error) {\n console.warn(\"[opendevbrowser] Failed to read installed extension version:\", error);\n }\n return null;\n}\n\nfunction getBundledExtensionPath(): string | null {\n const candidates = [\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"extension\"),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\")\n ];\n for (const candidate of candidates) {\n if (existsSync(join(candidate, \"manifest.json\"))) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction isCompleteInstall(dir: string): boolean {\n const required = [\"manifest.json\", VERSION_FILE];\n return required.every(file => existsSync(join(dir, file)));\n}\n\nexport function extractExtension(): string | null {\n const bundledPath = getBundledExtensionPath();\n if (!bundledPath) {\n return null;\n }\n\n const destDir = getConfigDir();\n const currentVersion = getPackageVersion();\n const installedVersion = getInstalledVersion(destDir);\n\n // Early return if version matches and installation is complete\n if (installedVersion === currentVersion && isCompleteInstall(destDir)) {\n return destDir;\n }\n\n // Create staging directory (sibling to destDir for same-device rename)\n const parentDir = dirname(destDir);\n const stagingDir = join(parentDir, `.opendevbrowser-staging-${process.pid}-${Date.now()}`);\n const backupDir = join(parentDir, `.opendevbrowser-backup-${process.pid}-${Date.now()}`);\n\n try {\n // Step 1: Copy to staging\n mkdirSync(stagingDir, { recursive: true });\n const itemsToCopy = [\"manifest.json\", \"popup.html\", \"dist\", \"icons\"];\n for (const item of itemsToCopy) {\n const src = join(bundledPath, item);\n const dest = join(stagingDir, item);\n if (existsSync(src)) {\n cpSync(src, dest, { recursive: true, force: true });\n }\n }\n writeFileSync(join(stagingDir, VERSION_FILE), currentVersion, \"utf-8\");\n\n // Step 2: Validate staging is complete\n if (!isCompleteInstall(stagingDir)) {\n throw new Error(\"Staging directory incomplete after copy\");\n }\n\n // Step 3: Atomic swap\n if (existsSync(destDir)) {\n renameSync(destDir, backupDir);\n }\n renameSync(stagingDir, destDir);\n\n // Step 4: Cleanup backup\n if (existsSync(backupDir)) {\n rmSync(backupDir, { recursive: true, force: true });\n }\n\n return destDir;\n } catch (error) {\n // Rollback: restore backup if it exists\n if (existsSync(backupDir) && !existsSync(destDir)) {\n try {\n renameSync(backupDir, destDir);\n } catch (rollbackError) {\n console.warn(`[opendevbrowser] Warning: Rollback failed for ${backupDir}:`, rollbackError);\n }\n }\n // Cleanup staging\n if (existsSync(stagingDir)) {\n try {\n rmSync(stagingDir, { recursive: true, force: true });\n } catch (stagingCleanupError) {\n console.warn(`[opendevbrowser] Warning: Failed to clean up staging directory ${stagingDir}:`, stagingCleanupError);\n }\n }\n // Cleanup backup\n if (existsSync(backupDir)) {\n try {\n rmSync(backupDir, { recursive: true, force: true });\n } catch (backupCleanupError) {\n console.warn(`[opendevbrowser] Warning: Failed to clean up backup directory ${backupDir}:`, backupCleanupError);\n }\n }\n throw error;\n }\n}\n\nexport function getExtensionPath(): string | null {\n const destDir = getConfigDir();\n if (isCompleteInstall(destDir)) {\n return destDir;\n }\n return getBundledExtensionPath();\n}\n","import type { BrowserManagerLike } from \"./manager-types\";\n\nexport type RunStep = {\n action: string;\n args?: Record<string, unknown>;\n};\n\nexport type RunResult = {\n i: number;\n ok: boolean;\n data?: unknown;\n error?: { message: string };\n};\n\nexport class ScriptRunner {\n private manager: BrowserManagerLike;\n\n constructor(manager: BrowserManagerLike) {\n this.manager = manager;\n }\n\n async run(sessionId: string, steps: RunStep[], stopOnError = true): Promise<{ results: RunResult[]; timingMs: number }> {\n const startTime = Date.now();\n const results: RunResult[] = [];\n\n for (let i = 0; i < steps.length; i += 1) {\n const step = steps[i];\n if (!step) {\n continue;\n }\n try {\n const data = await this.executeStep(sessionId, step);\n results.push({ i, ok: true, data });\n } catch (error) {\n results.push({\n i,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Unknown error\" }\n });\n if (stopOnError) {\n break;\n }\n }\n }\n\n return { results, timingMs: Date.now() - startTime };\n }\n\n private async executeStep(sessionId: string, step: RunStep): Promise<unknown> {\n const args = step.args ?? {};\n\n switch (step.action) {\n case \"goto\":\n return this.manager.goto(\n sessionId,\n requireString(args.url, \"url\"),\n requireWaitUntil(args.waitUntil),\n requireNumber(args.timeoutMs, 30000)\n );\n case \"wait\":\n if (typeof args.ref === \"string\") {\n const ref = args.ref;\n const state = requireState(args.state);\n const timeoutMs = requireNumber(args.timeoutMs, 30000);\n return withRetry(\"wait\", () => this.manager.waitForRef(\n sessionId,\n ref,\n state,\n timeoutMs\n ));\n }\n return withRetry(\"wait\", () => this.manager.waitForLoad(\n sessionId,\n requireWaitUntil(args.until),\n requireNumber(args.timeoutMs, 30000)\n ));\n case \"snapshot\":\n return this.manager.snapshot(\n sessionId,\n requireSnapshotMode(args.format ?? args.mode),\n requireNumber(args.maxChars, 16000),\n typeof args.cursor === \"string\" ? args.cursor : undefined\n );\n case \"click\":\n return withRetry(\"click\", () => this.manager.click(sessionId, requireString(args.ref, \"ref\")));\n case \"hover\":\n return withRetry(\"hover\", () => this.manager.hover(sessionId, requireString(args.ref, \"ref\")));\n case \"press\":\n return withRetry(\"press\", () => this.manager.press(\n sessionId,\n requireString(args.key, \"key\"),\n typeof args.ref === \"string\" ? args.ref : undefined\n ));\n case \"check\":\n return withRetry(\"check\", () => this.manager.check(sessionId, requireString(args.ref, \"ref\")));\n case \"uncheck\":\n return withRetry(\"uncheck\", () => this.manager.uncheck(sessionId, requireString(args.ref, \"ref\")));\n case \"type\":\n return withRetry(\"type\", () => this.manager.type(\n sessionId,\n requireString(args.ref, \"ref\"),\n requireString(args.text, \"text\"),\n Boolean(args.clear),\n Boolean(args.submit)\n ));\n case \"select\":\n return withRetry(\"select\", () => this.manager.select(\n sessionId,\n requireString(args.ref, \"ref\"),\n requireStringArray(args.values, \"values\")\n ));\n case \"scroll\":\n return withRetry(\"scroll\", () => this.manager.scroll(\n sessionId,\n requireNumber(args.dy, 0),\n typeof args.ref === \"string\" ? args.ref : undefined\n ));\n case \"scroll_into_view\":\n return withRetry(\"scroll_into_view\", () => this.manager.scrollIntoView(\n sessionId,\n requireString(args.ref, \"ref\")\n ));\n case \"dom_get_html\":\n return this.manager.domGetHtml(sessionId, requireString(args.ref, \"ref\"), requireNumber(args.maxChars, 8000));\n case \"dom_get_text\":\n return this.manager.domGetText(sessionId, requireString(args.ref, \"ref\"), requireNumber(args.maxChars, 8000));\n case \"dom_get_attr\":\n return this.manager.domGetAttr(sessionId, requireString(args.ref, \"ref\"), requireString(args.name, \"name\"));\n case \"dom_get_value\":\n return this.manager.domGetValue(sessionId, requireString(args.ref, \"ref\"));\n case \"dom_is_visible\":\n return this.manager.domIsVisible(sessionId, requireString(args.ref, \"ref\"));\n case \"dom_is_enabled\":\n return this.manager.domIsEnabled(sessionId, requireString(args.ref, \"ref\"));\n case \"dom_is_checked\":\n return this.manager.domIsChecked(sessionId, requireString(args.ref, \"ref\"));\n default:\n throw new Error(`Unknown action: ${step.action}`);\n }\n }\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Missing ${label}`);\n }\n return value;\n}\n\nfunction requireStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`Invalid ${label}`);\n }\n return value as string[];\n}\n\nfunction requireNumber(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return fallback;\n}\n\nfunction requireWaitUntil(value: unknown): \"domcontentloaded\" | \"load\" | \"networkidle\" {\n if (value === \"domcontentloaded\" || value === \"load\" || value === \"networkidle\") {\n return value;\n }\n return \"load\";\n}\n\nfunction requireSnapshotMode(value: unknown): \"outline\" | \"actionables\" {\n if (value === \"actionables\") return \"actionables\";\n return \"outline\";\n}\n\nfunction requireState(value: unknown): \"attached\" | \"visible\" | \"hidden\" {\n if (value === \"visible\" || value === \"hidden\") return value;\n return \"attached\";\n}\n\nconst RETRY_ACTIONS = new Set([\n \"click\",\n \"hover\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"type\",\n \"select\",\n \"scroll\",\n \"scroll_into_view\",\n \"wait\"\n]);\nconst RETRY_MAX_ATTEMPTS = 2;\nconst RETRY_BASE_DELAY_MS = 150;\nconst RETRY_MAX_DELAY_MS = 1000;\n\nasync function withRetry<T>(action: string, fn: () => Promise<T>): Promise<T> {\n if (!RETRY_ACTIONS.has(action)) {\n return fn();\n }\n\n let attempt = 0;\n let delay = RETRY_BASE_DELAY_MS;\n while (true) {\n try {\n return await fn();\n } catch (error) {\n attempt += 1;\n if (attempt >= RETRY_MAX_ATTEMPTS || !shouldRetry(error)) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 2, RETRY_MAX_DELAY_MS);\n }\n }\n}\n\nfunction shouldRetry(error: unknown): boolean {\n const message = error instanceof Error ? error.message : \"\";\n if (!message) return true;\n return !/missing|invalid|unknown ref|no active target/i.test(message);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { randomUUID } from \"crypto\";\nimport { mkdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { chromium, type Browser, type BrowserContext, type Page } from \"playwright-core\";\nimport { Mutex } from \"async-mutex\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { resolveCachePaths } from \"../cache/paths\";\nimport { findChromeExecutable } from \"../cache/chrome-locator\";\nimport { downloadChromeForTesting } from \"../cache/downloader\";\nimport { ConsoleTracker } from \"../devtools/console-tracker\";\nimport { NetworkTracker } from \"../devtools/network-tracker\";\nimport { captureDom } from \"../export/dom-capture\";\nimport { extractCss } from \"../export/css-extract\";\nimport { emitReactComponent, type ReactExport } from \"../export/react-emitter\";\nimport { RefStore } from \"../snapshot/refs\";\nimport { Snapshotter } from \"../snapshot/snapshotter\";\nimport { resolveRelayEndpoint, sanitizeWsEndpoint } from \"../relay/relay-endpoints\";\nimport { ensureLocalEndpoint } from \"../utils/endpoint-validation\";\nimport { SessionStore, type BrowserMode } from \"./session-store\";\nimport { TargetManager, type TargetInfo } from \"./target-manager\";\n\nexport type LaunchOptions = {\n profile?: string;\n headless?: boolean;\n startUrl?: string;\n chromePath?: string;\n flags?: string[];\n persistProfile?: boolean;\n // Used by hub/daemon callers to force managed launch when routing through relay.\n noExtension?: boolean;\n};\n\nexport type ConnectOptions = {\n wsEndpoint?: string;\n host?: string;\n port?: number;\n};\n\nexport type ManagedSession = {\n sessionId: string;\n mode: BrowserMode;\n browser: Browser;\n context: BrowserContext;\n profileDir: string;\n persistProfile: boolean;\n targets: TargetManager;\n refStore: RefStore;\n snapshotter: Snapshotter;\n consoleTracker: ConsoleTracker;\n networkTracker: NetworkTracker;\n};\n\nexport class BrowserManager {\n private store = new SessionStore();\n private sessions = new Map<string, ManagedSession>();\n private sessionMutexes = new Map<string, Mutex>();\n private worktree: string;\n private config: OpenDevBrowserConfig;\n private pageListeners = new WeakMap<Page, () => void>();\n\n constructor(worktree: string, config: OpenDevBrowserConfig) {\n this.worktree = worktree;\n this.config = config;\n }\n\n private getMutex(sessionId: string): Mutex {\n let mutex = this.sessionMutexes.get(sessionId);\n if (!mutex) {\n mutex = new Mutex();\n this.sessionMutexes.set(sessionId, mutex);\n }\n return mutex;\n }\n\n updateConfig(config: OpenDevBrowserConfig): void {\n this.config = config;\n for (const managed of this.sessions.values()) {\n managed.consoleTracker.setOptions({ showFullConsole: config.devtools.showFullConsole });\n managed.networkTracker.setOptions({ showFullUrls: config.devtools.showFullUrls });\n }\n }\n\n async launch(options: LaunchOptions): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const resolvedProfile = options.profile ?? this.config.profile;\n const resolvedHeadless = options.headless ?? this.config.headless;\n const persistProfile = options.persistProfile ?? this.config.persistProfile;\n\n const cachePaths = await resolveCachePaths(this.worktree, resolvedProfile);\n const executable = await findChromeExecutable(options.chromePath ?? this.config.chromePath);\n const warnings: string[] = [];\n\n let executablePath = executable;\n if (!executablePath) {\n const download = await downloadChromeForTesting(cachePaths.chromeDir);\n warnings.push(\"System Chrome not found. Downloaded Chrome for Testing.\");\n executablePath = download.executablePath;\n }\n\n const profileDir = persistProfile\n ? cachePaths.profileDir\n : join(cachePaths.projectRoot, \"temp-profiles\", randomUUID());\n\n await mkdir(profileDir, { recursive: true });\n\n let context: BrowserContext | null = null;\n\n try {\n context = await chromium.launchPersistentContext(profileDir, {\n headless: resolvedHeadless,\n executablePath: executablePath ?? undefined,\n args: options.flags ?? this.config.flags,\n viewport: null\n });\n\n const browser = context.browser();\n if (!browser) {\n throw new Error(\"Browser instance unavailable\");\n }\n const sessionId = randomUUID();\n const targets = new TargetManager();\n const pages = context.pages();\n\n if (pages.length === 0) {\n const page = await context.newPage();\n targets.registerPage(page);\n } else {\n targets.registerExistingPages(pages);\n }\n\n const activeTargetId = targets.getActiveTargetId();\n\n if (options.startUrl && activeTargetId) {\n await this.goto(sessionId, options.startUrl, \"load\", 30000, { browser, context, targets });\n }\n\n const refStore = new RefStore();\n const snapshotter = new Snapshotter(refStore);\n const consoleTracker = new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole });\n const networkTracker = new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls });\n\n const managed: ManagedSession = {\n sessionId,\n mode: \"managed\",\n browser,\n context,\n profileDir,\n persistProfile,\n targets,\n refStore,\n snapshotter,\n consoleTracker,\n networkTracker\n };\n\n this.store.add({ id: sessionId, mode: \"managed\", browser, context });\n this.sessions.set(sessionId, managed);\n\n this.attachTrackers(managed);\n this.attachRefInvalidation(managed);\n\n const wsEndpointProvider = browser as unknown as { wsEndpoint?: () => string };\n const wsEndpoint = typeof wsEndpointProvider.wsEndpoint === \"function\"\n ? wsEndpointProvider.wsEndpoint()\n : undefined;\n\n return { sessionId, mode: \"managed\", activeTargetId, warnings, wsEndpoint: wsEndpoint || undefined };\n } catch (error) {\n const launchMessage = error instanceof Error ? error.message : \"Unknown error\";\n const cleanupErrors: unknown[] = [];\n\n if (context) {\n try {\n await context.close();\n } catch (closeError) {\n cleanupErrors.push(closeError);\n }\n }\n\n if (!persistProfile) {\n try {\n await rm(profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n [error, ...cleanupErrors],\n `Failed to launch browser context: ${launchMessage}. Cleanup failed.`\n );\n }\n\n throw new Error(`Failed to launch browser context: ${launchMessage}`, { cause: error });\n }\n }\n\n async connect(options: ConnectOptions): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const wsEndpoint = await this.resolveWsEndpoint(options);\n return this.connectWithEndpoint(wsEndpoint, \"cdpConnect\");\n }\n\n async connectRelay(wsEndpoint: string): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string; leaseId?: string }> {\n ensureLocalEndpoint(wsEndpoint, this.config.security.allowNonLocalCdp);\n const { connectEndpoint, reportedEndpoint } = await this.resolveRelayEndpoints(wsEndpoint);\n return this.connectWithEndpoint(connectEndpoint, \"extension\", reportedEndpoint);\n }\n\n async closeAll(): Promise<void> {\n const sessions = Array.from(this.sessions.keys());\n await Promise.allSettled(sessions.map(id => this.disconnect(id, true)));\n }\n\n async disconnect(sessionId: string, closeBrowser = false): Promise<void> {\n const managed = this.getManaged(sessionId);\n const cleanupErrors: unknown[] = [];\n\n try {\n for (const entry of managed.targets.listPageEntries()) {\n const cleanup = this.pageListeners.get(entry.page);\n if (cleanup) {\n try {\n cleanup();\n } catch (error) {\n cleanupErrors.push(error);\n }\n this.pageListeners.delete(entry.page);\n }\n }\n\n try {\n const shouldCloseBrowser = closeBrowser || managed.mode !== \"managed\";\n if (shouldCloseBrowser) {\n if (managed.mode !== \"managed\") {\n const closePromise = managed.browser.close();\n const result = await Promise.race([\n closePromise.then(() => \"closed\"),\n delay(5000).then(() => \"timeout\")\n ]);\n if (result === \"timeout\") {\n closePromise.catch(() => {});\n console.warn(\"BrowserManager.disconnect: timed out closing CDP connection; continuing cleanup.\");\n }\n } else {\n await managed.browser.close();\n }\n } else {\n await managed.context.close();\n }\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.consoleTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.networkTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (!managed.persistProfile && managed.profileDir) {\n try {\n await rm(managed.profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n } catch (error) {\n cleanupErrors.push(error);\n }\n }\n } finally {\n this.sessions.delete(sessionId);\n this.sessionMutexes.delete(sessionId);\n this.store.delete(sessionId);\n }\n\n if (cleanupErrors.length === 1) {\n throw cleanupErrors[0];\n }\n if (cleanupErrors.length > 1) {\n throw new AggregateError(cleanupErrors, \"Failed to disconnect browser session.\");\n }\n }\n\n async status(sessionId: string): Promise<{ mode: BrowserMode; activeTargetId: string | null; url?: string; title?: string }> {\n const managed = this.getManaged(sessionId);\n const activeTargetId = managed.targets.getActiveTargetId();\n const page = activeTargetId ? managed.targets.getPage(activeTargetId) : null;\n const title = await this.safePageTitle(page, \"BrowserManager.status\");\n const url = this.safePageUrl(page, \"BrowserManager.status\");\n\n return {\n mode: managed.mode,\n activeTargetId,\n url,\n title\n };\n }\n\n async withPage<T>(\n sessionId: string,\n targetId: string | null,\n fn: (page: Page) => Promise<T>\n ): Promise<T> {\n const managed = this.getManaged(sessionId);\n const page = targetId ? managed.targets.getPage(targetId) : managed.targets.getActivePage();\n if (managed.mode === \"extension\") {\n await this.waitForExtensionTargetReady(page, \"withPage\");\n }\n return await fn(page);\n }\n\n async listTargets(sessionId: string, includeUrls = false): Promise<{ activeTargetId: string | null; targets: TargetInfo[] }> {\n const managed = this.getManaged(sessionId);\n const targets = await managed.targets.listTargets(includeUrls);\n return {\n activeTargetId: managed.targets.getActiveTargetId(),\n targets\n };\n }\n\n async page(sessionId: string, name: string, url?: string): Promise<{ targetId: string; created: boolean; url?: string; title?: string }> {\n const managed = this.getManaged(sessionId);\n const existingTargetId = managed.targets.getTargetIdByName(name);\n let targetId = existingTargetId;\n let created = false;\n\n if (targetId) {\n managed.targets.setActiveTarget(targetId);\n } else {\n if (managed.mode === \"extension\") {\n try {\n const page = await this.createExtensionPage(managed, \"page\");\n targetId = managed.targets.registerPage(page, name);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n created = true;\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n const activeTargetId = managed.targets.getActiveTargetId();\n if (!activeTargetId) {\n throw error;\n }\n managed.targets.setName(activeTargetId, name);\n targetId = activeTargetId;\n created = true;\n }\n } else {\n const page = await managed.context.newPage();\n targetId = managed.targets.registerPage(page, name);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n created = true;\n }\n }\n\n this.attachTrackers(managed);\n\n if (url) {\n await this.goto(sessionId, url, \"load\", 30000);\n }\n\n const page = managed.targets.getPage(targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.page\");\n const finalUrl = this.safePageUrl(page, \"BrowserManager.page\");\n\n return { targetId, created, url: finalUrl, title };\n }\n\n async listPages(sessionId: string): Promise<{ pages: Array<{ name: string; targetId: string; url?: string; title?: string }> }> {\n const managed = this.getManaged(sessionId);\n const named = managed.targets.listNamedTargets();\n const pages: Array<{ name: string; targetId: string; url?: string; title?: string }> = [];\n\n for (const entry of named) {\n const page = managed.targets.getPage(entry.targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.listPages\");\n const url = this.safePageUrl(page, \"BrowserManager.listPages\");\n pages.push({ name: entry.name, targetId: entry.targetId, url, title });\n }\n\n return { pages };\n }\n\n async closePage(sessionId: string, name: string): Promise<void> {\n const managed = this.getManaged(sessionId);\n const targetId = managed.targets.getTargetIdByName(name);\n if (!targetId) {\n throw new Error(`Unknown page name: ${name}`);\n }\n if (managed.mode === \"extension\") {\n const entries = managed.targets.listPageEntries();\n if (entries.length <= 1) {\n managed.targets.removeName(name);\n managed.refStore.clearTarget(targetId);\n return;\n }\n }\n await managed.targets.closeTarget(targetId);\n managed.refStore.clearTarget(targetId);\n this.attachTrackers(managed);\n }\n\n async useTarget(sessionId: string, targetId: string): Promise<{ activeTargetId: string; url?: string; title?: string }> {\n const managed = this.getManaged(sessionId);\n managed.targets.setActiveTarget(targetId);\n this.attachTrackers(managed);\n\n const page = managed.targets.getPage(targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.useTarget\");\n\n return {\n activeTargetId: targetId,\n url: this.safePageUrl(page, \"BrowserManager.useTarget\"),\n title\n };\n }\n\n async newTarget(sessionId: string, url?: string): Promise<{ targetId: string }> {\n const managed = this.getManaged(sessionId);\n if (managed.mode === \"extension\") {\n const previousTargetId = managed.targets.getActiveTargetId();\n let createdTargetId: string | null = null;\n try {\n const page = await this.createExtensionPage(managed, \"target-new\");\n const targetId = managed.targets.registerPage(page);\n createdTargetId = targetId;\n this.attachRefInvalidationForPage(managed, targetId, page);\n if (url) {\n await this.waitForExtensionTargetReady(page, \"target-new\");\n try {\n await page.goto(url, { waitUntil: \"load\" });\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n await delay(200);\n await this.waitForExtensionTargetReady(page, \"target-new\");\n await page.goto(url, { waitUntil: \"load\" });\n }\n }\n managed.targets.setActiveTarget(targetId);\n this.attachTrackers(managed);\n return { targetId };\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n if (createdTargetId) {\n try {\n await managed.targets.closeTarget(createdTargetId);\n } catch {\n // Best-effort cleanup; fall back to the existing tab.\n }\n }\n const fallbackTargetId = previousTargetId ?? managed.targets.getActiveTargetId();\n if (!fallbackTargetId) {\n throw error;\n }\n managed.targets.setActiveTarget(fallbackTargetId);\n const page = managed.targets.getPage(fallbackTargetId);\n if (url) {\n try {\n await page.goto(url, { waitUntil: \"load\" });\n } catch (retryError) {\n if (!this.isDetachedFrameError(retryError)) {\n throw retryError;\n }\n await delay(200);\n await page.goto(url, { waitUntil: \"load\" });\n }\n }\n this.attachTrackers(managed);\n return { targetId: fallbackTargetId };\n }\n }\n\n const page = await managed.context.newPage();\n const targetId = managed.targets.registerPage(page);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n if (url) {\n await page.goto(url, { waitUntil: \"load\" });\n }\n this.attachTrackers(managed);\n return { targetId };\n }\n\n async closeTarget(sessionId: string, targetId: string): Promise<void> {\n const managed = this.getManaged(sessionId);\n if (managed.mode === \"extension\") {\n const entries = managed.targets.listPageEntries();\n if (entries.length <= 1) {\n managed.refStore.clearTarget(targetId);\n return;\n }\n }\n await managed.targets.closeTarget(targetId);\n managed.refStore.clearTarget(targetId);\n this.attachTrackers(managed);\n }\n\n async goto(sessionId: string, url: string, waitUntil: \"domcontentloaded\" | \"load\" | \"networkidle\" = \"load\", timeoutMs = 30000, sessionOverride?: { browser: Browser; context: BrowserContext; targets: TargetManager }): Promise<{ finalUrl?: string; status?: number; timingMs: number }> {\n const startTime = Date.now();\n const managed = sessionOverride ? this.buildOverrideSession(sessionOverride) : this.getManaged(sessionId);\n let page = managed.targets.getActivePage();\n const syncExtensionTargets = (): void => {\n try {\n managed.targets.syncPages(managed.context.pages());\n } catch {\n // Best-effort sync only.\n }\n };\n const pickStableExtensionEntry = (): { targetId: string; page: Page } | null => {\n syncExtensionTargets();\n for (const entry of managed.targets.listPageEntries()) {\n try {\n const candidateUrl = entry.page.url();\n if (candidateUrl.startsWith(\"http://\") || candidateUrl.startsWith(\"https://\")) {\n return entry;\n }\n } catch {\n // Ignore pages that cannot report a URL.\n }\n }\n return null;\n };\n const selectFallbackExtensionPage = (): Page | null => {\n syncExtensionTargets();\n const entries = managed.targets.listPageEntries().filter((entry) => !entry.page.isClosed());\n if (entries.length === 0) {\n return null;\n }\n const stable = entries.find((entry) => {\n try {\n const candidateUrl = entry.page.url();\n return candidateUrl.startsWith(\"http://\") || candidateUrl.startsWith(\"https://\");\n } catch {\n return false;\n }\n }) ?? entries[0]!;\n managed.targets.setActiveTarget(stable.targetId);\n return stable.page;\n };\n const ensureActiveExtensionPage = async (): Promise<Page> => {\n const newPage = await this.createExtensionPage(managed, \"goto\");\n const targetId = managed.targets.registerPage(newPage);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, newPage);\n this.attachTrackers(managed);\n try {\n await this.waitForExtensionTargetReady(newPage, \"goto\", Math.min(timeoutMs, 5000));\n } catch (error) {\n if (!this.isExtensionTargetReadyTimeout(error)) {\n throw error;\n }\n console.warn(\"BrowserManager.goto: extension target readiness timed out; continuing.\");\n }\n return newPage;\n };\n\n if (managed.mode === \"extension\") {\n try {\n const currentUrl = page.url();\n if (!currentUrl || currentUrl === \"about:blank\" || currentUrl.startsWith(\"chrome://\") || currentUrl.startsWith(\"chrome-extension://\")) {\n const stable = pickStableExtensionEntry();\n if (stable) {\n managed.targets.setActiveTarget(stable.targetId);\n page = stable.page;\n } else {\n try {\n page = await ensureActiveExtensionPage();\n } catch (error) {\n if (!this.isTargetNotAllowedError(error)) {\n throw error;\n }\n }\n }\n }\n } catch {\n try {\n page = await ensureActiveExtensionPage();\n } catch (error) {\n if (!this.isTargetNotAllowedError(error)) {\n throw error;\n }\n }\n }\n try {\n await this.waitForExtensionTargetReady(page, \"goto\", Math.min(timeoutMs, 5000));\n } catch (error) {\n if (this.isDetachedFrameError(error)) {\n try {\n page = await ensureActiveExtensionPage();\n } catch (retryError) {\n if (!this.isTargetNotAllowedError(retryError)) {\n throw retryError;\n }\n page = selectFallbackExtensionPage() ?? page;\n }\n } else if (this.isExtensionTargetReadyTimeout(error)) {\n page = selectFallbackExtensionPage() ?? page;\n } else {\n throw error;\n }\n }\n }\n\n let response;\n if (managed.mode === \"extension\") {\n let lastError: unknown = null;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n response = await page.goto(url, { waitUntil, timeout: timeoutMs });\n lastError = null;\n break;\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n lastError = error;\n try {\n page = await ensureActiveExtensionPage();\n } catch (retryError) {\n if (!this.isTargetNotAllowedError(retryError)) {\n throw retryError;\n }\n page = selectFallbackExtensionPage() ?? page;\n }\n }\n }\n if (lastError) {\n throw lastError;\n }\n } else {\n response = await page.goto(url, { waitUntil, timeout: timeoutMs });\n }\n\n return {\n finalUrl: page.url(),\n status: response?.status(),\n timingMs: Date.now() - startTime\n };\n }\n\n async waitForLoad(sessionId: string, until: \"domcontentloaded\" | \"load\" | \"networkidle\", timeoutMs = 30000): Promise<{ timingMs: number }> {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n await page.waitForLoadState(until, { timeout: timeoutMs });\n return { timingMs: Date.now() - startTime };\n }\n\n async waitForRef(sessionId: string, ref: string, state: \"attached\" | \"visible\" | \"hidden\" = \"attached\", timeoutMs = 30000): Promise<{ timingMs: number }> {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const page = managed.targets.getActivePage();\n await page.locator(selector).waitFor({ state, timeout: timeoutMs });\n return { timingMs: Date.now() - startTime };\n }\n\n async snapshot(sessionId: string, mode: \"outline\" | \"actionables\", maxChars: number, cursor?: string): ReturnType<Snapshotter[\"snapshot\"]> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const managed = this.getManaged(sessionId);\n const targetId = managed.targets.getActiveTargetId();\n if (!targetId) {\n throw new Error(\"No active target for snapshot\");\n }\n const page = managed.targets.getActivePage();\n return managed.snapshotter.snapshot(page, targetId, {\n mode,\n maxChars,\n cursor,\n maxNodes: this.config.snapshot.maxNodes\n });\n });\n }\n\n async click(sessionId: string, ref: string): Promise<{ timingMs: number; navigated: boolean }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const page = managed.targets.getActivePage();\n const previousUrl = page.url();\n await page.locator(selector).click();\n const navigated = page.url() !== previousUrl;\n return { timingMs: Date.now() - startTime, navigated };\n });\n }\n\n async hover(sessionId: string, ref: string): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n await managed.targets.getActivePage().locator(selector).hover();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async press(sessionId: string, key: string, ref?: string): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n if (ref) {\n const selector = this.resolveSelector(managed, ref);\n await page.locator(selector).focus();\n }\n await page.keyboard.press(key);\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async check(sessionId: string, ref: string): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n await managed.targets.getActivePage().locator(selector).check();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async uncheck(sessionId: string, ref: string): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n await managed.targets.getActivePage().locator(selector).uncheck();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async type(sessionId: string, ref: string, text: string, clear = false, submit = false): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n if (clear) {\n await locator.fill(\"\");\n }\n await locator.fill(text);\n if (submit) {\n await locator.press(\"Enter\");\n }\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async select(sessionId: string, ref: string, values: string[]): Promise<void> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n await managed.targets.getActivePage().locator(selector).selectOption(values);\n }\n\n async scroll(sessionId: string, dy: number, ref?: string): Promise<void> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n if (ref) {\n const selector = this.resolveSelector(managed, ref);\n await page.locator(selector).evaluate((el, delta) => {\n (el as HTMLElement).scrollBy(0, delta as number);\n }, dy);\n } else {\n await page.mouse.wheel(0, dy);\n }\n }\n\n async scrollIntoView(sessionId: string, ref: string): Promise<{ timingMs: number }> {\n const mutex = this.getMutex(sessionId);\n return mutex.runExclusive(async () => {\n const startTime = Date.now();\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n await managed.targets.getActivePage().locator(selector).scrollIntoViewIfNeeded();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async domGetHtml(sessionId: string, ref: string, maxChars = 8000): Promise<{ outerHTML: string; truncated: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const html = await managed.targets.getActivePage().$eval(selector, (el) => (el as Element).outerHTML);\n return truncateHtml(html, maxChars);\n }\n\n async domGetText(sessionId: string, ref: string, maxChars = 8000): Promise<{ text: string; truncated: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const text = await managed.targets.getActivePage().$eval(selector, (el) => (el as HTMLElement).innerText || el.textContent || \"\");\n return truncateText(text, maxChars);\n }\n\n async domGetAttr(sessionId: string, ref: string, name: string): Promise<{ value: string | null }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n return { value: await locator.getAttribute(name) };\n }\n\n async domGetValue(sessionId: string, ref: string): Promise<{ value: string }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n return { value: await locator.inputValue() };\n }\n\n async domIsVisible(sessionId: string, ref: string): Promise<{ value: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n return { value: await locator.isVisible() };\n }\n\n async domIsEnabled(sessionId: string, ref: string): Promise<{ value: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n return { value: await locator.isEnabled() };\n }\n\n async domIsChecked(sessionId: string, ref: string): Promise<{ value: boolean }> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const locator = managed.targets.getActivePage().locator(selector);\n return { value: await locator.isChecked() };\n }\n\n async clonePage(sessionId: string): Promise<ReactExport> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n const allowUnsafeExport = this.config.security.allowUnsafeExport;\n const exportConfig = this.config.export;\n const capture = await captureDom(page, \"body\", {\n sanitize: !allowUnsafeExport,\n maxNodes: exportConfig.maxNodes,\n inlineStyles: exportConfig.inlineStyles\n });\n const css = extractCss(capture);\n return emitReactComponent(capture, css, { allowUnsafeExport });\n }\n\n async cloneComponent(sessionId: string, ref: string): Promise<ReactExport> {\n const managed = this.getManaged(sessionId);\n const selector = this.resolveSelector(managed, ref);\n const allowUnsafeExport = this.config.security.allowUnsafeExport;\n const exportConfig = this.config.export;\n const capture = await captureDom(managed.targets.getActivePage(), selector, {\n sanitize: !allowUnsafeExport,\n maxNodes: exportConfig.maxNodes,\n inlineStyles: exportConfig.inlineStyles\n });\n const css = extractCss(capture);\n return emitReactComponent(capture, css, { allowUnsafeExport });\n }\n\n async perfMetrics(sessionId: string): Promise<{ metrics: Array<{ name: string; value: number }> }> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n const session = await managed.context.newCDPSession(page);\n const result = await session.send(\"Performance.getMetrics\") as { metrics?: Array<{ name: string; value: number }> };\n await session.detach();\n const metrics = Array.isArray(result.metrics) ? result.metrics : [];\n return { metrics };\n }\n\n async screenshot(sessionId: string, path?: string): Promise<{ path?: string; base64?: string; warnings?: string[] }> {\n const managed = this.getManaged(sessionId);\n const page = managed.targets.getActivePage();\n if (path) {\n await page.screenshot({ path, type: \"png\" });\n return { path };\n }\n const buffer = await page.screenshot({ type: \"png\" });\n return { base64: buffer.toString(\"base64\") };\n }\n\n async consolePoll(sessionId: string, sinceSeq?: number, max = 50): Promise<{ events: ReturnType<ConsoleTracker[\"poll\"]>[\"events\"]; nextSeq: number }> {\n const managed = this.getManaged(sessionId);\n return managed.consoleTracker.poll(sinceSeq, max);\n }\n\n async networkPoll(sessionId: string, sinceSeq?: number, max = 50): Promise<{ events: ReturnType<NetworkTracker[\"poll\"]>[\"events\"]; nextSeq: number }> {\n const managed = this.getManaged(sessionId);\n return managed.networkTracker.poll(sinceSeq, max);\n }\n\n private buildOverrideSession(input: { browser: Browser; context: BrowserContext; targets: TargetManager }): ManagedSession {\n const refStore = new RefStore();\n return {\n sessionId: \"override\",\n mode: \"managed\",\n browser: input.browser,\n context: input.context,\n profileDir: \"\",\n persistProfile: true,\n targets: input.targets,\n refStore,\n snapshotter: new Snapshotter(refStore),\n consoleTracker: new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole }),\n networkTracker: new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls })\n };\n }\n\n private getManaged(sessionId: string): ManagedSession {\n const managed = this.sessions.get(sessionId);\n if (!managed) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n return managed;\n }\n\n private resolveSelector(managed: ManagedSession, ref: string): string {\n const targetId = managed.targets.getActiveTargetId();\n if (!targetId) {\n throw new Error(\"No active target for ref resolution\");\n }\n const entry = managed.refStore.resolve(targetId, ref);\n if (!entry) {\n throw new Error(`Unknown ref: ${ref}. Take a new snapshot first.`);\n }\n return entry.selector;\n }\n\n private async safePageTitle(page: Page | null, context: string): Promise<string | undefined> {\n if (!page) return undefined;\n try {\n const result = await Promise.race([\n page.title(),\n delay(2000).then(() => null)\n ]);\n if (result === null) {\n console.warn(`${context}: timed out reading page title`);\n return undefined;\n }\n return result;\n } catch {\n console.warn(`${context}: failed to read page title`);\n return undefined;\n }\n }\n\n private safePageUrl(page: Page | null, context: string): string | undefined {\n if (!page) return undefined;\n try {\n return page.url();\n } catch {\n console.warn(`${context}: failed to read page url`);\n return undefined;\n }\n }\n\n private async createExtensionPage(managed: ManagedSession, context: string): Promise<Page> {\n try {\n return await managed.context.newPage();\n } catch (error) {\n if (managed.mode !== \"extension\" || !this.isDetachedFrameError(error)) {\n throw error;\n }\n }\n\n await delay(200);\n\n try {\n return await managed.context.newPage();\n } catch (error) {\n throw this.describeExtensionFailure(context, error, managed);\n }\n }\n\n private async waitForExtensionTargetReady(page: Page, context: string, timeoutMs = 5000): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastError: string | null = null;\n\n while (Date.now() < deadline) {\n if (page.isClosed()) {\n throw new Error(`EXTENSION_TARGET_READY_CLOSED: ${context} page closed before navigation.`);\n }\n try {\n const frame = page.mainFrame();\n if (!frame.isDetached()) {\n const remaining = Math.max(250, Math.min(750, deadline - Date.now()));\n await frame.waitForLoadState(\"domcontentloaded\", { timeout: remaining });\n return;\n }\n } catch (error) {\n if (this.isDetachedFrameError(error)) {\n lastError = error instanceof Error ? error.message : String(error);\n } else if (error instanceof Error && error.name === \"TimeoutError\") {\n // Continue polling until deadline.\n } else {\n throw error;\n }\n }\n await delay(100);\n }\n\n const detail = lastError ? ` Last error: ${lastError}` : \"\";\n throw new Error(`EXTENSION_TARGET_READY_TIMEOUT: ${context} exceeded ${timeoutMs}ms.${detail}`);\n }\n\n private isDetachedFrameError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"Frame has been detached\");\n }\n\n private isTargetNotAllowedError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"Target.createTarget\") && message.includes(\"Not allowed\");\n }\n\n private isExtensionTargetReadyTimeout(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.startsWith(\"EXTENSION_TARGET_READY_TIMEOUT\");\n }\n\n private describeExtensionFailure(context: string, error: unknown, managed: ManagedSession): Error {\n const message = error instanceof Error ? error.message : String(error);\n let url: string | undefined;\n try {\n url = this.safePageUrl(managed.targets.getActivePage(), `BrowserManager.${context}`);\n } catch {\n url = undefined;\n }\n const urlInfo = url ? ` Active tab: ${url}.` : \"\";\n return new Error(`Extension mode ${context} failed. Focus a stable http(s) tab and retry.${urlInfo} ${message}`);\n }\n\n private attachTrackers(managed: ManagedSession): void {\n const activeTargetId = managed.targets.getActiveTargetId();\n if (!activeTargetId) return;\n const page = managed.targets.getActivePage();\n managed.consoleTracker.attach(page);\n managed.networkTracker.attach(page);\n }\n\n private attachRefInvalidation(managed: ManagedSession): void {\n const entries = managed.targets.listPageEntries();\n for (const entry of entries) {\n this.attachRefInvalidationForPage(managed, entry.targetId, entry.page);\n }\n }\n\n private attachRefInvalidationForPage(managed: ManagedSession, targetId: string, page: Page): void {\n if (this.pageListeners.has(page)) return;\n\n const onNavigate = (frame: { parentFrame: () => unknown }) => {\n if (frame.parentFrame() === null) {\n managed.refStore.clearTarget(targetId);\n }\n };\n\n const onClose = () => {\n managed.refStore.clearTarget(targetId);\n };\n\n page.on(\"framenavigated\", onNavigate);\n page.on(\"close\", onClose);\n\n this.pageListeners.set(page, () => {\n page.off(\"framenavigated\", onNavigate);\n page.off(\"close\", onClose);\n });\n }\n\n private async resolveWsEndpoint(options: ConnectOptions): Promise<string> {\n if (options.wsEndpoint) {\n ensureLocalEndpoint(options.wsEndpoint, this.config.security.allowNonLocalCdp);\n return options.wsEndpoint;\n }\n\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 9222;\n const url = `http://${host}:${port}/json/version`;\n ensureLocalEndpoint(url, this.config.security.allowNonLocalCdp);\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch CDP endpoint from ${url}`);\n }\n\n const data = await response.json() as { webSocketDebuggerUrl?: string };\n if (!data.webSocketDebuggerUrl) {\n throw new Error(\"webSocketDebuggerUrl missing from /json/version response\");\n }\n\n ensureLocalEndpoint(data.webSocketDebuggerUrl, this.config.security.allowNonLocalCdp);\n\n return data.webSocketDebuggerUrl;\n }\n\n private async connectWithEndpoint(\n connectWsEndpoint: string,\n mode: BrowserMode,\n reportedWsEndpoint?: string\n ): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n let browser: Browser;\n const connectStart = Date.now();\n const sanitizedEndpoint = this.sanitizeWsEndpointForOutput(connectWsEndpoint);\n try {\n browser = await chromium.connectOverCDP(connectWsEndpoint);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"401\") || message.toLowerCase().includes(\"unauthorized\")) {\n throw new Error(\"Relay /cdp rejected the connection (unauthorized). Check relayToken configuration and ensure clients use the current token.\");\n }\n throw new Error(\n `Relay /cdp connectOverCDP failed after ${Date.now() - connectStart}ms (mode=${mode}, endpoint=${sanitizedEndpoint}): ${message}`,\n { cause: error }\n );\n }\n try {\n const contexts = browser.contexts();\n let context = contexts[0] ?? null;\n if (!context) {\n if (mode === \"extension\") {\n throw new Error(\"Extension relay did not expose a browser context. Ensure a normal tab is active and retry.\");\n }\n context = await browser.newContext();\n }\n\n const sessionId = randomUUID();\n const targets = new TargetManager();\n const pages = context.pages();\n\n if (pages.length === 0) {\n if (mode === \"extension\") {\n const page = await waitForPage(context, 8000);\n if (!page) {\n throw new Error(\"Extension relay connected but no page was detected. Focus a normal tab and retry.\");\n }\n targets.registerPage(page);\n } else {\n const page = await context.newPage();\n targets.registerPage(page);\n }\n } else {\n targets.registerExistingPages(pages);\n if (mode === \"extension\") {\n const entries = targets.listPageEntries();\n for (const entry of entries) {\n try {\n const url = entry.page.url();\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n targets.setActiveTarget(entry.targetId);\n break;\n }\n } catch {\n // Skip pages that cannot report a URL.\n }\n }\n }\n }\n\n const refStore = new RefStore();\n const snapshotter = new Snapshotter(refStore);\n const consoleTracker = new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole });\n const networkTracker = new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls });\n\n const managed: ManagedSession = {\n sessionId,\n mode,\n browser,\n context,\n profileDir: \"\",\n persistProfile: true,\n targets,\n refStore,\n snapshotter,\n consoleTracker,\n networkTracker\n };\n\n this.store.add({ id: sessionId, mode, browser, context });\n this.sessions.set(sessionId, managed);\n this.attachTrackers(managed);\n this.attachRefInvalidation(managed);\n\n const wsEndpoint = reportedWsEndpoint ?? connectWsEndpoint;\n return { sessionId, mode, activeTargetId: targets.getActiveTargetId(), warnings: [], wsEndpoint };\n } catch (error) {\n try {\n await browser.close();\n } catch {\n // Best-effort cleanup to avoid orphaned /cdp connections.\n }\n throw error;\n }\n }\n\n private async resolveRelayEndpoints(wsEndpoint: string): Promise<{ connectEndpoint: string; reportedEndpoint: string }> {\n const result = await resolveRelayEndpoint({ wsEndpoint, path: \"cdp\", config: this.config });\n return { connectEndpoint: result.connectEndpoint, reportedEndpoint: result.reportedEndpoint };\n }\n\n private sanitizeWsEndpointForOutput(wsEndpoint: string): string {\n return sanitizeWsEndpoint(wsEndpoint);\n }\n}\n\nconst waitForPage = async (context: BrowserContext, timeoutMs: number): Promise<Page | null> => {\n const existing = context.pages()[0];\n if (existing) return existing;\n try {\n return await context.waitForEvent(\"page\", { timeout: timeoutMs });\n } catch {\n return context.pages()[0] ?? null;\n }\n};\n\nfunction truncateHtml(value: string, maxChars: number): { outerHTML: string; truncated: boolean } {\n if (value.length <= maxChars) {\n return { outerHTML: value, truncated: false };\n }\n return { outerHTML: value.slice(0, maxChars), truncated: true };\n}\n\nconst delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction truncateText(value: string, maxChars: number): { text: string; truncated: boolean } {\n if (value.length <= maxChars) {\n return { text: value, truncated: false };\n }\n return { text: value.slice(0, maxChars), truncated: true };\n}\n","import { createHash } from \"crypto\";\nimport { mkdir, stat } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nexport type CachePaths = {\n root: string;\n projectRoot: string;\n profileDir: string;\n chromeDir: string;\n};\n\nfunction safeHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16);\n}\n\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveCachePaths(worktree: string, profile: string): Promise<CachePaths> {\n const base = process.env.OPENCODE_CACHE_DIR\n ?? process.env.XDG_CACHE_HOME\n ?? join(homedir(), \".cache\");\n const root = join(base, \"opendevbrowser\");\n const projectRoot = join(root, \"projects\", safeHash(worktree));\n const profileDir = join(projectRoot, \"profiles\", profile);\n const chromeDir = join(root, \"chrome\");\n\n await ensureDir(root);\n await ensureDir(projectRoot);\n await ensureDir(profileDir);\n await ensureDir(chromeDir);\n\n return { root, projectRoot, profileDir, chromeDir };\n}\n\nexport async function ensureFileAbsent(path: string): Promise<void> {\n if (await exists(path)) {\n throw new Error(`Path already exists: ${path}`);\n }\n}\n","import { access } from \"fs/promises\";\nimport { delimiter, join } from \"path\";\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathCandidatesByPlatform(): string[] {\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n return [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\"\n ];\n }\n\n if (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 || \"\";\n\n return [\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 }\n\n return [];\n}\n\nfunction binaryCandidatesInPath(): string[] {\n return [\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\"\n ];\n}\n\nasync function findInPath(binary: string): Promise<string | null> {\n const pathValue = process.env.PATH;\n if (!pathValue) return null;\n\n const candidates = process.platform === \"win32\" ? [binary, `${binary}.exe`] : [binary];\n for (const dir of pathValue.split(delimiter)) {\n for (const name of candidates) {\n const fullPath = join(dir, name);\n if (await pathExists(fullPath)) return fullPath;\n }\n }\n\n return null;\n}\n\nexport async function findChromeExecutable(overridePath?: string): Promise<string | null> {\n if (overridePath && await pathExists(overridePath)) {\n return overridePath;\n }\n\n for (const candidate of pathCandidatesByPlatform()) {\n if (await pathExists(candidate)) return candidate;\n }\n\n for (const binary of binaryCandidatesInPath()) {\n const found = await findInPath(binary);\n if (found) return found;\n }\n\n return null;\n}\n","import { Browser, detectBrowserPlatform, install, resolveBuildId } from \"@puppeteer/browsers\";\n\nexport type DownloadResult = {\n executablePath: string;\n buildId: string;\n};\n\nexport async function downloadChromeForTesting(cacheDir: string): Promise<DownloadResult> {\n const platform = detectBrowserPlatform();\n if (!platform) {\n throw new Error(\"Unsupported platform for Chrome download\");\n }\n\n const buildId = await resolveBuildId(Browser.CHROME, platform, \"latest\");\n const result = await install({\n browser: Browser.CHROME,\n buildId,\n cacheDir,\n downloadProgressCallback: () => undefined\n });\n\n return {\n executablePath: result.executablePath,\n buildId\n };\n}\n","import type { Page } from \"playwright-core\";\n\nconst JWT_PATTERN = /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g;\nconst TOKEN_LIKE_PATTERN = /\\b[A-Za-z0-9_-]{16,}\\b/g;\nconst API_KEY_PREFIX_PATTERN = /\\b(sk_|pk_|api_|key_|token_|secret_|bearer_)[A-Za-z0-9_-]+\\b/gi;\nconst SENSITIVE_KV_PATTERN = /\\b(token|key|secret|password|auth|bearer|credential)[=:]\\s*\\S+/gi;\n\nfunction shouldRedactToken(token: string): boolean {\n if (/^(sk_|pk_|api_|key_|token_|secret_|bearer_)/i.test(token)) {\n return true;\n }\n const categories = [\n /[a-z]/.test(token),\n /[A-Z]/.test(token),\n /\\d/.test(token),\n /[_-]/.test(token)\n ].filter(Boolean).length;\n return categories >= 2;\n}\n\nfunction redactText(text: string): string {\n let result = text.replace(SENSITIVE_KV_PATTERN, (match) => {\n const sepIndex = match.search(/[=:]/);\n return match.slice(0, sepIndex + 1) + \"[REDACTED]\";\n });\n result = result.replace(JWT_PATTERN, \"[REDACTED]\");\n result = result.replace(API_KEY_PREFIX_PATTERN, \"[REDACTED]\");\n result = result.replace(TOKEN_LIKE_PATTERN, (match) => (\n shouldRedactToken(match) ? \"[REDACTED]\" : match\n ));\n return result;\n}\n\nexport type ConsoleEvent = {\n seq: number;\n level: string;\n text: string;\n ts: number;\n};\n\nexport type ConsoleTrackerOptions = {\n showFullConsole?: boolean;\n};\n\nexport class ConsoleTracker {\n private events: ConsoleEvent[] = [];\n private maxEvents: number;\n private seq: number = 0;\n private page: Page | null = null;\n private handler?: (msg: { type(): string; text(): string }) => void;\n private showFullConsole: boolean;\n\n constructor(maxEvents = 200, options: ConsoleTrackerOptions = {}) {\n this.maxEvents = maxEvents;\n this.showFullConsole = options.showFullConsole ?? false;\n }\n\n setOptions(options: ConsoleTrackerOptions): void {\n if (typeof options.showFullConsole === \"boolean\") {\n this.showFullConsole = options.showFullConsole;\n }\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.handler = (msg) => {\n const rawText = msg.text();\n const text = this.showFullConsole ? rawText : redactText(rawText);\n this.seq += 1;\n this.events.push({\n seq: this.seq,\n level: msg.type(),\n text,\n ts: Date.now()\n });\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n };\n\n page.on(\"console\", this.handler);\n }\n\n detach(): void {\n if (this.page && this.handler) {\n this.page.off(\"console\", this.handler);\n }\n this.page = null;\n this.handler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: ConsoleEvent[]; nextSeq: number } {\n const events = this.events.filter((event) => event.seq > sinceSeq).slice(0, max);\n const last = events[events.length - 1];\n const nextSeq = last ? last.seq : sinceSeq;\n return { events, nextSeq };\n }\n}\n\nexport const __test__ = {\n redactText,\n shouldRedactToken\n};\n","import type { Page, Request, Response } from \"playwright-core\";\n\nfunction shouldRedactPathSegment(segment: string): boolean {\n if (segment.length < 16) return false;\n if (/^\\d+$/.test(segment)) return false;\n if (/^[a-f0-9-]{36}$/i.test(segment)) return false;\n if (/^(sk_|pk_|api_|key_|token_|secret_|bearer_)/i.test(segment)) return true;\n const categories = [/[a-z]/, /[A-Z]/, /\\d/, /[_-]/].filter(r => r.test(segment)).length;\n return categories >= 3 && segment.length >= 20;\n}\n\nfunction redactUrl(rawUrl: string): string {\n try {\n const parsed = new URL(rawUrl);\n parsed.search = \"\";\n parsed.hash = \"\";\n const segments = parsed.pathname.split(\"/\");\n const redactedSegments = segments.map(segment =>\n shouldRedactPathSegment(segment) ? \"[REDACTED]\" : segment\n );\n parsed.pathname = redactedSegments.join(\"/\");\n return parsed.toString();\n } catch {\n return rawUrl.split(/[?#]/)[0] || rawUrl;\n }\n}\n\nexport type NetworkEvent = {\n seq: number;\n method: string;\n url: string;\n status?: number;\n resourceType?: string;\n ts: number;\n};\n\nexport type NetworkTrackerOptions = {\n showFullUrls?: boolean;\n};\n\nexport class NetworkTracker {\n private events: NetworkEvent[] = [];\n private maxEvents: number;\n private seq: number = 0;\n private page: Page | null = null;\n private requestHandler?: (req: Request) => void;\n private responseHandler?: (res: Response) => void;\n private showFullUrls: boolean;\n\n constructor(maxEvents = 300, options: NetworkTrackerOptions = {}) {\n this.maxEvents = maxEvents;\n this.showFullUrls = options.showFullUrls ?? false;\n }\n\n setOptions(options: NetworkTrackerOptions): void {\n if (typeof options.showFullUrls === \"boolean\") {\n this.showFullUrls = options.showFullUrls;\n }\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.requestHandler = (req) => {\n this.push({\n method: req.method(),\n url: this.showFullUrls ? req.url() : redactUrl(req.url()),\n resourceType: req.resourceType(),\n ts: Date.now()\n });\n };\n\n this.responseHandler = (res) => {\n const req = res.request();\n this.push({\n method: req.method(),\n url: this.showFullUrls ? res.url() : redactUrl(res.url()),\n status: res.status(),\n resourceType: req.resourceType(),\n ts: Date.now()\n });\n };\n\n page.on(\"request\", this.requestHandler);\n page.on(\"response\", this.responseHandler);\n }\n\n detach(): void {\n if (this.page && this.requestHandler) {\n this.page.off(\"request\", this.requestHandler);\n }\n if (this.page && this.responseHandler) {\n this.page.off(\"response\", this.responseHandler);\n }\n this.page = null;\n this.requestHandler = undefined;\n this.responseHandler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: NetworkEvent[]; nextSeq: number } {\n const events = this.events.filter((event) => event.seq > sinceSeq).slice(0, max);\n const last = events[events.length - 1];\n const nextSeq = last ? last.seq : sinceSeq;\n return { events, nextSeq };\n }\n\n private push(event: Omit<NetworkEvent, \"seq\">): void {\n this.seq += 1;\n this.events.push({\n seq: this.seq,\n ...event\n });\n\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n }\n}\n","import type { DomCapture } from \"./dom-capture\";\n\nexport const STYLE_ALLOWLIST = new Set([\n \"align-content\",\n \"align-items\",\n \"align-self\",\n \"background\",\n \"background-attachment\",\n \"background-clip\",\n \"background-color\",\n \"background-image\",\n \"background-origin\",\n \"background-position\",\n \"background-position-x\",\n \"background-position-y\",\n \"background-repeat\",\n \"background-size\",\n \"border\",\n \"border-bottom\",\n \"border-bottom-color\",\n \"border-bottom-left-radius\",\n \"border-bottom-right-radius\",\n \"border-bottom-style\",\n \"border-bottom-width\",\n \"border-color\",\n \"border-left\",\n \"border-left-color\",\n \"border-left-style\",\n \"border-left-width\",\n \"border-radius\",\n \"border-right\",\n \"border-right-color\",\n \"border-right-style\",\n \"border-right-width\",\n \"border-style\",\n \"border-top\",\n \"border-top-color\",\n \"border-top-left-radius\",\n \"border-top-right-radius\",\n \"border-top-style\",\n \"border-top-width\",\n \"border-width\",\n \"box-shadow\",\n \"box-sizing\",\n \"color\",\n \"column-gap\",\n \"contain\",\n \"direction\",\n \"display\",\n \"filter\",\n \"flex\",\n \"flex-direction\",\n \"flex-flow\",\n \"flex-wrap\",\n \"font\",\n \"font-family\",\n \"font-feature-settings\",\n \"font-kerning\",\n \"font-size\",\n \"font-size-adjust\",\n \"font-stretch\",\n \"font-style\",\n \"font-variant\",\n \"font-variant-caps\",\n \"font-variant-east-asian\",\n \"font-variant-ligatures\",\n \"font-variant-numeric\",\n \"font-variation-settings\",\n \"font-weight\",\n \"gap\",\n \"grid\",\n \"grid-auto-columns\",\n \"grid-auto-flow\",\n \"grid-auto-rows\",\n \"grid-template-areas\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"height\",\n \"hyphens\",\n \"inset\",\n \"inset-block\",\n \"inset-inline\",\n \"isolation\",\n \"justify-content\",\n \"left\",\n \"letter-spacing\",\n \"line-height\",\n \"margin\",\n \"margin-bottom\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"max-height\",\n \"max-width\",\n \"min-height\",\n \"min-width\",\n \"opacity\",\n \"outline\",\n \"outline-color\",\n \"outline-offset\",\n \"outline-style\",\n \"outline-width\",\n \"overflow\",\n \"overflow-wrap\",\n \"overflow-x\",\n \"overflow-y\",\n \"padding\",\n \"padding-bottom\",\n \"padding-left\",\n \"padding-right\",\n \"padding-top\",\n \"position\",\n \"right\",\n \"row-gap\",\n \"text-align\",\n \"text-align-last\",\n \"text-decoration\",\n \"text-decoration-color\",\n \"text-decoration-line\",\n \"text-decoration-style\",\n \"text-decoration-thickness\",\n \"text-indent\",\n \"text-rendering\",\n \"text-shadow\",\n \"text-transform\",\n \"top\",\n \"transform\",\n \"transform-origin\",\n \"visibility\",\n \"white-space\",\n \"width\",\n \"word-break\",\n \"word-spacing\",\n \"writing-mode\",\n \"z-index\"\n]);\n\nexport const SKIP_STYLE_VALUES = new Set([\n \"\",\n \"initial\",\n \"unset\",\n \"revert\",\n \"revert-layer\"\n]);\n\nexport function extractCss(capture: DomCapture): string {\n const shouldFilter = capture.inlineStyles !== false;\n const lines: string[] = [];\n lines.push(\".opendevbrowser-root {\");\n for (const [key, value] of Object.entries(capture.styles)) {\n const trimmed = value.trim();\n if (trimmed.length === 0) continue;\n if (shouldFilter) {\n if (!STYLE_ALLOWLIST.has(key)) continue;\n if (SKIP_STYLE_VALUES.has(trimmed)) continue;\n }\n lines.push(` ${key}: ${value};`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n","import type { Page } from \"playwright-core\";\nimport { STYLE_ALLOWLIST, SKIP_STYLE_VALUES } from \"./css-extract\";\n\nexport type DomCapture = {\n html: string;\n styles: Record<string, string>;\n warnings: string[];\n inlineStyles: boolean;\n};\n\ntype CaptureOptions = {\n sanitize?: boolean;\n maxNodes?: number;\n inlineStyles?: boolean;\n};\n\nconst DEFAULT_MAX_NODES = 1000;\n\nexport async function captureDom(\n page: Page,\n selector: string,\n options: CaptureOptions = {}\n): Promise<DomCapture> {\n const shouldSanitize = options.sanitize !== false;\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const inlineStyles = options.inlineStyles !== false;\n const styleAllowlist = Array.from(STYLE_ALLOWLIST);\n const skipStyleValues = Array.from(SKIP_STYLE_VALUES);\n\n return page.$eval(\n selector,\n (el, opts) => {\n const style = window.getComputedStyle(el as Element);\n const styles: Record<string, string> = {};\n for (const prop of Array.from(style)) {\n styles[prop] = style.getPropertyValue(prop);\n }\n\n const warnings: string[] = [];\n const root = el as Element;\n const clone = root.cloneNode(true) as Element;\n const originalElements = [root, ...Array.from(root.querySelectorAll(\"*\"))];\n const cloneElements = [clone, ...Array.from(clone.querySelectorAll(\"*\"))];\n const nodeLimit = Math.max(1, opts.maxNodes);\n\n if (originalElements.length > nodeLimit) {\n const omitted = originalElements.length - nodeLimit;\n warnings.push(`Export truncated at ${nodeLimit} nodes; ${omitted} nodes omitted.`);\n }\n\n const limit = Math.min(originalElements.length, nodeLimit);\n if (opts.inlineStyles) {\n const skipSet = new Set(opts.skipStyleValues);\n for (let index = 0; index < limit; index += 1) {\n const source = originalElements[index];\n const target = cloneElements[index];\n if (!source || !target) continue;\n const computed = window.getComputedStyle(source);\n const parts: string[] = [];\n for (const prop of opts.styleAllowlist) {\n const value = computed.getPropertyValue(prop).trim();\n if (value && !skipSet.has(value)) {\n parts.push(`${prop}: ${value};`);\n }\n }\n if (parts.length > 0) {\n target.setAttribute(\"style\", parts.join(\" \"));\n }\n }\n }\n\n if (originalElements.length > nodeLimit) {\n for (let index = nodeLimit; index < cloneElements.length; index += 1) {\n const target = cloneElements[index];\n if (target) {\n target.remove();\n }\n }\n }\n\n const container = document.createElement(\"template\");\n container.content.appendChild(clone);\n\n if (opts.shouldSanitize) {\n const blockedTags = new Set([\n \"script\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"frame\",\n \"frameset\",\n \"applet\",\n \"base\",\n \"link\",\n \"meta\",\n \"noscript\"\n ]);\n const urlAttrs = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\", \"srcset\"]);\n\n const isDangerousUrl = (value: string) => {\n const normalized = value.trim().toLowerCase();\n return normalized.startsWith(\"javascript:\")\n || normalized.startsWith(\"data:\")\n || normalized.startsWith(\"vbscript:\");\n };\n\n const isDangerousSrcset = (value: string) => {\n const entries = value.split(\",\");\n return entries.some((entry) => {\n const url = entry.trim().split(/\\s+/)[0] || \"\";\n return isDangerousUrl(url);\n });\n };\n\n const DANGEROUS_CSS_PATTERNS = [\n /url\\s*\\(/i,\n /expression\\s*\\(/i,\n /-moz-binding/i,\n /behavior\\s*:/i,\n /javascript\\s*:/i\n ];\n\n const sanitizeStyle = (styleValue: string): { sanitized: string; wasModified: boolean } => {\n let result = styleValue;\n let wasModified = false;\n for (const pattern of DANGEROUS_CSS_PATTERNS) {\n if (pattern.test(result)) {\n result = result.replace(new RegExp(pattern.source, \"gi\"), \"/* blocked */\");\n wasModified = true;\n }\n }\n return { sanitized: result, wasModified };\n };\n\n const sanitizeSvg = (svg: Element) => {\n const scripts = svg.querySelectorAll(\"script\");\n scripts.forEach(script => {\n script.remove();\n warnings.push(\"Removed script element from SVG\");\n });\n\n const foreignObjects = svg.querySelectorAll(\"foreignObject\");\n foreignObjects.forEach(fo => {\n fo.remove();\n warnings.push(\"Removed foreignObject from SVG\");\n });\n\n const allElements = svg.querySelectorAll(\"*\");\n allElements.forEach(el => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.toLowerCase().startsWith(\"on\")) {\n el.removeAttribute(attr.name);\n }\n }\n });\n };\n\n const sanitizeElement = (element: Element) => {\n const tag = element.tagName.toLowerCase();\n if (blockedTags.has(tag)) {\n element.remove();\n return;\n }\n\n if (tag === \"svg\") {\n sanitizeSvg(element);\n }\n\n for (const attr of Array.from(element.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\")) {\n element.removeAttribute(attr.name);\n continue;\n }\n if (name === \"style\") {\n const { sanitized, wasModified } = sanitizeStyle(attr.value);\n if (wasModified) {\n element.setAttribute(\"style\", sanitized);\n warnings.push(\"Sanitized dangerous CSS in style attribute\");\n }\n continue;\n }\n if (urlAttrs.has(name)) {\n const value = attr.value || \"\";\n const dangerous = name === \"srcset\"\n ? isDangerousSrcset(value)\n : isDangerousUrl(value);\n if (dangerous) {\n element.removeAttribute(attr.name);\n }\n }\n }\n };\n\n for (const element of Array.from(container.content.querySelectorAll(\"*\"))) {\n sanitizeElement(element);\n }\n if (container.content.firstElementChild) {\n sanitizeElement(container.content.firstElementChild);\n }\n }\n\n return { html: container.innerHTML, styles, warnings, inlineStyles: opts.inlineStyles };\n },\n { shouldSanitize, maxNodes, inlineStyles, styleAllowlist, skipStyleValues }\n );\n}\n","import type { DomCapture } from \"./dom-capture\";\n\nexport type ReactExport = {\n component: string;\n css: string;\n warnings?: string[];\n};\n\nexport type ReactEmitterOptions = {\n allowUnsafeExport?: boolean;\n};\n\nexport function emitReactComponent(capture: DomCapture, css: string, options: ReactEmitterOptions = {}): ReactExport {\n const warnings = [...(capture.warnings ?? [])];\n if (options.allowUnsafeExport) {\n warnings.push(\"Unsafe export enabled: HTML sanitization disabled.\");\n }\n\n const warningComment = options.allowUnsafeExport\n ? \"// WARNING: Unsafe export enabled. HTML sanitization disabled.\\n\"\n : \"\";\n\n const component = `${warningComment}import \"./opendevbrowser.css\";\n\nexport default function OpenDevBrowserComponent() {\n return (\n <div className=\"opendevbrowser-root\" dangerouslySetInnerHTML={{ __html: ${JSON.stringify(capture.html)} }} />\n );\n}`;\n\n return { component, css, warnings: warnings.length > 0 ? warnings : undefined };\n}\n","import { randomUUID } from \"crypto\";\n\nexport type RefEntry = {\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n};\n\nexport type RefSnapshot = {\n snapshotId: string;\n targetId: string;\n count: number;\n};\n\nexport class RefStore {\n private refsByTarget = new Map<string, Map<string, RefEntry>>();\n private snapshotByTarget = new Map<string, string>();\n\n setSnapshot(targetId: string, entries: RefEntry[]): RefSnapshot {\n const map = new Map<string, RefEntry>();\n for (const entry of entries) {\n map.set(entry.ref, entry);\n }\n\n const snapshotId = randomUUID();\n this.refsByTarget.set(targetId, map);\n this.snapshotByTarget.set(targetId, snapshotId);\n\n return { snapshotId, targetId, count: entries.length };\n }\n\n resolve(targetId: string, ref: string): RefEntry | null {\n const map = this.refsByTarget.get(targetId);\n if (!map) return null;\n return map.get(ref) ?? null;\n }\n\n getSnapshotId(targetId: string): string | null {\n return this.snapshotByTarget.get(targetId) ?? null;\n }\n\n getRefCount(targetId: string): number {\n const map = this.refsByTarget.get(targetId);\n return map ? map.size : 0;\n }\n\n clearTarget(targetId: string): void {\n this.refsByTarget.delete(targetId);\n this.snapshotByTarget.delete(targetId);\n }\n}\n","export type SnapshotMode = \"outline\" | \"actionables\";\n\nexport type SnapshotEntry = {\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n};\n\ntype AxValue = {\n type?: string;\n value?: unknown;\n};\n\ntype AxProperty = {\n name: string;\n value?: AxValue;\n};\n\ntype AxNode = {\n nodeId: string;\n ignored?: boolean;\n role?: AxValue;\n chromeRole?: AxValue;\n name?: AxValue;\n value?: AxValue;\n properties?: AxProperty[];\n backendDOMNodeId?: number;\n frameId?: string;\n};\n\nconst DEFAULT_MAX_AX_NODES = 1000;\nconst ACTIONABLE_ROLES = new Set([\n \"button\",\n \"link\",\n \"textbox\",\n \"searchbox\",\n \"textarea\",\n \"checkbox\",\n \"radio\",\n \"combobox\",\n \"listbox\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"switch\",\n \"tab\",\n \"slider\",\n \"spinbutton\",\n \"treeitem\"\n]);\nconst SEMANTIC_ROLES = new Set([\n \"heading\",\n \"article\",\n \"main\",\n \"navigation\",\n \"region\",\n \"section\",\n \"form\",\n \"list\",\n \"listitem\",\n \"paragraph\",\n \"img\",\n \"table\",\n \"row\",\n \"cell\",\n \"columnheader\",\n \"rowheader\",\n \"banner\",\n \"contentinfo\",\n \"complementary\"\n]);\n\nexport const selectorFunction = function(this: Element): string | null {\n if (!(this instanceof Element)) return null;\n const escape = (value: string): string => {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return String(value).replace(/([^\\w-])/g, \"\\\\$1\");\n };\n const testId = this.getAttribute(\"data-testid\");\n if (testId) {\n return '[data-testid=\"' + escape(testId) + '\"]';\n }\n const ariaLabel = this.getAttribute(\"aria-label\");\n if (ariaLabel && ariaLabel.length < 50) {\n return '[aria-label=\"' + escape(ariaLabel) + '\"]';\n }\n const buildPathSelector = (start: Element): string => {\n const parts: string[] = [];\n let current: Element | null = start;\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n if (current.id) {\n selector += \"#\" + escape(current.id);\n parts.unshift(selector);\n break;\n }\n const parentEl: Element | null = current.parentElement;\n if (!parentEl) {\n parts.unshift(selector);\n break;\n }\n let index = 1;\n let sibling: Element | null = current;\n while (sibling && sibling.previousElementSibling) {\n sibling = sibling.previousElementSibling;\n index += 1;\n }\n selector += \":nth-child(\" + index + \")\";\n parts.unshift(selector);\n current = parentEl;\n }\n return parts.join(\" > \");\n };\n return buildPathSelector(this);\n};\nconst SELECTOR_FUNCTION = selectorFunction.toString();\n\nexport async function buildSnapshotFromCdp(\n send: (method: string, params: object) => Promise<unknown>,\n mode: SnapshotMode,\n mainFrameOnly: boolean = true,\n maxNodes?: number\n): Promise<{ entries: SnapshotEntry[]; lines: string[]; warnings: string[] }> {\n await send(\"Accessibility.enable\", {});\n await send(\"DOM.enable\", {});\n const result = await send(\"Accessibility.getFullAXTree\", {}) as { nodes?: AxNode[] };\n const nodes = Array.isArray(result.nodes) ? result.nodes : [];\n const entries: SnapshotEntry[] = [];\n const lines: string[] = [];\n const warnings: string[] = [];\n const maxEntries = typeof maxNodes === \"number\" ? maxNodes : DEFAULT_MAX_AX_NODES;\n let skippedFrameCount = 0;\n\n for (const node of nodes) {\n if (entries.length >= maxEntries) break;\n if (node.ignored) continue;\n if (typeof node.backendDOMNodeId !== \"number\") continue;\n if (mainFrameOnly && node.frameId) {\n skippedFrameCount += 1;\n continue;\n }\n const role = extractValue(node.role) || extractValue(node.chromeRole);\n if (!role) continue;\n if (!shouldInclude(role, mode)) continue;\n\n const selector = await resolveSelector(send, node.backendDOMNodeId);\n if (!selector) continue;\n\n const ref = `r${entries.length + 1}`;\n const name = redactText(extractValue(node.name));\n const value = redactText(extractValue(node.value));\n const disabled = isTruthyProperty(node.properties, \"disabled\");\n const checked = isTruthyProperty(node.properties, \"checked\");\n\n entries.push({\n ref,\n selector,\n backendNodeId: node.backendDOMNodeId,\n frameId: node.frameId,\n role,\n name\n });\n\n lines.push(formatNode({\n ref,\n role,\n name,\n value,\n disabled,\n checked\n }));\n }\n\n if (mainFrameOnly && skippedFrameCount > 0) {\n warnings.push(`Skipped ${skippedFrameCount} iframe nodes; snapshot limited to main frame.`);\n }\n\n return { entries, lines, warnings };\n}\n\nasync function resolveSelector(\n send: (method: string, params: object) => Promise<unknown>,\n backendNodeId: number\n): Promise<string | null> {\n const resolved = await send(\"DOM.resolveNode\", { backendNodeId }) as { object?: { objectId?: string } };\n const objectId = resolved.object?.objectId;\n if (!objectId) return null;\n const result = await send(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: SELECTOR_FUNCTION,\n returnByValue: true\n }) as { result?: { value?: unknown } };\n const selector = result.result?.value;\n if (typeof selector !== \"string\" || selector.trim().length === 0) {\n return null;\n }\n return selector;\n}\n\nfunction shouldInclude(role: string, mode: SnapshotMode): boolean {\n const normalized = role.toLowerCase();\n if (ACTIONABLE_ROLES.has(normalized)) return true;\n if (mode === \"actionables\") return false;\n return SEMANTIC_ROLES.has(normalized);\n}\n\nfunction formatNode(node: {\n ref: string;\n role: string;\n name?: string;\n value?: string;\n disabled?: boolean;\n checked?: boolean;\n}): string {\n const name = redactText(node.name || \"\");\n const value = redactText(node.value || \"\");\n const parts: string[] = [];\n parts.push(`[${node.ref}]`);\n parts.push(node.role);\n\n if (node.disabled) {\n parts.push(\"disabled\");\n }\n\n if (node.checked) {\n parts.push(\"checked\");\n }\n\n if (name) {\n parts.push(`\\\"${name}\\\"`);\n }\n\n if (value) {\n parts.push(`value=\\\"${value}\\\"`);\n }\n\n return parts.join(\" \");\n}\n\nfunction redactText(text?: string): string {\n const trimmed = (text ?? \"\").trim();\n if (!trimmed) return \"\";\n return trimmed.replace(/[A-Za-z0-9+/_-]{24,}/g, \"[redacted]\");\n}\n\nfunction extractValue(value?: AxValue): string {\n if (!value || typeof value.value === \"undefined\" || value.value === null) return \"\";\n if (typeof value.value === \"string\") return value.value;\n if (typeof value.value === \"number\" || typeof value.value === \"boolean\") {\n return String(value.value);\n }\n return \"\";\n}\n\nfunction isTruthyProperty(properties: AxProperty[] | undefined, name: string): boolean {\n if (!properties) return false;\n const found = properties.find((prop) => prop.name === name);\n if (!found || !found.value) return false;\n const value = found.value.value;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.toLowerCase() === \"true\";\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n","import type { Page } from \"playwright-core\";\nimport type { RefStore } from \"./refs\";\nimport { buildSnapshotFromCdp, selectorFunction, type SnapshotMode } from \"./ops-snapshot\";\n\nexport { selectorFunction };\n\nexport type SnapshotResult = {\n snapshotId: string;\n url?: string;\n title?: string;\n content: string;\n truncated: boolean;\n nextCursor?: string;\n refCount: number;\n timingMs: number;\n warnings?: string[];\n};\n\nexport class Snapshotter {\n private refStore: RefStore;\n\n constructor(refStore: RefStore) {\n this.refStore = refStore;\n }\n\n async snapshot(page: Page, targetId: string, options: {\n mode: SnapshotMode;\n maxChars: number;\n cursor?: string;\n mainFrameOnly?: boolean;\n maxNodes?: number;\n }): Promise<SnapshotResult> {\n const startTime = Date.now();\n const session = await page.context().newCDPSession(page);\n let snapshotData: {\n entries: Array<{ ref: string; selector: string; backendNodeId: number; frameId?: string; role?: string; name?: string }>;\n lines: string[];\n warnings: string[];\n };\n try {\n snapshotData = await buildSnapshotFromCdp(\n (method, params) => session.send(\n method as Parameters<typeof session.send>[0],\n params as Parameters<typeof session.send>[1]\n ),\n options.mode,\n options.mainFrameOnly ?? true,\n options.maxNodes\n );\n } finally {\n await session.detach();\n }\n\n const snapshot = this.refStore.setSnapshot(targetId, snapshotData.entries);\n const formatted = snapshotData.lines;\n\n const startIndex = parseCursor(options.cursor);\n const { content, truncated, nextCursor } = paginate(formatted, startIndex, options.maxChars);\n\n const timingMs = Date.now() - startTime;\n let url: string | undefined;\n let title: string | undefined;\n\n try {\n url = page.url();\n title = await page.title();\n } catch (_err) {\n // Page may be closed or navigating; safely ignore and return undefined\n void _err;\n url = undefined;\n title = undefined;\n }\n\n return {\n snapshotId: snapshot.snapshotId,\n url,\n title,\n content,\n truncated,\n nextCursor,\n refCount: snapshot.count,\n timingMs,\n warnings: snapshotData.warnings\n };\n }\n}\n\nfunction parseCursor(cursor?: string): number {\n if (!cursor) return 0;\n const value = Number(cursor);\n if (!Number.isFinite(value) || value < 0) return 0;\n return Math.floor(value);\n}\n\nfunction paginate(lines: string[], startIndex: number, maxChars: number): {\n content: string;\n truncated: boolean;\n nextCursor?: string;\n} {\n let total = 0;\n const parts: string[] = [];\n let idx = startIndex;\n\n while (idx < lines.length) {\n const line = lines[idx];\n /* v8 ignore next -- @preserve */\n if (line === undefined) {\n break;\n }\n if (total + line.length + 1 > maxChars && parts.length > 0) {\n break;\n }\n parts.push(line);\n total += line.length + 1;\n idx += 1;\n }\n\n const truncated = idx < lines.length;\n const nextCursor = truncated ? String(idx) : undefined;\n return {\n content: parts.join(\"\\n\"),\n truncated,\n nextCursor\n };\n}\n","export function ensureLocalEndpoint(endpoint: string, allowNonLocal: boolean): void {\n if (allowNonLocal) return;\n\n const allowedProtocols = new Set([\"ws:\", \"wss:\", \"http:\", \"https:\"]);\n const localHostnames = new Set([\"localhost\", \"127.0.0.1\", \"::1\", \"[::1]\"]);\n\n let parsed: URL;\n try {\n parsed = new URL(endpoint);\n } catch {\n throw new Error(\"Invalid CDP endpoint URL.\");\n }\n\n if (!allowedProtocols.has(parsed.protocol)) {\n throw new Error(`Disallowed protocol \"${parsed.protocol}\" for CDP endpoint. Allowed: ws, wss, http, https.`);\n }\n\n const hostname = parsed.hostname.toLowerCase();\n if (!localHostnames.has(hostname) && !hostname.startsWith(\"::ffff:127.\")) {\n throw new Error(\"Non-local CDP endpoints are disabled by default.\");\n }\n}\n","import type { OpenDevBrowserConfig } from \"../config\";\nimport { ensureLocalEndpoint } from \"../utils/endpoint-validation\";\n\nexport type RelayEndpointResult = {\n connectEndpoint: string;\n reportedEndpoint: string;\n relayPort: number;\n pairingRequired: boolean;\n instanceId?: string;\n epoch?: number;\n};\n\nexport async function resolveRelayEndpoint(options: {\n wsEndpoint: string;\n path: string;\n config: OpenDevBrowserConfig;\n}): Promise<RelayEndpointResult> {\n const baseUrl = new URL(options.wsEndpoint);\n baseUrl.search = \"\";\n baseUrl.hash = \"\";\n\n const httpProtocol = baseUrl.protocol === \"wss:\" ? \"https:\" : \"http:\";\n const configBase = new URL(`${httpProtocol}//${baseUrl.hostname}:${baseUrl.port}`);\n const configUrl = new URL(\"/config\", configBase);\n ensureLocalEndpoint(configUrl.toString(), options.config.security.allowNonLocalCdp);\n\n const relayToken = typeof options.config.relayToken === \"string\" ? options.config.relayToken.trim() : \"\";\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (relayToken) {\n headers.Authorization = `Bearer ${relayToken}`;\n }\n\n const configResponse = await fetch(configUrl.toString(), { headers });\n if (!configResponse.ok) {\n throw new Error(\"Failed to fetch relay config. Ensure the relay is running and reachable.\");\n }\n const config = await configResponse.json() as {\n relayPort?: number;\n pairingRequired?: boolean;\n instanceId?: string;\n epoch?: number;\n };\n const relayPort = typeof config.relayPort === \"number\" ? config.relayPort : null;\n if (!relayPort || relayPort <= 0 || relayPort > 65535) {\n throw new Error(\"Relay config missing relayPort. Ensure the relay is running.\");\n }\n\n const relayWsBase = new URL(`${baseUrl.protocol}//${baseUrl.hostname}:${relayPort}/${options.path}`);\n const reportedEndpoint = sanitizeWsEndpoint(relayWsBase.toString());\n const pairingRequired = Boolean(config.pairingRequired);\n if (!pairingRequired) {\n return {\n connectEndpoint: relayWsBase.toString(),\n reportedEndpoint,\n relayPort,\n pairingRequired,\n instanceId: config.instanceId,\n epoch: config.epoch\n };\n }\n\n const pairBase = new URL(`${httpProtocol}//${baseUrl.hostname}:${relayPort}`);\n const pairUrl = new URL(\"/pair\", pairBase);\n ensureLocalEndpoint(pairUrl.toString(), options.config.security.allowNonLocalCdp);\n\n const pairResponse = await fetch(pairUrl.toString(), { headers });\n if (!pairResponse.ok) {\n throw new Error(\"Failed to fetch relay pairing token. Ensure the relay is running.\");\n }\n const pairData = await pairResponse.json() as { token?: string; instanceId?: string; epoch?: number };\n if (config.instanceId && typeof pairData.instanceId === \"string\" && pairData.instanceId !== config.instanceId) {\n throw new Error(\"Relay pairing mismatch detected. Restart the plugin and retry.\");\n }\n if (!pairData.token || typeof pairData.token !== \"string\") {\n throw new Error(\"Relay pairing token missing from /pair response.\");\n }\n\n const connectUrl = new URL(relayWsBase.toString());\n connectUrl.searchParams.set(\"token\", pairData.token);\n return {\n connectEndpoint: connectUrl.toString(),\n reportedEndpoint,\n relayPort,\n pairingRequired,\n instanceId: config.instanceId,\n epoch: config.epoch\n };\n}\n\nexport function sanitizeWsEndpoint(wsEndpoint: string): string {\n try {\n const url = new URL(wsEndpoint);\n url.searchParams.delete(\"token\");\n url.searchParams.delete(\"pairingToken\");\n url.hash = \"\";\n return url.toString();\n } catch {\n return wsEndpoint;\n }\n}\n","import type { Browser, BrowserContext } from \"playwright-core\";\n\nexport type BrowserMode = \"managed\" | \"cdpConnect\" | \"extension\";\n\nexport type BrowserSession = {\n id: string;\n mode: BrowserMode;\n browser: Browser;\n context: BrowserContext;\n};\n\nexport class SessionStore {\n private sessions = new Map<string, BrowserSession>();\n\n add(session: BrowserSession): void {\n this.sessions.set(session.id, session);\n }\n\n get(sessionId: string): BrowserSession {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n return session;\n }\n\n has(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n delete(sessionId: string): void {\n this.sessions.delete(sessionId);\n }\n\n list(): BrowserSession[] {\n return Array.from(this.sessions.values());\n }\n}\n","import { randomUUID } from \"crypto\";\nimport type { Page } from \"playwright-core\";\n\nexport type TargetInfo = {\n targetId: string;\n title?: string;\n url?: string;\n type: \"page\";\n};\n\nexport type NamedTargetInfo = {\n name: string;\n targetId: string;\n};\n\nconst TARGET_INFO_TIMEOUT_MS = 2000;\n\nexport class TargetManager {\n private targets = new Map<string, Page>();\n private activeTargetId: string | null = null;\n private nameToTarget = new Map<string, string>();\n private targetToName = new Map<string, string>();\n\n registerPage(page: Page, name?: string): string {\n const targetId = randomUUID();\n this.targets.set(targetId, page);\n if (!this.activeTargetId) {\n this.activeTargetId = targetId;\n }\n if (name) {\n this.setName(targetId, name);\n }\n return targetId;\n }\n\n registerExistingPages(pages: Page[]): void {\n for (const page of pages) {\n this.registerPage(page);\n }\n }\n\n setName(targetId: string, name: string): void {\n const trimmed = name.trim();\n if (!trimmed) {\n throw new Error(\"Name must be non-empty\");\n }\n if (!this.targets.has(targetId)) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n const existing = this.nameToTarget.get(trimmed);\n if (existing && existing !== targetId) {\n throw new Error(`Name already in use: ${trimmed}`);\n }\n const previousName = this.targetToName.get(targetId);\n if (previousName && previousName !== trimmed) {\n this.nameToTarget.delete(previousName);\n }\n this.nameToTarget.set(trimmed, targetId);\n this.targetToName.set(targetId, trimmed);\n }\n\n getTargetIdByName(name: string): string | null {\n return this.nameToTarget.get(name.trim()) ?? null;\n }\n\n getName(targetId: string): string | null {\n return this.targetToName.get(targetId) ?? null;\n }\n\n listNamedTargets(): NamedTargetInfo[] {\n return Array.from(this.nameToTarget.entries()).map(([name, targetId]) => ({\n name,\n targetId\n }));\n }\n\n removeName(name: string): void {\n const trimmed = name.trim();\n const targetId = this.nameToTarget.get(trimmed);\n if (targetId) {\n this.nameToTarget.delete(trimmed);\n this.targetToName.delete(targetId);\n }\n }\n\n setActiveTarget(targetId: string): void {\n if (!this.targets.has(targetId)) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n this.activeTargetId = targetId;\n }\n\n getActiveTargetId(): string | null {\n return this.activeTargetId;\n }\n\n getActivePage(): Page {\n if (!this.activeTargetId) {\n throw new Error(\"No active target\");\n }\n const page = this.targets.get(this.activeTargetId);\n if (!page) {\n throw new Error(`Missing active target: ${this.activeTargetId}`);\n }\n return page;\n }\n\n getPage(targetId: string): Page {\n const page = this.targets.get(targetId);\n if (!page) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n return page;\n }\n\n async listTargets(includeUrls = false): Promise<TargetInfo[]> {\n const entries = Array.from(this.targets.entries());\n return Promise.all(entries.map(async ([targetId, page]) => {\n const info: TargetInfo = {\n targetId,\n title: undefined,\n url: undefined,\n type: \"page\"\n };\n\n try {\n if (!page.isClosed()) {\n info.title = await readWithTimeout(() => page.title());\n }\n } catch {\n info.title = undefined;\n }\n\n if (includeUrls) {\n try {\n if (!page.isClosed()) {\n info.url = await readWithTimeout(async () => page.url());\n }\n } catch {\n info.url = undefined;\n }\n }\n\n return info;\n }));\n }\n\n async closeTarget(targetId: string): Promise<void> {\n const page = this.getPage(targetId);\n let closeError: unknown;\n try {\n await page.close();\n } catch (error) {\n closeError = error;\n } finally {\n this.targets.delete(targetId);\n const name = this.targetToName.get(targetId);\n if (name) {\n this.nameToTarget.delete(name);\n this.targetToName.delete(targetId);\n }\n\n if (this.activeTargetId === targetId) {\n const remaining = Array.from(this.targets.keys());\n this.activeTargetId = remaining[0] ?? null;\n }\n }\n\n if (closeError) {\n throw closeError;\n }\n }\n\n listPageEntries(): Array<{ targetId: string; page: Page }> {\n return Array.from(this.targets.entries()).map(([targetId, page]) => ({\n targetId,\n page\n }));\n }\n\n syncPages(pages: Page[]): void {\n const current = new Set(pages);\n\n for (const [targetId, page] of this.targets.entries()) {\n if (page.isClosed() || !current.has(page)) {\n this.targets.delete(targetId);\n const name = this.targetToName.get(targetId);\n if (name) {\n this.nameToTarget.delete(name);\n this.targetToName.delete(targetId);\n }\n }\n }\n\n for (const page of pages) {\n let exists = false;\n for (const existing of this.targets.values()) {\n if (existing === page) {\n exists = true;\n break;\n }\n }\n if (!exists) {\n this.registerPage(page);\n }\n }\n\n if (this.activeTargetId && !this.targets.has(this.activeTargetId)) {\n this.activeTargetId = this.targets.keys().next().value ?? null;\n }\n }\n}\n\nconst readWithTimeout = async <T>(reader: () => Promise<T>, timeoutMs: number = TARGET_INFO_TIMEOUT_MS): Promise<T | undefined> => {\n return await new Promise<T | undefined>((resolve) => {\n const timeoutId = setTimeout(() => resolve(undefined), timeoutMs);\n reader().then((value) => {\n clearTimeout(timeoutId);\n resolve(value);\n }).catch(() => {\n clearTimeout(timeoutId);\n resolve(undefined);\n });\n });\n};\n","import { writeFile } from \"fs/promises\";\nimport { randomUUID } from \"crypto\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { resolveRelayEndpoint, sanitizeWsEndpoint } from \"../relay/relay-endpoints\";\nimport type { BrowserManagerLike } from \"./manager-types\";\nimport type { ConnectOptions, LaunchOptions } from \"./browser-manager\";\nimport type { BrowserMode } from \"./session-store\";\nimport type { TargetInfo } from \"./target-manager\";\nimport type { ReactExport } from \"../export/react-emitter\";\nimport { emitReactComponent } from \"../export/react-emitter\";\nimport { extractCss, STYLE_ALLOWLIST, SKIP_STYLE_VALUES } from \"../export/css-extract\";\nimport type { DomCapture } from \"../export/dom-capture\";\nimport { OpsClient } from \"./ops-client\";\nimport type { ConsoleTracker } from \"../devtools/console-tracker\";\nimport type { NetworkTracker } from \"../devtools/network-tracker\";\nimport { BrowserManager } from \"./browser-manager\";\n\nexport class OpsBrowserManager implements BrowserManagerLike {\n private readonly base: BrowserManager;\n private readonly config: OpenDevBrowserConfig;\n private opsClient: OpsClient | null = null;\n private opsEndpoint: string | null = null;\n private opsSessions = new Set<string>();\n private opsLeases = new Map<string, string>();\n private closedOpsSessions = new Map<string, number>();\n\n constructor(base: BrowserManager, config: OpenDevBrowserConfig) {\n this.base = base;\n this.config = config;\n }\n\n async launch(options: LaunchOptions): ReturnType<BrowserManagerLike[\"launch\"]> {\n return this.base.launch(options);\n }\n\n async connect(options: ConnectOptions): ReturnType<BrowserManagerLike[\"connect\"]> {\n return this.base.connect(options);\n }\n\n async connectRelay(wsEndpoint: string): ReturnType<BrowserManagerLike[\"connectRelay\"]> {\n const endpoint = new URL(wsEndpoint);\n if (endpoint.pathname.endsWith(\"/cdp\")) {\n return this.base.connectRelay(wsEndpoint);\n }\n\n const { connectEndpoint, reportedEndpoint } = await resolveRelayEndpoint({\n wsEndpoint,\n path: \"ops\",\n config: this.config\n });\n const client = await this.ensureOpsClient(connectEndpoint);\n const leaseId = randomUUID();\n const result = await client.request<{ opsSessionId: string; activeTargetId?: string | null; url?: string; title?: string; leaseId?: string }>(\n \"session.connect\",\n {},\n undefined,\n 30000,\n leaseId\n );\n const sessionId = result.opsSessionId;\n this.opsSessions.add(sessionId);\n this.opsLeases.set(sessionId, result.leaseId ?? leaseId);\n this.trackClosedSessionCleanup();\n return {\n sessionId,\n mode: \"extension\",\n activeTargetId: result.activeTargetId ?? null,\n warnings: [],\n leaseId: result.leaseId ?? leaseId,\n wsEndpoint: sanitizeWsEndpoint(reportedEndpoint)\n };\n }\n\n async disconnect(sessionId: string, closeBrowser = false): ReturnType<BrowserManagerLike[\"disconnect\"]> {\n if (!this.opsSessions.has(sessionId)) {\n if (this.closedOpsSessions.has(sessionId)) {\n return;\n }\n return this.base.disconnect(sessionId, closeBrowser);\n }\n try {\n await this.requestOps(sessionId, \"session.disconnect\", { closeBrowser });\n } catch (error) {\n if (!isIgnorableOpsDisconnectError(error)) {\n throw error;\n }\n }\n this.opsSessions.delete(sessionId);\n this.opsLeases.delete(sessionId);\n this.closedOpsSessions.delete(sessionId);\n }\n\n async status(sessionId: string): ReturnType<BrowserManagerLike[\"status\"]> {\n if (!this.opsSessions.has(sessionId)) {\n if (this.closedOpsSessions.has(sessionId)) {\n throw new Error(\"[invalid_session] Session already closed\");\n }\n return this.base.status(sessionId);\n }\n const result = await this.requestOps<{ mode: BrowserMode; activeTargetId: string | null; url?: string; title?: string }>(\n sessionId,\n \"session.status\",\n {}\n );\n return result;\n }\n\n async withPage<T>(sessionId: string, targetId: string | null, fn: (page: never) => Promise<T>): Promise<T> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.withPage(sessionId, targetId, fn as never);\n }\n throw new Error(\"Direct annotate is unavailable via extension ops sessions.\");\n }\n\n async goto(sessionId: string, url: string, waitUntil: \"domcontentloaded\" | \"load\" | \"networkidle\" = \"load\", timeoutMs = 30000): ReturnType<BrowserManagerLike[\"goto\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.goto(sessionId, url, waitUntil, timeoutMs);\n }\n return await this.requestOps(sessionId, \"nav.goto\", { url, waitUntil, timeoutMs });\n }\n\n async waitForLoad(sessionId: string, until: \"domcontentloaded\" | \"load\" | \"networkidle\", timeoutMs = 30000): ReturnType<BrowserManagerLike[\"waitForLoad\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.waitForLoad(sessionId, until, timeoutMs);\n }\n return await this.requestOps(sessionId, \"nav.wait\", { until, timeoutMs });\n }\n\n async waitForRef(sessionId: string, ref: string, state: \"attached\" | \"visible\" | \"hidden\" = \"attached\", timeoutMs = 30000): ReturnType<BrowserManagerLike[\"waitForRef\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.waitForRef(sessionId, ref, state, timeoutMs);\n }\n return await this.requestOps(sessionId, \"nav.wait\", { ref, state, timeoutMs });\n }\n\n async snapshot(sessionId: string, mode: \"outline\" | \"actionables\", maxChars: number, cursor?: string): ReturnType<BrowserManagerLike[\"snapshot\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.snapshot(sessionId, mode, maxChars, cursor);\n }\n return await this.requestOps(sessionId, \"nav.snapshot\", {\n mode,\n maxChars,\n cursor,\n maxNodes: this.config.snapshot.maxNodes\n });\n }\n\n async click(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"click\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.click(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"interact.click\", { ref });\n }\n\n async hover(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"hover\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.hover(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"interact.hover\", { ref });\n }\n\n async press(sessionId: string, key: string, ref?: string): ReturnType<BrowserManagerLike[\"press\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.press(sessionId, key, ref);\n }\n return await this.requestOps(sessionId, \"interact.press\", { key, ref });\n }\n\n async check(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"check\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.check(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"interact.check\", { ref });\n }\n\n async uncheck(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"uncheck\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.uncheck(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"interact.uncheck\", { ref });\n }\n\n async type(sessionId: string, ref: string, text: string, clear = false, submit = false): ReturnType<BrowserManagerLike[\"type\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.type(sessionId, ref, text, clear, submit);\n }\n return await this.requestOps(sessionId, \"interact.type\", { ref, text, clear, submit });\n }\n\n async select(sessionId: string, ref: string, values: string[]): ReturnType<BrowserManagerLike[\"select\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.select(sessionId, ref, values);\n }\n return await this.requestOps(sessionId, \"interact.select\", { ref, values });\n }\n\n async scroll(sessionId: string, dy: number, ref?: string): ReturnType<BrowserManagerLike[\"scroll\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.scroll(sessionId, dy, ref);\n }\n return await this.requestOps(sessionId, \"interact.scroll\", { dy, ref });\n }\n\n async scrollIntoView(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"scrollIntoView\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.scrollIntoView(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"interact.scrollIntoView\", { ref });\n }\n\n async domGetHtml(sessionId: string, ref: string, maxChars = 8000): ReturnType<BrowserManagerLike[\"domGetHtml\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetHtml(sessionId, ref, maxChars);\n }\n return await this.requestOps(sessionId, \"dom.getHtml\", { ref, maxChars });\n }\n\n async domGetText(sessionId: string, ref: string, maxChars = 8000): ReturnType<BrowserManagerLike[\"domGetText\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetText(sessionId, ref, maxChars);\n }\n return await this.requestOps(sessionId, \"dom.getText\", { ref, maxChars });\n }\n\n async domGetAttr(sessionId: string, ref: string, name: string): ReturnType<BrowserManagerLike[\"domGetAttr\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetAttr(sessionId, ref, name);\n }\n return await this.requestOps(sessionId, \"dom.getAttr\", { ref, name });\n }\n\n async domGetValue(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"domGetValue\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetValue(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"dom.getValue\", { ref });\n }\n\n async domIsVisible(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"domIsVisible\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domIsVisible(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"dom.isVisible\", { ref });\n }\n\n async domIsEnabled(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"domIsEnabled\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domIsEnabled(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"dom.isEnabled\", { ref });\n }\n\n async domIsChecked(sessionId: string, ref: string): ReturnType<BrowserManagerLike[\"domIsChecked\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domIsChecked(sessionId, ref);\n }\n return await this.requestOps(sessionId, \"dom.isChecked\", { ref });\n }\n\n async clonePage(sessionId: string): Promise<ReactExport> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.clonePage(sessionId);\n }\n const capture = await this.requestOps<{ capture: DomCapture }>(sessionId, \"export.clonePage\", {\n sanitize: !this.config.security.allowUnsafeExport,\n maxNodes: this.config.export.maxNodes,\n inlineStyles: this.config.export.inlineStyles,\n styleAllowlist: Array.from(STYLE_ALLOWLIST),\n skipStyleValues: Array.from(SKIP_STYLE_VALUES)\n });\n const css = extractCss(capture.capture);\n return emitReactComponent(capture.capture, css, { allowUnsafeExport: this.config.security.allowUnsafeExport });\n }\n\n async cloneComponent(sessionId: string, ref: string): Promise<ReactExport> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.cloneComponent(sessionId, ref);\n }\n const capture = await this.requestOps<{ capture: DomCapture }>(sessionId, \"export.cloneComponent\", {\n ref,\n sanitize: !this.config.security.allowUnsafeExport,\n maxNodes: this.config.export.maxNodes,\n inlineStyles: this.config.export.inlineStyles,\n styleAllowlist: Array.from(STYLE_ALLOWLIST),\n skipStyleValues: Array.from(SKIP_STYLE_VALUES)\n });\n const css = extractCss(capture.capture);\n return emitReactComponent(capture.capture, css, { allowUnsafeExport: this.config.security.allowUnsafeExport });\n }\n\n async perfMetrics(sessionId: string): ReturnType<BrowserManagerLike[\"perfMetrics\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.perfMetrics(sessionId);\n }\n return await this.requestOps(sessionId, \"devtools.perf\", {});\n }\n\n async screenshot(sessionId: string, path?: string): ReturnType<BrowserManagerLike[\"screenshot\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.screenshot(sessionId, path);\n }\n const result = await this.requestOps<{ base64?: string; warning?: string }>(sessionId, \"page.screenshot\", {});\n if (!result.base64) {\n throw new Error(\"Screenshot failed\");\n }\n const warnings = result.warning ? [result.warning] : undefined;\n if (path) {\n await writeFile(path, Buffer.from(result.base64, \"base64\"));\n return warnings ? { path, warnings } : { path };\n }\n return warnings ? { base64: result.base64, warnings } : { base64: result.base64 };\n }\n\n async consolePoll(sessionId: string, sinceSeq?: number, max = 50): Promise<{ events: ReturnType<ConsoleTracker[\"poll\"]>[\"events\"]; nextSeq: number }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.consolePoll(sessionId, sinceSeq, max);\n }\n return await this.requestOps(sessionId, \"devtools.consolePoll\", { sinceSeq, max });\n }\n\n async networkPoll(sessionId: string, sinceSeq?: number, max = 50): Promise<{ events: ReturnType<NetworkTracker[\"poll\"]>[\"events\"]; nextSeq: number }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.networkPoll(sessionId, sinceSeq, max);\n }\n return await this.requestOps(sessionId, \"devtools.networkPoll\", { sinceSeq, max });\n }\n\n async listTargets(sessionId: string, includeUrls = false): Promise<{ activeTargetId: string | null; targets: TargetInfo[] }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.listTargets(sessionId, includeUrls);\n }\n return await this.requestOps(sessionId, \"targets.list\", { includeUrls });\n }\n\n async useTarget(sessionId: string, targetId: string): Promise<{ activeTargetId: string; url?: string; title?: string }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.useTarget(sessionId, targetId);\n }\n return await this.requestOps(sessionId, \"targets.use\", { targetId });\n }\n\n async newTarget(sessionId: string, url?: string): Promise<{ targetId: string }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.newTarget(sessionId, url);\n }\n return await this.requestOps(sessionId, \"targets.new\", { url });\n }\n\n async closeTarget(sessionId: string, targetId: string): Promise<void> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.closeTarget(sessionId, targetId);\n }\n await this.requestOps(sessionId, \"targets.close\", { targetId });\n }\n\n async page(sessionId: string, name: string, url?: string): Promise<{ targetId: string; created: boolean; url?: string; title?: string }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.page(sessionId, name, url);\n }\n return await this.requestOps(sessionId, \"page.open\", { name, url });\n }\n\n async listPages(sessionId: string): Promise<{ pages: Array<{ name: string; targetId: string; url?: string; title?: string }> }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.listPages(sessionId);\n }\n return await this.requestOps(sessionId, \"page.list\", {});\n }\n\n async closePage(sessionId: string, name: string): Promise<void> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.closePage(sessionId, name);\n }\n await this.requestOps(sessionId, \"page.close\", { name });\n }\n\n private async ensureOpsClient(wsEndpoint: string): Promise<OpsClient> {\n if (this.opsClient && this.opsEndpoint === wsEndpoint) {\n await this.opsClient.connect();\n return this.opsClient;\n }\n this.opsClient?.disconnect();\n const client = new OpsClient(wsEndpoint, {\n onEvent: (event) => {\n this.handleOpsEvent(event);\n },\n onClose: () => {\n this.handleOpsClientClosed();\n }\n });\n await client.connect();\n this.opsClient = client;\n this.opsEndpoint = wsEndpoint;\n return client;\n }\n\n private async requestOps<T>(sessionId: string, command: string, payload: Record<string, unknown>): Promise<T> {\n const client = this.opsClient;\n if (!client) {\n throw new Error(\"Ops client not connected\");\n }\n const leaseId = this.opsLeases.get(sessionId);\n if (!leaseId) {\n throw new Error(\"Ops lease not found for session\");\n }\n return await client.request<T>(command, payload, sessionId, 30000, leaseId);\n }\n\n private handleOpsEvent(event: { event?: string; opsSessionId?: string }): void {\n if (!event.opsSessionId) return;\n if (event.event === \"ops_session_closed\" || event.event === \"ops_session_expired\" || event.event === \"ops_tab_closed\") {\n this.opsSessions.delete(event.opsSessionId);\n this.opsLeases.delete(event.opsSessionId);\n this.closedOpsSessions.set(event.opsSessionId, Date.now());\n this.trackClosedSessionCleanup();\n }\n }\n\n private handleOpsClientClosed(): void {\n if (this.opsSessions.size === 0) return;\n const now = Date.now();\n for (const sessionId of this.opsSessions) {\n this.closedOpsSessions.set(sessionId, now);\n }\n this.opsSessions.clear();\n this.opsLeases.clear();\n this.trackClosedSessionCleanup();\n }\n\n private trackClosedSessionCleanup(): void {\n if (this.closedOpsSessions.size <= 100) return;\n const entries = Array.from(this.closedOpsSessions.entries()).sort((a, b) => a[1] - b[1]);\n const excess = entries.length - 100;\n for (let i = 0; i < excess; i += 1) {\n const sessionId = entries[i]?.[0];\n if (sessionId) {\n this.closedOpsSessions.delete(sessionId);\n }\n }\n }\n}\n\nconst isIgnorableOpsDisconnectError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.includes(\"Ops request timed out\")\n || message.includes(\"[invalid_session] Unknown ops session\")\n || message.includes(\"Ops socket closed\");\n};\n","import { randomUUID } from \"crypto\";\nimport { WebSocket } from \"ws\";\nimport {\n MAX_OPS_PAYLOAD_BYTES,\n OPS_PROTOCOL_VERSION,\n type OpsChunk,\n type OpsError,\n type OpsErrorResponse,\n type OpsEvent,\n type OpsHello,\n type OpsHelloAck,\n type OpsPing,\n type OpsPong,\n type OpsRequest,\n type OpsResponse\n} from \"../relay/protocol\";\n\nexport type OpsClientOptions = {\n handshakeTimeoutMs?: number;\n pingIntervalMs?: number;\n pingTimeoutMs?: number;\n maxPayloadBytes?: number;\n autoReconnect?: boolean;\n reconnectBaseDelayMs?: number;\n reconnectMaxDelayMs?: number;\n maxMissedPongs?: number;\n onEvent?: (event: OpsEvent) => void;\n onClose?: (detail?: { code?: number; reason?: string }) => void;\n};\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: NodeJS.Timeout;\n};\n\ntype PendingChunk = {\n requestId: string;\n totalChunks: number;\n chunks: string[];\n};\n\ntype PendingPing = {\n resolve: () => void;\n reject: (error: Error) => void;\n timeoutId: NodeJS.Timeout;\n};\n\nexport class OpsClient {\n private url: string;\n private socket: WebSocket | null = null;\n private lastHelloAck: OpsHelloAck | null = null;\n private connectPromise: Promise<OpsHelloAck> | null = null;\n private pendingRequests = new Map<string, PendingRequest>();\n private pendingChunks = new Map<string, PendingChunk>();\n private pendingPings = new Map<string, PendingPing>();\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private handshakeTimeoutMs: number;\n private pingIntervalMs: number;\n private pingTimeoutMs: number;\n private maxPayloadBytes: number;\n private onEvent?: (event: OpsEvent) => void;\n private onClose?: (detail?: { code?: number; reason?: string }) => void;\n private autoReconnect: boolean;\n private reconnectBaseDelayMs: number;\n private reconnectMaxDelayMs: number;\n private reconnectAttempts = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private shouldReconnectOnClose = true;\n private missedPongs = 0;\n private maxMissedPongs: number;\n\n constructor(url: string, options: OpsClientOptions = {}) {\n this.url = url;\n this.handshakeTimeoutMs = options.handshakeTimeoutMs ?? 3000;\n this.pingIntervalMs = options.pingIntervalMs ?? 25000;\n this.pingTimeoutMs = options.pingTimeoutMs ?? 2000;\n this.maxPayloadBytes = options.maxPayloadBytes ?? MAX_OPS_PAYLOAD_BYTES;\n this.autoReconnect = options.autoReconnect ?? true;\n this.reconnectBaseDelayMs = options.reconnectBaseDelayMs ?? 500;\n this.reconnectMaxDelayMs = options.reconnectMaxDelayMs ?? 10000;\n this.maxMissedPongs = options.maxMissedPongs ?? 2;\n this.onEvent = options.onEvent;\n this.onClose = options.onClose;\n }\n\n async connect(): Promise<OpsHelloAck> {\n if (this.connectPromise) {\n return await this.connectPromise;\n }\n\n const run = (async () => {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n this.clearReconnectTimer();\n this.socket = new WebSocket(this.url);\n await new Promise<void>((resolve, reject) => {\n /* c8 ignore next */\n if (!this.socket) {\n reject(new Error(\"Ops socket not created\"));\n return;\n }\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const cleanup = () => {\n this.socket?.removeListener(\"open\", onOpen);\n this.socket?.removeListener(\"error\", onError);\n };\n this.socket.once(\"open\", onOpen);\n this.socket.once(\"error\", onError);\n });\n\n this.socket.on(\"message\", (data) => {\n this.handleMessage(data);\n });\n this.socket.on(\"close\", (code, reason) => {\n this.handleClose({ code, reason: reason.toString() });\n });\n this.socket.on(\"error\", () => {\n // Errors are surfaced via close or pending requests.\n });\n }\n\n const hello: OpsHello = {\n type: \"ops_hello\",\n version: OPS_PROTOCOL_VERSION,\n maxPayloadBytes: this.maxPayloadBytes\n };\n\n const ack = await new Promise<OpsHelloAck>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(\"Ops handshake timeout\"));\n }, this.handshakeTimeoutMs);\n const handler = (message: OpsHelloAck) => {\n clearTimeout(timeoutId);\n resolve(message);\n };\n this.waitForHelloAck(handler, reject);\n try {\n this.send(hello);\n } catch (error) {\n clearTimeout(timeoutId);\n reject(error instanceof Error ? error : new Error(\"Ops handshake failed\"));\n }\n });\n\n this.lastHelloAck = ack;\n this.reconnectAttempts = 0;\n this.missedPongs = 0;\n this.startHeartbeat();\n return ack;\n })();\n\n this.connectPromise = run;\n try {\n return await run;\n } finally {\n if (this.connectPromise === run) {\n this.connectPromise = null;\n }\n }\n }\n\n disconnect(): void {\n this.autoReconnect = false;\n this.shouldReconnectOnClose = false;\n this.clearReconnectTimer();\n this.stopHeartbeat();\n if (this.socket) {\n try {\n if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close(1000, \"Ops disconnect\");\n }\n } catch {\n // ignore\n }\n }\n this.socket = null;\n this.lastHelloAck = null;\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingRequests.clear();\n this.pendingChunks.clear();\n for (const ping of this.pendingPings.values()) {\n clearTimeout(ping.timeoutId);\n ping.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingPings.clear();\n }\n\n async request<T>(command: string, payload?: unknown, opsSessionId?: string, timeoutMs = 30000, leaseId?: string): Promise<T> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n await this.connect();\n }\n\n const requestId = randomUUID();\n const request: OpsRequest = {\n type: \"ops_request\",\n requestId,\n opsSessionId,\n leaseId,\n command,\n payload\n };\n\n const serialized = JSON.stringify(request);\n if (Buffer.byteLength(serialized) > this.maxPayloadBytes) {\n throw new Error(\"Ops request payload exceeded max size\");\n }\n\n return await new Promise<T>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error(\"Ops request timed out\"));\n }, timeoutMs);\n const resolvePending = (value: unknown) => resolve(value as T);\n this.pendingRequests.set(requestId, { resolve: resolvePending, reject, timeoutId });\n try {\n this.sendRaw(serialized);\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(requestId);\n reject(error instanceof Error ? error : new Error(\"Ops send failed\"));\n }\n });\n }\n\n private waitForHelloAck(handler: (message: OpsHelloAck) => void, reject: (error: Error) => void): void {\n const onAck = (message: OpsHelloAck) => {\n this.socket?.off(\"close\", onClose);\n this.socket?.off(\"ops_hello_error\", onError);\n handler(message);\n };\n const onError = (message: OpsErrorResponse) => {\n this.socket?.off(\"close\", onClose);\n const error = buildOpsError(message.error);\n reject(error);\n };\n const onClose = () => {\n reject(new Error(\"Ops socket closed before handshake\"));\n };\n this.socket?.once(\"ops_hello_ack\", onAck as unknown as (...args: unknown[]) => void);\n this.socket?.once(\"ops_hello_error\", onError as unknown as (...args: unknown[]) => void);\n this.socket?.once(\"close\", onClose);\n }\n\n private handleMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!message || typeof message !== \"object\") {\n return;\n }\n const record = message as Record<string, unknown>;\n const type = record.type;\n\n if (type === \"ops_hello_ack\" && isOpsHelloAck(record)) {\n this.socket?.emit(\"ops_hello_ack\", record);\n return;\n }\n\n if (type === \"ops_pong\" && isOpsPong(record)) {\n const pending = this.pendingPings.get(record.id);\n if (pending) {\n clearTimeout(pending.timeoutId);\n this.pendingPings.delete(record.id);\n pending.resolve();\n this.missedPongs = 0;\n }\n return;\n }\n\n if (type === \"ops_response\" && isOpsResponse(record)) {\n const pending = this.pendingRequests.get(record.requestId);\n if (!pending) return;\n if (record.chunked && record.payloadId && typeof record.totalChunks === \"number\") {\n this.pendingChunks.set(record.payloadId, {\n requestId: record.requestId,\n totalChunks: record.totalChunks,\n chunks: []\n });\n return;\n }\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(record.requestId);\n pending.resolve(record.payload as unknown);\n return;\n }\n\n if (type === \"ops_chunk\" && isOpsChunk(record)) {\n const pendingChunk = this.pendingChunks.get(record.payloadId);\n if (!pendingChunk) return;\n pendingChunk.chunks[record.chunkIndex] = record.data;\n const received = pendingChunk.chunks.filter(Boolean).length;\n if (received >= pendingChunk.totalChunks) {\n this.pendingChunks.delete(record.payloadId);\n const pending = this.pendingRequests.get(pendingChunk.requestId);\n if (!pending) return;\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(pendingChunk.requestId);\n try {\n const merged = pendingChunk.chunks.join(\"\");\n const payload = merged ? JSON.parse(merged) : null;\n pending.resolve(payload as unknown);\n } catch (error) {\n pending.reject(error instanceof Error ? error : new Error(\"Ops chunk parse failed\"));\n }\n }\n return;\n }\n\n if (type === \"ops_error\" && isOpsErrorResponse(record)) {\n if (record.requestId === \"ops_hello\") {\n this.socket?.emit(\"ops_hello_error\", record);\n return;\n }\n const pending = this.pendingRequests.get(record.requestId);\n if (!pending) return;\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(record.requestId);\n pending.reject(buildOpsError(record.error));\n return;\n }\n\n if (type === \"ops_event\" && isOpsEvent(record)) {\n this.onEvent?.(record);\n return;\n }\n }\n\n private handleClose(detail?: { code?: number; reason?: string }): void {\n this.stopHeartbeat();\n this.lastHelloAck = null;\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingRequests.clear();\n this.pendingChunks.clear();\n for (const ping of this.pendingPings.values()) {\n clearTimeout(ping.timeoutId);\n ping.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingPings.clear();\n this.onClose?.(detail);\n if (this.autoReconnect && this.shouldReconnectOnClose) {\n this.scheduleReconnect();\n }\n this.shouldReconnectOnClose = true;\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n this.heartbeatTimer = setInterval(() => {\n this.sendPing().catch(() => {\n this.missedPongs += 1;\n if (this.missedPongs >= this.maxMissedPongs) {\n this.closeSocket(1011, \"Ops heartbeat missed\", true);\n }\n });\n }, this.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private async sendPing(): Promise<void> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const id = randomUUID();\n const ping: OpsPing = { type: \"ops_ping\", id };\n return await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingPings.delete(id);\n reject(new Error(\"Ops ping timed out\"));\n }, this.pingTimeoutMs);\n this.pendingPings.set(id, { resolve, reject, timeoutId });\n try {\n this.send(ping);\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingPings.delete(id);\n reject(error instanceof Error ? error : new Error(\"Ops ping failed\"));\n }\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n const attempt = this.reconnectAttempts;\n const base = Math.min(this.reconnectMaxDelayMs, this.reconnectBaseDelayMs * Math.pow(2, attempt));\n const jitter = Math.floor(base * (Math.random() * 0.4 - 0.2));\n const delay = Math.max(200, base + jitter);\n this.reconnectAttempts += 1;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n this.scheduleReconnect();\n });\n }, delay);\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private closeSocket(code: number, reason: string, allowReconnect: boolean): void {\n this.shouldReconnectOnClose = allowReconnect;\n this.stopHeartbeat();\n if (this.socket) {\n try {\n this.socket.close(code, reason);\n } catch {\n // ignore\n }\n }\n }\n\n private send(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n this.sendRaw(serialized);\n }\n\n private sendRaw(payload: string): void {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"Ops socket not connected\");\n }\n this.socket.send(payload);\n }\n}\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n\nconst isOpsHelloAck = (value: Record<string, unknown>): value is OpsHelloAck => {\n return value.type === \"ops_hello_ack\" && typeof value.version === \"string\";\n};\n\nconst isOpsPong = (value: Record<string, unknown>): value is OpsPong => {\n return value.type === \"ops_pong\" && typeof value.id === \"string\";\n};\n\nconst isOpsResponse = (value: Record<string, unknown>): value is OpsResponse => {\n return value.type === \"ops_response\" && typeof value.requestId === \"string\";\n};\n\nconst isOpsChunk = (value: Record<string, unknown>): value is OpsChunk => {\n return value.type === \"ops_chunk\" && typeof value.payloadId === \"string\" && typeof value.chunkIndex === \"number\";\n};\n\nconst isOpsErrorResponse = (value: Record<string, unknown>): value is OpsErrorResponse => {\n return value.type === \"ops_error\" && typeof value.requestId === \"string\" && typeof value.error === \"object\";\n};\n\nconst isOpsEvent = (value: Record<string, unknown>): value is OpsEvent => {\n return value.type === \"ops_event\" && typeof value.event === \"string\";\n};\n\nconst buildOpsError = (error: OpsError): Error => {\n const message = `[${error.code}] ${error.message}`;\n const err = new Error(message);\n (err as Error & { code?: string }).code = error.code;\n return err;\n};\n","export type RelayCommand = {\n id: string | number;\n method: \"forwardCDPCommand\";\n params: {\n method: string;\n params?: unknown;\n sessionId?: string;\n };\n};\n\nexport type RelayEvent = {\n method: \"forwardCDPEvent\";\n params: {\n method: string;\n params?: unknown;\n sessionId?: string;\n };\n};\n\nexport type RelayResponse = {\n id: string | number;\n result?: unknown;\n error?: { message: string };\n sessionId?: string;\n};\n\nexport type RelayHandshake = {\n type: \"handshake\";\n payload: {\n tabId: number;\n url?: string;\n title?: string;\n groupId?: number;\n pairingToken?: string;\n };\n};\n\nexport type RelayHandshakeAck = {\n type: \"handshakeAck\";\n payload: {\n instanceId: string;\n relayPort: number;\n pairingRequired: boolean;\n epoch?: number;\n };\n};\n\nexport type RelayHttpStatus = {\n instanceId: string;\n running: boolean;\n port?: number;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n annotationConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n health?: RelayHealthStatus;\n lastHandshakeError?: RelayHandshakeError;\n};\n\nexport type RelayHttpConfig = {\n relayPort: number;\n pairingRequired: boolean;\n instanceId: string;\n epoch?: number;\n discoveryPort: number | null;\n};\n\nexport type RelayHttpPair = {\n token: string | null;\n instanceId: string;\n epoch?: number;\n};\n\nexport type RelayHandshakeError = {\n code: \"pairing_missing\" | \"pairing_invalid\" | \"rate_limited\" | \"origin_blocked\";\n message: string;\n at: number;\n};\n\nexport const OPS_PROTOCOL_VERSION = \"1\";\nexport const MAX_OPS_PAYLOAD_BYTES = 12 * 1024 * 1024;\nexport const MAX_SNAPSHOT_BYTES = 2 * 1024 * 1024;\n\nexport type OpsErrorCode =\n | \"ops_unavailable\"\n | \"invalid_request\"\n | \"invalid_session\"\n | \"not_owner\"\n | \"restricted_url\"\n | \"timeout\"\n | \"not_supported\"\n | \"snapshot_too_large\"\n | \"execution_failed\"\n | \"cdp_attach_failed\"\n | \"cdp_session_lost\"\n | \"cdp_attach_blocked\";\n\nexport type OpsError = {\n code: OpsErrorCode;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\nexport type OpsHello = {\n type: \"ops_hello\";\n version: string;\n clientId?: string;\n capabilities?: string[];\n maxPayloadBytes?: number;\n};\n\nexport type OpsHelloAck = {\n type: \"ops_hello_ack\";\n version: string;\n clientId?: string;\n capabilities?: string[];\n maxPayloadBytes: number;\n};\n\nexport type OpsPing = {\n type: \"ops_ping\";\n id: string;\n clientId?: string;\n};\n\nexport type OpsPong = {\n type: \"ops_pong\";\n id: string;\n clientId?: string;\n};\n\nexport type OpsRequest = {\n type: \"ops_request\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n leaseId?: string;\n command: string;\n payload?: unknown;\n};\n\nexport type OpsResponse = {\n type: \"ops_response\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n payload?: unknown;\n chunked?: boolean;\n payloadId?: string;\n totalChunks?: number;\n};\n\nexport type OpsErrorResponse = {\n type: \"ops_error\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n error: OpsError;\n};\n\nexport type OpsEventType =\n | \"ops_session_created\"\n | \"ops_session_closed\"\n | \"ops_session_expired\"\n | \"ops_tab_closed\"\n | \"ops_client_disconnected\";\n\nexport type OpsEvent = {\n type: \"ops_event\";\n clientId?: string;\n opsSessionId?: string;\n event: OpsEventType;\n payload?: unknown;\n};\n\nexport type OpsChunk = {\n type: \"ops_chunk\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n payloadId: string;\n chunkIndex: number;\n totalChunks: number;\n data: string;\n};\n\nexport type OpsEnvelope =\n | OpsHello\n | OpsHelloAck\n | OpsPing\n | OpsPong\n | OpsRequest\n | OpsResponse\n | OpsErrorResponse\n | OpsEvent\n | OpsChunk;\n\nexport type RelayHealthReason =\n | \"ok\"\n | \"relay_down\"\n | \"extension_disconnected\"\n | \"handshake_incomplete\"\n | \"pairing_required\"\n | \"pairing_invalid\"\n | \"cdp_disconnected\"\n | \"annotation_disconnected\"\n | \"ops_disconnected\";\n\nexport type RelayHealthStatus = {\n ok: boolean;\n reason: RelayHealthReason;\n detail?: string;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n annotationConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n lastHandshakeError?: RelayHandshakeError;\n};\n\nexport type RelayPing = {\n type: \"ping\";\n id: string;\n};\n\nexport type RelayPong = {\n type: \"pong\";\n id: string;\n payload: RelayHealthStatus;\n};\n\nexport type RelayHealthCheck = {\n type: \"healthCheck\";\n id: string;\n};\n\nexport type RelayHealthResponse = {\n type: \"healthCheckResult\";\n id: string;\n payload: RelayHealthStatus;\n};\n\nexport type AnnotationScreenshotMode = \"visible\" | \"full\" | \"none\";\n\nexport type AnnotationTransport = \"auto\" | \"direct\" | \"relay\";\n\nexport type AnnotationCommand = {\n version: 1;\n requestId: string;\n command: \"start\" | \"cancel\";\n url?: string;\n tabId?: number;\n options?: {\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n };\n};\n\nexport type AnnotationErrorCode =\n | \"invalid_request\"\n | \"payload_too_large\"\n | \"timeout\"\n | \"direct_unavailable\"\n | \"direct_failed\"\n | \"relay_unavailable\"\n | \"restricted_url\"\n | \"injection_failed\"\n | \"capture_failed\"\n | \"cancelled\"\n | \"unknown\";\n\nexport type AnnotationRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type AnnotationStyle = {\n color?: string;\n backgroundColor?: string;\n fontSize?: string;\n fontFamily?: string;\n fontWeight?: string;\n lineHeight?: string;\n display?: string;\n position?: string;\n};\n\nexport type AnnotationA11y = {\n role?: string;\n label?: string;\n labelledBy?: string;\n describedBy?: string;\n hidden?: boolean;\n};\n\nexport type AnnotationDebug = {\n computedStyles?: Record<string, string>;\n cssVariables?: Record<string, string>;\n parentChain?: Array<{\n tag: string;\n id?: string;\n classes?: string[];\n role?: string;\n }>;\n};\n\nexport type AnnotationItem = {\n id: string;\n selector: string;\n tag: string;\n idAttr?: string;\n classes?: string[];\n text?: string;\n rect: AnnotationRect;\n attributes: Record<string, string>;\n a11y: AnnotationA11y;\n styles: AnnotationStyle;\n note?: string;\n screenshotId?: string;\n debug?: AnnotationDebug;\n};\n\nexport type AnnotationScreenshot = {\n id: string;\n label: string;\n base64: string;\n mime: \"image/png\";\n width?: number;\n height?: number;\n};\n\nexport type AnnotationPayload = {\n url: string;\n title?: string;\n timestamp: string;\n context?: string;\n screenshotMode: AnnotationScreenshotMode;\n screenshots?: AnnotationScreenshot[];\n annotations: AnnotationItem[];\n};\n\nexport type AnnotationResponse = {\n version: 1;\n requestId: string;\n status: \"ok\" | \"cancelled\" | \"error\";\n error?: { code: AnnotationErrorCode; message: string };\n payload?: AnnotationPayload;\n};\n\nexport type AnnotationEvent = {\n version: 1;\n requestId: string;\n event: \"progress\" | \"ready\" | \"warning\";\n message?: string;\n};\n\nexport type RelayAnnotationCommand = {\n type: \"annotationCommand\";\n payload: AnnotationCommand;\n};\n\nexport type RelayAnnotationResponse = {\n type: \"annotationResponse\";\n payload: AnnotationResponse;\n};\n\nexport type RelayAnnotationEvent = {\n type: \"annotationEvent\";\n payload: AnnotationEvent;\n};\n","import { randomUUID } from \"crypto\";\nimport { WebSocket } from \"ws\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { resolveDirectAnnotateAssets, runDirectAnnotate } from \"../annotate/direct-annotator\";\nimport type { RelayLike } from \"../relay/relay-types\";\nimport { resolveRelayEndpoint } from \"../relay/relay-endpoints\";\nimport type { BrowserManagerLike } from \"./manager-types\";\nimport type {\n AnnotationCommand,\n AnnotationResponse,\n AnnotationScreenshotMode,\n AnnotationTransport,\n RelayAnnotationCommand,\n RelayAnnotationEvent,\n RelayAnnotationResponse\n} from \"../relay/protocol\";\n\nexport type AnnotationRequestOptions = {\n sessionId?: string;\n targetId?: string;\n tabId?: number;\n transport?: AnnotationTransport;\n url?: string;\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n};\n\nexport class AnnotationManager {\n private relay: RelayLike | undefined;\n private config: OpenDevBrowserConfig;\n private manager?: BrowserManagerLike;\n\n constructor(relay: RelayLike | undefined, config: OpenDevBrowserConfig, manager?: BrowserManagerLike) {\n this.relay = relay;\n this.config = config;\n this.manager = manager;\n }\n\n setRelay(relay: RelayLike | undefined): void {\n this.relay = relay;\n }\n\n setBrowserManager(manager?: BrowserManagerLike): void {\n this.manager = manager;\n }\n\n async requestAnnotation(options: AnnotationRequestOptions): Promise<AnnotationResponse> {\n const transport = options.transport ?? \"auto\";\n\n if (transport === \"relay\") {\n return this.requestRelay(options, true);\n }\n\n if (transport === \"direct\") {\n return this.requestDirect(options);\n }\n\n if (options.sessionId) {\n const directResult = await this.requestDirect(options);\n if (directResult.status === \"ok\" || directResult.status === \"cancelled\") {\n return directResult;\n }\n if (directResult.error?.code === \"direct_unavailable\" || directResult.error?.code === \"direct_failed\") {\n const canFallback = await this.canFallbackToRelay(options.sessionId);\n if (canFallback) {\n return this.requestRelay(options, true);\n }\n }\n return directResult;\n }\n\n return this.requestRelay(options, false);\n }\n\n private async canFallbackToRelay(sessionId: string): Promise<boolean> {\n if (!this.manager) {\n return false;\n }\n try {\n const status = await this.manager.status(sessionId);\n if (status.mode !== \"extension\") {\n return false;\n }\n } catch {\n return false;\n }\n return Boolean(this.getRelayEndpoint());\n }\n\n private getRelayEndpoint(): string | null {\n return this.relay?.getAnnotationUrl?.()\n ?? (this.config.relayPort > 0 ? `ws://127.0.0.1:${this.config.relayPort}/annotation` : null);\n }\n\n private async requestDirect(options: AnnotationRequestOptions): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n if (!options.sessionId) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_unavailable\", message: \"Direct annotate requires sessionId.\" }\n };\n }\n\n if (!this.manager) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_unavailable\", message: \"Direct annotate unavailable for this session.\" }\n };\n }\n\n const assetsResult = resolveDirectAnnotateAssets();\n if (!assetsResult.assets) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_unavailable\", message: assetsResult.error ?? \"Direct annotate unavailable.\" }\n };\n }\n\n try {\n return await runDirectAnnotate(this.manager, assetsResult.assets, {\n sessionId: options.sessionId,\n targetId: options.targetId,\n url: options.url,\n screenshotMode: options.screenshotMode,\n debug: options.debug,\n context: options.context,\n timeoutMs: options.timeoutMs,\n signal: options.signal\n });\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Direct annotate failed.\";\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_failed\", message: detail }\n };\n }\n }\n\n private async requestRelay(options: AnnotationRequestOptions, requireExtension: boolean): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n const timeoutMs = options.timeoutMs ?? 120_000;\n\n const baseEndpoint = this.getRelayEndpoint();\n if (!baseEndpoint) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: \"Annotation relay unavailable. Start the daemon and retry.\" }\n };\n }\n\n if (requireExtension && options.sessionId && this.manager) {\n try {\n const status = await this.manager.status(options.sessionId);\n if (status.mode !== \"extension\") {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"invalid_request\", message: \"Relay annotations require extension mode.\" }\n };\n }\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Annotation session unavailable.\";\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"invalid_request\", message: detail }\n };\n }\n }\n\n const { connectEndpoint } = await resolveRelayEndpoint({\n wsEndpoint: baseEndpoint,\n path: \"annotation\",\n config: this.config\n });\n\n const socket = new WebSocket(connectEndpoint);\n try {\n await waitForSocketOpen(socket, 3000);\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Relay unavailable\";\n socket.removeAllListeners();\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, \"Annotation socket open failed\");\n }\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: detail }\n };\n }\n\n const command: AnnotationCommand = {\n version: 1,\n requestId,\n command: \"start\",\n url: options.url,\n tabId: options.tabId,\n options: {\n screenshotMode: options.screenshotMode,\n debug: options.debug,\n context: options.context\n }\n };\n\n const relayCommand: RelayAnnotationCommand = {\n type: \"annotationCommand\",\n payload: command\n };\n\n const cleanup = () => {\n socket.removeAllListeners();\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, \"Annotation complete\");\n }\n };\n\n const responsePromise = new Promise<AnnotationResponse>((resolve, reject) => {\n socket.on(\"message\", (data) => {\n const message = parseJson(data);\n if (!message || typeof message !== \"object\") return;\n const record = message as Record<string, unknown>;\n if (record.type === \"annotationResponse\") {\n const response = record as RelayAnnotationResponse;\n if (response.payload?.requestId === requestId) {\n resolve(response.payload);\n }\n } else if (record.type === \"annotationEvent\") {\n const event = record as RelayAnnotationEvent;\n if (event.payload?.requestId === requestId) {\n return;\n }\n }\n });\n socket.on(\"error\", (error) => reject(error));\n socket.on(\"close\", () => reject(new Error(\"Relay closed annotation socket\")));\n });\n\n const timeoutPromise = new Promise<AnnotationResponse>((resolve) => {\n const id = setTimeout(() => {\n clearTimeout(id);\n resolve({\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"timeout\", message: \"Annotation request timed out.\" }\n });\n }, timeoutMs);\n });\n\n const abortPromise = new Promise<AnnotationResponse>((resolve) => {\n if (!options.signal) return;\n if (options.signal.aborted) {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n return;\n }\n const onAbort = () => {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n };\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n socket.send(JSON.stringify(relayCommand));\n\n try {\n const result = await Promise.race([responsePromise, timeoutPromise, abortPromise]);\n if (result.status !== \"ok\") {\n sendCancel(socket, requestId);\n }\n return result;\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Relay unavailable\";\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: detail }\n };\n } finally {\n cleanup();\n }\n }\n}\n\nconst waitForSocketOpen = (socket: WebSocket, timeoutMs: number): Promise<void> => {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Annotation socket open timed out\"));\n }, timeoutMs);\n socket.once(\"open\", () => {\n clearTimeout(timeout);\n resolve();\n });\n socket.once(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n};\n\nconst sendCancel = (socket: WebSocket, requestId: string): void => {\n if (socket.readyState !== WebSocket.OPEN) return;\n const command: AnnotationCommand = {\n version: 1,\n requestId,\n command: \"cancel\"\n };\n const relayCommand: RelayAnnotationCommand = {\n type: \"annotationCommand\",\n payload: command\n };\n socket.send(JSON.stringify(relayCommand));\n};\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n","import { randomUUID } from \"crypto\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { Page } from \"playwright-core\";\nimport type { BrowserManagerLike } from \"../browser/manager-types\";\nimport { getExtensionPath } from \"../extension-extractor\";\nimport type {\n AnnotationErrorCode,\n AnnotationPayload,\n AnnotationResponse,\n AnnotationScreenshotMode\n} from \"../relay/protocol\";\n\nexport type DirectAnnotateAssets = {\n scriptPath: string;\n stylePath: string;\n};\n\nexport type DirectAnnotateRequest = {\n sessionId: string;\n targetId?: string;\n url?: string;\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n};\n\ntype DirectCompletionMessage =\n | { type: \"annotation:complete\"; requestId: string; payload: AnnotationPayload }\n | { type: \"annotation:error\"; requestId: string; error: { code: AnnotationErrorCode; message: string } }\n | { type: \"annotation:cancelled\"; requestId: string };\n\ntype DirectDispatchRuntime = {\n dispatch: (message: Record<string, unknown>) => unknown;\n};\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst bindingState = new WeakSet<Page>();\nconst completionMap = new WeakMap<Page, Map<string, (message: DirectCompletionMessage) => void>>();\n\nexport function resolveDirectAnnotateAssets(\n resolvePath: () => string | null = getExtensionPath\n): { assets?: DirectAnnotateAssets; error?: string } {\n const extensionPath = resolvePath();\n if (!extensionPath) {\n return { error: \"Extension assets unavailable.\" };\n }\n const scriptPath = join(extensionPath, \"dist\", \"annotate-content.js\");\n const stylePath = join(extensionPath, \"dist\", \"annotate-content.css\");\n if (!existsSync(scriptPath) || !existsSync(stylePath)) {\n return { error: \"Direct annotate assets missing. Run `npm run extension:build` and retry.\" };\n }\n return { assets: { scriptPath, stylePath } };\n}\n\nexport async function runDirectAnnotate(\n manager: BrowserManagerLike,\n assets: DirectAnnotateAssets,\n request: DirectAnnotateRequest\n): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return manager.withPage(request.sessionId, request.targetId ?? null, async (page) => {\n await ensureBindings(page);\n await ensureShim(page);\n\n if (request.url) {\n await page.goto(request.url, { waitUntil: \"load\" });\n }\n\n await injectAssets(page, assets);\n await ensureAnnotationReady(page);\n\n const completionHandlers = getCompletionMap(page);\n const responsePromise = new Promise<AnnotationResponse>((resolve) => {\n completionHandlers.set(requestId, (message) => {\n resolve(mapCompletionToResponse(message, requestId));\n });\n });\n\n const timeoutPromise = new Promise<AnnotationResponse>((resolve) => {\n const timeoutId = setTimeout(() => {\n clearTimeout(timeoutId);\n resolve({\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"timeout\", message: \"Annotation request timed out.\" }\n });\n }, timeoutMs);\n });\n\n const abortPromise = new Promise<AnnotationResponse>((resolve) => {\n if (!request.signal) return;\n if (request.signal.aborted) {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n return;\n }\n const onAbort = () => {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n };\n request.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n await dispatchMessage(page, {\n type: \"annotation:start\",\n requestId,\n options: {\n screenshotMode: request.screenshotMode ?? \"visible\",\n debug: request.debug,\n context: request.context\n },\n url: request.url\n });\n\n const result = await Promise.race([responsePromise, timeoutPromise, abortPromise]);\n completionHandlers.delete(requestId);\n\n if (result.status !== \"ok\" && (result.error?.code === \"timeout\" || result.status === \"cancelled\")) {\n await dispatchMessage(page, { type: \"annotation:cancel\", requestId });\n }\n\n return result;\n });\n}\n\nfunction getCompletionMap(page: Page): Map<string, (message: DirectCompletionMessage) => void> {\n let existing = completionMap.get(page);\n if (!existing) {\n existing = new Map();\n completionMap.set(page, existing);\n }\n return existing;\n}\n\nasync function ensureBindings(page: Page): Promise<void> {\n if (!bindingState.has(page)) {\n try {\n await page.exposeBinding(\"__odbDirectCapture\", async (_source, _mode: AnnotationScreenshotMode) => {\n const buffer = await page.screenshot({ type: \"png\", fullPage: false });\n const base64 = buffer.toString(\"base64\");\n return `data:image/png;base64,${base64}`;\n });\n } catch (error) {\n if (!isBindingExistsError(error)) {\n throw error;\n }\n }\n\n try {\n await page.exposeBinding(\"__odbDirectComplete\", (_source, message: DirectCompletionMessage) => {\n if (!message || typeof message !== \"object\") return;\n const requestId = (message as DirectCompletionMessage).requestId;\n if (!requestId) return;\n const handlers = completionMap.get(page);\n const handler = handlers?.get(requestId);\n if (handler) {\n handler(message as DirectCompletionMessage);\n handlers?.delete(requestId);\n }\n });\n } catch (error) {\n if (!isBindingExistsError(error)) {\n throw error;\n }\n }\n\n bindingState.add(page);\n }\n}\n\nasync function ensureShim(page: Page): Promise<void> {\n await page.addInitScript(installShim);\n await page.evaluate(installShim);\n}\n\nfunction installShim(): void {\n const w = window as unknown as {\n chrome?: { runtime?: Record<string, unknown> };\n __odbDirectShim?: boolean;\n __odbDirectRuntime?: DirectDispatchRuntime;\n __odbDirectCapture?: (mode: AnnotationScreenshotMode) => Promise<string>;\n __odbDirectComplete?: (message: DirectCompletionMessage) => void;\n };\n if (w.__odbDirectShim) return;\n const listeners = new Set<(...args: unknown[]) => unknown>();\n\n const runtime = {\n onMessage: {\n addListener: (listener: (...args: unknown[]) => unknown) => {\n listeners.add(listener);\n }\n },\n sendMessage: (message: { type?: string; mode?: AnnotationScreenshotMode }, callback?: (response: Record<string, unknown>) => void) => {\n const type = message?.type ?? \"\";\n if (type === \"annotation:capture\") {\n const capture = w.__odbDirectCapture;\n if (!capture) {\n callback?.({ ok: false, error: \"Capture binding unavailable\" });\n return;\n }\n Promise.resolve(capture(message.mode ?? \"visible\"))\n .then((dataUrl) => {\n callback?.({ ok: true, dataUrl });\n })\n .catch((error) => {\n const detail = error instanceof Error ? error.message : \"Capture failed\";\n callback?.({ ok: false, error: detail });\n });\n return;\n }\n if (type === \"annotation:complete\" || type === \"annotation:error\" || type === \"annotation:cancelled\") {\n try {\n w.__odbDirectComplete?.(message as DirectCompletionMessage);\n } catch {\n // Ignore completion routing errors.\n }\n callback?.({ ok: true });\n return;\n }\n\n let responseSent = false;\n const sendResponse = (response: Record<string, unknown>) => {\n if (responseSent) return;\n responseSent = true;\n callback?.(response);\n };\n\n for (const listener of listeners) {\n try {\n listener(message, undefined, sendResponse);\n } catch {\n // ignore listener errors\n }\n }\n\n if (!responseSent) {\n callback?.({ ok: true });\n }\n }\n };\n\n const chromeRoot = w.chrome ?? {};\n chromeRoot.runtime = runtime;\n w.chrome = chromeRoot;\n\n w.__odbDirectRuntime = {\n dispatch: (message: Record<string, unknown>) => {\n let response: unknown = null;\n const sendResponse = (value: unknown) => {\n response = value;\n };\n for (const listener of listeners) {\n try {\n listener(message, undefined, sendResponse);\n } catch {\n // ignore listener errors\n }\n }\n return response;\n }\n };\n\n w.__odbDirectShim = true;\n}\n\nasync function injectAssets(page: Page, assets: DirectAnnotateAssets): Promise<void> {\n await page.addStyleTag({ path: assets.stylePath });\n await page.addScriptTag({ path: assets.scriptPath });\n}\n\nasync function ensureAnnotationReady(page: Page): Promise<void> {\n const response = await dispatchMessage(page, { type: \"annotation:ping\" });\n if (!response || typeof response !== \"object\" || (response as { ok?: boolean }).ok !== true) {\n throw new Error(\"Annotation content script unavailable\");\n }\n}\n\nasync function dispatchMessage(page: Page, message: Record<string, unknown>): Promise<unknown> {\n return await page.evaluate((payload) => {\n const runtime = (window as unknown as { __odbDirectRuntime?: DirectDispatchRuntime }).__odbDirectRuntime;\n if (!runtime?.dispatch) {\n throw new Error(\"Direct annotation runtime missing\");\n }\n return runtime.dispatch(payload);\n }, message);\n}\n\nfunction mapCompletionToResponse(message: DirectCompletionMessage, requestId: string): AnnotationResponse {\n if (message.type === \"annotation:complete\") {\n return {\n version: 1,\n requestId,\n status: \"ok\",\n payload: message.payload\n };\n }\n if (message.type === \"annotation:cancelled\") {\n return {\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation cancelled.\" }\n };\n }\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: {\n code: message.error?.code ?? \"unknown\",\n message: message.error?.message ?? \"Annotation failed.\"\n }\n };\n}\n\nfunction isBindingExistsError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.toLowerCase().includes(\"already registered\") || message.toLowerCase().includes(\"has been already exposed\");\n}\n","import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc, modify, applyEdits } from \"jsonc-parser\";\nimport { generateSecureToken } from \"./utils/crypto\";\nimport { writeFileAtomic } from \"./utils/fs\";\n\nfunction isExecutable(filePath: string): boolean {\n try {\n fs.accessSync(filePath, fs.constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport type SnapshotConfig = {\n maxChars: number;\n maxNodes: number;\n};\n\nexport type SecurityConfig = {\n allowRawCDP: boolean;\n allowNonLocalCdp: boolean;\n allowUnsafeExport: boolean;\n};\n\nexport type DevtoolsConfig = {\n showFullUrls: boolean;\n showFullConsole: boolean;\n};\n\nexport type ExportConfig = {\n maxNodes: number;\n inlineStyles: boolean;\n};\n\nexport type SkillsNudgeConfig = {\n enabled: boolean;\n keywords: string[];\n maxAgeMs: number;\n};\n\nexport type SkillsConfig = {\n nudge: SkillsNudgeConfig;\n};\n\nexport type ContinuityNudgeConfig = {\n enabled: boolean;\n keywords: string[];\n maxAgeMs: number;\n};\n\nexport type ContinuityConfig = {\n enabled: boolean;\n filePath: string;\n nudge: ContinuityNudgeConfig;\n};\n\nexport type OpenDevBrowserConfig = {\n headless: boolean;\n profile: string;\n snapshot: SnapshotConfig;\n security: SecurityConfig;\n devtools: DevtoolsConfig;\n export: ExportConfig;\n skills: SkillsConfig;\n continuity: ContinuityConfig;\n relayPort: number;\n relayToken: string | false;\n nativeExtensionId?: string;\n daemonPort: number;\n daemonToken: string;\n chromePath?: string;\n flags: string[];\n checkForUpdates: boolean;\n persistProfile: boolean;\n skillPaths: string[];\n};\n\nconst DEFAULT_RELAY_PORT = 8787;\nconst DEFAULT_DAEMON_PORT = 8788;\n\nfunction buildDefaultConfigJsonc(relayToken: string, daemonToken: string): string {\n return `{\n // Set relayToken to false to disable extension pairing.\n \"relayPort\": ${DEFAULT_RELAY_PORT},\n \"relayToken\": \"${relayToken}\",\n // Optional: extension ID for native host auto-install.\n // \"nativeExtensionId\": \"abcdefghijklmnopabcdefghijklmnop\",\n \"daemonPort\": ${DEFAULT_DAEMON_PORT},\n \"daemonToken\": \"${daemonToken}\"\n}\n`;\n}\n\nconst snapshotSchema = z.object({\n maxChars: z.number().int().min(500).max(200000).default(16000),\n maxNodes: z.number().int().min(50).max(5000).default(1000)\n});\n\nconst securitySchema = z.object({\n allowRawCDP: z.boolean().default(false),\n allowNonLocalCdp: z.boolean().default(false),\n allowUnsafeExport: z.boolean().default(false)\n});\n\nconst devtoolsSchema = z.object({\n showFullUrls: z.boolean().default(false),\n showFullConsole: z.boolean().default(false)\n});\n\nconst exportSchema = z.object({\n maxNodes: z.number().int().min(1).max(5000).default(1000),\n inlineStyles: z.boolean().default(true)\n});\n\nconst skillsNudgeSchema = z.object({\n enabled: z.boolean().default(true),\n keywords: z.array(z.string()).default([\n \"login\",\n \"sign in\",\n \"sign-in\",\n \"auth\",\n \"authentication\",\n \"mfa\",\n \"form\",\n \"submit\",\n \"validation\",\n \"extract\",\n \"scrape\",\n \"scraping\",\n \"table\",\n \"pagination\",\n \"crawl\"\n ]),\n maxAgeMs: z.number().int().min(1000).max(600000).default(60000)\n});\n\nconst skillsSchema = z.object({\n nudge: skillsNudgeSchema.default({})\n}).default({});\n\nconst continuityNudgeSchema = z.object({\n enabled: z.boolean().default(true),\n keywords: z.array(z.string()).default([\n \"plan\",\n \"multi-step\",\n \"multi step\",\n \"long-running\",\n \"long running\",\n \"refactor\",\n \"migration\",\n \"rollout\",\n \"release\",\n \"upgrade\",\n \"investigate\",\n \"follow-up\",\n \"continue\"\n ]),\n maxAgeMs: z.number().int().min(1000).max(600000).default(60000)\n});\n\nconst continuitySchema = z.object({\n enabled: z.boolean().default(true),\n filePath: z.string().min(1).default(\"opendevbrowser_continuity.md\"),\n nudge: continuityNudgeSchema.default({})\n}).default({});\n\nconst configSchema = z.object({\n headless: z.boolean().default(false),\n profile: z.string().min(1).default(\"default\"),\n snapshot: snapshotSchema.default({}),\n security: securitySchema.default({}),\n devtools: devtoolsSchema.default({}),\n export: exportSchema.default({}),\n skills: skillsSchema.default({}),\n continuity: continuitySchema.default({}),\n relayPort: z.number().int().min(0).max(65535).default(DEFAULT_RELAY_PORT),\n relayToken: z.union([z.string(), z.literal(false)]).optional(),\n nativeExtensionId: z.string().optional(),\n daemonPort: z.number().int().min(0).max(65535).default(DEFAULT_DAEMON_PORT),\n daemonToken: z.string().min(1).optional(),\n chromePath: z.string().min(1).optional().refine(\n (val) => val === undefined || isExecutable(val),\n { message: \"chromePath must point to an executable file\" }\n ),\n flags: z.array(z.string()).default([]),\n checkForUpdates: z.boolean().default(false),\n persistProfile: z.boolean().default(true),\n skillPaths: z.array(z.string()).default([])\n});\n\nconst CONFIG_FILE_NAME = \"opendevbrowser.jsonc\";\n\nfunction getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, CONFIG_FILE_NAME);\n}\n\nfunction ensureConfigFile(filePath: string): { relayToken: string; daemonToken: string } {\n const relayToken = generateSecureToken();\n const daemonToken = generateSecureToken();\n if (fs.existsSync(filePath)) {\n return { relayToken, daemonToken };\n }\n try {\n fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });\n fs.writeFileSync(filePath, buildDefaultConfigJsonc(relayToken, daemonToken), { encoding: \"utf-8\", mode: 0o600 });\n } catch (error) {\n console.warn(`[opendevbrowser] Warning: Could not create config file at ${filePath}:`, error);\n }\n return { relayToken, daemonToken };\n}\n\nfunction loadConfigFile(filePath: string): {\n raw: unknown;\n content: string;\n generatedRelayToken: string | null;\n generatedDaemonToken: string | null;\n created: boolean;\n} {\n if (!fs.existsSync(filePath)) {\n const tokens = ensureConfigFile(filePath);\n const content = buildDefaultConfigJsonc(tokens.relayToken, tokens.daemonToken);\n return {\n raw: {},\n content,\n generatedRelayToken: tokens.relayToken,\n generatedDaemonToken: tokens.daemonToken,\n created: true\n };\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n if (errors.length > 0) {\n const firstError = errors[0];\n if (!firstError) {\n throw new Error(`Invalid JSONC in opendevbrowser config at ${filePath}: parse error`);\n }\n throw new Error(`Invalid JSONC in opendevbrowser config at ${filePath}: parse error at offset ${firstError.offset}`);\n }\n return {\n raw: parsed ?? {},\n content,\n generatedRelayToken: null,\n generatedDaemonToken: null,\n created: false\n };\n}\n\nexport function loadGlobalConfig(): OpenDevBrowserConfig {\n const configPath = getGlobalConfigPath();\n const { raw, content, generatedRelayToken, generatedDaemonToken, created } = loadConfigFile(configPath);\n const parsed = configSchema.safeParse(raw);\n\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n throw new Error(`Invalid opendevbrowser config at ${configPath}: ${issues}`);\n }\n\n const data = parsed.data;\n const relayToken = data.relayToken ?? generatedRelayToken ?? generateSecureToken();\n const daemonToken = data.daemonToken ?? generatedDaemonToken ?? generateSecureToken();\n\n if (!created) {\n persistDaemonConfigDefaults({\n configPath,\n content,\n raw,\n daemonPort: data.daemonPort,\n daemonToken\n });\n }\n\n return { ...data, relayToken, daemonToken };\n}\n\nexport function resolveConfig(config: unknown): OpenDevBrowserConfig {\n if (typeof config === \"undefined\") {\n return loadGlobalConfig();\n }\n const parsed = configSchema.safeParse(config);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n throw new Error(`Invalid opendevbrowser config override: ${issues}`);\n }\n const data = parsed.data;\n const relayToken = data.relayToken ?? generateSecureToken();\n const daemonToken = data.daemonToken ?? generateSecureToken();\n return { ...data, relayToken, daemonToken };\n}\n\nfunction persistDaemonConfigDefaults(params: {\n configPath: string;\n content: string;\n raw: unknown;\n daemonPort: number;\n daemonToken: string;\n}): void {\n if (!isRecord(params.raw)) {\n return;\n }\n const hasDaemonPort = Object.prototype.hasOwnProperty.call(params.raw, \"daemonPort\");\n const hasDaemonToken = Object.prototype.hasOwnProperty.call(params.raw, \"daemonToken\");\n if (hasDaemonPort && hasDaemonToken) {\n return;\n }\n const formattingOptions = { insertSpaces: true, tabSize: 2 };\n let updatedContent = params.content;\n if (!hasDaemonPort) {\n const edits = modify(updatedContent, [\"daemonPort\"], params.daemonPort, { formattingOptions });\n if (edits.length) {\n updatedContent = applyEdits(updatedContent, edits);\n }\n }\n if (!hasDaemonToken) {\n const edits = modify(updatedContent, [\"daemonToken\"], params.daemonToken, { formattingOptions });\n if (edits.length) {\n updatedContent = applyEdits(updatedContent, edits);\n }\n }\n if (updatedContent !== params.content) {\n writeFileAtomic(params.configPath, updatedContent, { mode: 0o600 });\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n\nexport class ConfigStore {\n private current: OpenDevBrowserConfig;\n\n constructor(initial: OpenDevBrowserConfig) {\n this.current = initial;\n }\n\n get(): OpenDevBrowserConfig {\n return this.current;\n }\n\n set(next: OpenDevBrowserConfig): void {\n this.current = next;\n }\n}\n\nexport const __test__ = {\n persistDaemonConfigDefaults\n};\n","import { randomBytes } from \"crypto\";\n\nexport function generateSecureToken(): string {\n return randomBytes(32).toString(\"hex\");\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\n\nexport function writeFileAtomic(\n filePath: string,\n content: string,\n options: { encoding?: BufferEncoding; mode?: number } = {}\n): void {\n const { encoding = \"utf-8\", mode } = options;\n const dir = path.dirname(filePath);\n const hash = crypto.randomBytes(8).toString(\"hex\");\n const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);\n\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const writeOptions: fs.WriteFileOptions = { encoding };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n fs.writeFileSync(tempPath, content, writeOptions);\n fs.renameSync(tempPath, filePath);\n } catch (error) {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch {\n /* best-effort cleanup */\n }\n throw error;\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport type { AddressInfo } from \"net\";\nimport { timingSafeEqual, randomUUID } from \"crypto\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport {\n AnnotationErrorCode,\n AnnotationResponse,\n MAX_OPS_PAYLOAD_BYTES,\n OpsEnvelope,\n OpsError,\n OpsErrorResponse,\n OpsEvent,\n OpsHello,\n OpsPing,\n OpsRequest,\n RelayAnnotationCommand,\n RelayAnnotationEvent,\n RelayAnnotationResponse,\n RelayCommand,\n RelayEvent,\n RelayHandshake,\n RelayHandshakeAck,\n RelayHandshakeError,\n RelayHealthCheck,\n RelayHealthResponse,\n RelayHealthStatus,\n RelayPing,\n RelayPong,\n RelayResponse\n} from \"./protocol\";\n\nconst DEFAULT_DISCOVERY_PORT = 8787;\nconst CONFIG_PATH = \"/config\";\nconst PAIR_PATH = \"/pair\";\nconst STATUS_PATH = \"/status\";\nconst CDP_TOKEN_QUERY_KEY = \"token\";\n\ntype ExtensionInfo = {\n tabId: number;\n url?: string;\n title?: string;\n groupId?: number;\n};\n\nexport type RelayStatus = {\n running: boolean;\n url?: string;\n port?: number;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n annotationConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n instanceId: string;\n extension?: ExtensionInfo;\n epoch: number;\n lastHandshakeError?: RelayHandshakeError;\n health: RelayHealthStatus;\n};\n\ntype RelayServerOptions = {\n discoveryPort?: number;\n};\n\nexport class RelayServer {\n private readonly instanceId = randomUUID();\n private readonly epoch = Date.now();\n private running = false;\n private baseUrl: string | null = null;\n private port: number | null = null;\n private server: ReturnType<typeof createServer> | null = null;\n private discoveryServer: ReturnType<typeof createServer> | null = null;\n private extensionWss: WebSocketServer | null = null;\n private cdpWss: WebSocketServer | null = null;\n private annotationWss: WebSocketServer | null = null;\n private opsWss: WebSocketServer | null = null;\n private extensionSocket: WebSocket | null = null;\n private cdpSocket: WebSocket | null = null;\n private annotationSocket: WebSocket | null = null;\n private opsClients = new Map<string, WebSocket>();\n private opsOwnedTabIds = new Set<number>();\n private extensionInfo: ExtensionInfo | null = null;\n private extensionHandshakeComplete = false;\n private pairingToken: string | null = null;\n private lastHandshakeError: RelayHandshakeError | null = null;\n private configuredDiscoveryPort: number;\n private discoveryPort: number | null = null;\n private handshakeAttempts = new Map<string, { count: number; resetAt: number }>();\n private httpAttempts = new Map<string, { count: number; resetAt: number }>();\n private cdpAllowlist: Set<string> | null = null;\n private annotationPending = new Map<string, { createdAt: number }>();\n private static readonly MAX_HANDSHAKE_ATTEMPTS = 5;\n private static readonly RATE_LIMIT_WINDOW_MS = 60_000;\n private static readonly MAX_HTTP_ATTEMPTS = 60;\n private static readonly MAX_ANNOTATION_PAYLOAD_BYTES = 12 * 1024 * 1024;\n private static readonly ANNOTATION_REQUEST_TIMEOUT_MS = 120_000;\n\n constructor(options: RelayServerOptions = {}) {\n this.configuredDiscoveryPort = options.discoveryPort ?? DEFAULT_DISCOVERY_PORT;\n }\n\n async start(port = 8787): Promise<{ url: string; port: number }> {\n if (this.running && this.baseUrl && this.port !== null) {\n return { url: this.baseUrl, port: this.port };\n }\n\n this.server = createServer();\n this.extensionWss = new WebSocketServer({ noServer: true });\n this.cdpWss = new WebSocketServer({ noServer: true });\n this.annotationWss = new WebSocketServer({ noServer: true });\n this.opsWss = new WebSocketServer({ noServer: true });\n\n this.extensionWss.on(\"connection\", (socket: WebSocket) => {\n if (this.extensionSocket) {\n this.extensionSocket.close(1000, \"Replaced by a new extension client\");\n }\n this.extensionSocket = socket;\n this.extensionInfo = null;\n this.extensionHandshakeComplete = false;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleExtensionMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.extensionSocket === socket) {\n this.extensionSocket = null;\n this.extensionInfo = null;\n this.extensionHandshakeComplete = false;\n this.opsOwnedTabIds.clear();\n this.failPendingAnnotations(\"relay_unavailable\", \"Extension disconnected.\");\n }\n if (this.cdpSocket) {\n this.cdpSocket.close(1011, \"Extension disconnected\");\n }\n });\n });\n\n this.cdpWss.on(\"connection\", (socket: WebSocket) => {\n if (this.cdpSocket) {\n socket.close(1008, \"Only one CDP client supported\");\n return;\n }\n this.cdpSocket = socket;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleCdpMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.cdpSocket === socket) {\n this.cdpSocket = null;\n }\n });\n });\n\n this.annotationWss.on(\"connection\", (socket: WebSocket) => {\n if (this.annotationSocket) {\n socket.close(1008, \"Only one annotation client supported\");\n return;\n }\n this.annotationSocket = socket;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleAnnotationMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.annotationSocket === socket) {\n this.annotationSocket = null;\n this.annotationPending.clear();\n }\n });\n });\n\n this.opsWss.on(\"connection\", (socket: WebSocket, _request: IncomingMessage) => {\n const clientId = randomUUID();\n this.opsClients.set(clientId, socket);\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleOpsClientMessage(clientId, data);\n });\n socket.on(\"close\", () => {\n if (this.opsClients.get(clientId) === socket) {\n this.opsClients.delete(clientId);\n this.notifyOpsClientClosed(clientId);\n }\n });\n socket.on(\"error\", () => {\n if (this.opsClients.get(clientId) === socket) {\n this.opsClients.delete(clientId);\n this.notifyOpsClientClosed(clientId);\n }\n });\n void _request;\n });\n\n this.server.on(\"request\", (request: IncomingMessage, response) => {\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n const origin = request.headers.origin;\n \n if (pathname === CONFIG_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n \n if (pathname === CONFIG_PATH && request.method === \"GET\") {\n this.handleConfigRequest(request, origin, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"GET\") {\n this.handleStatusRequest(request, origin, response);\n return;\n }\n \n if (pathname === PAIR_PATH && request.method === \"OPTIONS\") {\n if (origin && (origin.startsWith(\"chrome-extension://\") || this.isNullOrigin(origin))) {\n this.applyCorsOrigin(origin, response);\n response.setHeader(\"Access-Control-Allow-Methods\", \"GET, OPTIONS\");\n response.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n this.applyPrivateNetworkPreflight(request, response);\n }\n response.writeHead(204);\n response.end();\n return;\n }\n \n if (pathname === PAIR_PATH && request.method === \"GET\") {\n if (!this.authorizeHttpRequest(origin, request, response)) {\n return;\n }\n\n this.applyCorsOrigin(origin, response);\n this.applyPrivateNetworkResponse(origin, response);\n\n response.writeHead(200, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ token: this.pairingToken, instanceId: this.instanceId, epoch: this.epoch }));\n return;\n }\n \n response.writeHead(404);\n response.end();\n });\n\n this.server.on(\"upgrade\", (request: IncomingMessage, socket, head) => {\n const rawOrigin = request.headers.origin;\n const origin = this.normalizeOrigin(rawOrigin);\n const ip = request.socket.remoteAddress ?? \"unknown\";\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n\n if (pathname === \"/extension\") {\n if (!this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.extensionWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.extensionWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (pathname === \"/cdp\") {\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (origin && !this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (!origin && !this.isLoopbackAddress(ip)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const token = this.getCdpTokenFromRequestUrl(request.url);\n if (!this.isTokenValid(token)) {\n this.logSecurityEvent(\"cdp_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.cdpWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.cdpWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (pathname === \"/annotation\") {\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (origin && !this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (!origin && !this.isLoopbackAddress(ip)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const token = this.getCdpTokenFromRequestUrl(request.url);\n if (!this.isTokenValid(token)) {\n this.logSecurityEvent(\"annotation_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.annotationWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.annotationWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (pathname === \"/ops\") {\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (origin && !this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (!origin && !this.isLoopbackAddress(ip)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const token = this.getCdpTokenFromRequestUrl(request.url);\n if (!this.isTokenValid(token)) {\n this.logSecurityEvent(\"ops_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.opsWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.opsWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n socket.destroy();\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.listen(port, \"127.0.0.1\", () => {\n resolve();\n });\n });\n\n const address = this.server.address() as AddressInfo | null;\n if (!address) {\n throw new Error(\"Relay server did not expose a port\");\n }\n\n this.port = address.port;\n this.baseUrl = `ws://127.0.0.1:${address.port}`;\n this.running = true;\n\n try {\n await this.startDiscoveryServer();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[opendevbrowser] Discovery server failed to start: ${message}`);\n this.stopDiscoveryServer();\n }\n\n return { url: this.baseUrl, port: address.port };\n }\n\n stop(): void {\n this.running = false;\n this.baseUrl = null;\n this.port = null;\n this.extensionInfo = null;\n this.extensionHandshakeComplete = false;\n this.stopDiscoveryServer();\n\n if (this.extensionSocket) {\n this.extensionSocket.close(1000, \"Relay stopped\");\n this.extensionSocket = null;\n }\n\n if (this.cdpSocket) {\n this.cdpSocket.close(1000, \"Relay stopped\");\n this.cdpSocket = null;\n }\n\n if (this.annotationSocket) {\n this.annotationSocket.close(1000, \"Relay stopped\");\n this.annotationSocket = null;\n }\n\n for (const socket of this.opsClients.values()) {\n socket.close(1000, \"Relay stopped\");\n }\n this.opsClients.clear();\n this.opsOwnedTabIds.clear();\n\n this.extensionWss?.close();\n this.cdpWss?.close();\n this.annotationWss?.close();\n this.opsWss?.close();\n this.server?.close();\n\n this.extensionWss = null;\n this.cdpWss = null;\n this.annotationWss = null;\n this.opsWss = null;\n this.server = null;\n }\n\n status(): RelayStatus {\n const health = this.buildHealthStatus();\n return {\n running: this.running,\n url: this.baseUrl || undefined,\n port: this.port ?? undefined,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected: this.opsClients.size > 0,\n pairingRequired: Boolean(this.pairingToken),\n instanceId: this.instanceId,\n extension: this.extensionInfo ?? undefined,\n epoch: this.epoch,\n lastHandshakeError: this.lastHandshakeError ?? undefined,\n health\n };\n }\n\n getCdpUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/cdp` : null;\n }\n\n getAnnotationUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/annotation` : null;\n }\n\n getOpsUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/ops` : null;\n }\n\n getDiscoveryPort(): number | null {\n if (this.port !== null && this.port === this.configuredDiscoveryPort) {\n return this.port;\n }\n return this.discoveryPort;\n }\n\n setToken(token?: string | false | null): void {\n const trimmed = typeof token === \"string\" ? token.trim() : \"\";\n this.pairingToken = trimmed.length ? trimmed : null;\n }\n\n setCdpAllowlist(methods: string[] | undefined): void {\n if (!methods || methods.length === 0) {\n this.cdpAllowlist = null;\n return;\n }\n this.cdpAllowlist = new Set(methods);\n }\n\n private isExtensionOrigin(origin: string | undefined): boolean {\n return Boolean(origin && origin.startsWith(\"chrome-extension://\"));\n }\n\n private isNullOrigin(origin: string | undefined): boolean {\n return origin === \"null\";\n }\n\n private applyPrivateNetworkPreflight(request: IncomingMessage, response: ServerResponse): void {\n const pna = request.headers[\"access-control-request-private-network\"];\n if (typeof pna === \"string\" && pna.toLowerCase() === \"true\") {\n response.setHeader(\"Access-Control-Allow-Private-Network\", \"true\");\n }\n }\n\n private applyPrivateNetworkResponse(origin: string | undefined, response: ServerResponse): void {\n if (origin && (this.isExtensionOrigin(origin) || this.isNullOrigin(origin))) {\n response.setHeader(\"Access-Control-Allow-Private-Network\", \"true\");\n }\n }\n\n private applyCorsOrigin(origin: string | undefined, response: ServerResponse): void {\n if (origin && this.isExtensionOrigin(origin)) {\n response.setHeader(\"Access-Control-Allow-Origin\", origin);\n return;\n }\n if (this.isNullOrigin(origin)) {\n response.setHeader(\"Access-Control-Allow-Origin\", \"null\");\n }\n }\n\n private normalizeOrigin(origin: string | undefined): string | undefined {\n if (!origin || origin === \"null\") {\n return undefined;\n }\n return origin;\n }\n\n private isLoopbackAddress(ip: string): boolean {\n if (!ip) return false;\n return ip === \"127.0.0.1\"\n || ip === \"::1\"\n || ip.startsWith(\"::ffff:127.\");\n }\n\n private isHttpRateLimited(ip: string): boolean {\n const now = Date.now();\n const record = this.httpAttempts.get(ip);\n\n if (!record || now > record.resetAt) {\n this.httpAttempts.set(ip, { count: 1, resetAt: now + RelayServer.RATE_LIMIT_WINDOW_MS });\n return false;\n }\n\n record.count++;\n return record.count > RelayServer.MAX_HTTP_ATTEMPTS;\n }\n\n private authorizeHttpRequest(origin: string | undefined, request: IncomingMessage, response: ServerResponse): boolean {\n const normalizedOrigin = this.normalizeOrigin(origin);\n const ip = request.socket.remoteAddress ?? \"unknown\";\n\n if (this.isHttpRateLimited(ip)) {\n this.logSecurityEvent(\"http_rate_limited\", { ip });\n response.writeHead(429, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Too Many Requests\" }));\n return false;\n }\n\n if (normalizedOrigin) {\n if (!this.isExtensionOrigin(normalizedOrigin)) {\n response.writeHead(403, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Forbidden: extension origin required\" }));\n return false;\n }\n return true;\n }\n\n if (!this.isLoopbackAddress(ip)) {\n response.writeHead(403, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Forbidden: local requests only\" }));\n return false;\n }\n\n return true;\n }\n\n private getCdpTokenFromRequestUrl(requestUrl: string | undefined): string | null {\n try {\n const url = new URL(requestUrl ?? \"\", \"http://127.0.0.1\");\n const token = url.searchParams.get(CDP_TOKEN_QUERY_KEY);\n if (!token || token.trim().length === 0) {\n return null;\n }\n return token;\n } catch {\n return null;\n }\n }\n\n private handleConfigPreflight(origin: string | undefined, request: IncomingMessage, response: ServerResponse): void {\n if (origin && (this.isExtensionOrigin(origin) || this.isNullOrigin(origin))) {\n this.applyCorsOrigin(origin, response);\n response.setHeader(\"Access-Control-Allow-Methods\", \"GET, OPTIONS\");\n response.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n this.applyPrivateNetworkPreflight(request, response);\n }\n response.writeHead(204);\n response.end();\n }\n\n private handleConfigRequest(request: IncomingMessage, origin: string | undefined, response: ServerResponse): void {\n if (!this.authorizeHttpRequest(origin, request, response)) {\n return;\n }\n\n this.applyCorsOrigin(origin, response);\n this.applyPrivateNetworkResponse(origin, response);\n\n if (this.port === null) {\n response.writeHead(503, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Relay not running\" }));\n return;\n }\n\n response.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n response.end(JSON.stringify({\n relayPort: this.port,\n pairingRequired: Boolean(this.pairingToken),\n instanceId: this.instanceId,\n epoch: this.epoch,\n discoveryPort: this.getDiscoveryPort()\n }));\n }\n\n private handleStatusRequest(request: IncomingMessage, origin: string | undefined, response: ServerResponse): void {\n if (!this.authorizeHttpRequest(origin, request, response)) {\n return;\n }\n\n this.applyCorsOrigin(origin, response);\n this.applyPrivateNetworkResponse(origin, response);\n\n response.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n const health = this.buildHealthStatus();\n response.end(JSON.stringify({\n instanceId: this.instanceId,\n running: this.running,\n port: this.port ?? undefined,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected: this.opsClients.size > 0,\n pairingRequired: Boolean(this.pairingToken),\n health,\n lastHandshakeError: this.lastHandshakeError ?? undefined\n }));\n }\n\n private async startDiscoveryServer(): Promise<void> {\n if (this.port === null || this.discoveryServer) {\n return;\n }\n\n if (this.configuredDiscoveryPort > 0 && this.configuredDiscoveryPort === this.port) {\n return;\n }\n\n this.discoveryServer = createServer((request: IncomingMessage, response) => {\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n const origin = request.headers.origin;\n\n if (pathname === CONFIG_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n\n if (pathname === CONFIG_PATH && request.method === \"GET\") {\n this.handleConfigRequest(request, origin, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"GET\") {\n this.handleStatusRequest(request, origin, response);\n return;\n }\n\n response.writeHead(404);\n response.end();\n });\n\n await new Promise<void>((resolve, reject) => {\n this.discoveryServer?.once(\"error\", reject);\n this.discoveryServer?.listen(this.configuredDiscoveryPort, \"127.0.0.1\", () => {\n resolve();\n });\n });\n\n const address = this.discoveryServer.address() as AddressInfo | null;\n if (!address) {\n throw new Error(\"Discovery server did not expose a port\");\n }\n\n this.discoveryPort = address.port;\n }\n\n private stopDiscoveryServer(): void {\n if (this.discoveryServer) {\n this.discoveryServer.close();\n this.discoveryServer = null;\n }\n this.discoveryPort = null;\n }\n\n private isRateLimited(ip: string): boolean {\n const now = Date.now();\n const record = this.handshakeAttempts.get(ip);\n\n if (!record || now > record.resetAt) {\n this.handshakeAttempts.set(ip, { count: 1, resetAt: now + RelayServer.RATE_LIMIT_WINDOW_MS });\n return false;\n }\n\n record.count++;\n return record.count > RelayServer.MAX_HANDSHAKE_ATTEMPTS;\n }\n\n private isCommandAllowed(method: string): boolean {\n if (!this.cdpAllowlist) return true;\n return this.cdpAllowlist.has(method);\n }\n\n private isOpsOwnedTargetId(targetId: string): boolean {\n if (!targetId.startsWith(\"tab-\")) return false;\n const raw = targetId.slice(4);\n if (!raw) return false;\n const tabId = Number(raw);\n if (!Number.isFinite(tabId)) return false;\n return this.opsOwnedTabIds.has(tabId);\n }\n\n private logSecurityEvent(event: string, details: Record<string, unknown>): void {\n const safeDetails = { ...details };\n delete safeDetails.token;\n delete safeDetails.pairingToken;\n console.warn(`[security] ${event}`, JSON.stringify(safeDetails));\n }\n\n private handleCdpMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n const id = message.id;\n const method = message.method;\n if ((typeof id !== \"string\" && typeof id !== \"number\") || typeof method !== \"string\") {\n return;\n }\n\n if (!this.extensionSocket) {\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: \"Extension not connected to relay\" }\n } satisfies RelayResponse);\n return;\n }\n\n if (!this.isCommandAllowed(method)) {\n this.logSecurityEvent(\"command_blocked\", { method });\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: `CDP command '${method}' not in allowlist` }\n } satisfies RelayResponse);\n return;\n }\n\n if (method === \"Target.attachToTarget\" && isRecord(message.params)) {\n const targetId = typeof message.params.targetId === \"string\" ? message.params.targetId : \"\";\n if (this.isOpsOwnedTargetId(targetId)) {\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: \"cdp_attach_blocked: target is owned by an ops session\" }\n } satisfies RelayResponse);\n return;\n }\n }\n\n const relayCommand: RelayCommand = {\n id,\n method: \"forwardCDPCommand\",\n params: {\n method,\n params: message.params,\n sessionId: typeof message.sessionId === \"string\" ? message.sessionId : undefined\n }\n };\n\n this.sendJson(this.extensionSocket, relayCommand);\n }\n\n private handleAnnotationMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (isHealthCheck(message)) {\n this.sendJson(this.annotationSocket, this.buildHealthResponse(message));\n return;\n }\n if (isPing(message)) {\n this.sendJson(this.annotationSocket, this.buildPong(message));\n return;\n }\n\n if (isRelayAnnotationCommand(message)) {\n this.handleAnnotationCommand(message);\n return;\n }\n }\n\n private handleExtensionMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (isHandshake(message)) {\n if (!this.isPairingTokenValid(message)) {\n const hasToken = typeof message.payload.pairingToken === \"string\" && message.payload.pairingToken.length > 0;\n const code: RelayHandshakeError[\"code\"] = hasToken ? \"pairing_invalid\" : \"pairing_missing\";\n this.lastHandshakeError = {\n code,\n message: hasToken ? \"Invalid pairing token\" : \"Missing pairing token\",\n at: Date.now()\n };\n this.logSecurityEvent(\"handshake_failed\", { reason: hasToken ? \"invalid_token\" : \"missing_token\", tabId: message.payload.tabId });\n this.extensionInfo = null;\n this.extensionSocket?.close(1008, \"Invalid pairing token\");\n return;\n }\n if (this.extensionSocket) {\n this.extensionHandshakeComplete = true;\n }\n this.lastHandshakeError = null;\n this.extensionInfo = {\n tabId: message.payload.tabId,\n url: message.payload.url,\n title: message.payload.title,\n groupId: message.payload.groupId\n };\n if (this.extensionSocket && this.port !== null) {\n const ack: RelayHandshakeAck = {\n type: \"handshakeAck\",\n payload: {\n instanceId: this.instanceId,\n relayPort: this.port,\n pairingRequired: Boolean(this.pairingToken),\n epoch: this.epoch\n }\n };\n this.sendJson(this.extensionSocket, ack);\n }\n return;\n }\n\n if (isRelayAnnotationResponse(message)) {\n this.forwardAnnotationResponse(message);\n return;\n }\n\n if (isRelayAnnotationEvent(message)) {\n this.forwardAnnotationEvent(message);\n return;\n }\n\n if (isOpsEnvelope(message)) {\n this.handleOpsExtensionMessage(message);\n return;\n }\n\n if (isHealthCheck(message)) {\n this.sendJson(this.extensionSocket, this.buildHealthResponse(message));\n return;\n }\n if (isPing(message)) {\n this.sendJson(this.extensionSocket, this.buildPong(message));\n return;\n }\n\n if (message.method === \"forwardCDPEvent\" && isRecord(message.params)) {\n const params = message.params as RelayEvent[\"params\"];\n const event: Record<string, unknown> = {\n method: params.method,\n params: params.params ?? {}\n };\n if (params.sessionId) {\n event.sessionId = params.sessionId;\n }\n this.sendJson(this.cdpSocket, event);\n return;\n }\n\n if (typeof message.id === \"string\" || typeof message.id === \"number\") {\n const response: Record<string, unknown> = { id: message.id };\n if (typeof message.result !== \"undefined\") {\n response.result = message.result;\n }\n if (message.error) {\n response.error = message.error;\n }\n if (typeof message.sessionId === \"string\") {\n response.sessionId = message.sessionId;\n }\n this.sendJson(this.cdpSocket, response);\n }\n }\n\n private handleAnnotationCommand(message: RelayAnnotationCommand): void {\n const payload = message.payload as unknown;\n if (!isAnnotationCommand(payload)) {\n const requestId = isRecord(payload) && typeof payload.requestId === \"string\"\n ? payload.requestId\n : \"unknown\";\n this.sendAnnotationError(requestId, \"invalid_request\", \"Invalid annotation command payload.\");\n return;\n }\n\n const command = payload;\n if (!this.extensionSocket || !this.extensionHandshakeComplete) {\n this.sendAnnotationError(command.requestId, \"relay_unavailable\", \"Extension not connected to relay.\");\n return;\n }\n\n this.annotationPending.set(command.requestId, { createdAt: Date.now() });\n this.sendJson(this.extensionSocket, message);\n\n setTimeout(() => {\n if (!this.annotationPending.has(command.requestId)) return;\n this.annotationPending.delete(command.requestId);\n this.sendAnnotationError(command.requestId, \"timeout\", \"Annotation request timed out.\");\n }, RelayServer.ANNOTATION_REQUEST_TIMEOUT_MS);\n }\n\n private handleOpsClientMessage(clientId: string, data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (!this.extensionSocket || !this.extensionHandshakeComplete) {\n this.sendOpsError(clientId, {\n code: \"ops_unavailable\",\n message: \"Extension not connected to relay.\",\n retryable: true\n }, getOpsRequestId(message), getOpsSessionId(message));\n return;\n }\n\n if (isOpsHello(message) || isOpsRequest(message) || isOpsPing(message)) {\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > MAX_OPS_PAYLOAD_BYTES) {\n this.sendOpsError(clientId, {\n code: \"invalid_request\",\n message: \"Ops payload exceeded relay limits.\",\n retryable: false,\n details: { maxPayloadBytes: MAX_OPS_PAYLOAD_BYTES }\n }, getOpsRequestId(message), getOpsSessionId(message));\n return;\n }\n\n this.sendJson(this.extensionSocket, { ...message, clientId } satisfies OpsEnvelope);\n return;\n }\n\n this.sendOpsError(clientId, {\n code: \"invalid_request\",\n message: \"Invalid ops message.\",\n retryable: false\n }, getOpsRequestId(message), getOpsSessionId(message));\n }\n\n private handleOpsExtensionMessage(message: OpsEnvelope): void {\n if (message.type === \"ops_event\") {\n const tabId = extractOpsTabId(message.payload);\n if (typeof tabId === \"number\") {\n if (message.event === \"ops_session_created\") {\n this.opsOwnedTabIds.add(tabId);\n }\n if (message.event === \"ops_session_closed\" || message.event === \"ops_session_expired\" || message.event === \"ops_tab_closed\") {\n this.opsOwnedTabIds.delete(tabId);\n }\n }\n }\n\n if (message.type === \"ops_hello_ack\" && this.opsClients.size === 0) {\n return;\n }\n\n const clientId = message.clientId;\n if (!clientId) {\n return;\n }\n const client = this.opsClients.get(clientId);\n if (!client) {\n return;\n }\n this.sendJson(client, message);\n }\n\n private notifyOpsClientClosed(clientId: string): void {\n if (!this.extensionSocket) return;\n const event: OpsEvent = {\n type: \"ops_event\",\n clientId,\n event: \"ops_client_disconnected\",\n payload: { at: Date.now() }\n };\n this.sendJson(this.extensionSocket, event);\n }\n\n private sendOpsError(clientId: string, error: OpsError, requestId?: string, opsSessionId?: string): void {\n const client = this.opsClients.get(clientId);\n if (!client) return;\n const payload: OpsErrorResponse = {\n type: \"ops_error\",\n requestId: requestId ?? \"unknown\",\n clientId,\n opsSessionId,\n error\n };\n this.sendJson(client, payload);\n }\n\n private forwardAnnotationResponse(message: RelayAnnotationResponse): void {\n const payload = message.payload as unknown;\n if (!isAnnotationResponse(payload)) {\n const requestId = isRecord(payload) && typeof payload.requestId === \"string\"\n ? payload.requestId\n : \"unknown\";\n this.sendAnnotationError(requestId, \"invalid_request\", \"Invalid annotation response payload.\");\n return;\n }\n\n const requestId = payload.requestId;\n if (!this.annotationPending.has(requestId)) {\n return;\n }\n\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > RelayServer.MAX_ANNOTATION_PAYLOAD_BYTES) {\n this.annotationPending.delete(requestId);\n this.sendAnnotationError(requestId, \"payload_too_large\", \"Annotation payload exceeded relay limits.\");\n return;\n }\n\n this.annotationPending.delete(requestId);\n this.sendJson(this.annotationSocket, message);\n }\n\n private forwardAnnotationEvent(message: RelayAnnotationEvent): void {\n if (!isAnnotationEvent(message.payload)) {\n return;\n }\n const requestId = message.payload.requestId;\n if (!this.annotationPending.has(requestId)) {\n return;\n }\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > RelayServer.MAX_ANNOTATION_PAYLOAD_BYTES) {\n return;\n }\n this.sendJson(this.annotationSocket, message);\n }\n\n private sendAnnotationError(requestId: string, code: AnnotationErrorCode, message: string): void {\n const payload: AnnotationResponse = {\n version: 1,\n requestId,\n status: \"error\",\n error: { code, message }\n };\n const response: RelayAnnotationResponse = {\n type: \"annotationResponse\",\n payload\n };\n this.sendJson(this.annotationSocket, response);\n }\n\n private failPendingAnnotations(code: AnnotationErrorCode, message: string): void {\n for (const requestId of this.annotationPending.keys()) {\n this.sendAnnotationError(requestId, code, message);\n }\n this.annotationPending.clear();\n }\n\n private buildHealthStatus(): RelayHealthStatus {\n const opsConnected = this.opsClients.size > 0;\n if (!this.running) {\n return {\n ok: false,\n reason: \"relay_down\",\n detail: \"Relay not running\",\n extensionConnected: false,\n extensionHandshakeComplete: false,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n if (this.lastHandshakeError?.code === \"pairing_invalid\") {\n return {\n ok: false,\n reason: \"pairing_invalid\",\n detail: this.lastHandshakeError.message,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError\n };\n }\n\n if (this.lastHandshakeError?.code === \"pairing_missing\") {\n return {\n ok: false,\n reason: \"pairing_required\",\n detail: this.lastHandshakeError.message,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError\n };\n }\n\n if (!this.extensionSocket) {\n return {\n ok: false,\n reason: \"extension_disconnected\",\n detail: \"Extension not connected\",\n extensionConnected: false,\n extensionHandshakeComplete: false,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n if (!this.extensionHandshakeComplete) {\n return {\n ok: false,\n reason: \"handshake_incomplete\",\n detail: \"Extension handshake pending\",\n extensionConnected: true,\n extensionHandshakeComplete: false,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n return {\n ok: true,\n reason: \"ok\",\n extensionConnected: true,\n extensionHandshakeComplete: true,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n private buildHealthResponse(request: RelayHealthCheck): RelayHealthResponse {\n return {\n type: \"healthCheckResult\",\n id: request.id,\n payload: this.buildHealthStatus()\n };\n }\n\n private buildPong(request: RelayPing): RelayPong {\n return {\n type: \"pong\",\n id: request.id,\n payload: this.buildHealthStatus()\n };\n }\n\n private sendJson(socket: WebSocket | null, payload: unknown): void {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(JSON.stringify(payload));\n }\n\n private isPairingTokenValid(handshake: RelayHandshake): boolean {\n return this.isTokenValid(handshake.payload.pairingToken);\n }\n\n private isTokenValid(received: string | undefined | null): boolean {\n if (!this.pairingToken) {\n return true;\n }\n\n if (typeof received !== \"string\") {\n return false;\n }\n\n const expected = this.pairingToken;\n const expectedBuf = Buffer.from(expected, \"utf-8\");\n const receivedBuf = Buffer.from(received, \"utf-8\");\n\n if (expectedBuf.length !== receivedBuf.length) {\n timingSafeEqual(expectedBuf, expectedBuf);\n return false;\n }\n\n return timingSafeEqual(expectedBuf, receivedBuf);\n }\n}\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n\nconst isHandshake = (value: Record<string, unknown>): value is RelayHandshake => {\n if (value.type !== \"handshake\" || !isRecord(value.payload)) {\n return false;\n }\n return typeof value.payload.tabId === \"number\";\n};\n\nconst isHealthCheck = (value: Record<string, unknown>): value is RelayHealthCheck => {\n return value.type === \"healthCheck\" && typeof value.id === \"string\";\n};\n\nconst isPing = (value: Record<string, unknown>): value is RelayPing => {\n return value.type === \"ping\" && typeof value.id === \"string\";\n};\n\nconst isRelayAnnotationCommand = (value: Record<string, unknown>): value is RelayAnnotationCommand => {\n return value.type === \"annotationCommand\" && isRecord(value.payload);\n};\n\nconst isRelayAnnotationResponse = (value: Record<string, unknown>): value is RelayAnnotationResponse => {\n return value.type === \"annotationResponse\" && isRecord(value.payload);\n};\n\nconst isRelayAnnotationEvent = (value: Record<string, unknown>): value is RelayAnnotationEvent => {\n return value.type === \"annotationEvent\" && isRecord(value.payload);\n};\n\nconst isOpsHello = (value: Record<string, unknown>): value is OpsHello => {\n return value.type === \"ops_hello\" && typeof value.version === \"string\";\n};\n\nconst isOpsPing = (value: Record<string, unknown>): value is OpsPing => {\n return value.type === \"ops_ping\" && typeof value.id === \"string\";\n};\n\nconst isOpsRequest = (value: Record<string, unknown>): value is OpsRequest => {\n return value.type === \"ops_request\" && typeof value.requestId === \"string\" && typeof value.command === \"string\";\n};\n\nconst isOpsEnvelope = (value: Record<string, unknown>): value is OpsEnvelope => {\n const type = value.type;\n return typeof type === \"string\" && type.startsWith(\"ops_\");\n};\n\nconst getOpsRequestId = (value: Record<string, unknown>): string | undefined => {\n return typeof value.requestId === \"string\" ? value.requestId : undefined;\n};\n\nconst getOpsSessionId = (value: Record<string, unknown>): string | undefined => {\n return typeof value.opsSessionId === \"string\" ? value.opsSessionId : undefined;\n};\n\nconst extractOpsTabId = (payload: unknown): number | undefined => {\n if (!isRecord(payload)) return undefined;\n const tabId = payload.tabId;\n return typeof tabId === \"number\" ? tabId : undefined;\n};\n\nconst isAnnotationCommand = (value: unknown): value is RelayAnnotationCommand[\"payload\"] => {\n if (!isRecord(value)) return false;\n if (value.version !== 1) return false;\n if (typeof value.requestId !== \"string\") return false;\n if (value.command !== \"start\" && value.command !== \"cancel\") return false;\n if (value.options && !isRecord(value.options)) return false;\n return true;\n};\n\nconst isAnnotationResponse = (value: unknown): value is RelayAnnotationResponse[\"payload\"] => {\n if (!isRecord(value)) return false;\n if (value.version !== 1) return false;\n if (typeof value.requestId !== \"string\") return false;\n if (value.status !== \"ok\" && value.status !== \"cancelled\" && value.status !== \"error\") return false;\n if (value.error && !isRecord(value.error)) return false;\n return true;\n};\n\nconst isAnnotationEvent = (value: unknown): value is RelayAnnotationEvent[\"payload\"] => {\n if (!isRecord(value)) return false;\n if (value.version !== 1) return false;\n if (typeof value.requestId !== \"string\") return false;\n if (value.event !== \"progress\" && value.event !== \"ready\" && value.event !== \"warning\") return false;\n return true;\n};\n","import { readFile, readdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport * as os from \"os\";\nimport type { SkillInfo, SkillMetadata } from \"./types\";\n\nexport class SkillLoader {\n private rootDir: string;\n private additionalPaths: string[];\n private skillCache: SkillInfo[] | null = null;\n\n constructor(rootDir: string, additionalPaths: string[] = []) {\n this.rootDir = rootDir;\n this.additionalPaths = additionalPaths.map((p) => this.expandPath(p));\n }\n\n private expandPath(p: string): string {\n if (p.startsWith(\"~\")) {\n return join(os.homedir(), p.slice(1));\n }\n return p;\n }\n\n async loadBestPractices(topic?: string): Promise<string> {\n return this.loadSkill(\"opendevbrowser-best-practices\", topic);\n }\n\n async loadSkill(name: string, topic?: string): Promise<string> {\n const skills = await this.listSkills();\n const skill = skills.find((s) => s.name === name);\n\n if (!skill) {\n const available = skills.map((s) => s.name).join(\", \") || \"none\";\n throw new Error(`Skill \"${name}\" not found. Available: ${available}`);\n }\n\n const content = await readFile(skill.path, \"utf8\");\n const trimmed = content.trim();\n\n if (!topic || !topic.trim()) {\n return trimmed;\n }\n\n const filtered = filterSections(trimmed, topic);\n return filtered || trimmed;\n }\n\n async listSkills(): Promise<SkillInfo[]> {\n if (this.skillCache) {\n return this.skillCache;\n }\n\n const skills: SkillInfo[] = [];\n const searchPaths = this.getSearchPaths();\n\n for (const searchPath of searchPaths) {\n const discovered = await this.discoverSkillsInPath(searchPath);\n for (const skill of discovered) {\n if (!skills.some((s) => s.name === skill.name)) {\n skills.push(skill);\n }\n }\n }\n\n this.skillCache = skills;\n return skills;\n }\n\n private getSearchPaths(): string[] {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || join(os.homedir(), \".config\", \"opencode\");\n\n const searchPaths = [\n join(this.rootDir, \".opencode\", \"skill\"),\n join(configDir, \"skill\"),\n join(this.rootDir, \".claude\", \"skills\"),\n join(os.homedir(), \".claude\", \"skills\"),\n ...this.additionalPaths\n ];\n\n return Array.from(new Set(searchPaths));\n }\n\n private async discoverSkillsInPath(searchPath: string): Promise<SkillInfo[]> {\n const skills: SkillInfo[] = [];\n\n try {\n const entries = await readdir(searchPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = join(searchPath, entry.name, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf8\");\n const metadata = this.parseSkillMetadata(content, entry.name);\n\n skills.push({\n name: metadata.name,\n description: metadata.description,\n version: metadata.version ?? \"1.0.0\",\n path: skillPath\n });\n } catch {\n void 0;\n }\n }\n } catch {\n void 0;\n }\n\n return skills;\n }\n\n parseSkillMetadata(content: string, dirName: string): SkillMetadata {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!frontmatterMatch) {\n return {\n name: dirName,\n description: this.extractFirstParagraph(content) || `Skill: ${dirName}`\n };\n }\n\n const frontmatter = frontmatterMatch[1] || \"\";\n const metadata: SkillMetadata = {\n name: dirName,\n description: \"\"\n };\n\n const nameMatch = frontmatter.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (nameMatch?.[1]) {\n metadata.name = nameMatch[1].trim();\n }\n\n const descMatch = frontmatter.match(/^description:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (descMatch?.[1]) {\n metadata.description = descMatch[1].trim();\n }\n\n const versionMatch = frontmatter.match(/^version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (versionMatch?.[1]) {\n metadata.version = versionMatch[1].trim();\n }\n\n if (!metadata.description) {\n const afterFrontmatter = content.slice(frontmatterMatch[0].length);\n metadata.description = this.extractFirstParagraph(afterFrontmatter) || `Skill: ${metadata.name}`;\n }\n\n return metadata;\n }\n\n private extractFirstParagraph(content: string): string | null {\n const lines = content.trim().split(/\\n/);\n const paragraphLines: string[] = [];\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine.startsWith(\"#\")) continue;\n if (trimmedLine === \"\" && paragraphLines.length > 0) break;\n if (trimmedLine !== \"\") {\n paragraphLines.push(trimmedLine);\n }\n }\n\n const paragraph = paragraphLines.join(\" \").trim();\n return paragraph.length > 0 ? paragraph.slice(0, 200) : null;\n }\n\n clearCache(): void {\n this.skillCache = null;\n }\n}\n\nfunction filterSections(content: string, topic: string): string | null {\n const normalized = topic.trim().toLowerCase();\n const lines = content.split(/\\r?\\n/);\n const sections: Array<{ heading: string; body: string[] }> = [];\n let currentHeading = \"\";\n let currentBody: string[] = [];\n\n const flush = () => {\n if (currentHeading || currentBody.length > 0) {\n sections.push({ heading: currentHeading, body: [...currentBody] });\n }\n currentHeading = \"\";\n currentBody = [];\n };\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,3})\\s+(.*)$/);\n if (headingMatch) {\n flush();\n currentHeading = (headingMatch[2] || \"\").trim();\n currentBody.push(line);\n continue;\n }\n currentBody.push(line);\n }\n flush();\n\n const matches = sections.filter((section) => section.heading.toLowerCase().includes(normalized));\n if (matches.length === 0) {\n return null;\n }\n return matches.map((section) => section.body.join(\"\\n\")).join(\"\\n\\n\");\n}\n","import { BrowserManager } from \"../browser/browser-manager\";\nimport { OpsBrowserManager } from \"../browser/ops-browser-manager\";\nimport { AnnotationManager } from \"../browser/annotation-manager\";\nimport { ScriptRunner } from \"../browser/script-runner\";\nimport { ConfigStore, loadGlobalConfig } from \"../config\";\nimport { getExtensionPath } from \"../extension-extractor\";\nimport { RelayServer } from \"../relay/relay-server\";\nimport { SkillLoader } from \"../skills/skill-loader\";\nimport type { CoreOptions, OpenDevBrowserCore } from \"./types\";\n\nexport function createOpenDevBrowserCore(options: CoreOptions): OpenDevBrowserCore {\n const config = options.config ?? loadGlobalConfig();\n const configStore = new ConfigStore(config);\n const cacheRoot = options.worktree ?? options.directory;\n const baseManager = new BrowserManager(cacheRoot, config);\n const manager = new OpsBrowserManager(baseManager, config);\n const runner = new ScriptRunner(manager);\n const skills = new SkillLoader(cacheRoot, config.skillPaths);\n const relay = new RelayServer();\n relay.setToken(config.relayToken);\n const annotationManager = new AnnotationManager(relay, config, manager);\n\n const ensureRelay = async (port = config.relayPort): Promise<void> => {\n if (port <= 0 || config.relayToken === false) {\n relay.stop();\n return;\n }\n const status = relay.status();\n if (status.running && status.port === port) {\n return;\n }\n relay.stop();\n try {\n await relay.start(port);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"EADDRINUSE\") || message.includes(\"in use\")) {\n console.warn(`[opendevbrowser] Relay server port ${port} is already in use. Extension pairing will be unavailable.`);\n console.warn(`[opendevbrowser] To fix: kill the process using port ${port} or change relayPort in config.`);\n } else {\n console.warn(`[opendevbrowser] Failed to start relay server: ${message}`);\n }\n }\n };\n\n const cleanup = () => {\n relay.stop();\n baseManager.closeAll().catch(() => {});\n };\n\n return {\n cacheRoot,\n config,\n configStore,\n manager,\n annotationManager,\n runner,\n skills,\n relay,\n ensureRelay,\n cleanup,\n getExtensionPath\n };\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { timingSafeEqual } from \"crypto\";\nimport { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { generateSecureToken } from \"../utils/crypto\";\nimport { createOpenDevBrowserCore } from \"../core\";\nimport { loadGlobalConfig, type OpenDevBrowserConfig } from \"../config\";\nimport { handleDaemonCommand, type DaemonCommandRequest } from \"./daemon-commands\";\nimport { clearBinding, getBindingDiagnostics, getHubInstanceId } from \"./daemon-state\";\n\nconst DEFAULT_DAEMON_PORT = 8788;\n\nexport type DaemonState = {\n port: number;\n token: string;\n pid: number;\n relayPort: number;\n startedAt: string;\n hubInstanceId?: string;\n relayInstanceId?: string;\n relayEpoch?: number;\n};\n\ntype DaemonOptions = {\n port?: number;\n token?: string;\n config?: OpenDevBrowserConfig;\n directory?: string;\n worktree?: string | null;\n};\n\nexport function getCacheRoot(): string {\n const base = process.env.OPENCODE_CACHE_DIR\n ?? process.env.XDG_CACHE_HOME\n ?? join(homedir(), \".cache\");\n return join(base, \"opendevbrowser\");\n}\n\nexport function getDaemonMetadataPath(): string {\n return join(getCacheRoot(), \"daemon.json\");\n}\n\nexport function readDaemonMetadata(): DaemonState | null {\n const metadataPath = getDaemonMetadataPath();\n if (!existsSync(metadataPath)) {\n return null;\n }\n try {\n const content = readFileSync(metadataPath, \"utf-8\");\n return JSON.parse(content) as DaemonState;\n } catch {\n return null;\n }\n}\n\nexport function writeDaemonMetadata(state: DaemonState): void {\n const metadataPath = getDaemonMetadataPath();\n mkdirSync(join(getCacheRoot()), { recursive: true });\n writeFileSync(metadataPath, JSON.stringify(state, null, 2), { encoding: \"utf-8\", mode: 0o600 });\n}\n\nexport function clearDaemonMetadata(): void {\n const metadataPath = getDaemonMetadataPath();\n try {\n unlinkSync(metadataPath);\n } catch {\n void 0;\n }\n}\n\nfunction isAuthorized(request: IncomingMessage, token: string): boolean {\n const header = request.headers.authorization ?? \"\";\n if (!header.startsWith(\"Bearer \")) {\n return false;\n }\n const received = header.slice(\"Bearer \".length).trim();\n const expectedBuf = Buffer.from(token, \"utf-8\");\n const receivedBuf = Buffer.from(received, \"utf-8\");\n\n if (expectedBuf.length !== receivedBuf.length) {\n timingSafeEqual(expectedBuf, expectedBuf);\n return false;\n }\n return timingSafeEqual(expectedBuf, receivedBuf);\n}\n\nfunction sendJson(response: ServerResponse, status: number, payload: unknown): void {\n response.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n response.end(JSON.stringify(payload));\n}\n\nconst isDaemonCommandRequest = (value: Record<string, unknown>): value is DaemonCommandRequest => {\n if (typeof value.name !== \"string\") {\n return false;\n }\n if (typeof value.params === \"undefined\") {\n return true;\n }\n return typeof value.params === \"object\" && value.params !== null && !Array.isArray(value.params);\n};\n\nexport async function startDaemon(options: DaemonOptions = {}): Promise<{ state: DaemonState; stop: () => Promise<void> }> {\n const config = options.config ?? loadGlobalConfig();\n const port = options.port ?? config.daemonPort ?? DEFAULT_DAEMON_PORT;\n const token = options.token ?? config.daemonToken ?? generateSecureToken();\n const startedAt = new Date().toISOString();\n const core = createOpenDevBrowserCore({\n directory: options.directory ?? process.cwd(),\n worktree: options.worktree ?? null,\n config\n });\n\n await core.ensureRelay(config.relayPort);\n\n const server = createServer(async (request, response) => {\n if (!isAuthorized(request, token)) {\n sendJson(response, 401, { error: \"Unauthorized\" });\n return;\n }\n\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (request.method === \"GET\" && url.pathname === \"/status\") {\n const relayStatus = core.relay.status();\n writeDaemonMetadata({\n port,\n token,\n pid: process.pid,\n relayPort: relayStatus.port ?? config.relayPort,\n startedAt,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayEpoch: relayStatus.epoch\n });\n sendJson(response, 200, {\n ok: true,\n pid: process.pid,\n hub: { instanceId: getHubInstanceId() },\n relay: relayStatus,\n binding: getBindingDiagnostics()\n });\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/stop\") {\n sendJson(response, 200, { ok: true });\n await stop();\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/command\") {\n try {\n const body = await readJson(request);\n if (!isDaemonCommandRequest(body)) {\n throw new Error(\"Invalid daemon command request\");\n }\n const data = await handleDaemonCommand(core, body);\n sendJson(response, 200, { ok: true, data });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(response, 400, { ok: false, error: message });\n }\n return;\n }\n\n sendJson(response, 404, { error: \"Not found\" });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => resolve());\n });\n\n const state: DaemonState = {\n port,\n token,\n pid: process.pid,\n relayPort: config.relayPort,\n startedAt,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: core.relay.status().instanceId,\n relayEpoch: core.relay.status().epoch\n };\n writeDaemonMetadata(state);\n\n const stop = async () => {\n clearDaemonMetadata();\n clearBinding();\n core.cleanup();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n };\n\n process.on(\"SIGINT\", () => {\n stop().catch(() => {});\n });\n process.on(\"SIGTERM\", () => {\n stop().catch(() => {});\n });\n\n return { state, stop };\n}\n\nfunction readJson(request: IncomingMessage): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n request.setEncoding(\"utf8\");\n request.on(\"data\", (chunk) => {\n data += chunk;\n });\n request.on(\"end\", () => {\n try {\n const parsed = JSON.parse(data || \"{}\");\n if (!parsed || typeof parsed !== \"object\") {\n reject(new Error(\"Invalid JSON body\"));\n return;\n }\n resolve(parsed as Record<string, unknown>);\n } catch (error) {\n reject(error);\n }\n });\n request.on(\"error\", reject);\n });\n}\n","import { randomUUID } from \"crypto\";\n\nconst HUB_INSTANCE_ID = randomUUID();\nconst BINDING_TTL_MS = 60_000;\nconst RENEW_INTERVAL_MS = 20_000;\nconst RENEW_GRACE_MS = RENEW_INTERVAL_MS * 2;\nconst RENEW_JITTER_MS = 2000;\nconst WAIT_MAX_MS = 30_000;\n\nexport type RelayBindingState = {\n bindingId: string;\n clientId: string;\n expiresAt: number;\n lastRenewedAt: number;\n};\n\nexport type SessionLeaseState = {\n sessionId: string;\n leaseId: string;\n clientId: string;\n createdAt: number;\n lastUsedAt: number;\n};\n\nexport type RelayBindingResponse = {\n bindingId: string;\n expiresAt: string;\n ttlMs: number;\n renewAfterMs: number;\n};\n\nexport type RelayQueueResponse = {\n queued: true;\n position: number;\n waitUntil: string;\n waitMs: number;\n};\n\nexport type RelayBindResult = RelayBindingResponse | RelayQueueResponse;\n\ntype RelayQueueEntry = {\n clientId: string;\n requestedAt: number;\n timeoutAt: number;\n};\n\nlet binding: RelayBindingState | null = null;\nlet queue: RelayQueueEntry[] = [];\nconst sessionLeases = new Map<string, SessionLeaseState>();\n\nexport const getHubInstanceId = (): string => HUB_INSTANCE_ID;\n\nconst nowMs = (): number => Date.now();\n\nconst isExpired = (state: RelayBindingState): boolean => nowMs() > state.expiresAt + RENEW_GRACE_MS;\n\nconst computeRenewAfterMs = (): number => {\n const jitter = Math.floor((Math.random() * 2 - 1) * RENEW_JITTER_MS);\n return Math.max(1000, RENEW_INTERVAL_MS + jitter);\n};\n\nconst serializeBinding = (state: RelayBindingState): RelayBindingResponse => ({\n bindingId: state.bindingId,\n expiresAt: new Date(state.expiresAt).toISOString(),\n ttlMs: BINDING_TTL_MS,\n renewAfterMs: computeRenewAfterMs()\n});\n\nconst serializeQueue = (entry: RelayQueueEntry): RelayQueueResponse => ({\n queued: true,\n position: queue.findIndex((item) => item.clientId === entry.clientId) + 1,\n waitUntil: new Date(entry.timeoutAt).toISOString(),\n waitMs: Math.max(0, entry.timeoutAt - nowMs())\n});\n\nconst cleanupQueue = (): void => {\n const now = nowMs();\n queue = queue.filter((entry) => entry.timeoutAt > now);\n};\n\nconst getQueueEntry = (clientId: string): RelayQueueEntry | null => {\n return queue.find((entry) => entry.clientId === clientId) ?? null;\n};\n\nconst enqueueClient = (clientId: string): RelayQueueEntry => {\n cleanupQueue();\n const existing = getQueueEntry(clientId);\n if (existing) {\n return existing;\n }\n const entry: RelayQueueEntry = {\n clientId,\n requestedAt: nowMs(),\n timeoutAt: nowMs() + WAIT_MAX_MS\n };\n queue.push(entry);\n return entry;\n};\n\nconst dequeueClient = (clientId: string): void => {\n queue = queue.filter((entry) => entry.clientId !== clientId);\n};\n\nconst maybeGrantBinding = (clientId: string): RelayBindingResponse | null => {\n const existing = getBindingState();\n const now = nowMs();\n\n if (existing) {\n if (existing.clientId !== clientId) {\n return null;\n }\n existing.expiresAt = now + BINDING_TTL_MS;\n existing.lastRenewedAt = now;\n return serializeBinding(existing);\n }\n\n cleanupQueue();\n const head = queue[0];\n if (head && head.clientId !== clientId) {\n return null;\n }\n if (head && head.clientId === clientId) {\n queue.shift();\n }\n\n const state: RelayBindingState = {\n bindingId: randomUUID(),\n clientId: clientId.trim(),\n expiresAt: now + BINDING_TTL_MS,\n lastRenewedAt: now\n };\n binding = state;\n return serializeBinding(state);\n};\n\nexport const getBindingState = (): RelayBindingState | null => {\n if (binding && isExpired(binding)) {\n binding = null;\n }\n cleanupQueue();\n return binding;\n};\n\nexport const clearBinding = (): void => {\n binding = null;\n queue = [];\n};\n\nexport const registerSessionLease = (sessionId: string, leaseId: string, clientId: string): SessionLeaseState => {\n if (!sessionId || !sessionId.trim()) {\n throw new Error(\"RELAY_SESSION_REQUIRED: sessionId is required\");\n }\n if (!leaseId || !leaseId.trim()) {\n throw new Error(\"RELAY_LEASE_REQUIRED: leaseId is required\");\n }\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n const lease: SessionLeaseState = {\n sessionId,\n leaseId,\n clientId: clientId.trim(),\n createdAt: nowMs(),\n lastUsedAt: nowMs()\n };\n sessionLeases.set(sessionId, lease);\n return lease;\n};\n\nexport const getSessionLease = (sessionId: string): SessionLeaseState | null => {\n if (!sessionId || !sessionId.trim()) return null;\n return sessionLeases.get(sessionId) ?? null;\n};\n\nexport const touchSessionLease = (sessionId: string): void => {\n const lease = sessionLeases.get(sessionId);\n if (!lease) return;\n lease.lastUsedAt = nowMs();\n};\n\nexport const releaseSessionLease = (sessionId: string): void => {\n sessionLeases.delete(sessionId);\n};\n\nexport const clearSessionLeases = (): void => {\n sessionLeases.clear();\n};\n\nexport const requireSessionLease = (sessionId: string, clientId: string, leaseId: string | undefined): SessionLeaseState => {\n if (!sessionId || !sessionId.trim()) {\n throw new Error(\"RELAY_SESSION_REQUIRED: sessionId is required\");\n }\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n const lease = sessionLeases.get(sessionId);\n if (!lease) {\n throw new Error(\"RELAY_LEASE_REQUIRED: No active lease for session.\");\n }\n const normalizedClientId = clientId.trim();\n const normalizedLeaseId = leaseId?.trim() ?? \"\";\n\n if (!normalizedLeaseId) {\n if (lease.clientId !== normalizedClientId) {\n throw new Error(\"RELAY_LEASE_INVALID: Lease does not match session owner.\");\n }\n lease.lastUsedAt = nowMs();\n return lease;\n }\n if (lease.leaseId !== normalizedLeaseId || lease.clientId !== normalizedClientId) {\n throw new Error(\"RELAY_LEASE_INVALID: Lease does not match session owner.\");\n }\n lease.lastUsedAt = nowMs();\n return lease;\n};\n\nexport const bindRelay = (clientId: string): RelayBindResult => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n\n const result = maybeGrantBinding(clientId);\n if (result) {\n return result;\n }\n\n const entry = enqueueClient(clientId.trim());\n return serializeQueue(entry);\n};\n\nexport const waitForBinding = async (clientId: string, timeoutMs?: number): Promise<RelayBindingResponse> => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n\n const entry = enqueueClient(clientId.trim());\n const deadline = timeoutMs ? Math.min(entry.timeoutAt, nowMs() + timeoutMs) : entry.timeoutAt;\n\n while (nowMs() <= deadline) {\n const result = maybeGrantBinding(clientId);\n if (result) {\n return result;\n }\n cleanupQueue();\n if (!getQueueEntry(clientId)) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n\n dequeueClient(clientId);\n throw new Error(\"RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.\");\n};\n\nexport const renewRelay = (clientId: string, bindingId: string): RelayBindingResponse => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n if (!bindingId || !bindingId.trim()) {\n throw new Error(\"RELAY_BINDING_REQUIRED: bindingId is required\");\n }\n const existing = getBindingState();\n if (!existing) {\n throw new Error(\"RELAY_BINDING_REQUIRED: No active binding to renew.\");\n }\n if (existing.clientId !== clientId || existing.bindingId !== bindingId) {\n throw new Error(\"RELAY_BINDING_INVALID: Binding does not match the current owner.\");\n }\n const now = nowMs();\n existing.expiresAt = now + BINDING_TTL_MS;\n existing.lastRenewedAt = now;\n return serializeBinding(existing);\n};\n\nexport const releaseRelay = (clientId: string, bindingId: string): { released: boolean } => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n if (!bindingId || !bindingId.trim()) {\n throw new Error(\"RELAY_BINDING_REQUIRED: bindingId is required\");\n }\n const existing = getBindingState();\n if (!existing) {\n return { released: false };\n }\n if (existing.clientId !== clientId || existing.bindingId !== bindingId) {\n throw new Error(\"RELAY_BINDING_INVALID: Binding does not match the current owner.\");\n }\n binding = null;\n return { released: true };\n};\n\nexport const requireBinding = (clientId: string, bindingId: string | undefined): RelayBindingState => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n const existing = getBindingState();\n if (!existing) {\n throw new Error(\"RELAY_BINDING_REQUIRED: Call relay.bind to acquire the relay binding.\");\n }\n if (!bindingId || !bindingId.trim()) {\n throw new Error(\"RELAY_BINDING_REQUIRED: bindingId is required for relay operations.\");\n }\n if (existing.clientId !== clientId || existing.bindingId !== bindingId) {\n throw new Error(\"RELAY_BINDING_INVALID: Binding does not match the current owner.\");\n }\n return existing;\n};\n\nexport const getBindingDiagnostics = (): {\n bindingId: string;\n clientId: string;\n expiresAt: string;\n expiresInMs: number;\n queueLength: number;\n} | null => {\n const existing = getBindingState();\n if (!existing) return null;\n const expiresInMs = Math.max(0, existing.expiresAt - nowMs());\n return {\n bindingId: existing.bindingId,\n clientId: existing.clientId,\n expiresAt: new Date(existing.expiresAt).toISOString(),\n expiresInMs,\n queueLength: queue.length\n };\n};\n\nexport const getBindingRenewConfig = (): { ttlMs: number; renewIntervalMs: number; graceMs: number; waitMaxMs: number } => ({\n ttlMs: BINDING_TTL_MS,\n renewIntervalMs: RENEW_INTERVAL_MS,\n graceMs: RENEW_GRACE_MS,\n waitMaxMs: WAIT_MAX_MS\n});\n","const DEFAULT_HTTP_TIMEOUT_MS = 5000;\n\ntype FetchInput = Parameters<typeof fetch>[0];\ntype FetchInit = Parameters<typeof fetch>[1];\n\nfunction isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n return \"name\" in error && (error as { name?: string }).name === \"AbortError\";\n}\n\nexport async function fetchWithTimeout(\n input: FetchInput,\n init: FetchInit = {},\n timeoutMs: number = DEFAULT_HTTP_TIMEOUT_MS\n): Promise<Response> {\n const resolvedTimeout = Number.isFinite(timeoutMs) && timeoutMs > 0\n ? timeoutMs\n : DEFAULT_HTTP_TIMEOUT_MS;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), resolvedTimeout);\n\n if (init?.signal) {\n if (init.signal.aborted) {\n controller.abort();\n } else {\n init.signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n }\n\n try {\n return await fetch(input, { ...init, signal: controller.signal });\n } catch (error) {\n if (isAbortError(error)) {\n throw new Error(`Request timed out after ${resolvedTimeout}ms`);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n","import type { OpenDevBrowserCore } from \"../core\";\nimport {\n bindRelay,\n waitForBinding,\n releaseRelay,\n renewRelay,\n requireBinding,\n registerSessionLease,\n getSessionLease,\n requireSessionLease,\n releaseSessionLease,\n getBindingRenewConfig,\n getHubInstanceId\n} from \"./daemon-state\";\nimport { fetchWithTimeout } from \"./utils/http\";\n\nexport type DaemonCommandRequest = {\n name: string;\n params?: Record<string, unknown>;\n};\n\nexport async function handleDaemonCommand(core: OpenDevBrowserCore, request: DaemonCommandRequest): Promise<unknown> {\n const params = request.params ?? {};\n const bindingId = optionalString(params.bindingId);\n\n switch (request.name) {\n case \"relay.status\":\n return core.relay.status();\n case \"relay.cdpUrl\":\n return core.relay.getCdpUrl();\n case \"relay.annotationUrl\":\n return core.relay.getAnnotationUrl?.() ?? null;\n case \"relay.opsUrl\":\n return core.relay.getOpsUrl?.() ?? null;\n case \"relay.bind\": {\n const clientId = requireClientId(params);\n const binding = bindRelay(clientId);\n const relayStatus = core.relay.status();\n return {\n ...binding,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayPort: relayStatus.port ?? null,\n bindingConfig: getBindingRenewConfig()\n };\n }\n case \"relay.wait\": {\n const clientId = requireClientId(params);\n const timeoutMs = optionalNumber(params.timeoutMs, \"timeoutMs\");\n const binding = await waitForBinding(clientId, timeoutMs);\n const relayStatus = core.relay.status();\n return {\n ...binding,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayPort: relayStatus.port ?? null,\n bindingConfig: getBindingRenewConfig()\n };\n }\n case \"relay.renew\": {\n const clientId = requireClientId(params);\n const binding = renewRelay(clientId, requireString(bindingId, \"bindingId\"));\n const relayStatus = core.relay.status();\n return {\n ...binding,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayPort: relayStatus.port ?? null,\n bindingConfig: getBindingRenewConfig()\n };\n }\n case \"relay.release\": {\n const clientId = requireClientId(params);\n return releaseRelay(clientId, requireString(bindingId, \"bindingId\"));\n }\n case \"session.launch\":\n return launchWithRelay(core, params, requireClientId(params), bindingId);\n case \"session.connect\":\n return connectWithRelayRouting(core, params, requireClientId(params), bindingId);\n case \"session.disconnect\":\n return disconnectSession(core, params, requireClientId(params), bindingId);\n case \"session.status\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.status(requireString(params.sessionId, \"sessionId\"));\n case \"annotate\": {\n await authorizeSessionCommand(core, params, request.name, bindingId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n const status = await core.manager.status(sessionId);\n const transport = requireAnnotationTransport(params.transport);\n if (transport === \"relay\" && status.mode !== \"extension\") {\n throw new Error(\"Relay annotations require extension mode.\");\n }\n const url = optionalString(params.url);\n const targetId = optionalString(params.targetId);\n const tabId = optionalNumber(params.tabId, \"tabId\");\n const screenshotMode = requireScreenshotMode(params.screenshotMode);\n const debug = optionalBoolean(params.debug) ?? false;\n const context = optionalString(params.context);\n const timeoutMs = optionalNumber(params.timeoutMs, \"timeoutMs\");\n return core.annotationManager.requestAnnotation({\n sessionId,\n transport,\n targetId,\n tabId,\n url,\n screenshotMode,\n debug,\n context,\n timeoutMs\n });\n }\n case \"targets.list\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.listTargets(\n requireString(params.sessionId, \"sessionId\"),\n optionalBoolean(params.includeUrls) ?? false\n );\n case \"targets.use\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.useTarget(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.targetId, \"targetId\")\n );\n case \"targets.new\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.newTarget(\n requireString(params.sessionId, \"sessionId\"),\n optionalString(params.url)\n );\n case \"targets.close\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n await core.manager.closeTarget(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.targetId, \"targetId\")\n );\n return { ok: true };\n case \"page.open\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.page(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.name, \"name\"),\n optionalString(params.url)\n );\n case \"page.list\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.listPages(requireString(params.sessionId, \"sessionId\"));\n case \"page.close\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n await core.manager.closePage(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.name, \"name\")\n );\n return { ok: true };\n case \"nav.goto\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.goto(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.url, \"url\"),\n requireWaitUntil(params.waitUntil),\n optionalNumber(params.timeoutMs, \"timeoutMs\") ?? 30000\n );\n case \"nav.wait\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n if (typeof params.ref === \"string\") {\n return core.manager.waitForRef(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireState(params.state),\n optionalNumber(params.timeoutMs, \"timeoutMs\") ?? 30000\n );\n }\n return core.manager.waitForLoad(\n requireString(params.sessionId, \"sessionId\"),\n requireWaitUntil(params.until),\n optionalNumber(params.timeoutMs, \"timeoutMs\") ?? 30000\n );\n case \"nav.snapshot\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.snapshot(\n requireString(params.sessionId, \"sessionId\"),\n requireSnapshotMode(params.mode),\n optionalNumber(params.maxChars, \"maxChars\") ?? 16000,\n optionalString(params.cursor)\n );\n case \"interact.click\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.click(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"interact.hover\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.hover(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"interact.press\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.press(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.key, \"key\"),\n optionalString(params.ref)\n );\n case \"interact.check\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.check(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"interact.uncheck\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.uncheck(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"interact.type\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.type(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireString(params.text, \"text\"),\n optionalBoolean(params.clear) ?? false,\n optionalBoolean(params.submit) ?? false\n );\n case \"interact.select\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.select(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireStringArray(params.values, \"values\")\n );\n case \"interact.scroll\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.scroll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.dy, \"dy\") ?? 0,\n optionalString(params.ref)\n );\n case \"interact.scrollIntoView\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.scrollIntoView(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"dom.getHtml\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetHtml(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalNumber(params.maxChars, \"maxChars\") ?? 8000\n );\n case \"dom.getText\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetText(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalNumber(params.maxChars, \"maxChars\") ?? 8000\n );\n case \"dom.getAttr\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetAttr(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireString(params.name, \"name\")\n );\n case \"dom.getValue\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetValue(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"dom.isVisible\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domIsVisible(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"dom.isEnabled\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domIsEnabled(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"dom.isChecked\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domIsChecked(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"export.clonePage\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.clonePage(requireString(params.sessionId, \"sessionId\"));\n case \"export.cloneComponent\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.cloneComponent(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\")\n );\n case \"devtools.perf\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.perfMetrics(requireString(params.sessionId, \"sessionId\"));\n case \"page.screenshot\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.screenshot(\n requireString(params.sessionId, \"sessionId\"),\n optionalString(params.path)\n );\n case \"devtools.consolePoll\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.consolePoll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.sinceSeq, \"sinceSeq\"),\n optionalNumber(params.max, \"max\") ?? 50\n );\n case \"devtools.networkPoll\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.networkPoll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.sinceSeq, \"sinceSeq\"),\n optionalNumber(params.max, \"max\") ?? 50\n );\n default:\n throw new Error(`Unknown daemon command: ${request.name}`);\n }\n}\n\nasync function launchWithRelay(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n clientId: string,\n bindingId?: string\n) {\n let relayStatus = core.relay.status();\n const extensionLegacy = optionalBoolean(params.extensionLegacy) ?? false;\n let relayUrl = extensionLegacy ? core.relay.getCdpUrl() : core.relay.getOpsUrl?.() ?? null;\n const relayPort = core.config.relayPort;\n const noExtension = optionalBoolean(params.noExtension) ?? false;\n const extensionOnly = optionalBoolean(params.extensionOnly) ?? false;\n const waitForExtension = optionalBoolean(params.waitForExtension) ?? false;\n const headlessExplicit = optionalBoolean(params.headless) === true;\n const managedExplicit = Boolean(noExtension || headlessExplicit);\n const managedHeadless = headlessExplicit ? true : false;\n const waitTimeoutMs = clampWaitTimeout(optionalNumber(params.waitTimeoutMs, \"waitTimeoutMs\") ?? 30000);\n\n if (!managedExplicit && extensionLegacy) {\n requireBinding(clientId, bindingId);\n }\n\n if (waitForExtension && !managedExplicit) {\n const observedPort = resolveObservedPort(relayStatus, relayPort);\n const connected = await waitForRelayHandshake(core.relay, observedPort, waitTimeoutMs);\n if (connected) {\n relayStatus = core.relay.status();\n relayUrl = extensionLegacy ? core.relay.getCdpUrl() ?? relayUrl : core.relay.getOpsUrl?.() ?? relayUrl;\n }\n }\n\n const observedPort = resolveObservedPort(relayStatus, relayPort);\n const shouldFetchObserved = !managedExplicit && (!relayUrl || !(relayStatus.extensionHandshakeComplete || relayStatus.extensionConnected));\n const observedStatus = shouldFetchObserved ? await fetchRelayObservedStatus(observedPort) : null;\n if (!relayUrl) {\n const fallbackPort = isValidPort(observedStatus?.port) ? observedStatus?.port : observedPort;\n relayUrl = fallbackPort ? `ws://127.0.0.1:${fallbackPort}/${extensionLegacy ? \"cdp\" : \"ops\"}` : null;\n }\n const extensionReady = Boolean(\n relayUrl && (\n relayStatus.extensionHandshakeComplete ||\n observedStatus?.extensionHandshakeComplete ||\n relayStatus.extensionConnected ||\n observedStatus?.extensionConnected\n )\n );\n const diagnostics = observedStatus\n ? `Diagnostics: relayPort=${observedPort ?? \"?\"} instance=${observedStatus.instanceId.slice(0, 8)} ext=${observedStatus.extensionConnected} handshake=${observedStatus.extensionHandshakeComplete} ops=${observedStatus.opsConnected} cdp=${observedStatus.cdpConnected}`\n : null;\n const missingReason = diagnostics ? `Extension not connected. ${diagnostics}` : \"Extension not connected.\";\n\n if (extensionOnly && !extensionReady) {\n throw new Error(buildExtensionMissingMessage(missingReason));\n }\n\n if (!managedExplicit) {\n if (!extensionReady || !relayUrl) {\n throw new Error(buildExtensionMissingMessage(missingReason));\n }\n try {\n const result = await core.manager.connectRelay(relayUrl);\n const leaseId = extractLeaseId(result);\n if (result.mode === \"extension\" && leaseId) {\n registerSessionLease(result.sessionId, leaseId, clientId);\n }\n return { ...result, warnings: result.warnings ?? [], ...(leaseId ? { leaseId } : {}) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const unauthorized = message.toLowerCase().includes(\"unauthorized\") || message.includes(\"401\");\n const relayLabel = extensionLegacy ? \"/cdp\" : \"/ops\";\n const reason = unauthorized\n ? `Extension relay connection failed: relay ${relayLabel} unauthorized (token mismatch).`\n : `Extension relay connection failed: ${message}`;\n throw new Error(buildExtensionMissingMessage(reason));\n }\n }\n\n try {\n const result = await core.manager.launch({\n profile: optionalString(params.profile),\n headless: managedHeadless,\n startUrl: optionalString(params.startUrl),\n chromePath: optionalString(params.chromePath),\n flags: optionalStringArray(params.flags),\n persistProfile: optionalBoolean(params.persistProfile)\n });\n return { ...result, warnings: result.warnings ?? [] };\n } catch (error) {\n throw new Error(buildManagedFailureMessage(error));\n }\n}\n\nfunction normalizeRelayEndpoint(\n wsEndpoint: string | undefined,\n path: \"cdp\" | \"ops\",\n allowBase: boolean\n): string | null {\n if (!wsEndpoint) return null;\n try {\n const url = new URL(wsEndpoint);\n if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") return null;\n if (url.hostname !== \"127.0.0.1\" && url.hostname !== \"localhost\") return null;\n if (!url.port || !/^\\d+$/.test(url.port)) return null;\n const normalizedPath = url.pathname.endsWith(\"/\") ? url.pathname.slice(0, -1) : url.pathname;\n if (!allowBase && normalizedPath === \"\") return null;\n if (normalizedPath && normalizedPath !== `/${path}`) return null;\n return `${url.protocol}//${url.hostname}:${url.port}/${path}`;\n } catch {\n return null;\n }\n}\n\nasync function connectWithRelayRouting(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n clientId: string,\n bindingId?: string\n) {\n const wsEndpoint = optionalString(params.wsEndpoint);\n const extensionLegacy = optionalBoolean(params.extensionLegacy) ?? false;\n const relayUrl = extensionLegacy ? core.relay.getCdpUrl() : core.relay.getOpsUrl?.() ?? null;\n const normalizedOpsEndpoint = normalizeRelayEndpoint(wsEndpoint, \"ops\", true);\n const normalizedLegacyEndpoint = normalizeRelayEndpoint(wsEndpoint, \"cdp\", extensionLegacy);\n const relayEndpoint = relayUrl && wsEndpoint === relayUrl\n ? relayUrl\n : extensionLegacy\n ? normalizedLegacyEndpoint ?? normalizedOpsEndpoint\n : normalizedOpsEndpoint;\n\n const hasExplicitCdp = Boolean(wsEndpoint || params.host || params.port);\n if (normalizedLegacyEndpoint && !extensionLegacy) {\n throw new Error(\"Legacy extension relay (/cdp) requires --extension-legacy.\");\n }\n\n if (relayEndpoint || (!hasExplicitCdp && relayUrl)) {\n if (extensionLegacy) {\n requireBinding(clientId, bindingId);\n }\n const result = await core.manager.connectRelay(relayEndpoint ?? relayUrl ?? \"\");\n const leaseId = extractLeaseId(result);\n if (result.mode === \"extension\" && leaseId) {\n registerSessionLease(result.sessionId, leaseId, clientId);\n }\n return { ...result, ...(leaseId ? { leaseId } : {}) };\n }\n\n if (!hasExplicitCdp) {\n throw new Error(\"Extension relay not available. Connect the extension or pass --cdp-port/--ws-endpoint.\");\n }\n\n return core.manager.connect({\n wsEndpoint,\n host: optionalString(params.host),\n port: optionalNumber(params.port, \"port\")\n });\n}\n\nasync function disconnectSession(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n clientId: string,\n bindingId?: string\n): Promise<{ ok: true; bindingReleased?: boolean }> {\n const sessionId = requireString(params.sessionId, \"sessionId\");\n let status: Awaited<ReturnType<OpenDevBrowserCore[\"manager\"][\"status\"]>> | null = null;\n try {\n status = await core.manager.status(sessionId);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n if (message.includes(\"[invalid_session]\") || message.includes(\"Unknown ops session\")) {\n releaseSessionLease(sessionId);\n return { ok: true };\n }\n throw error;\n }\n if (status.mode === \"extension\") {\n const lease = getSessionLease(sessionId);\n if (lease) {\n requireSessionLease(sessionId, clientId, optionalString(params.leaseId));\n } else {\n requireBinding(clientId, bindingId);\n }\n }\n await core.manager.disconnect(sessionId, optionalBoolean(params.closeBrowser) ?? false);\n releaseSessionLease(sessionId);\n if (status.mode === \"extension\" && bindingId) {\n releaseRelay(clientId, bindingId);\n return { ok: true, bindingReleased: true };\n }\n return { ok: true };\n}\n\nasync function authorizeSessionCommand(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n _commandName: string,\n bindingId?: string\n): Promise<void> {\n const sessionId = optionalString(params.sessionId);\n if (!sessionId) return;\n const clientId = requireClientId(params);\n const lease = getSessionLease(sessionId);\n if (lease) {\n requireSessionLease(sessionId, clientId, optionalString(params.leaseId));\n return;\n }\n const status = await core.manager.status(sessionId);\n if (status.mode !== \"extension\") {\n return;\n }\n requireBinding(clientId, bindingId);\n}\n\nfunction extractLeaseId(result: unknown): string | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n const leaseId = (result as Record<string, unknown>).leaseId;\n return typeof leaseId === \"string\" ? leaseId : undefined;\n}\n\nfunction buildExtensionMissingMessage(reason: string): string {\n return [\n reason,\n \"Connect the extension: open the Chrome extension popup and click Connect, then retry.\",\n \"Tip: If the popup says Connected, it may be connected to a different relay instance/port than the daemon expects.\",\n \"Legend: ext=extension websocket, handshake=extension handshake, ops=active /ops client, cdp=active /cdp client, pairing=token required.\",\n \"\",\n \"Other options (explicit):\",\n \"- Managed (headed): npx opendevbrowser launch --no-extension\",\n \"- Managed (headless): npx opendevbrowser launch --no-extension --headless\",\n \"- Legacy extension relay: npx opendevbrowser launch --extension-legacy\",\n \"- CDPConnect (default port): npx opendevbrowser connect --cdp-port 9222\",\n \"- CDPConnect (explicit WS): npx opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/<id>\",\n \"Note: CDPConnect requires Chrome started with --remote-debugging-port=9222.\"\n ].join(\"\\n\");\n}\n\nfunction buildManagedFailureMessage(error: unknown): string {\n const detail = error instanceof Error ? error.message : String(error);\n return [\n `Managed session failed: ${detail}`,\n \"\",\n \"Final option (explicit):\",\n \"- CDPConnect (default port): npx opendevbrowser connect --cdp-port 9222\",\n \"- CDPConnect (explicit WS): npx opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/<id>\"\n ].join(\"\\n\");\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Missing ${label}`);\n }\n return value;\n}\n\nfunction requireClientId(params: Record<string, unknown>): string {\n return requireString(params.clientId, \"clientId\");\n}\n\nfunction requireStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`Invalid ${label}`);\n }\n return value as string[];\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction optionalStringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? value as string[]\n : undefined;\n}\n\nfunction optionalNumber(value: unknown, label: string): number | undefined {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n throw new Error(`Invalid ${label}`);\n}\n\nfunction optionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction requireWaitUntil(value: unknown): \"domcontentloaded\" | \"load\" | \"networkidle\" {\n if (value === \"domcontentloaded\" || value === \"load\" || value === \"networkidle\") {\n return value;\n }\n return \"load\";\n}\n\nfunction requireSnapshotMode(value: unknown): \"outline\" | \"actionables\" {\n if (value === \"actionables\") return \"actionables\";\n return \"outline\";\n}\n\nfunction requireScreenshotMode(value: unknown): \"visible\" | \"full\" | \"none\" {\n if (value === \"visible\" || value === \"full\" || value === \"none\") {\n return value;\n }\n return \"visible\";\n}\n\nfunction requireAnnotationTransport(value: unknown): \"auto\" | \"direct\" | \"relay\" {\n if (value === \"auto\" || value === \"direct\" || value === \"relay\") {\n return value;\n }\n if (typeof value === \"undefined\") {\n return \"auto\";\n }\n throw new Error(\"Invalid transport\");\n}\n\nfunction requireState(value: unknown): \"attached\" | \"visible\" | \"hidden\" {\n if (value === \"visible\" || value === \"hidden\") return value;\n return \"attached\";\n}\n\ntype RelayObservedStatus = {\n instanceId: string;\n running: boolean;\n port?: number;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n};\n\nconst MIN_WAIT_TIMEOUT_MS = 3000;\nconst WAIT_MIN_DELAY_MS = 250;\nconst WAIT_MAX_DELAY_MS = 2000;\nconst RELAY_STATUS_TIMEOUT_MS = 1500;\n\nfunction clampWaitTimeout(timeoutMs: number): number {\n if (!Number.isFinite(timeoutMs)) {\n return MIN_WAIT_TIMEOUT_MS;\n }\n return Math.max(timeoutMs, MIN_WAIT_TIMEOUT_MS);\n}\n\nasync function waitForRelayHandshake(\n relay: { status: () => { extensionHandshakeComplete: boolean } },\n observedPort: number | null,\n timeoutMs: number\n): Promise<boolean> {\n const start = Date.now();\n let delay = WAIT_MIN_DELAY_MS;\n while (Date.now() - start < timeoutMs) {\n if (relay.status().extensionHandshakeComplete) {\n return true;\n }\n const observedStatus = await fetchRelayObservedStatus(observedPort);\n if (observedStatus?.extensionHandshakeComplete) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay = Math.min(delay * 2, WAIT_MAX_DELAY_MS);\n }\n return false;\n}\n\nfunction resolveObservedPort(relayStatus: { port?: number }, configPort: number): number | null {\n if (isValidPort(relayStatus.port)) return relayStatus.port;\n if (isValidPort(configPort)) return configPort;\n return null;\n}\n\nfunction isValidPort(port: unknown): port is number {\n return typeof port === \"number\" && Number.isInteger(port) && port > 0 && port <= 65535;\n}\n\nasync function fetchRelayObservedStatus(port: number | null): Promise<RelayObservedStatus | null> {\n if (!isValidPort(port)) {\n return null;\n }\n try {\n const response = await fetchWithTimeout(\n `http://127.0.0.1:${port}/status`,\n undefined,\n RELAY_STATUS_TIMEOUT_MS\n );\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n if (!data || typeof data !== \"object\") {\n return null;\n }\n const record = data as Record<string, unknown>;\n if (typeof record.instanceId !== \"string\") {\n return null;\n }\n return {\n instanceId: record.instanceId,\n running: Boolean(record.running),\n port: typeof record.port === \"number\" ? record.port : undefined,\n extensionConnected: Boolean(record.extensionConnected),\n extensionHandshakeComplete: Boolean(record.extensionHandshakeComplete),\n cdpConnected: Boolean(record.cdpConnected),\n opsConnected: Boolean(record.opsConnected),\n pairingRequired: Boolean(record.pairingRequired)\n };\n } catch {\n return null;\n }\n}\n","import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.exitCode = exitCode;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n","import type { RelayStatus } from \"../relay/relay-server\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { loadGlobalConfig } from \"../config\";\nimport { readDaemonMetadata, writeDaemonMetadata, type DaemonState } from \"./daemon\";\nimport { fetchWithTimeout } from \"./utils/http\";\n\nexport type DaemonStatusPayload = {\n ok: true;\n pid: number;\n hub: { instanceId: string };\n relay: RelayStatus;\n binding: {\n bindingId: string;\n clientId: string;\n expiresAt: string;\n expiresInMs: number;\n } | null;\n};\n\nexport async function fetchDaemonStatus(port: number, token: string): Promise<DaemonStatusPayload | null> {\n try {\n const response = await fetchWithTimeout(`http://127.0.0.1:${port}/status`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${token}` }\n });\n if (!response.ok) return null;\n return await response.json() as DaemonStatusPayload;\n } catch {\n return null;\n }\n}\n\nexport async function fetchDaemonStatusFromMetadata(config?: OpenDevBrowserConfig): Promise<DaemonStatusPayload | null> {\n const metadata = readDaemonMetadata();\n if (metadata) {\n const status = await fetchDaemonStatus(metadata.port, metadata.token);\n if (status?.ok) {\n persistDaemonMetadata(metadata, status, config);\n return status;\n }\n }\n\n const resolvedConfig = config ?? loadGlobalConfig();\n if (resolvedConfig.daemonPort > 0 && resolvedConfig.daemonToken) {\n const status = await fetchDaemonStatus(resolvedConfig.daemonPort, resolvedConfig.daemonToken);\n if (status?.ok) {\n persistDaemonMetadata({\n port: resolvedConfig.daemonPort,\n token: resolvedConfig.daemonToken,\n pid: status.pid,\n relayPort: status.relay.port ?? resolvedConfig.relayPort,\n startedAt: new Date().toISOString()\n }, status, resolvedConfig);\n return status;\n }\n }\n return null;\n}\n\nfunction persistDaemonMetadata(\n base: DaemonState,\n status: DaemonStatusPayload,\n config?: OpenDevBrowserConfig\n): void {\n const resolvedConfig = config ?? loadGlobalConfig();\n writeDaemonMetadata({\n port: base.port,\n token: base.token,\n pid: status.pid,\n relayPort: status.relay.port ?? resolvedConfig.relayPort,\n startedAt: base.startedAt ?? new Date().toISOString(),\n hubInstanceId: status.hub.instanceId,\n relayInstanceId: status.relay.instanceId,\n relayEpoch: status.relay.epoch\n });\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { readDaemonMetadata, getCacheRoot, writeDaemonMetadata } from \"./daemon\";\nimport { CliError, createDisconnectedError, EXIT_EXECUTION } from \"./errors\";\nimport { writeFileAtomic } from \"../utils/fs\";\nimport { loadGlobalConfig } from \"../config\";\nimport { fetchDaemonStatus } from \"./daemon-status\";\nimport { fetchWithTimeout } from \"./utils/http\";\n\nconst CLIENT_ID_FILE = \"client.json\";\nconst DEFAULT_RENEW_AFTER_MS = 20_000;\nconst MIN_RENEW_AFTER_MS = 5_000;\n\ntype DaemonResponse<T> = { ok?: boolean; data?: T; error?: string };\n\ntype BindingConfig = {\n ttlMs: number;\n renewIntervalMs: number;\n graceMs: number;\n waitMaxMs: number;\n};\n\ntype BindingResponse = {\n bindingId: string;\n expiresAt: string;\n ttlMs?: number;\n renewAfterMs?: number;\n};\n\ntype QueueResponse = {\n queued: true;\n position: number;\n waitUntil: string;\n waitMs?: number;\n};\n\ntype RelayBindResponse = (BindingResponse | QueueResponse) & {\n hubInstanceId?: string;\n relayInstanceId?: string;\n relayPort?: number | null;\n bindingConfig?: BindingConfig;\n};\n\ntype BindingState = {\n bindingId: string;\n expiresAtMs: number;\n renewAfterMs: number;\n};\n\ntype CallOptions = {\n requireBinding?: boolean;\n timeoutMs?: number;\n};\n\nlet cachedClientId: string | null = null;\n\nconst loadClientId = (): string => {\n if (cachedClientId) {\n return cachedClientId;\n }\n\n const cacheRoot = getCacheRoot();\n const filePath = join(cacheRoot, CLIENT_ID_FILE);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(content) as { clientId?: unknown };\n if (typeof parsed.clientId === \"string\" && parsed.clientId.trim()) {\n cachedClientId = parsed.clientId.trim();\n return cachedClientId;\n }\n } catch {\n // fallthrough to regenerate\n }\n }\n\n const clientId = randomUUID();\n const payload = JSON.stringify({ clientId, createdAt: new Date().toISOString() }, null, 2);\n writeFileAtomic(filePath, payload, { mode: 0o600 });\n cachedClientId = clientId;\n return clientId;\n};\n\nconst parseBindingResponse = (data: BindingResponse): BindingState => {\n const expiresAtMs = Date.parse(data.expiresAt);\n if (!Number.isFinite(expiresAtMs)) {\n throw new Error(\"Invalid binding expiry timestamp\");\n }\n const renewAfterMs = Math.max(\n MIN_RENEW_AFTER_MS,\n typeof data.renewAfterMs === \"number\" && Number.isFinite(data.renewAfterMs)\n ? data.renewAfterMs\n : DEFAULT_RENEW_AFTER_MS\n );\n return {\n bindingId: data.bindingId,\n expiresAtMs,\n renewAfterMs\n };\n};\n\nconst isBindingRequiredError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_BINDING_REQUIRED\") || message.startsWith(\"RELAY_BINDING_INVALID\");\n};\n\nconst isLeaseInvalidError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_LEASE_INVALID\");\n};\n\nexport class DaemonClient {\n private binding: BindingState | null = null;\n private renewTimer: NodeJS.Timeout | null = null;\n private readonly clientId: string;\n private readonly autoRenew: boolean;\n private sessionLeases = new Map<string, string>();\n\n constructor(options: { clientId?: string; autoRenew?: boolean } = {}) {\n this.clientId = options.clientId ?? loadClientId();\n this.autoRenew = options.autoRenew ?? false;\n }\n\n async call<T>(name: string, params: Record<string, unknown> = {}, options: CallOptions = {}): Promise<T> {\n try {\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n } catch (error) {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId && !(\"leaseId\" in params) && isLeaseInvalidError(error) && this.sessionLeases.has(sessionId)) {\n this.sessionLeases.delete(sessionId);\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n }\n if (!options.requireBinding && isBindingRequiredError(error)) {\n await this.ensureBinding();\n const result = await this.callWithBinding<T>(name, params, { ...options, requireBinding: true });\n this.maybeTrackLease(name, params, result);\n return result;\n }\n throw error;\n }\n }\n\n async releaseBinding(): Promise<void> {\n if (!this.binding) return;\n const bindingId = this.binding.bindingId;\n try {\n await this.callRaw(\"relay.release\", { clientId: this.clientId, bindingId });\n } finally {\n this.clearBinding();\n }\n }\n\n private async callWithBinding<T>(name: string, params: Record<string, unknown>, options: CallOptions): Promise<T> {\n const requireBinding = options.requireBinding ?? false;\n const bindingId = requireBinding ? await this.ensureBinding() : this.binding?.bindingId;\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n const leaseId = sessionId ? this.sessionLeases.get(sessionId) : undefined;\n const payload = {\n ...params,\n clientId: this.clientId,\n ...(bindingId ? { bindingId } : {}),\n ...(leaseId ? { leaseId } : {})\n };\n return await this.callRaw<T>(name, payload, options.timeoutMs);\n }\n\n private maybeTrackLease<T>(name: string, params: Record<string, unknown>, result: T): void {\n if (name === \"session.disconnect\") {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId) {\n this.sessionLeases.delete(sessionId);\n }\n return;\n }\n if (name !== \"session.launch\" && name !== \"session.connect\") return;\n if (!result || typeof result !== \"object\") return;\n const record = result as Record<string, unknown>;\n const sessionId = record.sessionId;\n const leaseId = record.leaseId;\n if (typeof sessionId === \"string\" && typeof leaseId === \"string\") {\n this.sessionLeases.set(sessionId, leaseId);\n }\n }\n\n private async ensureBinding(): Promise<string> {\n if (this.binding && Date.now() < this.binding.expiresAtMs - MIN_RENEW_AFTER_MS) {\n return this.binding.bindingId;\n }\n const data = await this.callRaw<RelayBindResponse>(\"relay.bind\", { clientId: this.clientId });\n const state = await this.resolveBindingState(data);\n this.setBinding(state);\n return state.bindingId;\n }\n\n private async resolveBindingState(data: RelayBindResponse): Promise<BindingState> {\n if (\"queued\" in data && data.queued) {\n const waitMs = typeof data.waitMs === \"number\" && Number.isFinite(data.waitMs) ? data.waitMs : null;\n const timeoutMs = waitMs ? Math.max(1000, waitMs) : data.bindingConfig?.waitMaxMs;\n const waitResponse = await this.callRaw<RelayBindResponse>(\"relay.wait\", {\n clientId: this.clientId,\n ...(timeoutMs ? { timeoutMs } : {})\n });\n if (\"queued\" in waitResponse && waitResponse.queued) {\n throw new Error(\"RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.\");\n }\n return parseBindingResponse(waitResponse as BindingResponse);\n }\n return parseBindingResponse(data as BindingResponse);\n }\n\n private async renewBinding(): Promise<void> {\n if (!this.binding) return;\n const data = await this.callRaw<BindingResponse>(\"relay.renew\", {\n clientId: this.clientId,\n bindingId: this.binding.bindingId\n });\n this.setBinding(parseBindingResponse(data));\n }\n\n private setBinding(state: BindingState): void {\n this.binding = state;\n if (this.autoRenew) {\n this.scheduleRenew(state.renewAfterMs);\n }\n }\n\n private scheduleRenew(delayMs: number): void {\n if (!this.autoRenew) return;\n this.clearRenewTimer();\n this.renewTimer = setTimeout(() => {\n this.renewTimer = null;\n this.renewBinding().catch(() => this.clearBinding());\n }, delayMs);\n }\n\n private clearBinding(): void {\n this.binding = null;\n this.clearRenewTimer();\n }\n\n private clearRenewTimer(): void {\n if (this.renewTimer) {\n clearTimeout(this.renewTimer);\n this.renewTimer = null;\n }\n }\n\n private async callRaw<T>(name: string, params: Record<string, unknown>, timeoutMs?: number): Promise<T> {\n const connection = await resolveDaemonConnection();\n\n let response: Response;\n try {\n response = await fetchWithTimeout(`http://127.0.0.1:${connection.port}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${connection.token}`\n },\n body: JSON.stringify({ name, params })\n }, timeoutMs);\n } catch {\n response = await retryWithRefreshedConnection(name, params, timeoutMs);\n }\n\n if (!response.ok) {\n const text = await response.text();\n let message = text || String(response.status);\n try {\n const parsed = JSON.parse(text) as Record<string, unknown> | null;\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.error === \"string\" && parsed.error.trim()) {\n message = parsed.error;\n } else if (typeof parsed.message === \"string\" && parsed.message.trim()) {\n message = parsed.message;\n }\n }\n } catch {\n // Ignore JSON parse errors; fall back to raw text/status.\n }\n if (message.includes(\"Unauthorized\") || response.status === 401) {\n response = await retryWithRefreshedConnection(name, params);\n if (!response.ok) {\n throw new CliError(message, EXIT_EXECUTION);\n }\n } else {\n throw new CliError(message, EXIT_EXECUTION);\n }\n }\n\n const payload = await response.json() as DaemonResponse<T>;\n if (!payload.ok) {\n throw new CliError(payload.error || \"Daemon command failed.\", EXIT_EXECUTION);\n }\n\n return payload.data as T;\n }\n}\n\nconst cliClient = new DaemonClient({ autoRenew: false });\n\nexport async function callDaemon(command: string, params?: Record<string, unknown>, options?: CallOptions): Promise<unknown> {\n return cliClient.call(command, params ?? {}, options);\n}\n\ntype DaemonConnection = {\n port: number;\n token: string;\n};\n\nconst resolveDaemonConnection = async (): Promise<DaemonConnection> => {\n const metadata = readDaemonMetadata();\n if (metadata) {\n return { port: metadata.port, token: metadata.token };\n }\n\n const config = loadGlobalConfig();\n if (config.daemonPort > 0 && config.daemonToken) {\n const status = await fetchDaemonStatus(config.daemonPort, config.daemonToken);\n if (status?.ok) {\n writeDaemonMetadata({\n port: config.daemonPort,\n token: config.daemonToken,\n pid: status.pid,\n relayPort: status.relay.port ?? config.relayPort,\n startedAt: new Date().toISOString(),\n hubInstanceId: status.hub.instanceId,\n relayInstanceId: status.relay.instanceId,\n relayEpoch: status.relay.epoch\n });\n return { port: config.daemonPort, token: config.daemonToken };\n }\n }\n\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n};\n\nconst retryWithRefreshedConnection = async (\n name: string,\n params: Record<string, unknown>,\n timeoutMs?: number\n): Promise<Response> => {\n const config = loadGlobalConfig();\n if (config.daemonPort <= 0 || !config.daemonToken) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n const status = await fetchDaemonStatus(config.daemonPort, config.daemonToken);\n if (status?.ok) {\n writeDaemonMetadata({\n port: config.daemonPort,\n token: config.daemonToken,\n pid: status.pid,\n relayPort: status.relay.port ?? config.relayPort,\n startedAt: new Date().toISOString(),\n hubInstanceId: status.hub.instanceId,\n relayInstanceId: status.relay.instanceId,\n relayEpoch: status.relay.epoch\n });\n return await fetchWithTimeout(`http://127.0.0.1:${config.daemonPort}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.daemonToken}`\n },\n body: JSON.stringify({ name, params })\n }, timeoutMs);\n }\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n};\n","import { randomUUID } from \"crypto\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport type { AnnotationPayload, AnnotationItem, AnnotationScreenshot } from \"../relay/protocol\";\n\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\nconst sanitizeScreenshotLabel = (label: string): string => {\n const safe = label.replace(/[^a-z0-9-_]+/gi, \"-\").slice(0, 40);\n return safe || \"annotation\";\n};\n\nconst writeAnnotationScreenshots = async (\n screenshots: AnnotationScreenshot[]\n): Promise<Array<{ id: string; path: string }>> => {\n const results: Array<{ id: string; path: string }> = [];\n for (const screenshot of screenshots) {\n if (!screenshot.base64) continue;\n const buffer = Buffer.from(screenshot.base64, \"base64\");\n if (buffer.length > MAX_SCREENSHOT_BYTES) {\n continue;\n }\n const safeLabel = sanitizeScreenshotLabel(screenshot.label);\n const fileName = `opendevbrowser-annotate-${safeLabel}-${randomUUID().slice(0, 8)}.png`;\n const filePath = path.join(os.tmpdir(), fileName);\n await fs.writeFile(filePath, buffer);\n results.push({ id: screenshot.id, path: filePath });\n }\n return results;\n};\n\nconst roundNumber = (value: number): string => {\n return Math.round(value).toString();\n};\n\nconst formatRect = (rect: AnnotationPayload[\"annotations\"][number][\"rect\"]): string => {\n return `x=${roundNumber(rect.x)}, y=${roundNumber(rect.y)}, w=${roundNumber(rect.width)}, h=${roundNumber(rect.height)}`;\n};\n\nconst truncateText = (value: string, max: number): string => {\n if (value.length <= max) return value;\n return `${value.slice(0, max)}...`;\n};\n\nconst isSensitiveKey = (key: string): boolean => {\n const lowered = key.toLowerCase();\n return [\"password\", \"passwd\", \"token\", \"secret\", \"api-key\", \"apikey\", \"auth\", \"session\", \"csrf\", \"value\"].some((term) => lowered.includes(term));\n};\n\nconst looksSensitive = (value: string): boolean => {\n const trimmed = value.trim();\n if (trimmed.length < 12) return false;\n if (/[A-Z0-9]{20,}/.test(trimmed)) return true;\n if (/(token|secret|apikey|password)/i.test(trimmed)) return true;\n if (/^[A-Za-z0-9+/_-]{24,}={0,2}$/.test(trimmed)) return true;\n return false;\n};\n\nconst redactAnnotationItem = (item: AnnotationItem): AnnotationItem => {\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(item.attributes)) {\n if (isSensitiveKey(key)) {\n continue;\n }\n if (looksSensitive(value)) {\n continue;\n }\n attributes[key] = value;\n }\n const note = item.note && looksSensitive(item.note) ? \"[redacted]\" : item.note;\n const text = item.text && looksSensitive(item.text) ? \"[redacted]\" : item.text;\n return {\n ...item,\n attributes,\n note,\n text\n };\n};\n\nconst redactAnnotationPayload = (payload: AnnotationPayload): AnnotationPayload => {\n const redacted: AnnotationPayload = {\n ...payload,\n annotations: payload.annotations.map((item) => redactAnnotationItem(item))\n };\n return redacted;\n};\n\nconst formatAnnotationMarkdown = (\n payload: AnnotationPayload,\n screenshotPaths: Array<{ id: string; path: string }>\n): string => {\n const screenshotIndex = new Map(screenshotPaths.map((entry) => [entry.id, entry.path]));\n\n const lines: string[] = [];\n lines.push(\"# Annotation Summary\");\n lines.push(\"\");\n lines.push(`- URL: ${payload.url}`);\n if (payload.title) {\n lines.push(`- Title: ${payload.title}`);\n }\n lines.push(`- Timestamp: ${payload.timestamp}`);\n lines.push(`- Screenshot mode: ${payload.screenshotMode}`);\n if (payload.context) {\n lines.push(`- Context: ${payload.context}`);\n }\n lines.push(\"\");\n\n payload.annotations.forEach((annotation, index) => {\n lines.push(`## ${index + 1}. ${annotation.tag}${annotation.idAttr ? `#${annotation.idAttr}` : \"\"}`);\n if (annotation.note) {\n lines.push(`> ${annotation.note}`);\n }\n lines.push(`- Selector: \\`${annotation.selector}\\``);\n lines.push(`- Rect: ${formatRect(annotation.rect)}`);\n if (annotation.a11y.role || annotation.a11y.label) {\n lines.push(`- A11y: role=${annotation.a11y.role ?? \"n/a\"}, label=${annotation.a11y.label ?? \"n/a\"}`);\n }\n if (annotation.text) {\n lines.push(`- Text: ${truncateText(annotation.text, 160)}`);\n }\n const shot = annotation.screenshotId ? screenshotIndex.get(annotation.screenshotId) : null;\n if (shot) {\n lines.push(`- Screenshot: ${shot}`);\n }\n lines.push(\"\");\n });\n\n return lines.join(\"\\n\");\n};\n\nexport const buildAnnotateResult = async (\n payload: AnnotationPayload\n): Promise<{ message: string; details: AnnotationPayload; screenshots: Array<{ id: string; path: string }> }> => {\n const redacted = redactAnnotationPayload(payload);\n const screenshots = await writeAnnotationScreenshots(redacted.screenshots ?? []);\n const message = formatAnnotationMarkdown(redacted, screenshots);\n return {\n message,\n details: redacted,\n screenshots\n };\n};\n"],"mappings":"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KAAK;AAAA,MACV,GAAG;AAAA,IACL,CAAC;AAED,QAAI,KAAK,OAAO,SAAS,KAAK,WAAW;AACvC,WAAK,OAAO,MAAM;AAAA,IACpB;AAAA,EACF;AACF;;;ACrHO,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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","names":["delay","randomUUID","mkdir","join","homedir","join","path","join","homedir","join","path","el","redactText","randomUUID","join","randomUUID","mkdir","page","targetId","path","randomUUID","randomUUID","randomUUID","delay","randomUUID","path","randomUUID","WebSocket","randomUUID","existsSync","join","join","existsSync","randomUUID","randomUUID","WebSocket","parseJson","fs","path","content","randomUUID","WebSocket","randomUUID","parseJson","isRecord","requestId","WebSocket","join","os","createServer","timingSafeEqual","mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","homedir","join","randomUUID","binding","requireString","requireWaitUntil","requireState","requireSnapshotMode","requireStringArray","observedPort","path","delay","DEFAULT_DAEMON_PORT","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","unlinkSync","timingSafeEqual","createServer","existsSync","readFileSync","join","randomUUID","join","existsSync","readFileSync","randomUUID","requireBinding","sessionId","randomUUID","fs","path","os","truncateText"]}