browserclaw 0.5.0 → 0.5.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chrome-launcher.ts","../src/connection.ts","../src/snapshot/ref-map.ts","../src/snapshot/ai-snapshot.ts","../src/snapshot/aria-snapshot.ts","../src/security.ts","../src/actions/interaction.ts","../src/actions/keyboard.ts","../src/actions/navigation.ts","../src/actions/wait.ts","../src/actions/evaluate.ts","../src/actions/download.ts","../src/actions/emulation.ts","../src/capture/screenshot.ts","../src/capture/pdf.ts","../src/capture/trace.ts","../src/capture/response.ts","../src/capture/activity.ts","../src/storage/index.ts","../src/browser.ts"],"names":["fs","execFileSync","path","os","resolve","net","spawn","chromium","result","out","ipaddr","dnsLookupCb","dnsLookup","normalize","realpath","dirname","lstat","sep","posix","win32","randomUUID","basename","join","relative","rename","rm","devices"],"mappings":"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","file":"index.cjs","sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport { execFileSync, spawn } from 'node:child_process';\nimport type { ChromeExecutable, ChromeKind, LaunchOptions, RunningChrome } from './types.js';\n\n// ── Executable Detection ──\n\nconst CHROMIUM_BUNDLE_IDS = new Set([\n 'com.google.Chrome',\n 'com.google.Chrome.beta',\n 'com.google.Chrome.canary',\n 'com.google.Chrome.dev',\n 'com.brave.Browser',\n 'com.brave.Browser.beta',\n 'com.brave.Browser.nightly',\n 'com.microsoft.Edge',\n 'com.microsoft.EdgeBeta',\n 'com.microsoft.EdgeDev',\n 'com.microsoft.EdgeCanary',\n 'org.chromium.Chromium',\n 'com.vivaldi.Vivaldi',\n 'com.operasoftware.Opera',\n 'com.operasoftware.OperaGX',\n 'com.yandex.desktop.yandex-browser',\n 'company.thebrowser.Browser',\n]);\n\nconst CHROMIUM_DESKTOP_IDS = new Set([\n 'google-chrome.desktop',\n 'google-chrome-beta.desktop',\n 'google-chrome-unstable.desktop',\n 'brave-browser.desktop',\n 'microsoft-edge.desktop',\n 'microsoft-edge-beta.desktop',\n 'microsoft-edge-dev.desktop',\n 'microsoft-edge-canary.desktop',\n 'chromium.desktop',\n 'chromium-browser.desktop',\n 'vivaldi.desktop',\n 'vivaldi-stable.desktop',\n 'opera.desktop',\n 'opera-gx.desktop',\n 'yandex-browser.desktop',\n 'org.chromium.Chromium.desktop',\n]);\n\nconst CHROMIUM_EXE_NAMES = new Set([\n 'chrome.exe', 'msedge.exe', 'brave.exe', 'brave-browser.exe', 'chromium.exe',\n 'vivaldi.exe', 'opera.exe', 'launcher.exe', 'yandex.exe', 'yandexbrowser.exe',\n 'google chrome', 'google chrome canary', 'brave browser', 'microsoft edge',\n 'chromium', 'chrome', 'brave', 'msedge', 'brave-browser',\n 'google-chrome', 'google-chrome-stable', 'google-chrome-beta', 'google-chrome-unstable',\n 'microsoft-edge', 'microsoft-edge-beta', 'microsoft-edge-dev', 'microsoft-edge-canary',\n 'chromium-browser', 'vivaldi', 'vivaldi-stable', 'opera', 'opera-stable', 'opera-gx',\n 'yandex-browser',\n]);\n\nfunction fileExists(filePath: string): boolean {\n try { return fs.existsSync(filePath); } catch { return false; }\n}\n\nfunction execText(command: string, args: string[], timeoutMs = 1200): string | null {\n try {\n const output = execFileSync(command, args, {\n timeout: timeoutMs,\n encoding: 'utf8',\n maxBuffer: 1024 * 1024,\n });\n return String(output ?? '').trim() || null;\n } catch { return null; }\n}\n\nfunction inferKindFromIdentifier(identifier: string): ChromeKind {\n const id = identifier.toLowerCase();\n if (id.includes('brave')) return 'brave';\n if (id.includes('edge')) return 'edge';\n if (id.includes('chromium')) return 'chromium';\n if (id.includes('canary')) return 'canary';\n if (id.includes('opera') || id.includes('vivaldi') || id.includes('yandex') || id.includes('thebrowser')) return 'chromium';\n return 'chrome';\n}\n\nfunction inferKindFromExeName(name: string): ChromeKind {\n const lower = name.toLowerCase();\n if (lower.includes('brave')) return 'brave';\n if (lower.includes('edge') || lower.includes('msedge')) return 'edge';\n if (lower.includes('chromium')) return 'chromium';\n if (lower.includes('canary') || lower.includes('sxs')) return 'canary';\n if (lower.includes('opera') || lower.includes('vivaldi') || lower.includes('yandex')) return 'chromium';\n return 'chrome';\n}\n\nfunction findFirstExe(candidates: ChromeExecutable[]): ChromeExecutable | null {\n for (const c of candidates) if (fileExists(c.path)) return c;\n return null;\n}\n\n// ── Mac Detection ──\n\nfunction detectDefaultBrowserBundleIdMac(): string | null {\n const plistPath = path.join(os.homedir(), 'Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist');\n if (!fileExists(plistPath)) return null;\n const handlersRaw = execText('/usr/bin/plutil', ['-extract', 'LSHandlers', 'json', '-o', '-', '--', plistPath], 2000);\n if (!handlersRaw) return null;\n let handlers: any[];\n try { handlers = JSON.parse(handlersRaw); } catch { return null; }\n if (!Array.isArray(handlers)) return null;\n\n const resolveScheme = (scheme: string): string | null => {\n let candidate: string | null = null;\n for (const entry of handlers) {\n if (!entry || typeof entry !== 'object') continue;\n if (entry.LSHandlerURLScheme !== scheme) continue;\n const role = (typeof entry.LSHandlerRoleAll === 'string' && entry.LSHandlerRoleAll) ||\n (typeof entry.LSHandlerRoleViewer === 'string' && entry.LSHandlerRoleViewer) || null;\n if (role) candidate = role;\n }\n return candidate;\n };\n return resolveScheme('http') ?? resolveScheme('https');\n}\n\nfunction detectDefaultChromiumMac(): ChromeExecutable | null {\n const bundleId = detectDefaultBrowserBundleIdMac();\n if (!bundleId || !CHROMIUM_BUNDLE_IDS.has(bundleId)) return null;\n const appPathRaw = execText('/usr/bin/osascript', ['-e', `POSIX path of (path to application id \"${bundleId}\")`]);\n if (!appPathRaw) return null;\n const appPath = appPathRaw.trim().replace(/\\/$/, '');\n const exeName = execText('/usr/bin/defaults', ['read', path.join(appPath, 'Contents', 'Info'), 'CFBundleExecutable']);\n if (!exeName) return null;\n const exePath = path.join(appPath, 'Contents', 'MacOS', exeName.trim());\n if (!fileExists(exePath)) return null;\n return { kind: inferKindFromIdentifier(bundleId), path: exePath };\n}\n\nfunction findChromeMac(): ChromeExecutable | null {\n return findFirstExe([\n { kind: 'chrome', path: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' },\n { kind: 'chrome', path: path.join(os.homedir(), 'Applications/Google Chrome.app/Contents/MacOS/Google Chrome') },\n { kind: 'brave', path: '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser' },\n { kind: 'brave', path: path.join(os.homedir(), 'Applications/Brave Browser.app/Contents/MacOS/Brave Browser') },\n { kind: 'edge', path: '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge' },\n { kind: 'edge', path: path.join(os.homedir(), 'Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge') },\n { kind: 'chromium', path: '/Applications/Chromium.app/Contents/MacOS/Chromium' },\n { kind: 'chromium', path: path.join(os.homedir(), 'Applications/Chromium.app/Contents/MacOS/Chromium') },\n { kind: 'canary', path: '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary' },\n { kind: 'canary', path: path.join(os.homedir(), 'Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary') },\n ]);\n}\n\n// ── Linux Detection ──\n\nfunction detectDefaultChromiumLinux(): ChromeExecutable | null {\n const desktopId = execText('xdg-settings', ['get', 'default-web-browser']) ||\n execText('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n if (!desktopId) return null;\n const trimmed = desktopId.trim();\n if (!CHROMIUM_DESKTOP_IDS.has(trimmed)) return null;\n\n const searchDirs = [\n path.join(os.homedir(), '.local', 'share', 'applications'),\n '/usr/local/share/applications',\n '/usr/share/applications',\n '/var/lib/snapd/desktop/applications',\n ];\n let desktopPath: string | null = null;\n for (const dir of searchDirs) {\n const candidate = path.join(dir, trimmed);\n if (fileExists(candidate)) { desktopPath = candidate; break; }\n }\n if (!desktopPath) return null;\n\n let execLine: string | null = null;\n try {\n const lines = fs.readFileSync(desktopPath, 'utf8').split(/\\r?\\n/);\n for (const line of lines) if (line.startsWith('Exec=')) { execLine = line.slice(5).trim(); break; }\n } catch {}\n if (!execLine) return null;\n\n const tokens = execLine.split(/\\s+/);\n let command: string | null = null;\n for (const token of tokens) {\n if (!token || token === 'env' || (token.includes('=') && !token.startsWith('/'))) continue;\n command = token.replace(/^[\"']|[\"']$/g, '');\n break;\n }\n if (!command) return null;\n\n const resolved = command.startsWith('/') ? command : (execText('which', [command], 800)?.trim() ?? null);\n if (!resolved) return null;\n const exeName = path.posix.basename(resolved).toLowerCase();\n if (!CHROMIUM_EXE_NAMES.has(exeName)) return null;\n return { kind: inferKindFromExeName(exeName), path: resolved };\n}\n\nfunction findChromeLinux(): ChromeExecutable | null {\n return findFirstExe([\n { kind: 'chrome', path: '/usr/bin/google-chrome' },\n { kind: 'chrome', path: '/usr/bin/google-chrome-stable' },\n { kind: 'chrome', path: '/usr/bin/chrome' },\n { kind: 'brave', path: '/usr/bin/brave-browser' },\n { kind: 'brave', path: '/usr/bin/brave-browser-stable' },\n { kind: 'brave', path: '/usr/bin/brave' },\n { kind: 'brave', path: '/snap/bin/brave' },\n { kind: 'edge', path: '/usr/bin/microsoft-edge' },\n { kind: 'edge', path: '/usr/bin/microsoft-edge-stable' },\n { kind: 'chromium', path: '/usr/bin/chromium' },\n { kind: 'chromium', path: '/usr/bin/chromium-browser' },\n { kind: 'chromium', path: '/snap/bin/chromium' },\n ]);\n}\n\n// ── Windows Detection ──\n\nfunction findChromeWindows(): ChromeExecutable | null {\n const localAppData = process.env.LOCALAPPDATA ?? '';\n const programFiles = process.env.ProgramFiles ?? 'C:\\\\Program Files';\n const programFilesX86 = process.env['ProgramFiles(x86)'] ?? 'C:\\\\Program Files (x86)';\n const j = path.win32.join;\n const candidates: ChromeExecutable[] = [];\n if (localAppData) {\n candidates.push({ kind: 'chrome', path: j(localAppData, 'Google', 'Chrome', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'brave', path: j(localAppData, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') });\n candidates.push({ kind: 'edge', path: j(localAppData, 'Microsoft', 'Edge', 'Application', 'msedge.exe') });\n candidates.push({ kind: 'chromium', path: j(localAppData, 'Chromium', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'canary', path: j(localAppData, 'Google', 'Chrome SxS', 'Application', 'chrome.exe') });\n }\n candidates.push({ kind: 'chrome', path: j(programFiles, 'Google', 'Chrome', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'chrome', path: j(programFilesX86, 'Google', 'Chrome', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'brave', path: j(programFiles, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') });\n candidates.push({ kind: 'brave', path: j(programFilesX86, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') });\n candidates.push({ kind: 'edge', path: j(programFiles, 'Microsoft', 'Edge', 'Application', 'msedge.exe') });\n candidates.push({ kind: 'edge', path: j(programFilesX86, 'Microsoft', 'Edge', 'Application', 'msedge.exe') });\n return findFirstExe(candidates);\n}\n\n// ── Resolve Executable ──\n\nexport function resolveBrowserExecutable(opts?: { executablePath?: string }): ChromeExecutable | null {\n if (opts?.executablePath) {\n if (!fileExists(opts.executablePath)) throw new Error(`executablePath not found: ${opts.executablePath}`);\n return { kind: 'custom', path: opts.executablePath };\n }\n const platform = process.platform;\n // Try default browser first\n if (platform === 'darwin') return detectDefaultChromiumMac() ?? findChromeMac();\n if (platform === 'linux') return detectDefaultChromiumLinux() ?? findChromeLinux();\n if (platform === 'win32') return findChromeWindows();\n return null;\n}\n\n// ── Port Check ──\n\nasync function ensurePortAvailable(port: number): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const tester = net.createServer()\n .once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') reject(new Error(`Port ${port} is already in use`));\n else reject(err);\n })\n .once('listening', () => { tester.close(() => resolve()); })\n .listen(port);\n });\n}\n\n// ── Profile Decoration ──\n\nfunction safeReadJson(filePath: string): Record<string, any> | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return null;\n return parsed;\n } catch { return null; }\n}\n\nfunction safeWriteJson(filePath: string, data: Record<string, any>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\nfunction setDeep(obj: Record<string, any>, keys: string[], value: any): void {\n let node = obj;\n for (const key of keys.slice(0, -1)) {\n const next = node[key];\n if (typeof next !== 'object' || next === null || Array.isArray(next)) node[key] = {};\n node = node[key];\n }\n node[keys[keys.length - 1]!] = value;\n}\n\nfunction parseHexRgbToSignedArgbInt(hex: string): number | null {\n const cleaned = hex.trim().replace(/^#/, '');\n if (!/^[0-9a-fA-F]{6}$/.test(cleaned)) return null;\n const argbUnsigned = (255 << 24) | Number.parseInt(cleaned, 16);\n return argbUnsigned > 2147483647 ? argbUnsigned - 4294967296 : argbUnsigned;\n}\n\nfunction decorateProfile(userDataDir: string, name: string, color: string): void {\n const colorInt = parseHexRgbToSignedArgbInt(color);\n const localStatePath = path.join(userDataDir, 'Local State');\n const preferencesPath = path.join(userDataDir, 'Default', 'Preferences');\n\n const localState = safeReadJson(localStatePath) ?? {};\n setDeep(localState, ['profile', 'info_cache', 'Default', 'name'], name);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'shortcut_name'], name);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'user_name'], name);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'profile_color'], color);\n if (colorInt != null) {\n setDeep(localState, ['profile', 'info_cache', 'Default', 'profile_color_seed'], colorInt);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'profile_highlight_color'], colorInt);\n }\n safeWriteJson(localStatePath, localState);\n\n const prefs = safeReadJson(preferencesPath) ?? {};\n setDeep(prefs, ['profile', 'name'], name);\n setDeep(prefs, ['profile', 'profile_color'], color);\n if (colorInt != null) {\n setDeep(prefs, ['autogenerated', 'theme', 'color'], colorInt);\n setDeep(prefs, ['browser', 'theme', 'user_color2'], colorInt);\n }\n safeWriteJson(preferencesPath, prefs);\n}\n\nfunction ensureCleanExit(userDataDir: string): void {\n const preferencesPath = path.join(userDataDir, 'Default', 'Preferences');\n const prefs = safeReadJson(preferencesPath) ?? {};\n setDeep(prefs, ['exit_type'], 'Normal');\n setDeep(prefs, ['exited_cleanly'], true);\n safeWriteJson(preferencesPath, prefs);\n}\n\n// ── Launch Chrome ──\n\nconst DEFAULT_CDP_PORT = 9222;\nconst DEFAULT_PROFILE_NAME = 'browserclaw';\nconst DEFAULT_PROFILE_COLOR = '#FF4500';\n\nfunction resolveUserDataDir(profileName: string): string {\n const configDir = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config');\n return path.join(configDir, 'browserclaw', 'profiles', profileName, 'user-data');\n}\n\n// ── WebSocket / CDP URL Helpers ──\n\nfunction isWebSocketUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'ws:' || parsed.protocol === 'wss:';\n } catch { return false; }\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';\n}\n\n/**\n * Normalize a WebSocket debugger URL returned by `/json/version` to match the\n * external CDP host/port. Handles wildcard binds (`0.0.0.0`, `[::]`),\n * protocol upgrades (HTTP→WSS), and auth/search param inheritance.\n */\nfunction normalizeCdpWsUrl(wsUrl: string, cdpUrl: string): string {\n const ws = new URL(wsUrl);\n const cdp = new URL(cdpUrl);\n const isWildcardBind = ws.hostname === '0.0.0.0' || ws.hostname === '[::]';\n if ((isLoopbackHost(ws.hostname) || isWildcardBind) && !isLoopbackHost(cdp.hostname)) {\n ws.hostname = cdp.hostname;\n const cdpPort = cdp.port || (cdp.protocol === 'https:' ? '443' : '80');\n if (cdpPort) ws.port = cdpPort;\n ws.protocol = cdp.protocol === 'https:' ? 'wss:' : 'ws:';\n }\n if (cdp.protocol === 'https:' && ws.protocol === 'ws:') ws.protocol = 'wss:';\n if (!ws.username && !ws.password && (cdp.username || cdp.password)) {\n ws.username = cdp.username;\n ws.password = cdp.password;\n }\n for (const [key, value] of cdp.searchParams.entries()) {\n if (!ws.searchParams.has(key)) ws.searchParams.append(key, value);\n }\n return ws.toString();\n}\n\n/**\n * Convert a WebSocket CDP URL to an HTTP base URL for `/json/*` endpoints.\n */\nexport function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl: string): string {\n try {\n const url = new URL(cdpUrl);\n if (url.protocol === 'ws:') url.protocol = 'http:';\n else if (url.protocol === 'wss:') url.protocol = 'https:';\n url.pathname = url.pathname.replace(/\\/devtools\\/browser\\/.*$/, '');\n url.pathname = url.pathname.replace(/\\/cdp$/, '');\n return url.toString().replace(/\\/$/, '');\n } catch {\n return cdpUrl\n .replace(/^ws:/, 'http:')\n .replace(/^wss:/, 'https:')\n .replace(/\\/devtools\\/browser\\/.*$/, '')\n .replace(/\\/cdp$/, '')\n .replace(/\\/$/, '');\n }\n}\n\nfunction appendCdpPath(cdpUrl: string, cdpPath: string): string {\n const url = new URL(cdpUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, '')}${cdpPath.startsWith('/') ? cdpPath : `/${cdpPath}`}`;\n return url.toString();\n}\n\n// ── Chrome Reachability ──\n\nasync function canOpenWebSocket(url: string, timeoutMs: number): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n try { ws.close(); } catch {}\n resolve(value);\n };\n const timer = setTimeout(() => finish(false), Math.max(50, timeoutMs + 25));\n let ws: WebSocket;\n try { ws = new WebSocket(url); } catch { finish(false); return; }\n ws.onopen = () => finish(true);\n ws.onerror = () => finish(false);\n });\n}\n\nasync function fetchChromeVersion(\n cdpUrl: string,\n timeoutMs = 500,\n authToken?: string,\n): Promise<Record<string, any> | null> {\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), timeoutMs);\n try {\n const httpBase = isWebSocketUrl(cdpUrl) ? normalizeCdpHttpBaseForJsonEndpoints(cdpUrl) : cdpUrl;\n const headers: Record<string, string> = {};\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n const res = await fetch(appendCdpPath(httpBase, '/json/version'), { signal: ctrl.signal, headers });\n if (!res.ok) return null;\n const data = await res.json();\n if (!data || typeof data !== 'object') return null;\n return data as Record<string, any>;\n } catch { return null; }\n finally { clearTimeout(t); }\n}\n\nexport async function isChromeReachable(cdpUrl: string, timeoutMs = 500, authToken?: string): Promise<boolean> {\n if (isWebSocketUrl(cdpUrl)) return await canOpenWebSocket(cdpUrl, timeoutMs);\n const version = await fetchChromeVersion(cdpUrl, timeoutMs, authToken);\n return Boolean(version);\n}\n\nexport async function getChromeWebSocketUrl(cdpUrl: string, timeoutMs = 500, authToken?: string): Promise<string | null> {\n if (isWebSocketUrl(cdpUrl)) return cdpUrl;\n const version = await fetchChromeVersion(cdpUrl, timeoutMs, authToken);\n const wsUrl = String(version?.webSocketDebuggerUrl ?? '').trim();\n if (!wsUrl) return null;\n return normalizeCdpWsUrl(wsUrl, cdpUrl);\n}\n\nexport async function isChromeCdpReady(cdpUrl: string, timeoutMs = 500, handshakeTimeoutMs = 800): Promise<boolean> {\n const wsUrl = await getChromeWebSocketUrl(cdpUrl, timeoutMs);\n if (!wsUrl) return false;\n return await canRunCdpHealthCommand(wsUrl, handshakeTimeoutMs);\n}\n\nasync function canRunCdpHealthCommand(wsUrl: string, timeoutMs = 800): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n try { ws.close(); } catch {}\n resolve(value);\n };\n\n const timer = setTimeout(() => finish(false), Math.max(50, timeoutMs + 25));\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(wsUrl);\n } catch {\n finish(false);\n return;\n }\n\n ws.onopen = () => {\n try {\n ws.send(JSON.stringify({ id: 1, method: 'Browser.getVersion' }));\n } catch { finish(false); }\n };\n ws.onmessage = (event) => {\n try {\n const parsed = JSON.parse(String(event.data));\n if (parsed?.id !== 1) return;\n finish(Boolean(parsed.result && typeof parsed.result === 'object'));\n } catch { /* ignore non-JSON frames */ }\n };\n ws.onerror = () => finish(false);\n ws.onclose = () => finish(false);\n });\n}\n\nexport async function launchChrome(opts: LaunchOptions = {}): Promise<RunningChrome> {\n const cdpPort = opts.cdpPort ?? DEFAULT_CDP_PORT;\n await ensurePortAvailable(cdpPort);\n\n const exe = resolveBrowserExecutable({ executablePath: opts.executablePath });\n if (!exe) throw new Error('No supported browser found (Chrome/Brave/Edge/Chromium). Install one or provide executablePath.');\n\n const profileName = opts.profileName ?? DEFAULT_PROFILE_NAME;\n const userDataDir = opts.userDataDir ?? resolveUserDataDir(profileName);\n fs.mkdirSync(userDataDir, { recursive: true });\n\n const spawnChrome = () => {\n const args = [\n `--remote-debugging-port=${cdpPort}`,\n `--user-data-dir=${userDataDir}`,\n '--no-first-run',\n '--no-default-browser-check',\n '--disable-sync',\n '--disable-background-networking',\n '--disable-component-update',\n '--disable-features=Translate,MediaRouter',\n '--disable-blink-features=AutomationControlled',\n '--disable-session-crashed-bubble',\n '--hide-crash-restore-bubble',\n '--password-store=basic',\n ];\n if (opts.headless) {\n args.push('--headless=new', '--disable-gpu');\n }\n if (opts.noSandbox) {\n args.push('--no-sandbox', '--disable-setuid-sandbox');\n }\n if (process.platform === 'linux') args.push('--disable-dev-shm-usage');\n const extraArgs = Array.isArray(opts.chromeArgs)\n ? opts.chromeArgs.filter((a): a is string => typeof a === 'string' && a.trim().length > 0)\n : [];\n if (extraArgs.length) args.push(...extraArgs);\n args.push('about:blank');\n return spawn(exe.path, args, {\n stdio: 'pipe',\n env: { ...process.env, HOME: os.homedir() },\n });\n };\n\n const startedAt = Date.now();\n const localStatePath = path.join(userDataDir, 'Local State');\n const preferencesPath = path.join(userDataDir, 'Default', 'Preferences');\n\n // Bootstrap run if profile doesn't exist yet\n if (!fileExists(localStatePath) || !fileExists(preferencesPath)) {\n const bootstrap = spawnChrome();\n const deadline = Date.now() + 10000;\n while (Date.now() < deadline) {\n if (fileExists(localStatePath) && fileExists(preferencesPath)) break;\n await new Promise(r => setTimeout(r, 100));\n }\n try { bootstrap.kill('SIGTERM'); } catch {}\n const exitDeadline = Date.now() + 5000;\n while (Date.now() < exitDeadline) {\n if (bootstrap.exitCode != null) break;\n await new Promise(r => setTimeout(r, 50));\n }\n if (bootstrap.exitCode == null) {\n try { bootstrap.kill('SIGKILL'); } catch {}\n }\n }\n\n // Decorate profile\n try {\n decorateProfile(userDataDir, profileName, opts.profileColor ?? DEFAULT_PROFILE_COLOR);\n } catch {}\n\n // Ensure clean exit state\n try { ensureCleanExit(userDataDir); } catch {}\n\n // Launch for real\n const proc = spawnChrome();\n const cdpUrl = `http://127.0.0.1:${cdpPort}`;\n\n // Capture stderr for diagnostics on failure\n const stderrChunks: Buffer[] = [];\n const onStderr = (chunk: Buffer) => { stderrChunks.push(chunk); };\n proc.stderr?.on('data', onStderr);\n\n // Wait for Chrome to be ready\n const readyDeadline = Date.now() + 15000;\n while (Date.now() < readyDeadline) {\n if (await isChromeReachable(cdpUrl, 500)) break;\n await new Promise(r => setTimeout(r, 200));\n }\n\n if (!await isChromeReachable(cdpUrl, 500)) {\n const stderrOutput = Buffer.concat(stderrChunks).toString('utf8').trim();\n const stderrHint = stderrOutput ? `\\nChrome stderr:\\n${stderrOutput.slice(0, 2000)}` : '';\n const sandboxHint = process.platform === 'linux' && !opts.noSandbox\n ? '\\nHint: If running in a container or as root, try setting noSandbox: true.' : '';\n try { proc.kill('SIGKILL'); } catch {}\n throw new Error(`Failed to start Chrome CDP on port ${cdpPort}.${sandboxHint}${stderrHint}`);\n }\n\n proc.stderr?.off('data', onStderr);\n stderrChunks.length = 0;\n\n return {\n pid: proc.pid ?? -1,\n exe,\n userDataDir,\n cdpPort,\n startedAt,\n proc,\n };\n}\n\nexport async function stopChrome(running: RunningChrome, timeoutMs = 2500): Promise<void> {\n const proc = running.proc;\n if (proc.exitCode != null) return;\n try { proc.kill('SIGTERM'); } catch {}\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (proc.exitCode != null) return;\n await new Promise(r => setTimeout(r, 100));\n }\n try { proc.kill('SIGKILL'); } catch {}\n}\n","import { chromium } from 'playwright-core';\nimport type { Browser, Page, BrowserContext } from 'playwright-core';\nimport { getChromeWebSocketUrl, normalizeCdpHttpBaseForJsonEndpoints } from './chrome-launcher.js';\nimport type { PageState, ContextState, RoleRefs } from './types.js';\n\n/** Page extended with Playwright's private `_snapshotForAI` method. */\nexport type PageWithAI = Page & {\n _snapshotForAI?: (opts: { timeout: number; track: string }) => Promise<{ full?: string }>;\n};\n\n// ── Persistent Connection Cache ──\n\nlet cached: { browser: Browser; cdpUrl: string; authToken?: string } | null = null;\nconst connectingByUrl = new Map<string, Promise<{ browser: Browser; cdpUrl: string; authToken?: string }>>();\n\nconst pageStates = new WeakMap<Page, PageState>();\nconst contextStates = new WeakMap<BrowserContext, ContextState>();\nconst observedContexts = new WeakSet<BrowserContext>();\nconst observedPages = new WeakSet<Page>();\n\n// ── Arm ID Counters ──\n\nlet nextUploadArmId = 0;\nlet nextDialogArmId = 0;\nlet nextDownloadArmId = 0;\n\nexport function bumpUploadArmId(): number {\n nextUploadArmId += 1;\n return nextUploadArmId;\n}\nexport function bumpDialogArmId(): number {\n nextDialogArmId += 1;\n return nextDialogArmId;\n}\nexport function bumpDownloadArmId(): number {\n nextDownloadArmId += 1;\n return nextDownloadArmId;\n}\n\n// ── Context State Management ──\n\nexport function ensureContextState(context: BrowserContext): ContextState {\n const existing = contextStates.get(context);\n if (existing) return existing;\n const state: ContextState = { traceActive: false };\n contextStates.set(context, state);\n return state;\n}\n\n// Ref cache: keyed by \"cdpUrl::targetId\"\nconst roleRefsByTarget = new Map<string, {\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n}>();\nconst MAX_ROLE_REFS_CACHE = 50;\n\nconst MAX_CONSOLE_MESSAGES = 500;\nconst MAX_PAGE_ERRORS = 200;\nconst MAX_NETWORK_REQUESTS = 500;\n\nfunction normalizeCdpUrl(raw: string): string {\n return raw.replace(/\\/$/, '');\n}\n\nfunction roleRefsKey(cdpUrl: string, targetId: string): string {\n return `${normalizeCdpUrl(cdpUrl)}::${targetId}`;\n}\n\n// ── Page State Management ──\n\nexport function ensurePageState(page: Page): PageState {\n const existing = pageStates.get(page);\n if (existing) return existing;\n\n const state: PageState = {\n console: [],\n errors: [],\n requests: [],\n requestIds: new WeakMap(),\n nextRequestId: 0,\n armIdUpload: 0,\n armIdDialog: 0,\n armIdDownload: 0,\n };\n pageStates.set(page, state);\n\n if (!observedPages.has(page)) {\n observedPages.add(page);\n\n page.on('console', (msg) => {\n state.console.push({\n type: msg.type(),\n text: msg.text(),\n timestamp: new Date().toISOString(),\n location: msg.location(),\n });\n if (state.console.length > MAX_CONSOLE_MESSAGES) state.console.shift();\n });\n\n page.on('pageerror', (err) => {\n state.errors.push({\n message: err?.message ? String(err.message) : String(err),\n name: err?.name ? String(err.name) : undefined,\n stack: err?.stack ? String(err.stack) : undefined,\n timestamp: new Date().toISOString(),\n });\n if (state.errors.length > MAX_PAGE_ERRORS) state.errors.shift();\n });\n\n page.on('request', (req) => {\n state.nextRequestId += 1;\n const id = `r${state.nextRequestId}`;\n state.requestIds.set(req, id);\n state.requests.push({\n id,\n timestamp: new Date().toISOString(),\n method: req.method(),\n url: req.url(),\n resourceType: req.resourceType(),\n });\n if (state.requests.length > MAX_NETWORK_REQUESTS) state.requests.shift();\n });\n\n page.on('response', (resp) => {\n const req = resp.request();\n const id = state.requestIds.get(req);\n if (!id) return;\n for (let i = state.requests.length - 1; i >= 0; i--) {\n const rec = state.requests[i];\n if (rec && rec.id === id) {\n rec.status = resp.status();\n rec.ok = resp.ok();\n break;\n }\n }\n });\n\n page.on('requestfailed', (req) => {\n const id = state.requestIds.get(req);\n if (!id) return;\n for (let i = state.requests.length - 1; i >= 0; i--) {\n const rec = state.requests[i];\n if (rec && rec.id === id) {\n rec.failureText = req.failure()?.errorText;\n rec.ok = false;\n break;\n }\n }\n });\n\n page.on('close', () => {\n pageStates.delete(page);\n observedPages.delete(page);\n });\n }\n\n return state;\n}\n\n// ── Stealth: hide navigator.webdriver ──\n\nconst STEALTH_SCRIPT = `Object.defineProperty(navigator, 'webdriver', { get: () => undefined })`;\n\nfunction applyStealthToPage(page: Page): void {\n page.evaluate(STEALTH_SCRIPT).catch((e) => {\n if (process.env.DEBUG) console.warn('[browserclaw] stealth evaluate failed:', e.message);\n });\n}\n\nfunction observeContext(context: BrowserContext): void {\n if (observedContexts.has(context)) return;\n observedContexts.add(context);\n ensureContextState(context);\n\n context.addInitScript(STEALTH_SCRIPT).catch((e) => {\n if (process.env.DEBUG) console.warn('[browserclaw] stealth initScript failed:', e.message);\n });\n\n for (const page of context.pages()) {\n ensurePageState(page);\n applyStealthToPage(page);\n }\n context.on('page', (page) => {\n ensurePageState(page);\n applyStealthToPage(page);\n });\n}\n\nfunction observeBrowser(browser: Browser): void {\n for (const context of browser.contexts()) observeContext(context);\n}\n\n// ── Role Refs Storage ──\n\nexport function storeRoleRefsForTarget(opts: {\n page: Page;\n cdpUrl: string;\n targetId?: string;\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n}): void {\n const state = ensurePageState(opts.page);\n state.roleRefs = opts.refs;\n state.roleRefsFrameSelector = opts.frameSelector;\n state.roleRefsMode = opts.mode;\n\n const targetId = opts.targetId?.trim();\n if (!targetId) return;\n roleRefsByTarget.set(roleRefsKey(opts.cdpUrl, targetId), {\n refs: opts.refs,\n ...(opts.frameSelector ? { frameSelector: opts.frameSelector } : {}),\n ...(opts.mode ? { mode: opts.mode } : {}),\n });\n while (roleRefsByTarget.size > MAX_ROLE_REFS_CACHE) {\n const first = roleRefsByTarget.keys().next();\n if (first.done) break;\n roleRefsByTarget.delete(first.value);\n }\n}\n\nexport function restoreRoleRefsForTarget(opts: {\n cdpUrl: string;\n targetId?: string;\n page: Page;\n}): void {\n const targetId = opts.targetId?.trim() || '';\n if (!targetId) return;\n const entry = roleRefsByTarget.get(roleRefsKey(opts.cdpUrl, targetId));\n if (!entry) return;\n const state = ensurePageState(opts.page);\n if (state.roleRefs) return;\n state.roleRefs = entry.refs;\n state.roleRefsFrameSelector = entry.frameSelector;\n state.roleRefsMode = entry.mode;\n}\n\n// ── Connect to Browser ──\n\nexport async function connectBrowser(cdpUrl: string, authToken?: string): Promise<{ browser: Browser; cdpUrl: string; authToken?: string }> {\n const normalized = normalizeCdpUrl(cdpUrl);\n if (cached?.cdpUrl === normalized) return cached;\n\n const existing = connectingByUrl.get(normalized);\n if (existing) return await existing;\n\n const connectWithRetry = async () => {\n let lastErr: unknown;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const timeout = 5000 + attempt * 2000;\n const endpoint = await getChromeWebSocketUrl(normalized, timeout, authToken).catch(() => null) ?? normalized;\n const headers: Record<string, string> = {};\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n const browser = await chromium.connectOverCDP(endpoint, { timeout, headers });\n const connected = { browser, cdpUrl: normalized, authToken };\n cached = connected;\n observeBrowser(browser);\n browser.on('disconnected', () => {\n if (cached?.browser === browser) cached = null;\n for (const key of roleRefsByTarget.keys()) {\n if (key.startsWith(normalized + '::')) roleRefsByTarget.delete(key);\n }\n });\n return connected;\n } catch (err) {\n lastErr = err;\n await new Promise(r => setTimeout(r, 250 + attempt * 250));\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error('CDP connect failed');\n };\n\n const promise = connectWithRetry().finally(() => { connectingByUrl.delete(normalized); });\n connectingByUrl.set(normalized, promise);\n return await promise;\n}\n\nexport async function disconnectBrowser(): Promise<void> {\n if (connectingByUrl.size) {\n for (const p of connectingByUrl.values()) {\n try { await p; } catch {}\n }\n }\n const cur = cached;\n cached = null;\n if (cur) await cur.browser.close().catch(() => {});\n}\n\n/**\n * Force-disconnect a Playwright browser connection for a given CDP target.\n * Clears the connection cache, sends Runtime.terminateExecution via CDP\n * session to kill stuck evals, and closes the browser.\n */\nexport async function forceDisconnectPlaywrightForTarget(opts: {\n cdpUrl: string;\n targetId?: string;\n reason?: string;\n}): Promise<void> {\n const normalized = normalizeCdpUrl(opts.cdpUrl);\n const cur = cached;\n if (!cur || cur.cdpUrl !== normalized) return;\n\n cached = null;\n connectingByUrl.delete(normalized);\n\n // Attempt to terminate execution in the target page via CDP\n const targetId = opts.targetId?.trim() || '';\n if (targetId) {\n try {\n const pages = await getAllPages(cur.browser);\n for (const page of pages) {\n const tid = await pageTargetId(page).catch(() => null);\n if (tid === targetId) {\n const session = await page.context().newCDPSession(page);\n try {\n await session.send('Runtime.terminateExecution');\n } finally {\n await session.detach().catch(() => {});\n }\n break;\n }\n }\n } catch {\n // Best effort — don't block disconnect\n }\n }\n\n cur.browser.close().catch(() => {});\n}\n\n// ── Page Lookup ──\n\n/** CDP target entry from /json/list endpoint. */\ninterface CdpTarget {\n id: string;\n url: string;\n title?: string;\n type?: string;\n webSocketDebuggerUrl?: string;\n}\n\nexport async function getAllPages(browser: Browser) {\n return browser.contexts().flatMap(c => c.pages());\n}\n\nexport async function pageTargetId(page: Page): Promise<string | null> {\n const session = await page.context().newCDPSession(page);\n try {\n const info = await session.send('Target.getTargetInfo');\n const targetInfo = (info as { targetInfo?: { targetId?: string } }).targetInfo;\n return String(targetInfo?.targetId ?? '').trim() || null;\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nexport async function findPageByTargetId(browser: Browser, targetId: string, cdpUrl?: string) {\n const pages = await getAllPages(browser);\n let resolvedViaCdp = false;\n for (const page of pages) {\n let tid: string | null = null;\n try {\n tid = await pageTargetId(page);\n resolvedViaCdp = true;\n } catch {\n tid = null;\n }\n if (tid && tid === targetId) return page;\n }\n // Extension relays can block CDP attachment APIs entirely. If that happens and\n // Playwright only exposes one page, return it as the best available mapping.\n if (!resolvedViaCdp && pages.length === 1) {\n return pages[0];\n }\n\n // Fallback: match by URL from /json/list\n if (cdpUrl) {\n try {\n const listUrl = `${normalizeCdpHttpBaseForJsonEndpoints(cdpUrl)}/json/list`;\n const headers: Record<string, string> = {};\n if (cached?.authToken) headers['Authorization'] = `Bearer ${cached.authToken}`;\n const response = await fetch(listUrl, { headers });\n if (response.ok) {\n const targets = await response.json() as CdpTarget[];\n const target = targets.find(t => t.id === targetId);\n if (target) {\n const urlMatch = pages.filter(p => p.url() === target.url);\n if (urlMatch.length === 1) return urlMatch[0];\n if (urlMatch.length > 1) {\n const sameUrlTargets = targets.filter(t => t.url === target.url);\n if (sameUrlTargets.length === urlMatch.length) {\n const idx = sameUrlTargets.findIndex(t => t.id === targetId);\n if (idx >= 0 && idx < urlMatch.length) return urlMatch[idx];\n }\n }\n }\n }\n } catch {}\n }\n return null;\n}\n\nexport async function getPageForTargetId(opts: { cdpUrl: string; targetId?: string }) {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = await getAllPages(browser);\n if (!pages.length) throw new Error('No pages available in the connected browser.');\n const first = pages[0]!;\n if (!opts.targetId) return first;\n const found = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!found) {\n if (pages.length === 1) return first;\n throw new Error(`Tab not found (targetId: ${opts.targetId}). Call browser.tabs() to list open tabs.`);\n }\n return found;\n}\n\n// ── Ref Locator ──\n\nexport function refLocator(page: Page, ref: string) {\n const normalized = ref.startsWith('@') ? ref.slice(1) : ref.startsWith('ref=') ? ref.slice(4) : ref;\n if (!normalized.trim()) throw new Error('ref is required');\n\n if (/^e\\d+$/.test(normalized)) {\n const state = pageStates.get(page);\n\n // Aria mode: use aria-ref locator\n if (state?.roleRefsMode === 'aria') {\n return (state.roleRefsFrameSelector ? page.frameLocator(state.roleRefsFrameSelector) : page)\n .locator(`aria-ref=${normalized}`);\n }\n\n // Role mode: use getByRole\n const info = state?.roleRefs?.[normalized];\n if (!info) throw new Error(`Unknown ref \"${normalized}\". Run a new snapshot and use a ref from that snapshot.`);\n\n const locAny = state?.roleRefsFrameSelector\n ? page.frameLocator(state.roleRefsFrameSelector)\n : page;\n const role = info.role as Parameters<Page['getByRole']>[0];\n const locator = info.name\n ? locAny.getByRole(role, { name: info.name, exact: true })\n : locAny.getByRole(role);\n return info.nth !== undefined ? locator.nth(info.nth) : locator;\n }\n\n return page.locator(`aria-ref=${normalized}`);\n}\n\n// ── Error Helpers ──\n\nexport function toAIFriendlyError(error: unknown, selector: string): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('strict mode violation')) {\n const countMatch = message.match(/resolved to (\\d+) elements/);\n const count = countMatch ? countMatch[1] : 'multiple';\n return new Error(`Selector \"${selector}\" matched ${count} elements. Run a new snapshot to get updated refs, or use a different ref.`);\n }\n if ((message.includes('Timeout') || message.includes('waiting for')) &&\n (message.includes('to be visible') || message.includes('not visible'))) {\n return new Error(`Element \"${selector}\" not found or not visible. Run a new snapshot to see current page elements.`);\n }\n if (message.includes('intercepts pointer events') || message.includes('not visible') || message.includes('not receive pointer events')) {\n return new Error(`Element \"${selector}\" is not interactable (hidden or covered). Try scrolling it into view, closing overlays, or re-snapshotting.`);\n }\n return error instanceof Error ? error : new Error(message);\n}\n\nexport function normalizeTimeoutMs(timeoutMs: number | undefined, fallback: number, maxMs = 120000): number {\n return Math.max(500, Math.min(maxMs, timeoutMs ?? fallback));\n}\n","import type { RoleRefs, RoleRefInfo } from '../types.js';\n\nexport const INTERACTIVE_ROLES = new Set([\n 'button', 'link', 'textbox', 'checkbox', 'radio', 'combobox', 'listbox',\n 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'searchbox',\n 'slider', 'spinbutton', 'switch', 'tab', 'treeitem',\n]);\n\nexport const CONTENT_ROLES = new Set([\n 'heading', 'cell', 'gridcell', 'columnheader', 'rowheader',\n 'listitem', 'article', 'region', 'main', 'navigation',\n]);\n\nexport const STRUCTURAL_ROLES = new Set([\n 'generic', 'group', 'list', 'table', 'row', 'rowgroup', 'grid', 'treegrid',\n 'menu', 'menubar', 'toolbar', 'tablist', 'tree', 'directory', 'document',\n 'application', 'presentation', 'none',\n]);\n\nfunction getIndentLevel(line: string): number {\n const match = line.match(/^(\\s*)/);\n return match ? Math.floor(match[1]!.length / 2) : 0;\n}\n\ninterface ParsedSnapshotLine {\n roleRaw: string;\n role: string;\n name?: string;\n suffix: string;\n}\n\nfunction matchInteractiveSnapshotLine(\n line: string,\n options: SnapshotBuildOptions,\n): ParsedSnapshotLine | null {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) {\n return null;\n }\n const match = line.match(/^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/);\n if (!match) {\n return null;\n }\n const [, , roleRaw, name, suffix] = match;\n if (roleRaw!.startsWith('/')) {\n return null;\n }\n const role = roleRaw!.toLowerCase();\n return {\n roleRaw: roleRaw!,\n role,\n ...(name ? { name } : {}),\n suffix: suffix!,\n };\n}\n\nfunction createRoleNameTracker() {\n const counts = new Map<string, number>();\n const refsByKey = new Map<string, string[]>();\n\n return {\n counts,\n refsByKey,\n getKey(role: string, name?: string): string {\n return `${role}:${name ?? ''}`;\n },\n getNextIndex(role: string, name?: string): number {\n const key = this.getKey(role, name);\n const current = counts.get(key) ?? 0;\n counts.set(key, current + 1);\n return current;\n },\n trackRef(role: string, name: string | undefined, ref: string): void {\n const key = this.getKey(role, name);\n const list = refsByKey.get(key) ?? [];\n list.push(ref);\n refsByKey.set(key, list);\n },\n getDuplicateKeys(): Set<string> {\n const out = new Set<string>();\n for (const [key, refs] of refsByKey) if (refs.length > 1) out.add(key);\n return out;\n },\n };\n}\n\nfunction removeNthFromNonDuplicates(refs: RoleRefs, tracker: ReturnType<typeof createRoleNameTracker>): void {\n const duplicates = tracker.getDuplicateKeys();\n for (const [ref, data] of Object.entries(refs)) {\n const key = tracker.getKey(data.role, data.name);\n if (!duplicates.has(key)) delete refs[ref]?.nth;\n }\n}\n\nfunction compactTree(tree: string): string {\n const lines = tree.split('\\n');\n const result: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (line.includes('[ref=')) { result.push(line); continue; }\n if (line.includes(':') && !line.trimEnd().endsWith(':')) { result.push(line); continue; }\n const currentIndent = getIndentLevel(line);\n let hasRelevantChildren = false;\n for (let j = i + 1; j < lines.length; j++) {\n if (getIndentLevel(lines[j]!) <= currentIndent) break;\n if (lines[j]?.includes('[ref=')) { hasRelevantChildren = true; break; }\n }\n if (hasRelevantChildren) result.push(line);\n }\n return result.join('\\n');\n}\n\nexport interface SnapshotBuildOptions {\n interactive?: boolean;\n compact?: boolean;\n maxDepth?: number;\n}\n\n/**\n * Build a role snapshot from Playwright's ariaSnapshot() output.\n * Assigns ref IDs (e1, e2, ...) to interactive/content elements.\n */\nexport function buildRoleSnapshotFromAriaSnapshot(\n ariaSnapshot: string,\n options: SnapshotBuildOptions = {},\n): { snapshot: string; refs: RoleRefs } {\n const lines = ariaSnapshot.split('\\n');\n const refs: RoleRefs = {};\n const tracker = createRoleNameTracker();\n let counter = 0;\n const nextRef = () => { counter++; return `e${counter}`; };\n\n if (options.interactive) {\n const result: string[] = [];\n for (const line of lines) {\n const parsed = matchInteractiveSnapshotLine(line, options);\n if (!parsed) continue;\n const { roleRaw, role, name, suffix } = parsed;\n if (!INTERACTIVE_ROLES.has(role)) continue;\n const prefix = line.match(/^(\\s*-\\s*)/)?.[1] ?? '';\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n refs[ref] = { role, name, nth };\n let enhanced = `${prefix}${roleRaw}`;\n if (name) enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${nth}]`;\n if (suffix.includes('[')) enhanced += suffix;\n result.push(enhanced);\n }\n removeNthFromNonDuplicates(refs, tracker);\n return { snapshot: result.join('\\n') || '(no interactive elements)', refs };\n }\n\n const result: string[] = [];\n for (const line of lines) {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) continue;\n const match = line.match(/^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/);\n if (!match) { result.push(line); continue; }\n const [, prefix, roleRaw, name, suffix] = match;\n if (roleRaw!.startsWith('/')) { result.push(line); continue; }\n const role = roleRaw!.toLowerCase();\n const isInteractive = INTERACTIVE_ROLES.has(role);\n const isContent = CONTENT_ROLES.has(role);\n const isStructural = STRUCTURAL_ROLES.has(role);\n if (options.compact && isStructural && !name) continue;\n if (!(isInteractive || (isContent && name))) { result.push(line); continue; }\n\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n refs[ref] = { role, name, nth };\n\n let enhanced = `${prefix}${roleRaw}`;\n if (name) enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${nth}]`;\n if (suffix) enhanced += suffix;\n result.push(enhanced);\n }\n removeNthFromNonDuplicates(refs, tracker);\n const tree = result.join('\\n') || '(empty)';\n return { snapshot: options.compact ? compactTree(tree) : tree, refs };\n}\n\n/**\n * Build a role snapshot from Playwright's AI snapshot output.\n * Preserves Playwright's own aria-ref ids (e.g. ref=e13).\n */\nexport function buildRoleSnapshotFromAiSnapshot(\n aiSnapshot: string,\n options: SnapshotBuildOptions = {},\n): { snapshot: string; refs: RoleRefs } {\n const lines = String(aiSnapshot ?? '').split('\\n');\n const refs: RoleRefs = {};\n\n function parseAiSnapshotRef(suffix: string): string | null {\n const match = suffix.match(/\\[ref=(e\\d+)\\]/i);\n return match ? match[1]! : null;\n }\n\n if (options.interactive) {\n const out: string[] = [];\n for (const line of lines) {\n const parsed = matchInteractiveSnapshotLine(line, options);\n if (!parsed) continue;\n const { roleRaw, role, name, suffix } = parsed;\n if (!INTERACTIVE_ROLES.has(role)) continue;\n const ref = parseAiSnapshotRef(suffix);\n if (!ref) continue;\n const prefix = line.match(/^(\\s*-\\s*)/)?.[1] ?? '';\n refs[ref] = { role, ...(name ? { name } : {}) };\n out.push(`${prefix}${roleRaw}${name ? ` \"${name}\"` : ''}${suffix}`);\n }\n return { snapshot: out.join('\\n') || '(no interactive elements)', refs };\n }\n\n const out: string[] = [];\n for (const line of lines) {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) continue;\n const match = line.match(/^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/);\n if (!match) { out.push(line); continue; }\n const [, , roleRaw, name, suffix] = match;\n if (roleRaw!.startsWith('/')) { out.push(line); continue; }\n const role = roleRaw!.toLowerCase();\n const isStructural = STRUCTURAL_ROLES.has(role);\n if (options.compact && isStructural && !name) continue;\n const ref = parseAiSnapshotRef(suffix!);\n if (ref) refs[ref] = { role, ...(name ? { name } : {}) };\n out.push(line);\n }\n const tree = out.join('\\n') || '(empty)';\n return { snapshot: options.compact ? compactTree(tree) : tree, refs };\n}\n\nexport function getRoleSnapshotStats(snapshot: string, refs: RoleRefs) {\n const interactive = Object.values(refs).filter(r => INTERACTIVE_ROLES.has(r.role)).length;\n return {\n lines: snapshot.split('\\n').length,\n chars: snapshot.length,\n refs: Object.keys(refs).length,\n interactive,\n };\n}\n","import { getPageForTargetId, ensurePageState, storeRoleRefsForTarget, normalizeTimeoutMs } from '../connection.js';\nimport type { PageWithAI } from '../connection.js';\nimport { buildRoleSnapshotFromAiSnapshot, getRoleSnapshotStats } from './ref-map.js';\nimport type { SnapshotResult, SnapshotOptions } from '../types.js';\n\n/**\n * Take an AI-readable snapshot using Playwright's _snapshotForAI.\n * This is the primary snapshot method — uses Playwright's built-in AI mode.\n */\nexport async function snapshotAi(opts: {\n cdpUrl: string;\n targetId?: string;\n maxChars?: number;\n timeoutMs?: number;\n options?: SnapshotOptions;\n}): Promise<SnapshotResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const maybe = page as PageWithAI;\n if (!maybe._snapshotForAI) {\n throw new Error('Playwright _snapshotForAI is not available. Upgrade playwright-core to >= 1.50.');\n }\n\n const sourceUrl = page.url();\n\n const result = await maybe._snapshotForAI({\n timeout: normalizeTimeoutMs(opts.timeoutMs, 5000, 60000),\n track: 'response',\n });\n\n let snapshot = String(result?.full ?? '');\n const maxChars = opts.maxChars;\n const limit = typeof maxChars === 'number' && Number.isFinite(maxChars) && maxChars > 0\n ? Math.floor(maxChars) : undefined;\n\n if (limit && snapshot.length > limit) {\n const lastNewline = snapshot.lastIndexOf('\\n', limit);\n const cutoff = lastNewline > 0 ? lastNewline : limit;\n snapshot = `${snapshot.slice(0, cutoff)}\\n\\n[...TRUNCATED - page too large]`;\n }\n\n const built = buildRoleSnapshotFromAiSnapshot(snapshot, opts.options);\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n mode: 'aria',\n });\n\n return {\n snapshot: built.snapshot,\n refs: built.refs,\n stats: getRoleSnapshotStats(built.snapshot, built.refs),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n}\n","import { getPageForTargetId, ensurePageState, storeRoleRefsForTarget, normalizeTimeoutMs } from '../connection.js';\nimport {\n buildRoleSnapshotFromAriaSnapshot,\n getRoleSnapshotStats,\n} from './ref-map.js';\nimport type { SnapshotResult, AriaSnapshotResult, AriaNode } from '../types.js';\n\n/**\n * Take a role-based snapshot using Playwright's ariaSnapshot().\n * This produces a tree with ref IDs that can be targeted by actions.\n */\nexport async function snapshotRole(opts: {\n cdpUrl: string;\n targetId?: string;\n selector?: string;\n frameSelector?: string;\n refsMode?: 'role' | 'aria';\n timeoutMs?: number;\n options?: {\n interactive?: boolean;\n compact?: boolean;\n maxDepth?: number;\n };\n}): Promise<SnapshotResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const sourceUrl = page.url();\n const frameSelector = opts.frameSelector?.trim() || '';\n const selector = opts.selector?.trim() || '';\n const locator = frameSelector\n ? (selector\n ? page.frameLocator(frameSelector).locator(selector)\n : page.frameLocator(frameSelector).locator(':root'))\n : (selector\n ? page.locator(selector)\n : page.locator(':root'));\n\n const ariaSnapshot = await locator.ariaSnapshot({ timeout: normalizeTimeoutMs(opts.timeoutMs, 5000) });\n const built = buildRoleSnapshotFromAriaSnapshot(String(ariaSnapshot ?? ''), opts.options);\n\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n frameSelector: frameSelector || undefined,\n mode: opts.refsMode ?? 'role',\n });\n\n return {\n snapshot: built.snapshot,\n refs: built.refs,\n stats: getRoleSnapshotStats(built.snapshot, built.refs),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n}\n\n/** CDP accessibility tree node from Accessibility.getFullAXTree. */\ninterface CdpAXNode {\n nodeId: string;\n childIds?: string[];\n role?: { value?: string | number | boolean };\n name?: { value?: string | number | boolean };\n value?: { value?: string | number | boolean };\n description?: { value?: string | number | boolean };\n backendDOMNodeId?: number;\n}\n\n/**\n * Take a raw ARIA accessibility tree snapshot via CDP.\n */\nexport async function snapshotAria(opts: {\n cdpUrl: string;\n targetId?: string;\n limit?: number;\n}): Promise<AriaSnapshotResult> {\n const limit = Math.max(1, Math.min(2000, Math.floor(opts.limit ?? 500)));\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const sourceUrl = page.url();\n\n const session = await page.context().newCDPSession(page);\n try {\n await session.send('Accessibility.enable').catch(() => {});\n const res = await session.send('Accessibility.getFullAXTree') as { nodes?: CdpAXNode[] };\n return {\n nodes: formatAriaNodes(Array.isArray(res?.nodes) ? res.nodes : [], limit),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-aria-tree',\n capturedAt: new Date().toISOString(),\n },\n };\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nfunction axValue(v: { value?: string | number | boolean } | undefined): string {\n if (!v || typeof v !== 'object') return '';\n const value = v.value;\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return '';\n}\n\nfunction formatAriaNodes(nodes: CdpAXNode[], limit: number): AriaNode[] {\n const byId = new Map<string, CdpAXNode>();\n for (const n of nodes) if (n.nodeId) byId.set(n.nodeId, n);\n\n const referenced = new Set<string>();\n for (const n of nodes) for (const c of n.childIds ?? []) referenced.add(c);\n\n const root = nodes.find(n => n.nodeId && !referenced.has(n.nodeId)) ?? nodes[0];\n if (!root?.nodeId) return [];\n\n const out: AriaNode[] = [];\n const stack: Array<{ id: string; depth: number }> = [{ id: root.nodeId, depth: 0 }];\n\n while (stack.length && out.length < limit) {\n const popped = stack.pop();\n if (!popped) break;\n const { id, depth } = popped;\n const n = byId.get(id);\n if (!n) continue;\n\n const role = axValue(n.role);\n const name = axValue(n.name);\n const value = axValue(n.value);\n const description = axValue(n.description);\n const ref = `ax${out.length + 1}`;\n\n out.push({\n ref,\n role: role || 'unknown',\n name: name || '',\n ...(value ? { value } : {}),\n ...(description ? { description } : {}),\n ...(typeof n.backendDOMNodeId === 'number' ? { backendDOMNodeId: n.backendDOMNodeId } : {}),\n depth,\n });\n\n const children = (n.childIds ?? []).filter((c: string) => byId.has(c));\n for (let i = children.length - 1; i >= 0; i--) {\n if (children[i]) stack.push({ id: children[i], depth: depth + 1 });\n }\n }\n\n return out;\n}\n","import { resolve, normalize, dirname, basename, join, sep, relative, posix, win32 } from 'node:path';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { lookup as dnsLookupCb } from 'node:dns';\nimport { lstat, realpath, rename, rm } from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport * as ipaddr from 'ipaddr.js';\nimport type { SsrfPolicy, PinnedHostname } from './types.js';\n\nexport type LookupFn = typeof dnsLookup;\n\n/**\n * Thrown when a navigation URL is blocked by SSRF policy.\n * Callers can catch this specifically to distinguish navigation blocks\n * from other errors.\n */\nexport class InvalidBrowserNavigationUrlError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidBrowserNavigationUrlError';\n }\n}\n\n/** Options for browser navigation SSRF policy. */\nexport type BrowserNavigationPolicyOptions = {\n ssrfPolicy?: SsrfPolicy;\n};\n\n/** Playwright-compatible request interface for redirect chain inspection. */\nexport type BrowserNavigationRequestLike = {\n url(): string;\n redirectedFrom(): BrowserNavigationRequestLike | null;\n};\n\n/** Build a BrowserNavigationPolicyOptions from an SsrfPolicy. */\nexport function withBrowserNavigationPolicy(ssrfPolicy?: SsrfPolicy): BrowserNavigationPolicyOptions {\n return { ssrfPolicy };\n}\n\n// Only http: and https: are permitted for navigation; about:blank is the sole non-network exception.\nconst NETWORK_NAVIGATION_PROTOCOLS = new Set(['http:', 'https:']);\nconst SAFE_NON_NETWORK_URLS = new Set(['about:blank']);\n\nconst PROXY_ENV_KEYS = ['HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'http_proxy', 'https_proxy', 'all_proxy'];\n\nconst BLOCKED_HOSTNAMES = new Set([\n 'localhost',\n 'localhost.localdomain',\n 'metadata.google.internal',\n]);\n\nfunction isAllowedNonNetworkNavigationUrl(parsed: URL): boolean {\n return SAFE_NON_NETWORK_URLS.has(parsed.href);\n}\n\nfunction isPrivateNetworkAllowedByPolicy(policy?: SsrfPolicy): boolean {\n return policy?.dangerouslyAllowPrivateNetwork === true || policy?.allowPrivateNetwork === true;\n}\n\nfunction hasProxyEnvConfigured(env: Record<string, string | undefined> = process.env): boolean {\n for (const key of PROXY_ENV_KEYS) {\n const value = env[key];\n if (typeof value === 'string' && value.trim().length > 0) return true;\n }\n return false;\n}\n\n// ── Hostname normalization & blocking ──\n\nfunction normalizeHostname(hostname: string): string {\n let h = String(hostname ?? '').trim().toLowerCase();\n // Strip IPv6 brackets\n if (h.startsWith('[') && h.endsWith(']')) h = h.slice(1, -1);\n // Strip trailing dot (FQDN)\n if (h.endsWith('.')) h = h.slice(0, -1);\n return h;\n}\n\nfunction isBlockedHostnameNormalized(normalized: string): boolean {\n if (BLOCKED_HOSTNAMES.has(normalized)) return true;\n return normalized.endsWith('.localhost') || normalized.endsWith('.local') || normalized.endsWith('.internal');\n}\n\n// ── IP address checking via ipaddr.js ──\n\n/**\n * Validate a single IPv4 octet string: must be a plain decimal integer 0-255\n * with no leading zeros, hex prefixes, or other non-standard forms.\n */\nfunction isStrictDecimalOctet(part: string): boolean {\n if (!/^[0-9]+$/.test(part)) return false;\n const n = parseInt(part, 10);\n if (n < 0 || n > 255) return false;\n if (String(n) !== part) return false;\n return true;\n}\n\n/**\n * Returns true if the string looks like a legacy/non-standard IPv4 literal\n * that should be treated as internal and blocked (fail closed).\n */\nfunction isUnsupportedIPv4Literal(ip: string): boolean {\n if (/^[0-9]+$/.test(ip)) return true;\n const parts = ip.split('.');\n if (parts.length !== 4) return true;\n if (!parts.every(isStrictDecimalOctet)) return true;\n return false;\n}\n\nconst BLOCKED_IPV4_RANGES = new Set([\n 'unspecified', 'broadcast', 'multicast', 'linkLocal',\n 'loopback', 'carrierGradeNat', 'private', 'reserved',\n]);\n\nconst BLOCKED_IPV6_RANGES = new Set([\n 'unspecified', 'loopback', 'linkLocal', 'uniqueLocal', 'multicast',\n]);\n\nconst RFC2544_BENCHMARK_PREFIX: [ipaddr.IPv4, number] = [ipaddr.IPv4.parse('198.18.0.0'), 15];\n\ntype IsPrivateIpOpts = { allowRfc2544BenchmarkRange?: boolean };\n\nfunction isBlockedSpecialUseIpv4Address(address: ipaddr.IPv4, opts?: IsPrivateIpOpts): boolean {\n const inRfc2544 = address.match(RFC2544_BENCHMARK_PREFIX);\n if (inRfc2544 && opts?.allowRfc2544BenchmarkRange === true) return false;\n return BLOCKED_IPV4_RANGES.has(address.range()) || inRfc2544;\n}\n\nfunction isBlockedSpecialUseIpv6Address(address: ipaddr.IPv6): boolean {\n if (BLOCKED_IPV6_RANGES.has(address.range())) return true;\n // Deprecated site-local range (fec0::/10) — may not be caught by ipaddr.js range()\n return (address.parts[0] & 0xffc0) === 0xfec0;\n}\n\n/**\n * Extract embedded IPv4 from IPv6 transition formats (IPv4-mapped, NAT64, 6to4, Teredo)\n * and check if the embedded IPv4 is blocked. Returns null if not a transition format.\n */\nfunction extractEmbeddedIpv4FromIpv6(v6: ipaddr.IPv6, opts?: IsPrivateIpOpts): boolean | null {\n // IPv4-mapped (::ffff:a.b.c.d)\n if (v6.isIPv4MappedAddress()) {\n return isBlockedSpecialUseIpv4Address(v6.toIPv4Address(), opts);\n }\n\n const parts = v6.parts; // 8 x 16-bit groups\n\n // NAT64 well-known prefix: 64:ff9b::/96\n if (parts[0] === 0x0064 && parts[1] === 0xff9b &&\n parts[2] === 0x0000 && parts[3] === 0x0000 &&\n parts[4] === 0x0000 && parts[5] === 0x0000) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // NAT64 local-use prefix: 64:ff9b:1::/48\n if (parts[0] === 0x0064 && parts[1] === 0xff9b && parts[2] === 0x0001) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // 6to4 prefix: 2002::/16\n if (parts[0] === 0x2002) {\n const ip4str = `${(parts[1] >> 8) & 0xff}.${parts[1] & 0xff}.${(parts[2] >> 8) & 0xff}.${parts[2] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // Teredo prefix: 2001:0000::/32 — client IPv4 is in last 32 bits XOR'd with 0xFFFF\n if (parts[0] === 0x2001 && parts[1] === 0x0000) {\n const hiXored = parts[6] ^ 0xffff;\n const loXored = parts[7] ^ 0xffff;\n const ip4str = `${(hiXored >> 8) & 0xff}.${hiXored & 0xff}.${(loXored >> 8) & 0xff}.${loXored & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n return null; // not a known transition format\n}\n\n/**\n * Check whether an IP address string is private/internal/loopback.\n * Uses ipaddr.js for proper CIDR matching.\n */\nfunction isPrivateIpAddress(address: string, opts?: IsPrivateIpOpts): boolean {\n let normalized = address.trim().toLowerCase();\n if (normalized.startsWith('[') && normalized.endsWith(']')) normalized = normalized.slice(1, -1);\n if (!normalized) return false;\n\n // Try strict parse via ipaddr.js\n try {\n const parsed = ipaddr.parse(normalized);\n if (parsed.kind() === 'ipv4') {\n return isBlockedSpecialUseIpv4Address(parsed as ipaddr.IPv4, opts);\n }\n // IPv6\n const v6 = parsed as ipaddr.IPv6;\n if (isBlockedSpecialUseIpv6Address(v6)) return true;\n // Check for embedded IPv4 in transition formats\n const embeddedV4 = extractEmbeddedIpv4FromIpv6(v6, opts);\n if (embeddedV4 !== null) return embeddedV4;\n return false;\n } catch {\n // Parse failed\n }\n\n // Defense-in-depth: legacy IPv4 literal check (fail closed)\n if (!normalized.includes(':') && isUnsupportedIPv4Literal(normalized)) return true;\n\n // Unparseable IPv6-looking address — fail closed\n if (normalized.includes(':')) return true;\n\n return false;\n}\n\n// ── URL-level checks ──\n\n/**\n * Check whether a URL targets a loopback or private/internal network address.\n * Synchronous hostname-based check. Used to prevent SSRF attacks.\n */\nexport function isInternalUrl(url: string, opts?: IsPrivateIpOpts): boolean {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return true;\n }\n\n const hostname = normalizeHostname(parsed.hostname);\n if (isBlockedHostnameNormalized(hostname)) return true;\n if (isPrivateIpAddress(hostname, opts)) return true;\n\n return false;\n}\n\n// ── DNS pinning (prevents TOCTOU rebinding) ──\n\nfunction dedupeAndPreferIpv4(results: { address: string; family: number }[]): string[] {\n const seen = new Set<string>();\n const ipv4: string[] = [];\n const ipv6: string[] = [];\n for (const r of results) {\n if (seen.has(r.address)) continue;\n seen.add(r.address);\n if (r.family === 4) ipv4.push(r.address);\n else ipv6.push(r.address);\n }\n return [...ipv4, ...ipv6];\n}\n\n/**\n * Create a pinned DNS lookup function that always resolves to the pre-resolved\n * addresses for the given hostname. Falls back to real DNS for other hostnames.\n */\nexport function createPinnedLookup(params: {\n hostname: string;\n addresses: string[];\n fallback?: typeof dnsLookupCb;\n}): typeof dnsLookupCb {\n const normalizedHost = normalizeHostname(params.hostname);\n const fallback = params.fallback ?? dnsLookupCb;\n const records = params.addresses.map((address) => ({\n address,\n family: address.includes(':') ? 6 as const : 4 as const,\n }));\n let index = 0;\n\n return ((host: string, options: any, callback?: any) => {\n const cb = typeof options === 'function' ? options : callback;\n if (!cb) return;\n\n const normalized = normalizeHostname(host);\n if (!normalized || normalized !== normalizedHost) {\n if (typeof options === 'function' || options === undefined) return (fallback as any)(host, cb);\n return (fallback as any)(host, options, cb);\n }\n\n const opts = typeof options === 'object' && options !== null ? options : {};\n const requestedFamily = typeof options === 'number' ? options : typeof opts.family === 'number' ? opts.family : 0;\n const candidates = requestedFamily === 4 || requestedFamily === 6\n ? records.filter((entry) => entry.family === requestedFamily)\n : records;\n const usable = candidates.length > 0 ? candidates : records;\n\n if (opts.all) {\n cb(null, usable);\n return;\n }\n const chosen = usable[index % usable.length];\n index += 1;\n cb(null, chosen.address, chosen.family);\n }) as typeof dnsLookupCb;\n}\n\n/**\n * Resolve DNS for a hostname and validate resolved addresses against SSRF policy.\n * Returns a PinnedHostname with pre-resolved addresses and a pinned lookup function.\n */\nexport async function resolvePinnedHostnameWithPolicy(hostname: string, params: {\n lookupFn?: LookupFn;\n policy?: SsrfPolicy;\n} = {}): Promise<PinnedHostname> {\n const normalized = normalizeHostname(hostname);\n if (!normalized) throw new InvalidBrowserNavigationUrlError(`Invalid hostname: \"${hostname}\"`);\n\n const allowPrivateNetwork = isPrivateNetworkAllowedByPolicy(params.policy);\n\n const allowedHostnames = [\n ...(params.policy?.allowedHostnames ?? []),\n ...(params.policy?.hostnameAllowlist ?? []),\n ].map(h => normalizeHostname(h));\n\n const isExplicitlyAllowed = allowedHostnames.some(h => h === normalized);\n const skipPrivateNetworkChecks = allowPrivateNetwork || isExplicitlyAllowed;\n\n // Check hostname itself\n if (!skipPrivateNetworkChecks) {\n if (isBlockedHostnameNormalized(normalized)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n const ipOpts: IsPrivateIpOpts = { allowRfc2544BenchmarkRange: params.policy?.allowRfc2544BenchmarkRange };\n if (isPrivateIpAddress(normalized, ipOpts)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n }\n\n // Resolve DNS\n const lookupFn = params.lookupFn ?? dnsLookup;\n let results: { address: string; family: number }[];\n try {\n results = await lookupFn(normalized, { all: true }) as unknown as { address: string; family: number }[];\n } catch {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: unable to resolve \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n\n if (!results || results.length === 0) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: unable to resolve \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n\n // Validate resolved addresses\n if (!skipPrivateNetworkChecks) {\n const ipOpts: IsPrivateIpOpts = { allowRfc2544BenchmarkRange: params.policy?.allowRfc2544BenchmarkRange };\n for (const r of results) {\n if (isPrivateIpAddress(r.address, ipOpts)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\" resolves to \"${r.address}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n }\n }\n\n const addresses = dedupeAndPreferIpv4(results);\n if (addresses.length === 0) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: unable to resolve \"${hostname}\".`\n );\n }\n\n return {\n hostname: normalized,\n addresses,\n lookup: createPinnedLookup({ hostname: normalized, addresses }),\n };\n}\n\n/**\n * Assert that a URL is allowed for browser navigation under the given SSRF policy.\n * Throws `InvalidBrowserNavigationUrlError` if the URL is blocked.\n */\nexport async function assertBrowserNavigationAllowed(opts: {\n url: string;\n lookupFn?: LookupFn;\n} & BrowserNavigationPolicyOptions): Promise<void> {\n const rawUrl = String(opts.url ?? '').trim();\n\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n throw new InvalidBrowserNavigationUrlError(`Invalid URL: \"${rawUrl}\"`);\n }\n\n // Block non-network protocols (file:, data:, javascript:, etc.) — only http/https allowed.\n if (!NETWORK_NAVIGATION_PROTOCOLS.has(parsed.protocol)) {\n if (isAllowedNonNetworkNavigationUrl(parsed)) return;\n throw new InvalidBrowserNavigationUrlError(`Navigation blocked: unsupported protocol \"${parsed.protocol}\"`);\n }\n\n // Fail closed when proxy env vars are set — SSRF checks cannot be reliably enforced\n if (hasProxyEnvConfigured() && !isPrivateNetworkAllowedByPolicy(opts.ssrfPolicy)) {\n throw new InvalidBrowserNavigationUrlError(\n 'Navigation blocked: strict browser SSRF policy cannot be enforced while env proxy variables are set'\n );\n }\n\n const policy = opts.ssrfPolicy;\n\n if (policy?.dangerouslyAllowPrivateNetwork ?? policy?.allowPrivateNetwork ?? true) return;\n\n await resolvePinnedHostnameWithPolicy(parsed.hostname, {\n lookupFn: opts.lookupFn,\n policy,\n });\n}\n\n/**\n * Validate that an output file path is safe — no directory traversal or escape.\n */\nexport async function assertSafeOutputPath(path: string, allowedRoots?: string[]): Promise<void> {\n if (!path || typeof path !== 'string') {\n throw new Error('Output path is required.');\n }\n\n const normalized = normalize(path);\n\n if (normalized.includes('..')) {\n throw new Error(`Unsafe output path: directory traversal detected in \"${path}\".`);\n }\n\n if (allowedRoots?.length) {\n const resolved = resolve(normalized);\n\n let parentReal: string;\n try {\n parentReal = await realpath(dirname(resolved));\n } catch {\n throw new Error(`Unsafe output path: parent directory is inaccessible for \"${path}\".`);\n }\n\n try {\n const targetStat = await lstat(resolved);\n if (targetStat.isSymbolicLink()) {\n throw new Error(`Unsafe output path: \"${path}\" is a symbolic link.`);\n }\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n }\n\n const results = await Promise.all(\n allowedRoots.map(async (root) => {\n try {\n const rootStat = await lstat(resolve(root));\n if (!rootStat.isDirectory() || rootStat.isSymbolicLink()) return false;\n const rootReal = await realpath(resolve(root));\n return parentReal === rootReal || parentReal.startsWith(rootReal + sep);\n } catch {\n return false;\n }\n })\n );\n if (!results.some(Boolean)) {\n throw new Error(`Unsafe output path: \"${path}\" is outside allowed directories.`);\n }\n }\n}\n\n/**\n * Validate upload file paths immediately before use.\n */\nexport async function assertSafeUploadPaths(paths: string[]): Promise<void> {\n for (const filePath of paths) {\n let stat: Awaited<ReturnType<typeof lstat>>;\n try {\n stat = await lstat(filePath);\n } catch {\n throw new Error(`Upload path does not exist or is inaccessible: \"${filePath}\".`);\n }\n if (stat.isSymbolicLink()) {\n throw new Error(`Upload path is a symbolic link: \"${filePath}\".`);\n }\n if (!stat.isFile()) {\n throw new Error(`Upload path is not a regular file: \"${filePath}\".`);\n }\n }\n}\n\n// ── Atomic file write utilities ──\n\n/**\n * Sanitize an untrusted file name (e.g. from a download) to prevent path traversal.\n */\nexport function sanitizeUntrustedFileName(fileName: string, fallbackName: string): string {\n const trimmed = String(fileName ?? '').trim();\n if (!trimmed) return fallbackName;\n\n let base = posix.basename(trimmed);\n base = win32.basename(base);\n\n // Strip control characters\n let cleaned = '';\n for (let i = 0; i < base.length; i++) {\n const code = base.charCodeAt(i);\n if (code < 32 || code === 127) continue;\n cleaned += base[i];\n }\n base = cleaned.trim();\n\n if (!base || base === '.' || base === '..') return fallbackName;\n if (base.length > 200) base = base.slice(0, 200);\n return base;\n}\n\n/**\n * Build a sibling temp path for atomic writes.\n */\nfunction buildSiblingTempPath(targetPath: string): string {\n const id = randomUUID();\n const safeTail = sanitizeUntrustedFileName(basename(targetPath), 'output.bin');\n return join(dirname(targetPath), `.browserclaw-output-${id}-${safeTail}.part`);\n}\n\n/**\n * Write a file atomically via a sibling temp path.\n * The writeTemp callback should write the content to tempPath.\n * After writeTemp completes, the temp file is renamed to the target path.\n */\nexport async function writeViaSiblingTempPath(params: {\n rootDir: string;\n targetPath: string;\n writeTemp: (tempPath: string) => Promise<void>;\n}): Promise<void> {\n const rootDir = await realpath(resolve(params.rootDir)).catch(() => resolve(params.rootDir));\n const requestedTargetPath = resolve(params.targetPath);\n const targetPath = await realpath(dirname(requestedTargetPath))\n .then((realDir) => join(realDir, basename(requestedTargetPath)))\n .catch(() => requestedTargetPath);\n\n const relativeTargetPath = relative(rootDir, targetPath);\n if (\n !relativeTargetPath ||\n relativeTargetPath === '..' ||\n relativeTargetPath.startsWith(`..${sep}`) ||\n isAbsolute(relativeTargetPath)\n ) {\n throw new Error('Target path is outside the allowed root');\n }\n\n const tempPath = buildSiblingTempPath(targetPath);\n let renameSucceeded = false;\n try {\n await params.writeTemp(tempPath);\n await rename(tempPath, targetPath);\n renameSucceeded = true;\n } finally {\n if (!renameSucceeded) await rm(tempPath, { force: true }).catch(() => {});\n }\n}\n\nfunction isAbsolute(p: string): boolean {\n return p.startsWith('/') || /^[a-zA-Z]:/.test(p);\n}\n\n/**\n * Best-effort post-navigation guard for the final page URL.\n */\nexport async function assertBrowserNavigationResultAllowed(opts: {\n url: string;\n lookupFn?: LookupFn;\n} & BrowserNavigationPolicyOptions): Promise<void> {\n const rawUrl = String(opts.url ?? '').trim();\n if (!rawUrl) return;\n\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return;\n }\n\n if (NETWORK_NAVIGATION_PROTOCOLS.has(parsed.protocol) || isAllowedNonNetworkNavigationUrl(parsed)) {\n await assertBrowserNavigationAllowed(opts);\n }\n}\n\n/**\n * Walk the full redirect chain and validate each hop against the SSRF policy.\n */\nexport async function assertBrowserNavigationRedirectChainAllowed(opts: {\n request?: BrowserNavigationRequestLike | null;\n lookupFn?: LookupFn;\n} & BrowserNavigationPolicyOptions): Promise<void> {\n const chain: string[] = [];\n let current = opts.request ?? null;\n while (current) {\n chain.push(current.url());\n current = current.redirectedFrom();\n }\n for (const url of [...chain].reverse()) {\n await assertBrowserNavigationAllowed({ url, lookupFn: opts.lookupFn, ssrfPolicy: opts.ssrfPolicy });\n }\n}\n\n/**\n * Returns true if the SSRF policy requires redirect chain inspection.\n */\nexport function requiresInspectableBrowserNavigationRedirects(ssrfPolicy?: SsrfPolicy): boolean {\n return !isPrivateNetworkAllowedByPolicy(ssrfPolicy);\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpUploadArmId,\n bumpDialogArmId,\n} from '../connection.js';\nimport { assertSafeUploadPaths } from '../security.js';\nimport type { FormField } from '../types.js';\n\ntype MouseButton = 'left' | 'right' | 'middle';\ntype KeyModifier = 'Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift';\n\nexport async function clickViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n doubleClick?: boolean;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const locator = refLocator(page, opts.ref);\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 8000, 60000);\n\n try {\n if (opts.doubleClick) {\n await locator.dblclick({ timeout, button: opts.button, modifiers: opts.modifiers });\n } else {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers });\n }\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function hoverViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).hover({\n timeout: normalizeTimeoutMs(opts.timeoutMs, 8000, 60000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function typeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n text: string;\n submit?: boolean;\n slowly?: boolean;\n timeoutMs?: number;\n}): Promise<void> {\n const text = String(opts.text ?? '');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const locator = refLocator(page, opts.ref);\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 8000, 60000);\n\n try {\n if (opts.slowly) {\n await locator.click({ timeout });\n await locator.pressSequentially(text, { timeout, delay: 75 });\n } else {\n await locator.fill(text, { timeout });\n }\n if (opts.submit) await locator.press('Enter', { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function selectOptionViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n values: string[];\n timeoutMs?: number;\n}): Promise<void> {\n if (!opts.values?.length) throw new Error('values are required');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).selectOption(opts.values, {\n timeout: normalizeTimeoutMs(opts.timeoutMs, 8000, 60000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function dragViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n startRef: string;\n endRef: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.startRef).dragTo(refLocator(page, opts.endRef), {\n timeout: normalizeTimeoutMs(opts.timeoutMs, 8000, 60000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, `${opts.startRef} -> ${opts.endRef}`);\n }\n}\n\nexport async function fillFormViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fields: FormField[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 8000, 60000);\n\n for (const field of opts.fields) {\n const ref = field.ref.trim();\n const type = (typeof field.type === 'string' ? field.type.trim() : '') || 'text';\n const rawValue = field.value;\n const value = typeof rawValue === 'string' ? rawValue\n : typeof rawValue === 'number' || typeof rawValue === 'boolean' ? String(rawValue)\n : '';\n\n if (!ref) continue;\n const locator = refLocator(page, ref);\n\n if (type === 'checkbox' || type === 'radio') {\n const checked = rawValue === true || rawValue === 1 || rawValue === '1' || rawValue === 'true';\n try {\n await locator.setChecked(checked, { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, ref);\n }\n continue;\n }\n\n try {\n await locator.fill(value, { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, ref);\n }\n }\n}\n\nexport async function scrollIntoViewViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).scrollIntoViewIfNeeded({\n timeout: normalizeTimeoutMs(opts.timeoutMs, 20000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function highlightViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).highlight();\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function setInputFilesViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n element?: string;\n paths: string[];\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n if (!opts.paths.length) throw new Error('paths are required');\n\n const inputRef = typeof opts.ref === 'string' ? opts.ref.trim() : '';\n const element = typeof opts.element === 'string' ? opts.element.trim() : '';\n if (inputRef && element) throw new Error('ref and element are mutually exclusive');\n if (!inputRef && !element) throw new Error('Either ref or element is required for setInputFiles');\n\n const locator = inputRef\n ? refLocator(page, inputRef)\n : page.locator(element).first();\n\n await assertSafeUploadPaths(opts.paths);\n\n try {\n await locator.setInputFiles(opts.paths);\n } catch (err) {\n throw toAIFriendlyError(err, inputRef || element);\n }\n\n // Dispatch input+change events for frameworks that listen on these\n try {\n const handle = await locator.elementHandle();\n if (handle) {\n await handle.evaluate((el: Element) => {\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n });\n }\n } catch {\n // Best effort\n }\n}\n\nexport async function armDialogViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n accept: boolean;\n promptText?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const state = ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n state.armIdDialog = bumpDialogArmId();\n const armId = state.armIdDialog;\n\n page.waitForEvent('dialog', { timeout }).then(async (dialog) => {\n if (state.armIdDialog !== armId) return;\n if (opts.accept) await dialog.accept(opts.promptText);\n else await dialog.dismiss();\n }).catch(() => {});\n}\n\nexport async function armFileUploadViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n paths?: string[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const state = ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n state.armIdUpload = bumpUploadArmId();\n const armId = state.armIdUpload;\n\n page.waitForEvent('filechooser', { timeout }).then(async (fileChooser) => {\n if (state.armIdUpload !== armId) return;\n\n if (!opts.paths?.length) {\n try { await page.keyboard.press('Escape'); } catch {}\n return;\n }\n\n try {\n await assertSafeUploadPaths(opts.paths);\n } catch {\n try { await page.keyboard.press('Escape'); } catch {}\n return;\n }\n await fileChooser.setFiles(opts.paths);\n\n // Dispatch input+change events\n try {\n const input = typeof fileChooser.element === 'function' ? await Promise.resolve(fileChooser.element()) : null;\n if (input) {\n await (input as any).evaluate((el: Element) => {\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n });\n }\n } catch {}\n }).catch(() => {});\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\n\nexport async function pressKeyViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n key: string;\n delayMs?: number;\n}): Promise<void> {\n const key = String(opts.key ?? '').trim();\n if (!key) throw new Error('key is required');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.keyboard.press(key, { delay: Math.max(0, Math.floor(opts.delayMs ?? 0)) });\n}\n","import { connectBrowser, getPageForTargetId, ensurePageState, ensureContextState, pageTargetId, findPageByTargetId, getAllPages, normalizeTimeoutMs, forceDisconnectPlaywrightForTarget } from '../connection.js';\nimport { assertBrowserNavigationAllowed, assertBrowserNavigationResultAllowed, assertBrowserNavigationRedirectChainAllowed, withBrowserNavigationPolicy } from '../security.js';\nimport type { BrowserTab, SsrfPolicy } from '../types.js';\n\nfunction isRetryableNavigateError(err: unknown): boolean {\n const msg = typeof err === 'string' ? err.toLowerCase() : err instanceof Error ? err.message.toLowerCase() : '';\n return msg.includes('frame has been detached') || msg.includes('target page, context or browser has been closed');\n}\n\nexport async function navigateViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n url: string;\n timeoutMs?: number;\n ssrfPolicy?: SsrfPolicy;\n /** @deprecated Use ssrfPolicy: { dangerouslyAllowPrivateNetwork: true } instead */\n allowInternal?: boolean;\n}): Promise<{ url: string }> {\n const url = String(opts.url ?? '').trim();\n if (!url) throw new Error('url is required');\n const policy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n await assertBrowserNavigationAllowed({ url, ...withBrowserNavigationPolicy(policy) });\n\n const timeout = Math.max(1000, Math.min(120000, opts.timeoutMs ?? 20000));\n let page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const navigate = async () => await page.goto(url, { timeout });\n\n let response;\n try {\n response = await navigate();\n } catch (err) {\n if (!isRetryableNavigateError(err)) throw err;\n await forceDisconnectPlaywrightForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'retry navigate after detached frame',\n }).catch(() => {});\n page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n response = await navigate();\n }\n\n await assertBrowserNavigationRedirectChainAllowed({ request: response?.request(), ...withBrowserNavigationPolicy(policy) });\n const finalUrl = page.url();\n await assertBrowserNavigationResultAllowed({ url: finalUrl, ...withBrowserNavigationPolicy(policy) });\n return { url: finalUrl };\n}\n\nexport async function listPagesViaPlaywright(opts: { cdpUrl: string }): Promise<BrowserTab[]> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = await getAllPages(browser);\n const results: BrowserTab[] = [];\n for (const page of pages) {\n const tid = await pageTargetId(page).catch(() => null);\n if (tid) results.push({\n targetId: tid,\n title: await page.title().catch(() => ''),\n url: page.url(),\n type: 'page',\n });\n }\n return results;\n}\n\nexport async function createPageViaPlaywright(opts: {\n cdpUrl: string;\n url?: string;\n ssrfPolicy?: SsrfPolicy;\n /** @deprecated Use ssrfPolicy: { dangerouslyAllowPrivateNetwork: true } instead */\n allowInternal?: boolean;\n}): Promise<BrowserTab> {\n const targetUrl = (opts.url ?? '').trim() || 'about:blank';\n const policy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n if (targetUrl !== 'about:blank') {\n await assertBrowserNavigationAllowed({ url: targetUrl, ssrfPolicy: policy });\n }\n const { browser } = await connectBrowser(opts.cdpUrl);\n const context = browser.contexts()[0] ?? await browser.newContext();\n ensureContextState(context);\n const page = await context.newPage();\n ensurePageState(page);\n if (targetUrl !== 'about:blank') {\n const navigationPolicy = withBrowserNavigationPolicy(policy);\n const response = await page.goto(targetUrl, { timeout: 30000 }).catch(() => null);\n await assertBrowserNavigationRedirectChainAllowed({ request: response?.request(), ...navigationPolicy });\n await assertBrowserNavigationResultAllowed({ url: page.url(), ssrfPolicy: policy });\n }\n const tid = await pageTargetId(page).catch(() => null);\n if (!tid) throw new Error('Failed to get targetId for new page');\n return {\n targetId: tid,\n title: await page.title().catch(() => ''),\n url: page.url(),\n type: 'page',\n };\n}\n\nexport async function closePageViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.close();\n}\n\nexport async function closePageByTargetIdViaPlaywright(opts: {\n cdpUrl: string;\n targetId: string;\n}): Promise<void> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!page) throw new Error(`Tab not found (targetId: ${opts.targetId}). Use browser.tabs() to list open tabs.`);\n await page.close();\n}\n\nexport async function focusPageByTargetIdViaPlaywright(opts: {\n cdpUrl: string;\n targetId: string;\n}): Promise<void> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!page) throw new Error(`Tab not found (targetId: ${opts.targetId}). Use browser.tabs() to list open tabs.`);\n try {\n await page.bringToFront();\n } catch (err) {\n const session = await page.context().newCDPSession(page);\n try {\n await session.send('Page.bringToFront');\n } catch {\n throw err;\n } finally {\n await session.detach().catch(() => {});\n }\n }\n}\n\nexport async function resizeViewportViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n width: number;\n height: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.setViewportSize({\n width: Math.max(1, Math.floor(opts.width)),\n height: Math.max(1, Math.floor(opts.height)),\n });\n}\n","import { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from '../connection.js';\n\nexport async function waitForViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n timeMs?: number;\n text?: string;\n textGone?: string;\n selector?: string;\n url?: string;\n loadState?: 'load' | 'domcontentloaded' | 'networkidle';\n fn?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 20000);\n\n if (typeof opts.timeMs === 'number' && Number.isFinite(opts.timeMs)) {\n await page.waitForTimeout(Math.max(0, opts.timeMs));\n }\n if (opts.text) {\n await page.getByText(opts.text).first().waitFor({ state: 'visible', timeout });\n }\n if (opts.textGone) {\n await page.getByText(opts.textGone).first().waitFor({ state: 'hidden', timeout });\n }\n if (opts.selector) {\n const selector = String(opts.selector).trim();\n if (selector) await page.locator(selector).first().waitFor({ state: 'visible', timeout });\n }\n if (opts.url) {\n const url = String(opts.url).trim();\n if (url) await page.waitForURL(url, { timeout });\n }\n if (opts.loadState) {\n await page.waitForLoadState(opts.loadState, { timeout });\n }\n if (opts.fn) {\n const fn = String(opts.fn).trim();\n if (fn) await page.waitForFunction(fn, undefined, { timeout });\n }\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n normalizeTimeoutMs,\n forceDisconnectPlaywrightForTarget,\n} from '../connection.js';\n\nexport interface FrameEvalResult {\n frameUrl: string;\n frameName: string;\n result: unknown;\n}\n\n/**\n * Evaluate JavaScript in ALL frames (including cross-origin iframes).\n * Playwright can access cross-origin frames via CDP, bypassing same-origin policy.\n * Returns results from each frame where evaluation succeeded.\n */\nexport async function evaluateInAllFramesViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fn: string;\n}): Promise<FrameEvalResult[]> {\n const fnText = String(opts.fn ?? '').trim();\n if (!fnText) throw new Error('function is required');\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const frames = page.frames();\n const results: FrameEvalResult[] = [];\n\n for (const frame of frames) {\n try {\n // Runs in the frame's browser context (sandboxed), not in Node.js\n const result = await frame.evaluate(\n // eslint-disable-next-line no-eval\n (fnBody: string) => {\n 'use strict';\n try {\n const candidate = (0, eval)('(' + fnBody + ')');\n return typeof candidate === 'function' ? candidate() : candidate;\n } catch (err: unknown) {\n throw new Error('Invalid evaluate function: ' + (err instanceof Error ? err.message : String(err)));\n }\n },\n fnText,\n );\n results.push({\n frameUrl: frame.url(),\n frameName: frame.name(),\n result,\n });\n } catch {\n // Frame may have been detached or navigation in progress — skip\n }\n }\n\n return results;\n}\n\n/**\n * Race an eval promise against an abort promise.\n */\nasync function awaitEvalWithAbort(evalPromise: Promise<unknown>, abortPromise?: Promise<never>): Promise<unknown> {\n if (!abortPromise) return await evalPromise;\n try {\n return await Promise.race([evalPromise, abortPromise]);\n } catch (err) {\n // Suppress unhandled rejection from the eval promise if abort won the race\n evalPromise.catch(() => {});\n throw err;\n }\n}\n\n// Browser-side evaluator that wraps async results with a timeout via Promise.race.\n// This runs inside the browser sandbox (not Node.js) — `new Function` is the standard\n// pattern for browser-context evaluation with timeout, matching OpenClaw's implementation.\n// eslint-disable-next-line no-new-func\nconst BROWSER_EVALUATOR = new Function('args', `\n \"use strict\";\n var fnBody = args.fnBody, timeoutMs = args.timeoutMs;\n try {\n var candidate = eval(\"(\" + fnBody + \")\");\n var result = typeof candidate === \"function\" ? candidate() : candidate;\n if (result && typeof result.then === \"function\") {\n return Promise.race([\n result,\n new Promise(function(_, reject) {\n setTimeout(function() { reject(new Error(\"evaluate timed out after \" + timeoutMs + \"ms\")); }, timeoutMs);\n })\n ]);\n }\n return result;\n } catch (err) {\n throw new Error(\"Invalid evaluate function: \" + (err && err.message ? err.message : String(err)));\n }\n`);\n\n// eslint-disable-next-line no-new-func\nconst ELEMENT_EVALUATOR = new Function('el', 'args', `\n \"use strict\";\n var fnBody = args.fnBody, timeoutMs = args.timeoutMs;\n try {\n var candidate = eval(\"(\" + fnBody + \")\");\n var result = typeof candidate === \"function\" ? candidate(el) : candidate;\n if (result && typeof result.then === \"function\") {\n return Promise.race([\n result,\n new Promise(function(_, reject) {\n setTimeout(function() { reject(new Error(\"evaluate timed out after \" + timeoutMs + \"ms\")); }, timeoutMs);\n })\n ]);\n }\n return result;\n } catch (err) {\n throw new Error(\"Invalid evaluate function: \" + (err && err.message ? err.message : String(err)));\n }\n`);\n\n/**\n * Evaluate JavaScript in the browser page context.\n * This is intentionally using eval() to execute user-provided browser-side code,\n * which is the core purpose of this function — running arbitrary JS in the page.\n * The code runs in the browser sandbox, not in Node.js.\n */\nexport async function evaluateViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fn: string;\n ref?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n}): Promise<unknown> {\n const fnText = String(opts.fn ?? '').trim();\n if (!fnText) throw new Error('function is required');\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const outerTimeout = normalizeTimeoutMs(opts.timeoutMs, 20000);\n let evaluateTimeout = Math.max(1000, Math.min(120000, outerTimeout - 500));\n evaluateTimeout = Math.min(evaluateTimeout, outerTimeout);\n\n const signal = opts.signal;\n let abortListener: (() => void) | undefined;\n let abortReject: ((reason: unknown) => void) | undefined;\n let abortPromise: Promise<never> | undefined;\n\n if (signal) {\n abortPromise = new Promise<never>((_, reject) => {\n abortReject = reject;\n });\n abortPromise.catch(() => {});\n }\n\n if (signal) {\n const disconnect = () => {\n forceDisconnectPlaywrightForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'evaluate aborted',\n }).catch(() => {});\n };\n if (signal.aborted) {\n disconnect();\n throw signal.reason ?? new Error('aborted');\n }\n abortListener = () => {\n disconnect();\n abortReject?.(signal.reason ?? new Error('aborted'));\n };\n signal.addEventListener('abort', abortListener, { once: true });\n if (signal.aborted) {\n abortListener();\n throw signal.reason ?? new Error('aborted');\n }\n }\n\n try {\n if (opts.ref) {\n const locator = refLocator(page, opts.ref);\n return await awaitEvalWithAbort(\n locator.evaluate(ELEMENT_EVALUATOR as any, { fnBody: fnText, timeoutMs: evaluateTimeout }),\n abortPromise,\n );\n }\n\n return await awaitEvalWithAbort(\n page.evaluate(BROWSER_EVALUATOR as any, { fnBody: fnText, timeoutMs: evaluateTimeout }),\n abortPromise,\n );\n } finally {\n if (signal && abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpDownloadArmId,\n} from '../connection.js';\nimport { dirname } from 'node:path';\nimport { assertSafeOutputPath, writeViaSiblingTempPath } from '../security.js';\nimport type { DownloadResult } from '../types.js';\n\nexport async function downloadViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n path: string;\n timeoutMs?: number;\n allowedOutputRoots?: string[];\n}): Promise<DownloadResult> {\n await assertSafeOutputPath(opts.path, opts.allowedOutputRoots);\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const state = ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n const locator = refLocator(page, opts.ref);\n\n state.armIdDownload = bumpDownloadArmId();\n\n try {\n const [download] = await Promise.all([\n page.waitForEvent('download', { timeout }),\n locator.click({ timeout }),\n ]);\n\n // Atomic write via sibling temp path\n const outPath = opts.path;\n await writeViaSiblingTempPath({\n rootDir: dirname(outPath),\n targetPath: outPath,\n writeTemp: async (tempPath) => {\n await download.saveAs(tempPath);\n },\n });\n\n return {\n url: download.url(),\n suggestedFilename: download.suggestedFilename(),\n path: outPath,\n };\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function waitForDownloadViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n path?: string;\n timeoutMs?: number;\n allowedOutputRoots?: string[];\n}): Promise<DownloadResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n\n const download = await page.waitForEvent('download', { timeout });\n const savePath = opts.path ?? download.suggestedFilename();\n await assertSafeOutputPath(savePath, opts.allowedOutputRoots);\n\n await writeViaSiblingTempPath({\n rootDir: dirname(savePath),\n targetPath: savePath,\n writeTemp: async (tempPath) => {\n await download.saveAs(tempPath);\n },\n });\n\n return {\n url: download.url(),\n suggestedFilename: download.suggestedFilename(),\n path: savePath,\n };\n}\n","import { devices } from 'playwright-core';\nimport {\n getPageForTargetId,\n ensurePageState,\n} from '../connection.js';\nimport type { ColorScheme } from '../types.js';\n\nexport async function emulateMediaViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n colorScheme: ColorScheme;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.emulateMedia({ colorScheme: opts.colorScheme });\n}\n\nexport async function setDeviceViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n name: string;\n}): Promise<void> {\n const name = String(opts.name ?? '').trim();\n if (!name) throw new Error('device name is required');\n\n const device = devices[name];\n if (!device) {\n throw new Error(`Unknown device \"${name}\".`);\n }\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n if (device.viewport) {\n await page.setViewportSize({\n width: device.viewport.width,\n height: device.viewport.height,\n });\n }\n\n const session = await page.context().newCDPSession(page);\n try {\n const locale = (device as any).locale as string | undefined;\n if (device.userAgent || locale) {\n await session.send('Emulation.setUserAgentOverride', {\n userAgent: device.userAgent ?? '',\n acceptLanguage: locale ?? undefined,\n });\n }\n if (device.viewport) {\n await session.send('Emulation.setDeviceMetricsOverride', {\n mobile: Boolean(device.isMobile),\n width: device.viewport.width,\n height: device.viewport.height,\n deviceScaleFactor: device.deviceScaleFactor ?? 1,\n screenWidth: device.viewport.width,\n screenHeight: device.viewport.height,\n });\n }\n if (device.hasTouch) {\n await session.send('Emulation.setTouchEmulationEnabled', { enabled: true });\n }\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nexport async function setExtraHTTPHeadersViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n headers: Record<string, string>;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.context().setExtraHTTPHeaders(opts.headers);\n}\n\nexport async function setGeolocationViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n latitude?: number;\n longitude?: number;\n accuracy?: number;\n origin?: string;\n clear?: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const context = page.context();\n\n if (opts.clear) {\n await context.setGeolocation(null);\n await context.clearPermissions().catch(() => {});\n return;\n }\n\n if (typeof opts.latitude !== 'number' || typeof opts.longitude !== 'number') {\n throw new Error('latitude and longitude are required (or set clear=true)');\n }\n\n await context.setGeolocation({\n latitude: opts.latitude,\n longitude: opts.longitude,\n accuracy: typeof opts.accuracy === 'number' ? opts.accuracy : undefined,\n });\n\n const origin = opts.origin?.trim() || (() => {\n try { return new URL(page.url()).origin; } catch { return ''; }\n })();\n if (origin) await context.grantPermissions(['geolocation'], { origin }).catch(() => {});\n}\n\n/**\n * Set or clear HTTP credentials for the browser context.\n * Note: Playwright's `setHTTPCredentials()` is deprecated — prefer providing credentials\n * at context creation time. This function is retained for CDP-connected contexts where\n * context creation is not controlled by the library.\n */\nexport async function setHttpCredentialsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n username?: string;\n password?: string;\n clear?: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n if (opts.clear) {\n await page.context().setHTTPCredentials(null as any);\n return;\n }\n\n const username = String(opts.username ?? '');\n const password = String(opts.password ?? '');\n if (!username) throw new Error('username is required (or set clear=true)');\n\n await page.context().setHTTPCredentials({ username, password });\n}\n\nexport async function setLocaleViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n locale: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const locale = String(opts.locale ?? '').trim();\n if (!locale) throw new Error('locale is required');\n\n const session = await page.context().newCDPSession(page);\n try {\n try {\n await session.send('Emulation.setLocaleOverride', { locale });\n } catch (err) {\n if (String(err).includes('Another locale override is already in effect')) return;\n throw err;\n }\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nexport async function setOfflineViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n offline: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.context().setOffline(opts.offline);\n}\n\nexport async function setTimezoneViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n timezoneId: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timezoneId = String(opts.timezoneId ?? '').trim();\n if (!timezoneId) throw new Error('timezoneId is required');\n\n const session = await page.context().newCDPSession(page);\n try {\n try {\n await session.send('Emulation.setTimezoneOverride', { timezoneId });\n } catch (err) {\n const msg = String(err);\n if (msg.includes('Timezone override is already in effect')) return;\n if (msg.includes('Invalid timezone')) throw new Error(`Invalid timezone ID: ${timezoneId}`, { cause: err });\n throw err;\n }\n } finally {\n await session.detach().catch(() => {});\n }\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n} from '../connection.js';\n\nexport async function takeScreenshotViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fullPage?: boolean;\n ref?: string;\n element?: string;\n type?: 'png' | 'jpeg';\n}): Promise<{ buffer: Buffer }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n const type = opts.type ?? 'png';\n\n if (opts.ref) {\n if (opts.fullPage) throw new Error('fullPage is not supported for element screenshots');\n return { buffer: await refLocator(page, opts.ref).screenshot({ type }) };\n }\n if (opts.element) {\n if (opts.fullPage) throw new Error('fullPage is not supported for element screenshots');\n return { buffer: await page.locator(opts.element).first().screenshot({ type }) };\n }\n return { buffer: await page.screenshot({ type, fullPage: Boolean(opts.fullPage) }) };\n}\n\nexport async function screenshotWithLabelsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n refs: string[];\n maxLabels?: number;\n type?: 'png' | 'jpeg';\n}): Promise<{ buffer: Buffer; labels: Array<{ ref: string; index: number; box: { x: number; y: number; width: number; height: number } }>; skipped: string[] }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const maxLabels = opts.maxLabels ?? 50;\n const type = opts.type ?? 'png';\n const refs = opts.refs.slice(0, maxLabels);\n const skipped = opts.refs.slice(maxLabels);\n\n // Collect bounding boxes for each ref\n const labels: Array<{ ref: string; index: number; box: { x: number; y: number; width: number; height: number } }> = [];\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]!;\n try {\n const locator = refLocator(page, ref);\n const box = await locator.boundingBox({ timeout: 2000 });\n if (box) {\n labels.push({ ref, index: i + 1, box });\n } else {\n skipped.push(ref);\n }\n } catch {\n skipped.push(ref);\n }\n }\n\n // Inject visible label overlays into the page\n await page.evaluate((labelData: Array<{ index: number; box: { x: number; y: number; width: number; height: number } }>) => {\n const container = document.createElement('div');\n container.id = '__browserclaw_labels__';\n container.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647;';\n for (const { index, box } of labelData) {\n // Border around element\n const border = document.createElement('div');\n border.style.cssText = `position:absolute;left:${box.x}px;top:${box.y}px;width:${box.width}px;height:${box.height}px;border:2px solid #FF4500;box-sizing:border-box;`;\n container.appendChild(border);\n // Label badge\n const badge = document.createElement('div');\n badge.textContent = String(index);\n badge.style.cssText = `position:absolute;left:${box.x}px;top:${Math.max(0, box.y - 18)}px;background:#FF4500;color:#fff;font:bold 12px/16px monospace;padding:0 4px;border-radius:2px;`;\n container.appendChild(badge);\n }\n document.body.appendChild(container);\n }, labels.map(l => ({ index: l.index, box: l.box })));\n\n // Take the screenshot with labels visible\n const buffer = await page.screenshot({ type });\n\n // Remove the label overlays (best-effort — page may have navigated)\n await page.evaluate(() => {\n const el = document.getElementById('__browserclaw_labels__');\n if (el) el.remove();\n }).catch(() => {});\n\n return { buffer, labels, skipped };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\n\nexport async function pdfViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<{ buffer: Buffer }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return { buffer: await page.pdf({ printBackground: true }) };\n}\n","import { dirname } from 'node:path';\nimport {\n getPageForTargetId,\n ensurePageState,\n ensureContextState,\n} from '../connection.js';\nimport { assertSafeOutputPath, writeViaSiblingTempPath } from '../security.js';\n\nexport async function traceStartViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n screenshots?: boolean;\n snapshots?: boolean;\n sources?: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const context = page.context();\n const ctxState = ensureContextState(context);\n\n if (ctxState.traceActive) {\n throw new Error('Trace already running. Stop the current trace before starting a new one.');\n }\n\n await context.tracing.start({\n screenshots: opts.screenshots ?? true,\n snapshots: opts.snapshots ?? true,\n sources: opts.sources ?? false,\n });\n ctxState.traceActive = true;\n}\n\nexport async function traceStopViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n path: string;\n allowedOutputRoots?: string[];\n}): Promise<void> {\n await assertSafeOutputPath(opts.path, opts.allowedOutputRoots);\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const context = page.context();\n const ctxState = ensureContextState(context);\n\n if (!ctxState.traceActive) {\n throw new Error('No active trace. Start a trace before stopping it.');\n }\n\n await writeViaSiblingTempPath({\n rootDir: dirname(opts.path),\n targetPath: opts.path,\n writeTemp: async (tempPath) => {\n await context.tracing.stop({ path: tempPath });\n },\n });\n ctxState.traceActive = false;\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n normalizeTimeoutMs,\n} from '../connection.js';\nimport type { ResponseBodyResult } from '../types.js';\n\nexport async function responseBodyViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n url: string;\n timeoutMs?: number;\n maxChars?: number;\n}): Promise<ResponseBodyResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 30000, 120000);\n\n const response = await page.waitForResponse(opts.url, { timeout });\n let body = await response.text();\n let truncated = false;\n\n const maxChars = typeof opts.maxChars === 'number' && Number.isFinite(opts.maxChars)\n ? Math.max(1, Math.min(5_000_000, Math.floor(opts.maxChars)))\n : undefined;\n if (maxChars !== undefined && body.length > maxChars) {\n body = body.slice(0, maxChars);\n truncated = true;\n }\n\n const headers: Record<string, string> = {};\n const allHeaders = response.headers();\n for (const [key, value] of Object.entries(allHeaders)) {\n headers[key] = value;\n }\n\n return {\n url: response.url(),\n status: response.status(),\n headers,\n body,\n truncated,\n };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\nimport type { ConsoleMessage, PageError, NetworkRequest } from '../types.js';\n\nfunction consolePriority(level: string): number {\n switch (level) {\n case 'error': return 3;\n case 'warning':\n case 'warn': return 2;\n case 'info':\n case 'log': return 1;\n case 'debug': return 0;\n default: return 1;\n }\n}\n\nexport async function getConsoleMessagesViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n level?: string;\n clear?: boolean;\n}): Promise<ConsoleMessage[]> {\n const state = ensurePageState(await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId }));\n const messages = opts.level\n ? state.console.filter(msg => consolePriority(msg.type) >= consolePriority(opts.level!))\n : [...state.console];\n if (opts.clear) state.console = [];\n return messages;\n}\n\nexport async function getPageErrorsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n clear?: boolean;\n}): Promise<{ errors: PageError[] }> {\n const state = ensurePageState(await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId }));\n const errors = [...state.errors];\n if (opts.clear) state.errors = [];\n return { errors };\n}\n\nexport async function getNetworkRequestsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n filter?: string;\n clear?: boolean;\n}): Promise<{ requests: NetworkRequest[] }> {\n const state = ensurePageState(await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId }));\n const raw = [...state.requests];\n const filter = typeof opts.filter === 'string' ? opts.filter.trim() : '';\n const requests = filter ? raw.filter(r => r.url.includes(filter)) : raw;\n if (opts.clear) {\n state.requests = [];\n state.requestIds = new WeakMap();\n }\n return { requests };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\nimport type { CookieData, StorageKind } from '../types.js';\n\n// ── Cookies ──\n\nexport async function cookiesGetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<{ cookies: Awaited<ReturnType<import('playwright-core').BrowserContext['cookies']>> }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return { cookies: await page.context().cookies() };\n}\n\nexport async function cookiesSetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n cookie: CookieData;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const cookie = opts.cookie;\n if (!cookie.name || cookie.value === undefined) throw new Error('cookie name and value are required');\n const hasUrl = typeof cookie.url === 'string' && cookie.url.trim();\n const hasDomainPath = typeof cookie.domain === 'string' && cookie.domain.trim() && typeof cookie.path === 'string' && cookie.path.trim();\n if (!hasUrl && !hasDomainPath) throw new Error('cookie requires url, or domain+path');\n await page.context().addCookies([cookie]);\n}\n\nexport async function cookiesClearViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.context().clearCookies();\n}\n\n// ── localStorage / sessionStorage ──\n\nexport async function storageGetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n kind: StorageKind;\n key?: string;\n}): Promise<{ values: Record<string, string> }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return {\n values: await page.evaluate(\n ({ kind, key }: { kind: string; key?: string }) => {\n const store = kind === 'session' ? window.sessionStorage : window.localStorage;\n if (key) {\n const value = store.getItem(key);\n return value === null ? {} : { [key]: value };\n }\n const out: Record<string, string> = {};\n for (let i = 0; i < store.length; i++) {\n const k = store.key(i);\n if (!k) continue;\n const v = store.getItem(k);\n if (v !== null) out[k] = v;\n }\n return out;\n },\n { kind: opts.kind, key: opts.key },\n ) ?? {},\n };\n}\n\nexport async function storageSetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n kind: StorageKind;\n key: string;\n value: string;\n}): Promise<void> {\n const key = String(opts.key ?? '');\n if (!key) throw new Error('key is required');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.evaluate(\n ({ kind, key: k, value }: { kind: string; key: string; value: string }) => {\n (kind === 'session' ? window.sessionStorage : window.localStorage).setItem(k, value);\n },\n { kind: opts.kind, key, value: String(opts.value ?? '') },\n );\n}\n\nexport async function storageClearViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n kind: StorageKind;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.evaluate(\n ({ kind }: { kind: string }) => {\n (kind === 'session' ? window.sessionStorage : window.localStorage).clear();\n },\n { kind: opts.kind },\n );\n}\n","import { launchChrome, stopChrome, isChromeReachable } from './chrome-launcher.js';\nimport { connectBrowser, disconnectBrowser, getPageForTargetId, ensurePageState, restoreRoleRefsForTarget, refLocator, pageTargetId, getAllPages, normalizeTimeoutMs } from './connection.js';\nimport { snapshotAi } from './snapshot/ai-snapshot.js';\nimport { snapshotRole, snapshotAria } from './snapshot/aria-snapshot.js';\nimport { clickViaPlaywright, hoverViaPlaywright, typeViaPlaywright, selectOptionViaPlaywright, dragViaPlaywright, fillFormViaPlaywright, scrollIntoViewViaPlaywright, highlightViaPlaywright, setInputFilesViaPlaywright, armDialogViaPlaywright, armFileUploadViaPlaywright } from './actions/interaction.js';\nimport { pressKeyViaPlaywright } from './actions/keyboard.js';\nimport { navigateViaPlaywright, listPagesViaPlaywright, createPageViaPlaywright, closePageByTargetIdViaPlaywright, focusPageByTargetIdViaPlaywright, resizeViewportViaPlaywright } from './actions/navigation.js';\nimport { waitForViaPlaywright } from './actions/wait.js';\nimport { evaluateViaPlaywright, evaluateInAllFramesViaPlaywright, type FrameEvalResult } from './actions/evaluate.js';\nimport { downloadViaPlaywright, waitForDownloadViaPlaywright } from './actions/download.js';\nimport { emulateMediaViaPlaywright, setDeviceViaPlaywright, setExtraHTTPHeadersViaPlaywright, setGeolocationViaPlaywright, setHttpCredentialsViaPlaywright, setLocaleViaPlaywright, setOfflineViaPlaywright, setTimezoneViaPlaywright } from './actions/emulation.js';\nimport { takeScreenshotViaPlaywright, screenshotWithLabelsViaPlaywright } from './capture/screenshot.js';\nimport { pdfViaPlaywright } from './capture/pdf.js';\nimport { traceStartViaPlaywright, traceStopViaPlaywright } from './capture/trace.js';\nimport { responseBodyViaPlaywright } from './capture/response.js';\nimport { getConsoleMessagesViaPlaywright, getPageErrorsViaPlaywright, getNetworkRequestsViaPlaywright } from './capture/activity.js';\nimport { cookiesGetViaPlaywright, cookiesSetViaPlaywright, cookiesClearViaPlaywright, storageGetViaPlaywright, storageSetViaPlaywright, storageClearViaPlaywright } from './storage/index.js';\nimport type {\n LaunchOptions, ConnectOptions, SnapshotResult, SnapshotOptions, AriaSnapshotResult,\n BrowserTab, FormField, ClickOptions, TypeOptions, WaitOptions,\n ScreenshotOptions, ConsoleMessage, PageError, NetworkRequest,\n CookieData, StorageKind, RunningChrome, SsrfPolicy,\n DownloadResult, DialogOptions, ResponseBodyResult, TraceStartOptions,\n ColorScheme, GeolocationOptions, HttpCredentials,\n} from './types.js';\n\n/**\n * Represents a single browser page/tab with ref-based automation.\n *\n * The workflow is: **snapshot → read refs → act on refs**.\n *\n * @example\n * ```ts\n * const page = await browser.open('https://example.com');\n *\n * // 1. Take a snapshot to get refs\n * const { snapshot, refs } = await page.snapshot();\n * // snapshot: AI-readable text tree\n * // refs: { \"e1\": { role: \"link\", name: \"More info\" }, ... }\n *\n * // 2. Act on refs\n * await page.click('e1');\n * await page.type('e3', 'hello');\n * ```\n */\nexport class CrawlPage {\n private readonly cdpUrl: string;\n private readonly targetId: string;\n private readonly ssrfPolicy: SsrfPolicy | undefined;\n\n /** @internal */\n constructor(cdpUrl: string, targetId: string, ssrfPolicy?: SsrfPolicy) {\n this.cdpUrl = cdpUrl;\n this.targetId = targetId;\n this.ssrfPolicy = ssrfPolicy;\n }\n\n /** The CDP target ID for this page. Use this to identify the page in multi-tab scenarios. */\n get id(): string {\n return this.targetId;\n }\n\n // ── Snapshot ──────────────────────────────────────────────────\n\n /**\n * Take an AI-readable snapshot of the page.\n *\n * Returns a text tree with numbered refs (`e1`, `e2`, ...) that map to\n * interactive elements. Use these refs with actions like `click()` and `type()`.\n *\n * @param opts - Snapshot options (mode, filtering, depth limits)\n * @returns Snapshot text, ref map, and statistics\n *\n * @example\n * ```ts\n * // Default snapshot (aria mode)\n * const { snapshot, refs } = await page.snapshot();\n *\n * // Interactive elements only, compact\n * const result = await page.snapshot({ interactive: true, compact: true });\n *\n * // Role-based mode (uses getByRole resolution)\n * const result = await page.snapshot({ mode: 'role' });\n * ```\n */\n async snapshot(opts?: SnapshotOptions): Promise<SnapshotResult> {\n if (opts?.mode === 'role') {\n return snapshotRole({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n selector: opts.selector,\n frameSelector: opts.frameSelector,\n refsMode: opts.refsMode,\n timeoutMs: opts.timeoutMs,\n options: {\n interactive: opts.interactive,\n compact: opts.compact,\n maxDepth: opts.maxDepth,\n },\n });\n }\n if (opts?.selector || opts?.frameSelector) {\n throw new Error('selector and frameSelector are only supported in role mode. Use { mode: \"role\" } or omit these options.');\n }\n return snapshotAi({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n maxChars: opts?.maxChars,\n options: {\n interactive: opts?.interactive,\n compact: opts?.compact,\n maxDepth: opts?.maxDepth,\n },\n });\n }\n\n /**\n * Take a raw ARIA accessibility tree snapshot via CDP.\n *\n * Unlike `snapshot()`, this returns structured node data rather than\n * an AI-readable text tree. Useful for programmatic accessibility analysis.\n *\n * @param opts - Options (limit: max nodes to return, default 500)\n * @returns Array of accessibility tree nodes\n */\n async ariaSnapshot(opts?: { limit?: number }): Promise<AriaSnapshotResult> {\n return snapshotAria({ cdpUrl: this.cdpUrl, targetId: this.targetId, limit: opts?.limit });\n }\n\n // ── Interactions ─────────────────────────────────────────────\n\n /**\n * Click an element by ref.\n *\n * @param ref - Ref ID from a snapshot (e.g. `'e1'`)\n * @param opts - Click options (double-click, button, modifiers)\n *\n * @example\n * ```ts\n * await page.click('e1');\n * await page.click('e2', { doubleClick: true });\n * await page.click('e3', { button: 'right' });\n * await page.click('e4', { modifiers: ['Control'] });\n * ```\n */\n async click(ref: string, opts?: ClickOptions): Promise<void> {\n return clickViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n doubleClick: opts?.doubleClick,\n button: opts?.button,\n modifiers: opts?.modifiers,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Type text into an input element by ref.\n *\n * By default, uses Playwright's `fill()` for instant input. Use `slowly: true`\n * to simulate real keystroke typing with a 75ms delay per character.\n *\n * @param ref - Ref ID of the input element (e.g. `'e3'`)\n * @param text - Text to type\n * @param opts - Type options (submit, slowly)\n *\n * @example\n * ```ts\n * await page.type('e3', 'hello world');\n * await page.type('e3', 'slow typing', { slowly: true });\n * await page.type('e3', 'search query', { submit: true }); // press Enter after\n * ```\n */\n async type(ref: string, text: string, opts?: TypeOptions): Promise<void> {\n return typeViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n text,\n submit: opts?.submit,\n slowly: opts?.slowly,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Hover over an element by ref.\n *\n * @param ref - Ref ID from a snapshot\n * @param opts - Timeout options\n */\n async hover(ref: string, opts?: { timeoutMs?: number }): Promise<void> {\n return hoverViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Select option(s) in a `<select>` dropdown by ref.\n *\n * @param ref - Ref ID of the select element\n * @param values - One or more option labels/values to select\n *\n * @example\n * ```ts\n * await page.select('e5', 'Option A');\n * await page.select('e5', 'Option A', 'Option B'); // multi-select\n * ```\n */\n async select(ref: string, ...values: string[]): Promise<void> {\n return selectOptionViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n values,\n });\n }\n\n /**\n * Drag one element to another.\n *\n * @param startRef - Ref ID of the element to drag\n * @param endRef - Ref ID of the drop target\n * @param opts - Timeout options\n */\n async drag(startRef: string, endRef: string, opts?: { timeoutMs?: number }): Promise<void> {\n return dragViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n startRef,\n endRef,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Fill multiple form fields at once.\n *\n * Supports text inputs, checkboxes, and radio buttons.\n *\n * @param fields - Array of form fields to fill\n *\n * @example\n * ```ts\n * await page.fill([\n * { ref: 'e2', type: 'text', value: 'Jane Doe' },\n * { ref: 'e4', type: 'text', value: 'jane@example.com' },\n * { ref: 'e6', type: 'checkbox', value: true },\n * ]);\n * ```\n */\n async fill(fields: FormField[]): Promise<void> {\n return fillFormViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fields,\n });\n }\n\n /**\n * Scroll an element into the visible viewport.\n *\n * @param ref - Ref ID of the element to scroll to\n * @param opts - Timeout options\n */\n async scrollIntoView(ref: string, opts?: { timeoutMs?: number }): Promise<void> {\n return scrollIntoViewViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Highlight an element in the browser (Playwright built-in highlight).\n *\n * @param ref - Ref ID of the element to highlight\n */\n async highlight(ref: string): Promise<void> {\n return highlightViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n });\n }\n\n /**\n * Set files on an `<input type=\"file\">` element.\n *\n * @param ref - Ref ID of the file input element\n * @param paths - Array of file paths to upload\n */\n async uploadFile(ref: string, paths: string[]): Promise<void> {\n return setInputFilesViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n paths,\n });\n }\n\n /**\n * Arm a one-shot dialog handler (alert, confirm, prompt).\n *\n * Returns a promise — store it (don't await), trigger the dialog, then await it.\n *\n * @param opts - Dialog options (accept/dismiss, prompt text, timeout)\n *\n * @example\n * ```ts\n * const dialogDone = page.armDialog({ accept: true }); // don't await here\n * await page.click('e5'); // triggers confirm()\n * await dialogDone; // wait for dialog to be handled\n * ```\n */\n async armDialog(opts: DialogOptions): Promise<void> {\n return armDialogViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n accept: opts.accept,\n promptText: opts.promptText,\n timeoutMs: opts.timeoutMs,\n });\n }\n\n /**\n * Arm a one-shot file chooser handler.\n *\n * Returns a promise — store it (don't await), trigger the file picker, then await it.\n *\n * @param paths - File paths to set when the chooser appears (empty to clear)\n * @param opts - Timeout options\n *\n * @example\n * ```ts\n * const uploadDone = page.armFileUpload(['/path/to/file.pdf']); // don't await here\n * await page.click('e3'); // triggers file picker\n * await uploadDone; // wait for files to be set\n * ```\n */\n async armFileUpload(paths?: string[], opts?: { timeoutMs?: number }): Promise<void> {\n return armFileUploadViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n paths,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n // ── Keyboard ─────────────────────────────────────────────────\n\n /**\n * Press a keyboard key or key combination.\n *\n * Uses Playwright's key names. Supports combinations with `+`.\n *\n * @param key - Key to press (e.g. `'Enter'`, `'Tab'`, `'Control+a'`, `'Meta+c'`)\n * @param opts - Options (delayMs: hold time between keydown and keyup)\n *\n * @example\n * ```ts\n * await page.press('Enter');\n * await page.press('Control+a');\n * await page.press('Meta+Shift+p');\n * ```\n */\n async press(key: string, opts?: { delayMs?: number }): Promise<void> {\n return pressKeyViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n key,\n delayMs: opts?.delayMs,\n });\n }\n\n // ── Navigation ───────────────────────────────────────────────\n\n /**\n * Get the current URL of the page.\n */\n async url(): Promise<string> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return page.url();\n }\n\n /**\n * Get the page title.\n */\n async title(): Promise<string> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return page.title();\n }\n\n /**\n * Navigate to a URL.\n *\n * @param url - The URL to navigate to\n * @param opts - Timeout options\n * @returns The final URL after navigation (may differ due to redirects)\n */\n async goto(url: string, opts?: { timeoutMs?: number }): Promise<{ url: string }> {\n return navigateViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n url,\n timeoutMs: opts?.timeoutMs,\n ssrfPolicy: this.ssrfPolicy,\n });\n }\n\n /**\n * Reload the current page.\n *\n * @param opts - Timeout options\n */\n async reload(opts?: { timeoutMs?: number }): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n ensurePageState(page);\n await page.reload({ timeout: normalizeTimeoutMs(opts?.timeoutMs, 20000) });\n }\n\n /**\n * Navigate back in browser history.\n *\n * @param opts - Timeout options\n */\n async goBack(opts?: { timeoutMs?: number }): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n ensurePageState(page);\n await page.goBack({ timeout: normalizeTimeoutMs(opts?.timeoutMs, 20000) });\n }\n\n /**\n * Navigate forward in browser history.\n *\n * @param opts - Timeout options\n */\n async goForward(opts?: { timeoutMs?: number }): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n ensurePageState(page);\n await page.goForward({ timeout: normalizeTimeoutMs(opts?.timeoutMs, 20000) });\n }\n\n // ── Wait ─────────────────────────────────────────────────────\n\n /**\n * Wait for various conditions on the page.\n *\n * Multiple conditions can be specified — they are checked in order.\n *\n * @param opts - Wait conditions (text, URL, load state, selector, etc.)\n *\n * @example\n * ```ts\n * await page.waitFor({ loadState: 'networkidle' });\n * await page.waitFor({ text: 'Welcome back' });\n * await page.waitFor({ url: '**\\/dashboard' });\n * await page.waitFor({ timeMs: 1000 }); // sleep\n * ```\n */\n async waitFor(opts: WaitOptions): Promise<void> {\n return waitForViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ...opts,\n });\n }\n\n // ── Evaluate ─────────────────────────────────────────────────\n\n /**\n * Run JavaScript in the browser page context.\n *\n * The function string is evaluated in the browser's sandbox, not in Node.js.\n * Pass a `ref` to receive the element as the first argument.\n *\n * @param fn - JavaScript function body as a string\n * @param opts - Options (ref: scope evaluation to a specific element)\n * @returns The return value of the evaluated function\n *\n * @example\n * ```ts\n * const title = await page.evaluate('() => document.title');\n * const text = await page.evaluate('(el) => el.textContent', { ref: 'e1' });\n * const count = await page.evaluate('() => document.querySelectorAll(\"img\").length');\n * ```\n */\n async evaluate(fn: string, opts?: { ref?: string; timeoutMs?: number; signal?: AbortSignal }): Promise<unknown> {\n return evaluateViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fn,\n ref: opts?.ref,\n timeoutMs: opts?.timeoutMs,\n signal: opts?.signal,\n });\n }\n\n /**\n * Run JavaScript in ALL frames on the page (including cross-origin iframes).\n *\n * Playwright can access cross-origin frames via CDP, bypassing the same-origin policy.\n * This is essential for filling payment iframes (Stripe, etc.).\n *\n * @param fn - JavaScript function body as a string\n * @returns Array of results from each frame where evaluation succeeded\n *\n * @example\n * ```ts\n * const results = await page.evaluateInAllFrames(`() => {\n * const el = document.querySelector('input[name=\"cardnumber\"]');\n * return el ? 'found' : null;\n * }`);\n * ```\n */\n async evaluateInAllFrames(fn: string): Promise<FrameEvalResult[]> {\n return evaluateInAllFramesViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fn,\n });\n }\n\n // ── Capture ──────────────────────────────────────────────────\n\n /**\n * Take a screenshot of the page or a specific element.\n *\n * @param opts - Screenshot options (fullPage, ref, element, type)\n * @returns PNG or JPEG image as a Buffer\n *\n * @example\n * ```ts\n * const screenshot = await page.screenshot();\n * const fullPage = await page.screenshot({ fullPage: true });\n * const element = await page.screenshot({ ref: 'e1' });\n * ```\n */\n async screenshot(opts?: ScreenshotOptions): Promise<Buffer> {\n const result = await takeScreenshotViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fullPage: opts?.fullPage,\n ref: opts?.ref,\n element: opts?.element,\n type: opts?.type,\n });\n return result.buffer;\n }\n\n /**\n * Export the page as a PDF.\n *\n * Only works in headless mode.\n *\n * @returns PDF document as a Buffer\n */\n async pdf(): Promise<Buffer> {\n const result = await pdfViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return result.buffer;\n }\n\n /**\n * Take a screenshot with numbered labels overlaid on referenced elements.\n *\n * Useful for visual debugging — each ref gets a numbered badge and border.\n *\n * @param refs - Array of ref IDs to label\n * @param opts - Options (maxLabels: limit, type: image format)\n * @returns Screenshot buffer, label positions, and any skipped refs\n *\n * @example\n * ```ts\n * const { buffer, labels, skipped } = await page.screenshotWithLabels(['e1', 'e2', 'e3']);\n * fs.writeFileSync('labeled.png', buffer);\n * ```\n */\n async screenshotWithLabels(refs: string[], opts?: { maxLabels?: number; type?: 'png' | 'jpeg' }): Promise<{\n buffer: Buffer;\n labels: Array<{ ref: string; index: number; box: { x: number; y: number; width: number; height: number } }>;\n skipped: string[];\n }> {\n return screenshotWithLabelsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n refs,\n maxLabels: opts?.maxLabels,\n type: opts?.type,\n });\n }\n\n /**\n * Start recording a Playwright trace.\n *\n * Traces capture screenshots, DOM snapshots, and network activity.\n * Stop with `traceStop()` to save the trace file.\n *\n * @param opts - Trace options (screenshots, snapshots, sources)\n */\n async traceStart(opts?: TraceStartOptions): Promise<void> {\n return traceStartViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n screenshots: opts?.screenshots,\n snapshots: opts?.snapshots,\n sources: opts?.sources,\n });\n }\n\n /**\n * Stop recording a trace and save it to a file.\n *\n * @param path - File path to save the trace (e.g. `'trace.zip'`)\n * @param opts - Options (allowedOutputRoots: constrain output to specific directories)\n */\n async traceStop(path: string, opts?: { allowedOutputRoots?: string[] }): Promise<void> {\n return traceStopViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n path,\n allowedOutputRoots: opts?.allowedOutputRoots,\n });\n }\n\n /**\n * Wait for a network response matching a URL pattern and return its body.\n *\n * @param url - URL string or pattern to match\n * @param opts - Options (timeoutMs, maxChars)\n * @returns Response body, status, headers, and truncation info\n *\n * @example\n * ```ts\n * const resp = await page.responseBody('/api/data');\n * console.log(resp.status, resp.body);\n * ```\n */\n async responseBody(url: string, opts?: { timeoutMs?: number; maxChars?: number }): Promise<ResponseBodyResult> {\n return responseBodyViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n url,\n timeoutMs: opts?.timeoutMs,\n maxChars: opts?.maxChars,\n });\n }\n\n /**\n * Get console messages captured from the page.\n *\n * Messages are buffered automatically. Use `level` to filter by minimum severity.\n *\n * @param opts - Filter options (level, clear)\n * @returns Array of captured console messages\n */\n async consoleLogs(opts?: { level?: string; clear?: boolean }): Promise<ConsoleMessage[]> {\n return getConsoleMessagesViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n level: opts?.level,\n clear: opts?.clear,\n });\n }\n\n /**\n * Get uncaught errors from the page.\n *\n * @param opts - Options (clear: reset the error buffer after reading)\n * @returns Array of captured page errors\n */\n async pageErrors(opts?: { clear?: boolean }): Promise<PageError[]> {\n const result = await getPageErrorsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n clear: opts?.clear,\n });\n return result.errors;\n }\n\n /**\n * Get network requests captured from the page.\n *\n * @param opts - Options (filter: URL substring match, clear: reset the buffer)\n * @returns Array of captured network requests\n *\n * @example\n * ```ts\n * const all = await page.networkRequests();\n * const apiCalls = await page.networkRequests({ filter: '/api/' });\n * const fresh = await page.networkRequests({ clear: true }); // read and clear\n * ```\n */\n async networkRequests(opts?: { filter?: string; clear?: boolean }): Promise<NetworkRequest[]> {\n const result = await getNetworkRequestsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n filter: opts?.filter,\n clear: opts?.clear,\n });\n return result.requests;\n }\n\n // ── Viewport ─────────────────────────────────────────────────\n\n /**\n * Resize the browser viewport.\n *\n * @param width - Viewport width in pixels\n * @param height - Viewport height in pixels\n */\n async resize(width: number, height: number): Promise<void> {\n return resizeViewportViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n width,\n height,\n });\n }\n\n // ── Storage ──────────────────────────────────────────────────\n\n /**\n * Get all cookies for the current browser context.\n *\n * @returns Array of cookie objects\n */\n async cookies(): Promise<Awaited<ReturnType<import('playwright-core').BrowserContext['cookies']>>> {\n const result = await cookiesGetViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return result.cookies;\n }\n\n /**\n * Set a cookie in the browser context.\n *\n * @param cookie - Cookie data (must include `name`, `value`, and either `url` or `domain`+`path`)\n *\n * @example\n * ```ts\n * await page.setCookie({\n * name: 'token',\n * value: 'abc123',\n * url: 'https://example.com',\n * });\n * ```\n */\n async setCookie(cookie: CookieData): Promise<void> {\n return cookiesSetViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId, cookie });\n }\n\n /** Clear all cookies in the browser context. */\n async clearCookies(): Promise<void> {\n return cookiesClearViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n }\n\n /**\n * Get values from localStorage or sessionStorage.\n *\n * @param kind - `'local'` for localStorage, `'session'` for sessionStorage\n * @param key - Optional specific key to retrieve (returns all if omitted)\n * @returns Key-value map of storage entries\n */\n async storageGet(kind: StorageKind, key?: string): Promise<Record<string, string>> {\n const result = await storageGetViaPlaywright({\n cdpUrl: this.cdpUrl, targetId: this.targetId, kind, key,\n });\n return result.values;\n }\n\n /**\n * Set a value in localStorage or sessionStorage.\n *\n * @param kind - `'local'` for localStorage, `'session'` for sessionStorage\n * @param key - Storage key\n * @param value - Storage value\n */\n async storageSet(kind: StorageKind, key: string, value: string): Promise<void> {\n return storageSetViaPlaywright({\n cdpUrl: this.cdpUrl, targetId: this.targetId, kind, key, value,\n });\n }\n\n /**\n * Clear all entries in localStorage or sessionStorage.\n *\n * @param kind - `'local'` for localStorage, `'session'` for sessionStorage\n */\n async storageClear(kind: StorageKind): Promise<void> {\n return storageClearViaPlaywright({\n cdpUrl: this.cdpUrl, targetId: this.targetId, kind,\n });\n }\n\n // ── Downloads ───────────────────────────────────────────────\n\n /**\n * Click a ref and save the resulting file download.\n *\n * @param ref - Ref ID of the element that triggers the download\n * @param path - Local file path to save the download to\n * @param opts - Timeout options\n * @returns Download result with URL, suggested filename, and saved path\n *\n * @example\n * ```ts\n * const result = await page.download('e7', '/tmp/report.pdf');\n * console.log(result.suggestedFilename); // 'report.pdf'\n * ```\n */\n async download(ref: string, path: string, opts?: { timeoutMs?: number; allowedOutputRoots?: string[] }): Promise<DownloadResult> {\n return downloadViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n path,\n timeoutMs: opts?.timeoutMs,\n allowedOutputRoots: opts?.allowedOutputRoots,\n });\n }\n\n /**\n * Wait for the next download event (without clicking).\n *\n * Returns a promise — store it (don't await), trigger the download, then await it.\n *\n * @param opts - Options (path: save location, timeoutMs)\n * @returns Download result with URL, suggested filename, and saved path\n */\n async waitForDownload(opts?: { path?: string; timeoutMs?: number; allowedOutputRoots?: string[] }): Promise<DownloadResult> {\n return waitForDownloadViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n path: opts?.path,\n timeoutMs: opts?.timeoutMs,\n allowedOutputRoots: opts?.allowedOutputRoots,\n });\n }\n\n // ── Emulation ───────────────────────────────────────────────\n\n /**\n * Set the browser to offline or online mode.\n *\n * @param offline - `true` to go offline, `false` to go online\n */\n async setOffline(offline: boolean): Promise<void> {\n return setOfflineViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n offline,\n });\n }\n\n /**\n * Set extra HTTP headers for all requests.\n *\n * @param headers - Headers to add to every request\n *\n * @example\n * ```ts\n * await page.setExtraHeaders({ 'X-Custom': 'value' });\n * ```\n */\n async setExtraHeaders(headers: Record<string, string>): Promise<void> {\n return setExtraHTTPHeadersViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n headers,\n });\n }\n\n /**\n * Set HTTP authentication credentials.\n *\n * @param opts - Credentials (username, password) or `{ clear: true }` to remove\n */\n async setHttpCredentials(opts: HttpCredentials): Promise<void> {\n return setHttpCredentialsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n username: opts.username,\n password: opts.password,\n clear: opts.clear,\n });\n }\n\n /**\n * Emulate a geolocation.\n *\n * @param opts - Geolocation coordinates or `{ clear: true }` to clear\n *\n * @example\n * ```ts\n * await page.setGeolocation({ latitude: 48.8566, longitude: 2.3522 }); // Paris\n * await page.setGeolocation({ clear: true }); // reset\n * ```\n */\n async setGeolocation(opts: GeolocationOptions): Promise<void> {\n return setGeolocationViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n latitude: opts.latitude,\n longitude: opts.longitude,\n accuracy: opts.accuracy,\n origin: opts.origin,\n clear: opts.clear,\n });\n }\n\n /**\n * Emulate a preferred color scheme.\n *\n * @param opts - Color scheme options\n *\n * @example\n * ```ts\n * await page.emulateMedia({ colorScheme: 'dark' });\n * ```\n */\n async emulateMedia(opts: { colorScheme: ColorScheme }): Promise<void> {\n return emulateMediaViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n colorScheme: opts.colorScheme,\n });\n }\n\n /**\n * Override the browser locale.\n *\n * @param locale - BCP-47 locale string (e.g. `'fr-FR'`, `'ja-JP'`)\n */\n async setLocale(locale: string): Promise<void> {\n return setLocaleViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n locale,\n });\n }\n\n /**\n * Override the browser timezone.\n *\n * @param timezoneId - IANA timezone ID (e.g. `'America/New_York'`, `'Asia/Tokyo'`)\n */\n async setTimezone(timezoneId: string): Promise<void> {\n return setTimezoneViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n timezoneId,\n });\n }\n\n /**\n * Emulate a specific device (viewport + user agent).\n *\n * @param name - Playwright device name (e.g. `'iPhone 13'`, `'Pixel 5'`)\n *\n * @example\n * ```ts\n * await page.setDevice('iPhone 13');\n * ```\n */\n async setDevice(name: string): Promise<void> {\n return setDeviceViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n name,\n });\n }\n}\n\n/**\n * Main entry point for browserclaw.\n *\n * Launch or connect to a browser, then open pages and automate them\n * using the snapshot + ref pattern.\n *\n * @example\n * ```ts\n * import { BrowserClaw } from 'browserclaw';\n *\n * const browser = await BrowserClaw.launch({ headless: false });\n * const page = await browser.open('https://example.com');\n *\n * const { snapshot, refs } = await page.snapshot();\n * console.log(snapshot); // AI-readable page tree\n * console.log(refs); // { \"e1\": { role: \"link\", name: \"More info\" }, ... }\n *\n * await page.click('e1');\n * await browser.stop();\n * ```\n */\nexport class BrowserClaw {\n private readonly cdpUrl: string;\n private readonly ssrfPolicy: SsrfPolicy | undefined;\n private chrome: RunningChrome | null;\n\n private constructor(cdpUrl: string, chrome: RunningChrome | null, ssrfPolicy?: SsrfPolicy) {\n this.cdpUrl = cdpUrl;\n this.chrome = chrome;\n this.ssrfPolicy = ssrfPolicy;\n }\n\n /**\n * Launch a new Chrome instance and connect to it.\n *\n * Automatically detects Chrome, Brave, Edge, or Chromium on the system.\n * Creates a dedicated browser profile to avoid conflicts with your daily browser.\n *\n * @param opts - Launch options (headless, executablePath, cdpPort, etc.)\n * @returns A connected BrowserClaw instance\n *\n * @example\n * ```ts\n * // Default: visible Chrome window\n * const browser = await BrowserClaw.launch();\n *\n * // Headless mode\n * const browser = await BrowserClaw.launch({ headless: true });\n *\n * // Specific browser\n * const browser = await BrowserClaw.launch({\n * executablePath: '/usr/bin/google-chrome',\n * });\n * ```\n */\n static async launch(opts: LaunchOptions = {}): Promise<BrowserClaw> {\n const chrome = await launchChrome(opts);\n const cdpUrl = `http://127.0.0.1:${chrome.cdpPort}`;\n const ssrfPolicy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n return new BrowserClaw(cdpUrl, chrome, ssrfPolicy);\n }\n\n /**\n * Connect to an already-running Chrome instance via its CDP endpoint.\n *\n * The Chrome instance must have been started with `--remote-debugging-port`.\n *\n * @param cdpUrl - CDP endpoint URL (e.g. `'http://localhost:9222'`)\n * @returns A connected BrowserClaw instance\n *\n * @example\n * ```ts\n * // Chrome started with: chrome --remote-debugging-port=9222\n * const browser = await BrowserClaw.connect('http://localhost:9222');\n * ```\n */\n static async connect(cdpUrl: string, opts?: ConnectOptions): Promise<BrowserClaw> {\n if (!await isChromeReachable(cdpUrl, 3000, opts?.authToken)) {\n throw new Error(`Cannot connect to Chrome at ${cdpUrl}. Is Chrome running with --remote-debugging-port?`);\n }\n await connectBrowser(cdpUrl, opts?.authToken);\n const ssrfPolicy = opts?.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts?.ssrfPolicy;\n return new BrowserClaw(cdpUrl, null, ssrfPolicy);\n }\n\n /**\n * Open a URL in a new tab and return the page handle.\n *\n * @param url - URL to navigate to\n * @returns A CrawlPage for the new tab\n *\n * @example\n * ```ts\n * const page = await browser.open('https://example.com');\n * const { snapshot, refs } = await page.snapshot();\n * ```\n */\n async open(url: string): Promise<CrawlPage> {\n const tab = await createPageViaPlaywright({ cdpUrl: this.cdpUrl, url, ssrfPolicy: this.ssrfPolicy });\n return new CrawlPage(this.cdpUrl, tab.targetId, this.ssrfPolicy);\n }\n\n /**\n * Get a CrawlPage handle for the currently active tab.\n *\n * @returns CrawlPage for the first/active page\n */\n async currentPage(): Promise<CrawlPage> {\n const { browser } = await connectBrowser(this.cdpUrl);\n const pages = await getAllPages(browser);\n if (!pages.length) throw new Error('No pages available. Use browser.open(url) to create a tab.');\n const tid = await pageTargetId(pages[0]!).catch(() => null);\n if (!tid) throw new Error('Failed to get targetId for the current page.');\n return new CrawlPage(this.cdpUrl, tid, this.ssrfPolicy);\n }\n\n /**\n * List all open tabs.\n *\n * @returns Array of tab information objects\n */\n async tabs(): Promise<BrowserTab[]> {\n return listPagesViaPlaywright({ cdpUrl: this.cdpUrl });\n }\n\n /**\n * Bring a tab to the foreground.\n *\n * @param targetId - CDP target ID of the tab (from `tabs()` or `page.id`)\n */\n async focus(targetId: string): Promise<void> {\n return focusPageByTargetIdViaPlaywright({ cdpUrl: this.cdpUrl, targetId });\n }\n\n /**\n * Close a tab.\n *\n * @param targetId - CDP target ID of the tab to close\n */\n async close(targetId: string): Promise<void> {\n return closePageByTargetIdViaPlaywright({ cdpUrl: this.cdpUrl, targetId });\n }\n\n /**\n * Get a CrawlPage handle for a specific tab by its target ID.\n *\n * Unlike `open()`, this doesn't create a new tab — it wraps an existing one.\n *\n * @param targetId - CDP target ID of the tab\n * @returns CrawlPage for the specified tab\n */\n page(targetId: string): CrawlPage {\n return new CrawlPage(this.cdpUrl, targetId, this.ssrfPolicy);\n }\n\n /** The CDP endpoint URL for this browser connection. */\n get url(): string {\n return this.cdpUrl;\n }\n\n /**\n * Stop the browser and clean up all resources.\n *\n * If the browser was launched by `BrowserClaw.launch()`, the Chrome process\n * will be terminated. If connected via `BrowserClaw.connect()`, only the\n * Playwright connection is closed.\n */\n async stop(): Promise<void> {\n await disconnectBrowser();\n if (this.chrome) {\n await stopChrome(this.chrome);\n this.chrome = null;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/chrome-launcher.ts","../src/connection.ts","../src/snapshot/ref-map.ts","../src/snapshot/ai-snapshot.ts","../src/snapshot/aria-snapshot.ts","../src/security.ts","../src/actions/interaction.ts","../src/actions/keyboard.ts","../src/actions/navigation.ts","../src/actions/wait.ts","../src/actions/evaluate.ts","../src/actions/download.ts","../src/actions/emulation.ts","../src/capture/screenshot.ts","../src/capture/pdf.ts","../src/capture/trace.ts","../src/capture/response.ts","../src/capture/activity.ts","../src/storage/index.ts","../src/browser.ts"],"names":["fs","execFileSync","path","os","resolve","net","spawn","chromium","result","out","built","ipaddr","dnsLookupCb","dnsLookup","normalize","realpath","dirname","lstat","sep","posix","win32","randomUUID","basename","join","relative","rename","rm","devices"],"mappings":"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","file":"index.cjs","sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport { execFileSync, spawn } from 'node:child_process';\nimport type { ChromeExecutable, ChromeKind, LaunchOptions, RunningChrome } from './types.js';\n\n// ── Executable Detection ──\n\nconst CHROMIUM_BUNDLE_IDS = new Set([\n 'com.google.Chrome',\n 'com.google.Chrome.beta',\n 'com.google.Chrome.canary',\n 'com.google.Chrome.dev',\n 'com.brave.Browser',\n 'com.brave.Browser.beta',\n 'com.brave.Browser.nightly',\n 'com.microsoft.Edge',\n 'com.microsoft.EdgeBeta',\n 'com.microsoft.EdgeDev',\n 'com.microsoft.EdgeCanary',\n 'org.chromium.Chromium',\n 'com.vivaldi.Vivaldi',\n 'com.operasoftware.Opera',\n 'com.operasoftware.OperaGX',\n 'com.yandex.desktop.yandex-browser',\n 'company.thebrowser.Browser',\n]);\n\nconst CHROMIUM_DESKTOP_IDS = new Set([\n 'google-chrome.desktop',\n 'google-chrome-beta.desktop',\n 'google-chrome-unstable.desktop',\n 'brave-browser.desktop',\n 'microsoft-edge.desktop',\n 'microsoft-edge-beta.desktop',\n 'microsoft-edge-dev.desktop',\n 'microsoft-edge-canary.desktop',\n 'chromium.desktop',\n 'chromium-browser.desktop',\n 'vivaldi.desktop',\n 'vivaldi-stable.desktop',\n 'opera.desktop',\n 'opera-gx.desktop',\n 'yandex-browser.desktop',\n 'org.chromium.Chromium.desktop',\n]);\n\nconst CHROMIUM_EXE_NAMES = new Set([\n 'chrome.exe', 'msedge.exe', 'brave.exe', 'brave-browser.exe', 'chromium.exe',\n 'vivaldi.exe', 'opera.exe', 'launcher.exe', 'yandex.exe', 'yandexbrowser.exe',\n 'google chrome', 'google chrome canary', 'brave browser', 'microsoft edge',\n 'chromium', 'chrome', 'brave', 'msedge', 'brave-browser',\n 'google-chrome', 'google-chrome-stable', 'google-chrome-beta', 'google-chrome-unstable',\n 'microsoft-edge', 'microsoft-edge-beta', 'microsoft-edge-dev', 'microsoft-edge-canary',\n 'chromium-browser', 'vivaldi', 'vivaldi-stable', 'opera', 'opera-stable', 'opera-gx',\n 'yandex-browser',\n]);\n\nfunction fileExists(filePath: string): boolean {\n try { return fs.existsSync(filePath); } catch { return false; }\n}\n\nfunction execText(command: string, args: string[], timeoutMs = 1200): string | null {\n try {\n const output = execFileSync(command, args, {\n timeout: timeoutMs,\n encoding: 'utf8',\n maxBuffer: 1024 * 1024,\n });\n return String(output ?? '').trim() || null;\n } catch { return null; }\n}\n\nfunction inferKindFromIdentifier(identifier: string): ChromeKind {\n const id = identifier.toLowerCase();\n if (id.includes('brave')) return 'brave';\n if (id.includes('edge')) return 'edge';\n if (id.includes('chromium')) return 'chromium';\n if (id.includes('canary')) return 'canary';\n if (id.includes('opera') || id.includes('vivaldi') || id.includes('yandex') || id.includes('thebrowser')) return 'chromium';\n return 'chrome';\n}\n\nfunction inferKindFromExeName(name: string): ChromeKind {\n const lower = name.toLowerCase();\n if (lower.includes('brave')) return 'brave';\n if (lower.includes('edge') || lower.includes('msedge')) return 'edge';\n if (lower.includes('chromium')) return 'chromium';\n if (lower.includes('canary') || lower.includes('sxs')) return 'canary';\n if (lower.includes('opera') || lower.includes('vivaldi') || lower.includes('yandex')) return 'chromium';\n return 'chrome';\n}\n\nfunction findFirstExe(candidates: ChromeExecutable[]): ChromeExecutable | null {\n for (const c of candidates) if (fileExists(c.path)) return c;\n return null;\n}\n\n// ── Mac Detection ──\n\nfunction detectDefaultBrowserBundleIdMac(): string | null {\n const plistPath = path.join(os.homedir(), 'Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist');\n if (!fileExists(plistPath)) return null;\n const handlersRaw = execText('/usr/bin/plutil', ['-extract', 'LSHandlers', 'json', '-o', '-', '--', plistPath], 2000);\n if (!handlersRaw) return null;\n let handlers: any[];\n try { handlers = JSON.parse(handlersRaw); } catch { return null; }\n if (!Array.isArray(handlers)) return null;\n\n const resolveScheme = (scheme: string): string | null => {\n let candidate: string | null = null;\n for (const entry of handlers) {\n if (!entry || typeof entry !== 'object') continue;\n if (entry.LSHandlerURLScheme !== scheme) continue;\n const role = (typeof entry.LSHandlerRoleAll === 'string' && entry.LSHandlerRoleAll) ||\n (typeof entry.LSHandlerRoleViewer === 'string' && entry.LSHandlerRoleViewer) || null;\n if (role) candidate = role;\n }\n return candidate;\n };\n return resolveScheme('http') ?? resolveScheme('https');\n}\n\nfunction detectDefaultChromiumMac(): ChromeExecutable | null {\n const bundleId = detectDefaultBrowserBundleIdMac();\n if (!bundleId || !CHROMIUM_BUNDLE_IDS.has(bundleId)) return null;\n const appPathRaw = execText('/usr/bin/osascript', ['-e', `POSIX path of (path to application id \"${bundleId}\")`]);\n if (!appPathRaw) return null;\n const appPath = appPathRaw.trim().replace(/\\/$/, '');\n const exeName = execText('/usr/bin/defaults', ['read', path.join(appPath, 'Contents', 'Info'), 'CFBundleExecutable']);\n if (!exeName) return null;\n const exePath = path.join(appPath, 'Contents', 'MacOS', exeName.trim());\n if (!fileExists(exePath)) return null;\n return { kind: inferKindFromIdentifier(bundleId), path: exePath };\n}\n\nfunction findChromeMac(): ChromeExecutable | null {\n return findFirstExe([\n { kind: 'chrome', path: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' },\n { kind: 'chrome', path: path.join(os.homedir(), 'Applications/Google Chrome.app/Contents/MacOS/Google Chrome') },\n { kind: 'brave', path: '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser' },\n { kind: 'brave', path: path.join(os.homedir(), 'Applications/Brave Browser.app/Contents/MacOS/Brave Browser') },\n { kind: 'edge', path: '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge' },\n { kind: 'edge', path: path.join(os.homedir(), 'Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge') },\n { kind: 'chromium', path: '/Applications/Chromium.app/Contents/MacOS/Chromium' },\n { kind: 'chromium', path: path.join(os.homedir(), 'Applications/Chromium.app/Contents/MacOS/Chromium') },\n { kind: 'canary', path: '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary' },\n { kind: 'canary', path: path.join(os.homedir(), 'Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary') },\n ]);\n}\n\n// ── Linux Detection ──\n\nfunction detectDefaultChromiumLinux(): ChromeExecutable | null {\n const desktopId = execText('xdg-settings', ['get', 'default-web-browser']) ||\n execText('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n if (!desktopId) return null;\n const trimmed = desktopId.trim();\n if (!CHROMIUM_DESKTOP_IDS.has(trimmed)) return null;\n\n const searchDirs = [\n path.join(os.homedir(), '.local', 'share', 'applications'),\n '/usr/local/share/applications',\n '/usr/share/applications',\n '/var/lib/snapd/desktop/applications',\n ];\n let desktopPath: string | null = null;\n for (const dir of searchDirs) {\n const candidate = path.join(dir, trimmed);\n if (fileExists(candidate)) { desktopPath = candidate; break; }\n }\n if (!desktopPath) return null;\n\n let execLine: string | null = null;\n try {\n const lines = fs.readFileSync(desktopPath, 'utf8').split(/\\r?\\n/);\n for (const line of lines) if (line.startsWith('Exec=')) { execLine = line.slice(5).trim(); break; }\n } catch {}\n if (!execLine) return null;\n\n const tokens = execLine.split(/\\s+/);\n let command: string | null = null;\n for (const token of tokens) {\n if (!token || token === 'env' || (token.includes('=') && !token.startsWith('/'))) continue;\n command = token.replace(/^[\"']|[\"']$/g, '');\n break;\n }\n if (!command) return null;\n\n const resolved = command.startsWith('/') ? command : (execText('which', [command], 800)?.trim() ?? null);\n if (!resolved) return null;\n const exeName = path.posix.basename(resolved).toLowerCase();\n if (!CHROMIUM_EXE_NAMES.has(exeName)) return null;\n return { kind: inferKindFromExeName(exeName), path: resolved };\n}\n\nfunction findChromeLinux(): ChromeExecutable | null {\n return findFirstExe([\n { kind: 'chrome', path: '/usr/bin/google-chrome' },\n { kind: 'chrome', path: '/usr/bin/google-chrome-stable' },\n { kind: 'chrome', path: '/usr/bin/chrome' },\n { kind: 'brave', path: '/usr/bin/brave-browser' },\n { kind: 'brave', path: '/usr/bin/brave-browser-stable' },\n { kind: 'brave', path: '/usr/bin/brave' },\n { kind: 'brave', path: '/snap/bin/brave' },\n { kind: 'edge', path: '/usr/bin/microsoft-edge' },\n { kind: 'edge', path: '/usr/bin/microsoft-edge-stable' },\n { kind: 'chromium', path: '/usr/bin/chromium' },\n { kind: 'chromium', path: '/usr/bin/chromium-browser' },\n { kind: 'chromium', path: '/snap/bin/chromium' },\n ]);\n}\n\n// ── Windows Detection ──\n\nfunction findChromeWindows(): ChromeExecutable | null {\n const localAppData = process.env.LOCALAPPDATA ?? '';\n const programFiles = process.env.ProgramFiles ?? 'C:\\\\Program Files';\n const programFilesX86 = process.env['ProgramFiles(x86)'] ?? 'C:\\\\Program Files (x86)';\n const j = path.win32.join;\n const candidates: ChromeExecutable[] = [];\n if (localAppData) {\n candidates.push({ kind: 'chrome', path: j(localAppData, 'Google', 'Chrome', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'brave', path: j(localAppData, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') });\n candidates.push({ kind: 'edge', path: j(localAppData, 'Microsoft', 'Edge', 'Application', 'msedge.exe') });\n candidates.push({ kind: 'chromium', path: j(localAppData, 'Chromium', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'canary', path: j(localAppData, 'Google', 'Chrome SxS', 'Application', 'chrome.exe') });\n }\n candidates.push({ kind: 'chrome', path: j(programFiles, 'Google', 'Chrome', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'chrome', path: j(programFilesX86, 'Google', 'Chrome', 'Application', 'chrome.exe') });\n candidates.push({ kind: 'brave', path: j(programFiles, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') });\n candidates.push({ kind: 'brave', path: j(programFilesX86, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe') });\n candidates.push({ kind: 'edge', path: j(programFiles, 'Microsoft', 'Edge', 'Application', 'msedge.exe') });\n candidates.push({ kind: 'edge', path: j(programFilesX86, 'Microsoft', 'Edge', 'Application', 'msedge.exe') });\n return findFirstExe(candidates);\n}\n\n// ── Resolve Executable ──\n\nexport function resolveBrowserExecutable(opts?: { executablePath?: string }): ChromeExecutable | null {\n if (opts?.executablePath) {\n if (!fileExists(opts.executablePath)) throw new Error(`executablePath not found: ${opts.executablePath}`);\n return { kind: 'custom', path: opts.executablePath };\n }\n const platform = process.platform;\n // Try default browser first\n if (platform === 'darwin') return detectDefaultChromiumMac() ?? findChromeMac();\n if (platform === 'linux') return detectDefaultChromiumLinux() ?? findChromeLinux();\n if (platform === 'win32') return findChromeWindows();\n return null;\n}\n\n// ── Port Check ──\n\nasync function ensurePortAvailable(port: number): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const tester = net.createServer()\n .once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') reject(new Error(`Port ${port} is already in use`));\n else reject(err);\n })\n .once('listening', () => { tester.close(() => resolve()); })\n .listen(port);\n });\n}\n\n// ── Profile Decoration ──\n\nfunction safeReadJson(filePath: string): Record<string, any> | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return null;\n return parsed;\n } catch { return null; }\n}\n\nfunction safeWriteJson(filePath: string, data: Record<string, any>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\nfunction setDeep(obj: Record<string, any>, keys: string[], value: any): void {\n let node = obj;\n for (const key of keys.slice(0, -1)) {\n const next = node[key];\n if (typeof next !== 'object' || next === null || Array.isArray(next)) node[key] = {};\n node = node[key];\n }\n node[keys[keys.length - 1]!] = value;\n}\n\nfunction parseHexRgbToSignedArgbInt(hex: string): number | null {\n const cleaned = hex.trim().replace(/^#/, '');\n if (!/^[0-9a-fA-F]{6}$/.test(cleaned)) return null;\n const argbUnsigned = (255 << 24) | Number.parseInt(cleaned, 16);\n return argbUnsigned > 2147483647 ? argbUnsigned - 4294967296 : argbUnsigned;\n}\n\nfunction decorateProfile(userDataDir: string, name: string, color: string): void {\n const colorInt = parseHexRgbToSignedArgbInt(color);\n const localStatePath = path.join(userDataDir, 'Local State');\n const preferencesPath = path.join(userDataDir, 'Default', 'Preferences');\n\n const localState = safeReadJson(localStatePath) ?? {};\n setDeep(localState, ['profile', 'info_cache', 'Default', 'name'], name);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'shortcut_name'], name);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'user_name'], name);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'profile_color'], color);\n if (colorInt != null) {\n setDeep(localState, ['profile', 'info_cache', 'Default', 'profile_color_seed'], colorInt);\n setDeep(localState, ['profile', 'info_cache', 'Default', 'profile_highlight_color'], colorInt);\n }\n safeWriteJson(localStatePath, localState);\n\n const prefs = safeReadJson(preferencesPath) ?? {};\n setDeep(prefs, ['profile', 'name'], name);\n setDeep(prefs, ['profile', 'profile_color'], color);\n if (colorInt != null) {\n setDeep(prefs, ['autogenerated', 'theme', 'color'], colorInt);\n setDeep(prefs, ['browser', 'theme', 'user_color2'], colorInt);\n }\n safeWriteJson(preferencesPath, prefs);\n}\n\nfunction ensureCleanExit(userDataDir: string): void {\n const preferencesPath = path.join(userDataDir, 'Default', 'Preferences');\n const prefs = safeReadJson(preferencesPath) ?? {};\n setDeep(prefs, ['exit_type'], 'Normal');\n setDeep(prefs, ['exited_cleanly'], true);\n safeWriteJson(preferencesPath, prefs);\n}\n\n// ── Launch Chrome ──\n\nconst DEFAULT_CDP_PORT = 9222;\nconst DEFAULT_PROFILE_NAME = 'browserclaw';\nconst DEFAULT_PROFILE_COLOR = '#FF4500';\n\nfunction resolveUserDataDir(profileName: string): string {\n const configDir = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config');\n return path.join(configDir, 'browserclaw', 'profiles', profileName, 'user-data');\n}\n\n// ── WebSocket / CDP URL Helpers ──\n\nfunction isWebSocketUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'ws:' || parsed.protocol === 'wss:';\n } catch { return false; }\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';\n}\n\n/**\n * Normalize a WebSocket debugger URL returned by `/json/version` to match the\n * external CDP host/port. Handles wildcard binds (`0.0.0.0`, `[::]`),\n * protocol upgrades (HTTP→WSS), and auth/search param inheritance.\n */\nfunction normalizeCdpWsUrl(wsUrl: string, cdpUrl: string): string {\n const ws = new URL(wsUrl);\n const cdp = new URL(cdpUrl);\n const isWildcardBind = ws.hostname === '0.0.0.0' || ws.hostname === '[::]';\n if ((isLoopbackHost(ws.hostname) || isWildcardBind) && !isLoopbackHost(cdp.hostname)) {\n ws.hostname = cdp.hostname;\n const cdpPort = cdp.port || (cdp.protocol === 'https:' ? '443' : '80');\n if (cdpPort) ws.port = cdpPort;\n ws.protocol = cdp.protocol === 'https:' ? 'wss:' : 'ws:';\n }\n if (cdp.protocol === 'https:' && ws.protocol === 'ws:') ws.protocol = 'wss:';\n if (!ws.username && !ws.password && (cdp.username || cdp.password)) {\n ws.username = cdp.username;\n ws.password = cdp.password;\n }\n for (const [key, value] of cdp.searchParams.entries()) {\n if (!ws.searchParams.has(key)) ws.searchParams.append(key, value);\n }\n return ws.toString();\n}\n\n/**\n * Convert a WebSocket CDP URL to an HTTP base URL for `/json/*` endpoints.\n */\nexport function normalizeCdpHttpBaseForJsonEndpoints(cdpUrl: string): string {\n try {\n const url = new URL(cdpUrl);\n if (url.protocol === 'ws:') url.protocol = 'http:';\n else if (url.protocol === 'wss:') url.protocol = 'https:';\n url.pathname = url.pathname.replace(/\\/devtools\\/browser\\/.*$/, '');\n url.pathname = url.pathname.replace(/\\/cdp$/, '');\n return url.toString().replace(/\\/$/, '');\n } catch {\n return cdpUrl\n .replace(/^ws:/, 'http:')\n .replace(/^wss:/, 'https:')\n .replace(/\\/devtools\\/browser\\/.*$/, '')\n .replace(/\\/cdp$/, '')\n .replace(/\\/$/, '');\n }\n}\n\nfunction appendCdpPath(cdpUrl: string, cdpPath: string): string {\n const url = new URL(cdpUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, '')}${cdpPath.startsWith('/') ? cdpPath : `/${cdpPath}`}`;\n return url.toString();\n}\n\n// ── Chrome Reachability ──\n\nasync function canOpenWebSocket(url: string, timeoutMs: number): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n try { ws.close(); } catch {}\n resolve(value);\n };\n const timer = setTimeout(() => finish(false), Math.max(50, timeoutMs + 25));\n let ws: WebSocket;\n try { ws = new WebSocket(url); } catch { finish(false); return; }\n ws.onopen = () => finish(true);\n ws.onerror = () => finish(false);\n });\n}\n\nasync function fetchChromeVersion(\n cdpUrl: string,\n timeoutMs = 500,\n authToken?: string,\n): Promise<Record<string, any> | null> {\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), timeoutMs);\n try {\n const httpBase = isWebSocketUrl(cdpUrl) ? normalizeCdpHttpBaseForJsonEndpoints(cdpUrl) : cdpUrl;\n const headers: Record<string, string> = {};\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n const res = await fetch(appendCdpPath(httpBase, '/json/version'), { signal: ctrl.signal, headers });\n if (!res.ok) return null;\n const data = await res.json();\n if (!data || typeof data !== 'object') return null;\n return data as Record<string, any>;\n } catch { return null; }\n finally { clearTimeout(t); }\n}\n\nexport async function isChromeReachable(cdpUrl: string, timeoutMs = 500, authToken?: string): Promise<boolean> {\n if (isWebSocketUrl(cdpUrl)) return await canOpenWebSocket(cdpUrl, timeoutMs);\n const version = await fetchChromeVersion(cdpUrl, timeoutMs, authToken);\n return Boolean(version);\n}\n\nexport async function getChromeWebSocketUrl(cdpUrl: string, timeoutMs = 500, authToken?: string): Promise<string | null> {\n if (isWebSocketUrl(cdpUrl)) return cdpUrl;\n const version = await fetchChromeVersion(cdpUrl, timeoutMs, authToken);\n const wsUrl = String(version?.webSocketDebuggerUrl ?? '').trim();\n if (!wsUrl) return null;\n return normalizeCdpWsUrl(wsUrl, cdpUrl);\n}\n\nexport async function isChromeCdpReady(cdpUrl: string, timeoutMs = 500, handshakeTimeoutMs = 800): Promise<boolean> {\n const wsUrl = await getChromeWebSocketUrl(cdpUrl, timeoutMs);\n if (!wsUrl) return false;\n return await canRunCdpHealthCommand(wsUrl, handshakeTimeoutMs);\n}\n\nasync function canRunCdpHealthCommand(wsUrl: string, timeoutMs = 800): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n try { ws.close(); } catch {}\n resolve(value);\n };\n\n const timer = setTimeout(() => finish(false), Math.max(50, timeoutMs + 25));\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(wsUrl);\n } catch {\n finish(false);\n return;\n }\n\n ws.onopen = () => {\n try {\n ws.send(JSON.stringify({ id: 1, method: 'Browser.getVersion' }));\n } catch { finish(false); }\n };\n ws.onmessage = (event) => {\n try {\n const parsed = JSON.parse(String(event.data));\n if (parsed?.id !== 1) return;\n finish(Boolean(parsed.result && typeof parsed.result === 'object'));\n } catch { /* ignore non-JSON frames */ }\n };\n ws.onerror = () => finish(false);\n ws.onclose = () => finish(false);\n });\n}\n\nexport async function launchChrome(opts: LaunchOptions = {}): Promise<RunningChrome> {\n const cdpPort = opts.cdpPort ?? DEFAULT_CDP_PORT;\n await ensurePortAvailable(cdpPort);\n\n const exe = resolveBrowserExecutable({ executablePath: opts.executablePath });\n if (!exe) throw new Error('No supported browser found (Chrome/Brave/Edge/Chromium). Install one or provide executablePath.');\n\n const profileName = opts.profileName ?? DEFAULT_PROFILE_NAME;\n const userDataDir = opts.userDataDir ?? resolveUserDataDir(profileName);\n fs.mkdirSync(userDataDir, { recursive: true });\n\n const spawnChrome = () => {\n const args = [\n `--remote-debugging-port=${cdpPort}`,\n `--user-data-dir=${userDataDir}`,\n '--no-first-run',\n '--no-default-browser-check',\n '--disable-sync',\n '--disable-background-networking',\n '--disable-component-update',\n '--disable-features=Translate,MediaRouter',\n '--disable-blink-features=AutomationControlled',\n '--disable-session-crashed-bubble',\n '--hide-crash-restore-bubble',\n '--password-store=basic',\n ];\n if (opts.headless) {\n args.push('--headless=new', '--disable-gpu');\n }\n if (opts.noSandbox) {\n args.push('--no-sandbox', '--disable-setuid-sandbox');\n }\n if (process.platform === 'linux') args.push('--disable-dev-shm-usage');\n const extraArgs = Array.isArray(opts.chromeArgs)\n ? opts.chromeArgs.filter((a): a is string => typeof a === 'string' && a.trim().length > 0)\n : [];\n if (extraArgs.length) args.push(...extraArgs);\n args.push('about:blank');\n return spawn(exe.path, args, {\n stdio: 'pipe',\n env: { ...process.env, HOME: os.homedir() },\n });\n };\n\n const startedAt = Date.now();\n const localStatePath = path.join(userDataDir, 'Local State');\n const preferencesPath = path.join(userDataDir, 'Default', 'Preferences');\n\n // Bootstrap run if profile doesn't exist yet\n if (!fileExists(localStatePath) || !fileExists(preferencesPath)) {\n const bootstrap = spawnChrome();\n const deadline = Date.now() + 10000;\n while (Date.now() < deadline) {\n if (fileExists(localStatePath) && fileExists(preferencesPath)) break;\n await new Promise(r => setTimeout(r, 100));\n }\n try { bootstrap.kill('SIGTERM'); } catch {}\n const exitDeadline = Date.now() + 5000;\n while (Date.now() < exitDeadline) {\n if (bootstrap.exitCode != null) break;\n await new Promise(r => setTimeout(r, 50));\n }\n if (bootstrap.exitCode == null) {\n try { bootstrap.kill('SIGKILL'); } catch {}\n }\n }\n\n // Decorate profile\n try {\n decorateProfile(userDataDir, profileName, opts.profileColor ?? DEFAULT_PROFILE_COLOR);\n } catch {}\n\n // Ensure clean exit state\n try { ensureCleanExit(userDataDir); } catch {}\n\n // Launch for real\n const proc = spawnChrome();\n const cdpUrl = `http://127.0.0.1:${cdpPort}`;\n\n // Capture stderr for diagnostics on failure\n const stderrChunks: Buffer[] = [];\n const onStderr = (chunk: Buffer) => { stderrChunks.push(chunk); };\n proc.stderr?.on('data', onStderr);\n\n // Wait for Chrome to be ready\n const readyDeadline = Date.now() + 15000;\n while (Date.now() < readyDeadline) {\n if (await isChromeReachable(cdpUrl, 500)) break;\n await new Promise(r => setTimeout(r, 200));\n }\n\n if (!await isChromeReachable(cdpUrl, 500)) {\n const stderrOutput = Buffer.concat(stderrChunks).toString('utf8').trim();\n const stderrHint = stderrOutput ? `\\nChrome stderr:\\n${stderrOutput.slice(0, 2000)}` : '';\n const sandboxHint = process.platform === 'linux' && !opts.noSandbox\n ? '\\nHint: If running in a container or as root, try setting noSandbox: true.' : '';\n try { proc.kill('SIGKILL'); } catch {}\n throw new Error(`Failed to start Chrome CDP on port ${cdpPort}.${sandboxHint}${stderrHint}`);\n }\n\n proc.stderr?.off('data', onStderr);\n stderrChunks.length = 0;\n\n return {\n pid: proc.pid ?? -1,\n exe,\n userDataDir,\n cdpPort,\n startedAt,\n proc,\n };\n}\n\nexport async function stopChrome(running: RunningChrome, timeoutMs = 2500): Promise<void> {\n const proc = running.proc;\n if (proc.exitCode != null) return;\n try { proc.kill('SIGTERM'); } catch {}\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (proc.exitCode != null) return;\n await new Promise(r => setTimeout(r, 100));\n }\n try { proc.kill('SIGKILL'); } catch {}\n}\n","import { chromium } from 'playwright-core';\nimport type { Browser, Page, BrowserContext } from 'playwright-core';\nimport { getChromeWebSocketUrl, normalizeCdpHttpBaseForJsonEndpoints } from './chrome-launcher.js';\nimport type { PageState, ContextState, RoleRefs } from './types.js';\n\n/** Page extended with Playwright's private `_snapshotForAI` method. */\nexport type PageWithAI = Page & {\n _snapshotForAI?: (opts: { timeout: number; track: string }) => Promise<{ full?: string }>;\n};\n\n// ── Persistent Connection Cache ──\n\nlet cached: { browser: Browser; cdpUrl: string; authToken?: string } | null = null;\nconst connectingByUrl = new Map<string, Promise<{ browser: Browser; cdpUrl: string; authToken?: string }>>();\n\nconst pageStates = new WeakMap<Page, PageState>();\nconst contextStates = new WeakMap<BrowserContext, ContextState>();\nconst observedContexts = new WeakSet<BrowserContext>();\nconst observedPages = new WeakSet<Page>();\n\n// ── Arm ID Counters ──\n\nlet nextUploadArmId = 0;\nlet nextDialogArmId = 0;\nlet nextDownloadArmId = 0;\n\nexport function bumpUploadArmId(): number {\n nextUploadArmId += 1;\n return nextUploadArmId;\n}\nexport function bumpDialogArmId(): number {\n nextDialogArmId += 1;\n return nextDialogArmId;\n}\nexport function bumpDownloadArmId(): number {\n nextDownloadArmId += 1;\n return nextDownloadArmId;\n}\n\n// ── Context State Management ──\n\nexport function ensureContextState(context: BrowserContext): ContextState {\n const existing = contextStates.get(context);\n if (existing) return existing;\n const state: ContextState = { traceActive: false };\n contextStates.set(context, state);\n return state;\n}\n\n// Ref cache: keyed by \"cdpUrl::targetId\"\nconst roleRefsByTarget = new Map<string, {\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n}>();\nconst MAX_ROLE_REFS_CACHE = 50;\n\nconst MAX_CONSOLE_MESSAGES = 500;\nconst MAX_PAGE_ERRORS = 200;\nconst MAX_NETWORK_REQUESTS = 500;\n\nfunction normalizeCdpUrl(raw: string): string {\n return raw.replace(/\\/$/, '');\n}\n\nfunction roleRefsKey(cdpUrl: string, targetId: string): string {\n return `${normalizeCdpUrl(cdpUrl)}::${targetId}`;\n}\n\n// ── Page State Management ──\n\nexport function ensurePageState(page: Page): PageState {\n const existing = pageStates.get(page);\n if (existing) return existing;\n\n const state: PageState = {\n console: [],\n errors: [],\n requests: [],\n requestIds: new WeakMap(),\n nextRequestId: 0,\n armIdUpload: 0,\n armIdDialog: 0,\n armIdDownload: 0,\n };\n pageStates.set(page, state);\n\n if (!observedPages.has(page)) {\n observedPages.add(page);\n\n page.on('console', (msg) => {\n state.console.push({\n type: msg.type(),\n text: msg.text(),\n timestamp: new Date().toISOString(),\n location: msg.location(),\n });\n if (state.console.length > MAX_CONSOLE_MESSAGES) state.console.shift();\n });\n\n page.on('pageerror', (err) => {\n state.errors.push({\n message: err?.message ? String(err.message) : String(err),\n name: err?.name ? String(err.name) : undefined,\n stack: err?.stack ? String(err.stack) : undefined,\n timestamp: new Date().toISOString(),\n });\n if (state.errors.length > MAX_PAGE_ERRORS) state.errors.shift();\n });\n\n page.on('request', (req) => {\n state.nextRequestId += 1;\n const id = `r${state.nextRequestId}`;\n state.requestIds.set(req, id);\n state.requests.push({\n id,\n timestamp: new Date().toISOString(),\n method: req.method(),\n url: req.url(),\n resourceType: req.resourceType(),\n });\n if (state.requests.length > MAX_NETWORK_REQUESTS) state.requests.shift();\n });\n\n page.on('response', (resp) => {\n const req = resp.request();\n const id = state.requestIds.get(req);\n if (!id) return;\n for (let i = state.requests.length - 1; i >= 0; i--) {\n const rec = state.requests[i];\n if (rec && rec.id === id) {\n rec.status = resp.status();\n rec.ok = resp.ok();\n break;\n }\n }\n });\n\n page.on('requestfailed', (req) => {\n const id = state.requestIds.get(req);\n if (!id) return;\n for (let i = state.requests.length - 1; i >= 0; i--) {\n const rec = state.requests[i];\n if (rec && rec.id === id) {\n rec.failureText = req.failure()?.errorText;\n rec.ok = false;\n break;\n }\n }\n });\n\n page.on('close', () => {\n pageStates.delete(page);\n observedPages.delete(page);\n });\n }\n\n return state;\n}\n\n// ── Stealth: hide navigator.webdriver ──\n\nconst STEALTH_SCRIPT = `Object.defineProperty(navigator, 'webdriver', { get: () => undefined })`;\n\nfunction applyStealthToPage(page: Page): void {\n page.evaluate(STEALTH_SCRIPT).catch((e) => {\n if (process.env.DEBUG) console.warn('[browserclaw] stealth evaluate failed:', e.message);\n });\n}\n\nfunction observeContext(context: BrowserContext): void {\n if (observedContexts.has(context)) return;\n observedContexts.add(context);\n ensureContextState(context);\n\n context.addInitScript(STEALTH_SCRIPT).catch((e) => {\n if (process.env.DEBUG) console.warn('[browserclaw] stealth initScript failed:', e.message);\n });\n\n for (const page of context.pages()) {\n ensurePageState(page);\n applyStealthToPage(page);\n }\n context.on('page', (page) => {\n ensurePageState(page);\n applyStealthToPage(page);\n });\n}\n\nfunction observeBrowser(browser: Browser): void {\n for (const context of browser.contexts()) observeContext(context);\n}\n\n// ── Role Refs Storage ──\n\nexport function storeRoleRefsForTarget(opts: {\n page: Page;\n cdpUrl: string;\n targetId?: string;\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n}): void {\n const state = ensurePageState(opts.page);\n state.roleRefs = opts.refs;\n state.roleRefsFrameSelector = opts.frameSelector;\n state.roleRefsMode = opts.mode;\n\n const targetId = opts.targetId?.trim();\n if (!targetId) return;\n roleRefsByTarget.set(roleRefsKey(opts.cdpUrl, targetId), {\n refs: opts.refs,\n ...(opts.frameSelector ? { frameSelector: opts.frameSelector } : {}),\n ...(opts.mode ? { mode: opts.mode } : {}),\n });\n while (roleRefsByTarget.size > MAX_ROLE_REFS_CACHE) {\n const first = roleRefsByTarget.keys().next();\n if (first.done) break;\n roleRefsByTarget.delete(first.value);\n }\n}\n\nexport function restoreRoleRefsForTarget(opts: {\n cdpUrl: string;\n targetId?: string;\n page: Page;\n}): void {\n const targetId = opts.targetId?.trim() || '';\n if (!targetId) return;\n const entry = roleRefsByTarget.get(roleRefsKey(opts.cdpUrl, targetId));\n if (!entry) return;\n const state = ensurePageState(opts.page);\n if (state.roleRefs) return;\n state.roleRefs = entry.refs;\n state.roleRefsFrameSelector = entry.frameSelector;\n state.roleRefsMode = entry.mode;\n}\n\n// ── Connect to Browser ──\n\nexport async function connectBrowser(cdpUrl: string, authToken?: string): Promise<{ browser: Browser; cdpUrl: string; authToken?: string }> {\n const normalized = normalizeCdpUrl(cdpUrl);\n if (cached?.cdpUrl === normalized) return cached;\n\n const existing = connectingByUrl.get(normalized);\n if (existing) return await existing;\n\n const connectWithRetry = async () => {\n let lastErr: unknown;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const timeout = 5000 + attempt * 2000;\n const endpoint = await getChromeWebSocketUrl(normalized, timeout, authToken).catch(() => null) ?? normalized;\n const headers: Record<string, string> = {};\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n const browser = await chromium.connectOverCDP(endpoint, { timeout, headers });\n const connected = { browser, cdpUrl: normalized, authToken };\n cached = connected;\n observeBrowser(browser);\n browser.on('disconnected', () => {\n if (cached?.browser === browser) cached = null;\n for (const key of roleRefsByTarget.keys()) {\n if (key.startsWith(normalized + '::')) roleRefsByTarget.delete(key);\n }\n });\n return connected;\n } catch (err) {\n lastErr = err;\n if ((err instanceof Error ? err.message : String(err)).includes('rate limit')) break;\n await new Promise(r => setTimeout(r, 250 + attempt * 250));\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error('CDP connect failed');\n };\n\n const promise = connectWithRetry().finally(() => { connectingByUrl.delete(normalized); });\n connectingByUrl.set(normalized, promise);\n return await promise;\n}\n\nexport async function disconnectBrowser(): Promise<void> {\n if (connectingByUrl.size) {\n for (const p of connectingByUrl.values()) {\n try { await p; } catch {}\n }\n }\n const cur = cached;\n cached = null;\n if (cur) await cur.browser.close().catch(() => {});\n}\n\n/**\n * Best-effort termination of stuck page operations via raw CDP websocket.\n * Bypasses Playwright entirely — important because Playwright may be stuck.\n */\nasync function tryTerminateExecutionViaCdp(cdpUrl: string, targetId: string): Promise<void> {\n const httpBase = normalizeCdpHttpBaseForJsonEndpoints(cdpUrl);\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), 2000);\n let targets: any[];\n try {\n const res = await fetch(`${httpBase}/json/list`, { signal: ctrl.signal });\n if (!res.ok) return;\n targets = await res.json();\n } catch { return; }\n finally { clearTimeout(t); }\n\n if (!Array.isArray(targets)) return;\n const target = targets.find((entry: any) => String(entry?.id ?? '').trim() === targetId);\n const wsUrl = String(target?.webSocketDebuggerUrl ?? '').trim();\n if (!wsUrl) return;\n\n await new Promise<void>((resolve) => {\n let done = false;\n const finish = () => { if (done) return; done = true; clearTimeout(timer); try { ws.close(); } catch {} resolve(); };\n const timer = setTimeout(finish, 2000);\n let ws: WebSocket;\n try { ws = new WebSocket(wsUrl); } catch { finish(); return; }\n ws.onopen = () => {\n try { ws.send(JSON.stringify({ id: 1, method: 'Runtime.terminateExecution' })); } catch {}\n setTimeout(finish, 300);\n };\n ws.onerror = () => finish();\n ws.onclose = () => finish();\n });\n}\n\n/**\n * Force-disconnect a Playwright browser connection for a given CDP target.\n * Clears the connection cache, sends Runtime.terminateExecution via raw CDP\n * websocket to kill stuck evals (bypassing Playwright), and closes the browser.\n */\nexport async function forceDisconnectPlaywrightForTarget(opts: {\n cdpUrl: string;\n targetId?: string;\n reason?: string;\n}): Promise<void> {\n const normalized = normalizeCdpUrl(opts.cdpUrl);\n const cur = cached;\n if (!cur || cur.cdpUrl !== normalized) return;\n\n cached = null;\n connectingByUrl.delete(normalized);\n\n const targetId = opts.targetId?.trim() || '';\n if (targetId) {\n await tryTerminateExecutionViaCdp(normalized, targetId).catch(() => {});\n }\n\n cur.browser.close().catch(() => {});\n}\n\n// ── Page Lookup ──\n\n/** CDP target entry from /json/list endpoint. */\ninterface CdpTarget {\n id: string;\n url: string;\n title?: string;\n type?: string;\n webSocketDebuggerUrl?: string;\n}\n\nexport async function getAllPages(browser: Browser) {\n return browser.contexts().flatMap(c => c.pages());\n}\n\nexport async function pageTargetId(page: Page): Promise<string | null> {\n const session = await page.context().newCDPSession(page);\n try {\n const info = await session.send('Target.getTargetInfo');\n const targetInfo = (info as { targetInfo?: { targetId?: string } }).targetInfo;\n return String(targetInfo?.targetId ?? '').trim() || null;\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nexport async function findPageByTargetId(browser: Browser, targetId: string, cdpUrl?: string) {\n const pages = await getAllPages(browser);\n let resolvedViaCdp = false;\n for (const page of pages) {\n let tid: string | null = null;\n try {\n tid = await pageTargetId(page);\n resolvedViaCdp = true;\n } catch {\n tid = null;\n }\n if (tid && tid === targetId) return page;\n }\n // Extension relays can block CDP attachment APIs entirely. If that happens and\n // Playwright only exposes one page, return it as the best available mapping.\n if (!resolvedViaCdp && pages.length === 1) {\n return pages[0];\n }\n\n // Fallback: match by URL from /json/list\n if (cdpUrl) {\n try {\n const listUrl = `${normalizeCdpHttpBaseForJsonEndpoints(cdpUrl)}/json/list`;\n const headers: Record<string, string> = {};\n if (cached?.authToken) headers['Authorization'] = `Bearer ${cached.authToken}`;\n const response = await fetch(listUrl, { headers });\n if (response.ok) {\n const targets = await response.json() as CdpTarget[];\n const target = targets.find(t => t.id === targetId);\n if (target) {\n const urlMatch = pages.filter(p => p.url() === target.url);\n if (urlMatch.length === 1) return urlMatch[0];\n if (urlMatch.length > 1) {\n const sameUrlTargets = targets.filter(t => t.url === target.url);\n if (sameUrlTargets.length === urlMatch.length) {\n const idx = sameUrlTargets.findIndex(t => t.id === targetId);\n if (idx >= 0 && idx < urlMatch.length) return urlMatch[idx];\n }\n }\n }\n }\n } catch {}\n }\n return null;\n}\n\nexport async function getPageForTargetId(opts: { cdpUrl: string; targetId?: string }) {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = await getAllPages(browser);\n if (!pages.length) throw new Error('No pages available in the connected browser.');\n const first = pages[0]!;\n if (!opts.targetId) return first;\n const found = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!found) {\n if (pages.length === 1) return first;\n throw new Error(`Tab not found (targetId: ${opts.targetId}). Call browser.tabs() to list open tabs.`);\n }\n return found;\n}\n\n// ── Ref Locator ──\n\nexport function refLocator(page: Page, ref: string) {\n const normalized = ref.startsWith('@') ? ref.slice(1) : ref.startsWith('ref=') ? ref.slice(4) : ref;\n if (!normalized.trim()) throw new Error('ref is required');\n\n if (/^e\\d+$/.test(normalized)) {\n const state = pageStates.get(page);\n\n // Aria mode: use aria-ref locator\n if (state?.roleRefsMode === 'aria') {\n return (state.roleRefsFrameSelector ? page.frameLocator(state.roleRefsFrameSelector) : page)\n .locator(`aria-ref=${normalized}`);\n }\n\n // Role mode: use getByRole\n const info = state?.roleRefs?.[normalized];\n if (!info) throw new Error(`Unknown ref \"${normalized}\". Run a new snapshot and use a ref from that snapshot.`);\n\n const locAny = state?.roleRefsFrameSelector\n ? page.frameLocator(state.roleRefsFrameSelector)\n : page;\n const role = info.role as Parameters<Page['getByRole']>[0];\n const locator = info.name\n ? locAny.getByRole(role, { name: info.name, exact: true })\n : locAny.getByRole(role);\n return info.nth !== undefined ? locator.nth(info.nth) : locator;\n }\n\n return page.locator(`aria-ref=${normalized}`);\n}\n\n// ── Error Helpers ──\n\nexport function toAIFriendlyError(error: unknown, selector: string): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('strict mode violation')) {\n const countMatch = message.match(/resolved to (\\d+) elements/);\n const count = countMatch ? countMatch[1] : 'multiple';\n return new Error(`Selector \"${selector}\" matched ${count} elements. Run a new snapshot to get updated refs, or use a different ref.`);\n }\n if ((message.includes('Timeout') || message.includes('waiting for')) &&\n (message.includes('to be visible') || message.includes('not visible'))) {\n return new Error(`Element \"${selector}\" not found or not visible. Run a new snapshot to see current page elements.`);\n }\n if (message.includes('intercepts pointer events') || message.includes('not visible') || message.includes('not receive pointer events')) {\n return new Error(`Element \"${selector}\" is not interactable (hidden or covered). Try scrolling it into view, closing overlays, or re-snapshotting.`);\n }\n return error instanceof Error ? error : new Error(message);\n}\n\nexport function normalizeTimeoutMs(timeoutMs: number | undefined, fallback: number, maxMs = 120000): number {\n return Math.max(500, Math.min(maxMs, timeoutMs ?? fallback));\n}\n","import type { RoleRefs, RoleRefInfo } from '../types.js';\n\nexport const INTERACTIVE_ROLES = new Set([\n 'button', 'link', 'textbox', 'checkbox', 'radio', 'combobox', 'listbox',\n 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'searchbox',\n 'slider', 'spinbutton', 'switch', 'tab', 'treeitem',\n]);\n\nexport const CONTENT_ROLES = new Set([\n 'heading', 'cell', 'gridcell', 'columnheader', 'rowheader',\n 'listitem', 'article', 'region', 'main', 'navigation',\n]);\n\nexport const STRUCTURAL_ROLES = new Set([\n 'generic', 'group', 'list', 'table', 'row', 'rowgroup', 'grid', 'treegrid',\n 'menu', 'menubar', 'toolbar', 'tablist', 'tree', 'directory', 'document',\n 'application', 'presentation', 'none',\n]);\n\nfunction getIndentLevel(line: string): number {\n const match = line.match(/^(\\s*)/);\n return match ? Math.floor(match[1]!.length / 2) : 0;\n}\n\ninterface ParsedSnapshotLine {\n roleRaw: string;\n role: string;\n name?: string;\n suffix: string;\n}\n\nfunction matchInteractiveSnapshotLine(\n line: string,\n options: SnapshotBuildOptions,\n): ParsedSnapshotLine | null {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) {\n return null;\n }\n const match = line.match(/^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/);\n if (!match) {\n return null;\n }\n const [, , roleRaw, name, suffix] = match;\n if (roleRaw!.startsWith('/')) {\n return null;\n }\n const role = roleRaw!.toLowerCase();\n return {\n roleRaw: roleRaw!,\n role,\n ...(name ? { name } : {}),\n suffix: suffix!,\n };\n}\n\nfunction createRoleNameTracker() {\n const counts = new Map<string, number>();\n const refsByKey = new Map<string, string[]>();\n\n return {\n counts,\n refsByKey,\n getKey(role: string, name?: string): string {\n return `${role}:${name ?? ''}`;\n },\n getNextIndex(role: string, name?: string): number {\n const key = this.getKey(role, name);\n const current = counts.get(key) ?? 0;\n counts.set(key, current + 1);\n return current;\n },\n trackRef(role: string, name: string | undefined, ref: string): void {\n const key = this.getKey(role, name);\n const list = refsByKey.get(key) ?? [];\n list.push(ref);\n refsByKey.set(key, list);\n },\n getDuplicateKeys(): Set<string> {\n const out = new Set<string>();\n for (const [key, refs] of refsByKey) if (refs.length > 1) out.add(key);\n return out;\n },\n };\n}\n\nfunction removeNthFromNonDuplicates(refs: RoleRefs, tracker: ReturnType<typeof createRoleNameTracker>): void {\n const duplicates = tracker.getDuplicateKeys();\n for (const [ref, data] of Object.entries(refs)) {\n const key = tracker.getKey(data.role, data.name);\n if (!duplicates.has(key)) delete refs[ref]?.nth;\n }\n}\n\nfunction compactTree(tree: string): string {\n const lines = tree.split('\\n');\n const result: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (line.includes('[ref=')) { result.push(line); continue; }\n if (line.includes(':') && !line.trimEnd().endsWith(':')) { result.push(line); continue; }\n const currentIndent = getIndentLevel(line);\n let hasRelevantChildren = false;\n for (let j = i + 1; j < lines.length; j++) {\n if (getIndentLevel(lines[j]!) <= currentIndent) break;\n if (lines[j]?.includes('[ref=')) { hasRelevantChildren = true; break; }\n }\n if (hasRelevantChildren) result.push(line);\n }\n return result.join('\\n');\n}\n\nexport interface SnapshotBuildOptions {\n interactive?: boolean;\n compact?: boolean;\n maxDepth?: number;\n}\n\n/**\n * Build a role snapshot from Playwright's ariaSnapshot() output.\n * Assigns ref IDs (e1, e2, ...) to interactive/content elements.\n */\nexport function buildRoleSnapshotFromAriaSnapshot(\n ariaSnapshot: string,\n options: SnapshotBuildOptions = {},\n): { snapshot: string; refs: RoleRefs } {\n const lines = ariaSnapshot.split('\\n');\n const refs: RoleRefs = {};\n const tracker = createRoleNameTracker();\n let counter = 0;\n const nextRef = () => { counter++; return `e${counter}`; };\n\n if (options.interactive) {\n const result: string[] = [];\n for (const line of lines) {\n const parsed = matchInteractiveSnapshotLine(line, options);\n if (!parsed) continue;\n const { roleRaw, role, name, suffix } = parsed;\n if (!INTERACTIVE_ROLES.has(role)) continue;\n const prefix = line.match(/^(\\s*-\\s*)/)?.[1] ?? '';\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n refs[ref] = { role, name, nth };\n let enhanced = `${prefix}${roleRaw}`;\n if (name) enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${nth}]`;\n if (suffix.includes('[')) enhanced += suffix;\n result.push(enhanced);\n }\n removeNthFromNonDuplicates(refs, tracker);\n return { snapshot: result.join('\\n') || '(no interactive elements)', refs };\n }\n\n const result: string[] = [];\n for (const line of lines) {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) continue;\n const match = line.match(/^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/);\n if (!match) { result.push(line); continue; }\n const [, prefix, roleRaw, name, suffix] = match;\n if (roleRaw!.startsWith('/')) { result.push(line); continue; }\n const role = roleRaw!.toLowerCase();\n const isInteractive = INTERACTIVE_ROLES.has(role);\n const isContent = CONTENT_ROLES.has(role);\n const isStructural = STRUCTURAL_ROLES.has(role);\n if (options.compact && isStructural && !name) continue;\n if (!(isInteractive || (isContent && name))) { result.push(line); continue; }\n\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n refs[ref] = { role, name, nth };\n\n let enhanced = `${prefix}${roleRaw}`;\n if (name) enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${nth}]`;\n if (suffix) enhanced += suffix;\n result.push(enhanced);\n }\n removeNthFromNonDuplicates(refs, tracker);\n const tree = result.join('\\n') || '(empty)';\n return { snapshot: options.compact ? compactTree(tree) : tree, refs };\n}\n\n/**\n * Build a role snapshot from Playwright's AI snapshot output.\n * Preserves Playwright's own aria-ref ids (e.g. ref=e13).\n */\nexport function buildRoleSnapshotFromAiSnapshot(\n aiSnapshot: string,\n options: SnapshotBuildOptions = {},\n): { snapshot: string; refs: RoleRefs } {\n const lines = String(aiSnapshot ?? '').split('\\n');\n const refs: RoleRefs = {};\n\n function parseAiSnapshotRef(suffix: string): string | null {\n const match = suffix.match(/\\[ref=(e\\d+)\\]/i);\n return match ? match[1]! : null;\n }\n\n if (options.interactive) {\n const out: string[] = [];\n for (const line of lines) {\n const parsed = matchInteractiveSnapshotLine(line, options);\n if (!parsed) continue;\n const { roleRaw, role, name, suffix } = parsed;\n if (!INTERACTIVE_ROLES.has(role)) continue;\n const ref = parseAiSnapshotRef(suffix);\n if (!ref) continue;\n const prefix = line.match(/^(\\s*-\\s*)/)?.[1] ?? '';\n refs[ref] = { role, ...(name ? { name } : {}) };\n out.push(`${prefix}${roleRaw}${name ? ` \"${name}\"` : ''}${suffix}`);\n }\n return { snapshot: out.join('\\n') || '(no interactive elements)', refs };\n }\n\n const out: string[] = [];\n for (const line of lines) {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) continue;\n const match = line.match(/^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/);\n if (!match) { out.push(line); continue; }\n const [, , roleRaw, name, suffix] = match;\n if (roleRaw!.startsWith('/')) { out.push(line); continue; }\n const role = roleRaw!.toLowerCase();\n const isStructural = STRUCTURAL_ROLES.has(role);\n if (options.compact && isStructural && !name) continue;\n const ref = parseAiSnapshotRef(suffix!);\n if (ref) refs[ref] = { role, ...(name ? { name } : {}) };\n out.push(line);\n }\n const tree = out.join('\\n') || '(empty)';\n return { snapshot: options.compact ? compactTree(tree) : tree, refs };\n}\n\nexport function getRoleSnapshotStats(snapshot: string, refs: RoleRefs) {\n const interactive = Object.values(refs).filter(r => INTERACTIVE_ROLES.has(r.role)).length;\n return {\n lines: snapshot.split('\\n').length,\n chars: snapshot.length,\n refs: Object.keys(refs).length,\n interactive,\n };\n}\n","import { getPageForTargetId, ensurePageState, storeRoleRefsForTarget, normalizeTimeoutMs } from '../connection.js';\nimport type { PageWithAI } from '../connection.js';\nimport { buildRoleSnapshotFromAiSnapshot, getRoleSnapshotStats } from './ref-map.js';\nimport type { SnapshotResult, SnapshotOptions } from '../types.js';\n\n/**\n * Take an AI-readable snapshot using Playwright's _snapshotForAI.\n * This is the primary snapshot method — uses Playwright's built-in AI mode.\n */\nexport async function snapshotAi(opts: {\n cdpUrl: string;\n targetId?: string;\n maxChars?: number;\n timeoutMs?: number;\n options?: SnapshotOptions;\n}): Promise<SnapshotResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const maybe = page as PageWithAI;\n if (!maybe._snapshotForAI) {\n throw new Error('Playwright _snapshotForAI is not available. Upgrade playwright-core to >= 1.50.');\n }\n\n const sourceUrl = page.url();\n\n const result = await maybe._snapshotForAI({\n timeout: normalizeTimeoutMs(opts.timeoutMs, 5000, 60000),\n track: 'response',\n });\n\n let snapshot = String(result?.full ?? '');\n const maxChars = opts.maxChars;\n const limit = typeof maxChars === 'number' && Number.isFinite(maxChars) && maxChars > 0\n ? Math.floor(maxChars) : undefined;\n\n if (limit && snapshot.length > limit) {\n const lastNewline = snapshot.lastIndexOf('\\n', limit);\n const cutoff = lastNewline > 0 ? lastNewline : limit;\n snapshot = `${snapshot.slice(0, cutoff)}\\n\\n[...TRUNCATED - page too large]`;\n }\n\n const built = buildRoleSnapshotFromAiSnapshot(snapshot, opts.options);\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n mode: 'aria',\n });\n\n return {\n snapshot: built.snapshot,\n refs: built.refs,\n stats: getRoleSnapshotStats(built.snapshot, built.refs),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n}\n","import { getPageForTargetId, ensurePageState, storeRoleRefsForTarget, normalizeTimeoutMs } from '../connection.js';\nimport type { PageWithAI } from '../connection.js';\nimport {\n buildRoleSnapshotFromAriaSnapshot,\n buildRoleSnapshotFromAiSnapshot,\n getRoleSnapshotStats,\n} from './ref-map.js';\nimport type { SnapshotResult, AriaSnapshotResult, AriaNode } from '../types.js';\n\n/**\n * Take a role-based snapshot using Playwright's ariaSnapshot().\n * This produces a tree with ref IDs that can be targeted by actions.\n *\n * When `refsMode === 'aria'`, uses Playwright's `_snapshotForAI()` instead\n * and stores refs in aria mode (resolved via aria-ref locators).\n */\nexport async function snapshotRole(opts: {\n cdpUrl: string;\n targetId?: string;\n selector?: string;\n frameSelector?: string;\n refsMode?: 'role' | 'aria';\n timeoutMs?: number;\n options?: {\n interactive?: boolean;\n compact?: boolean;\n maxDepth?: number;\n };\n}): Promise<SnapshotResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const sourceUrl = page.url();\n\n // refs=aria sub-path: use _snapshotForAI instead of ariaSnapshot\n if (opts.refsMode === 'aria') {\n if (opts.selector?.trim() || opts.frameSelector?.trim()) {\n throw new Error('refs=aria does not support selector/frame snapshots yet.');\n }\n const maybe = page as PageWithAI;\n if (!maybe._snapshotForAI) {\n throw new Error('refs=aria requires Playwright _snapshotForAI support.');\n }\n const result = await maybe._snapshotForAI({ timeout: 5000, track: 'response' });\n const built = buildRoleSnapshotFromAiSnapshot(String(result?.full ?? ''), opts.options);\n\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n mode: 'aria',\n });\n\n return {\n snapshot: built.snapshot,\n refs: built.refs,\n stats: getRoleSnapshotStats(built.snapshot, built.refs),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n }\n\n const frameSelector = opts.frameSelector?.trim() || '';\n const selector = opts.selector?.trim() || '';\n const locator = frameSelector\n ? (selector\n ? page.frameLocator(frameSelector).locator(selector)\n : page.frameLocator(frameSelector).locator(':root'))\n : (selector\n ? page.locator(selector)\n : page.locator(':root'));\n\n const ariaSnapshot = await locator.ariaSnapshot({ timeout: normalizeTimeoutMs(opts.timeoutMs, 5000) });\n const built = buildRoleSnapshotFromAriaSnapshot(String(ariaSnapshot ?? ''), opts.options);\n\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n frameSelector: frameSelector || undefined,\n mode: 'role',\n });\n\n return {\n snapshot: built.snapshot,\n refs: built.refs,\n stats: getRoleSnapshotStats(built.snapshot, built.refs),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n}\n\n/** CDP accessibility tree node from Accessibility.getFullAXTree. */\ninterface CdpAXNode {\n nodeId: string;\n childIds?: string[];\n role?: { value?: string | number | boolean };\n name?: { value?: string | number | boolean };\n value?: { value?: string | number | boolean };\n description?: { value?: string | number | boolean };\n backendDOMNodeId?: number;\n}\n\n/**\n * Take a raw ARIA accessibility tree snapshot via CDP.\n */\nexport async function snapshotAria(opts: {\n cdpUrl: string;\n targetId?: string;\n limit?: number;\n}): Promise<AriaSnapshotResult> {\n const limit = Math.max(1, Math.min(2000, Math.floor(opts.limit ?? 500)));\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const sourceUrl = page.url();\n\n const session = await page.context().newCDPSession(page);\n try {\n await session.send('Accessibility.enable').catch(() => {});\n const res = await session.send('Accessibility.getFullAXTree') as { nodes?: CdpAXNode[] };\n return {\n nodes: formatAriaNodes(Array.isArray(res?.nodes) ? res.nodes : [], limit),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-aria-tree',\n capturedAt: new Date().toISOString(),\n },\n };\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nfunction axValue(v: { value?: string | number | boolean } | undefined): string {\n if (!v || typeof v !== 'object') return '';\n const value = v.value;\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return '';\n}\n\nfunction formatAriaNodes(nodes: CdpAXNode[], limit: number): AriaNode[] {\n const byId = new Map<string, CdpAXNode>();\n for (const n of nodes) if (n.nodeId) byId.set(n.nodeId, n);\n\n const referenced = new Set<string>();\n for (const n of nodes) for (const c of n.childIds ?? []) referenced.add(c);\n\n const root = nodes.find(n => n.nodeId && !referenced.has(n.nodeId)) ?? nodes[0];\n if (!root?.nodeId) return [];\n\n const out: AriaNode[] = [];\n const stack: Array<{ id: string; depth: number }> = [{ id: root.nodeId, depth: 0 }];\n\n while (stack.length && out.length < limit) {\n const popped = stack.pop();\n if (!popped) break;\n const { id, depth } = popped;\n const n = byId.get(id);\n if (!n) continue;\n\n const role = axValue(n.role);\n const name = axValue(n.name);\n const value = axValue(n.value);\n const description = axValue(n.description);\n const ref = `ax${out.length + 1}`;\n\n out.push({\n ref,\n role: role || 'unknown',\n name: name || '',\n ...(value ? { value } : {}),\n ...(description ? { description } : {}),\n ...(typeof n.backendDOMNodeId === 'number' ? { backendDOMNodeId: n.backendDOMNodeId } : {}),\n depth,\n });\n\n const children = (n.childIds ?? []).filter((c: string) => byId.has(c));\n for (let i = children.length - 1; i >= 0; i--) {\n if (children[i]) stack.push({ id: children[i], depth: depth + 1 });\n }\n }\n\n return out;\n}\n","import { resolve, normalize, dirname, basename, join, sep, relative, posix, win32 } from 'node:path';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { lookup as dnsLookupCb } from 'node:dns';\nimport { lstat, realpath, rename, rm } from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport * as ipaddr from 'ipaddr.js';\nimport type { SsrfPolicy, PinnedHostname } from './types.js';\n\nexport type LookupFn = typeof dnsLookup;\n\n/**\n * Thrown when a navigation URL is blocked by SSRF policy.\n * Callers can catch this specifically to distinguish navigation blocks\n * from other errors.\n */\nexport class InvalidBrowserNavigationUrlError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidBrowserNavigationUrlError';\n }\n}\n\n/** Options for browser navigation SSRF policy. */\nexport type BrowserNavigationPolicyOptions = {\n ssrfPolicy?: SsrfPolicy;\n};\n\n/** Playwright-compatible request interface for redirect chain inspection. */\nexport type BrowserNavigationRequestLike = {\n url(): string;\n redirectedFrom(): BrowserNavigationRequestLike | null;\n};\n\n/** Build a BrowserNavigationPolicyOptions from an SsrfPolicy. */\nexport function withBrowserNavigationPolicy(ssrfPolicy?: SsrfPolicy): BrowserNavigationPolicyOptions {\n return ssrfPolicy ? { ssrfPolicy } : {};\n}\n\n// Only http: and https: are permitted for navigation; about:blank is the sole non-network exception.\nconst NETWORK_NAVIGATION_PROTOCOLS = new Set(['http:', 'https:']);\nconst SAFE_NON_NETWORK_URLS = new Set(['about:blank']);\n\nconst PROXY_ENV_KEYS = ['HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'http_proxy', 'https_proxy', 'all_proxy'];\n\nconst BLOCKED_HOSTNAMES = new Set([\n 'localhost',\n 'localhost.localdomain',\n 'metadata.google.internal',\n]);\n\nfunction isAllowedNonNetworkNavigationUrl(parsed: URL): boolean {\n return SAFE_NON_NETWORK_URLS.has(parsed.href);\n}\n\nfunction isPrivateNetworkAllowedByPolicy(policy?: SsrfPolicy): boolean {\n return policy?.dangerouslyAllowPrivateNetwork === true || policy?.allowPrivateNetwork === true;\n}\n\nfunction hasProxyEnvConfigured(env: Record<string, string | undefined> = process.env): boolean {\n for (const key of PROXY_ENV_KEYS) {\n const value = env[key];\n if (typeof value === 'string' && value.trim().length > 0) return true;\n }\n return false;\n}\n\n// ── Hostname normalization & blocking ──\n\nfunction normalizeHostname(hostname: string): string {\n let h = String(hostname ?? '').trim().toLowerCase();\n // Strip IPv6 brackets\n if (h.startsWith('[') && h.endsWith(']')) h = h.slice(1, -1);\n // Strip trailing dot (FQDN)\n if (h.endsWith('.')) h = h.slice(0, -1);\n return h;\n}\n\nfunction isBlockedHostnameNormalized(normalized: string): boolean {\n if (BLOCKED_HOSTNAMES.has(normalized)) return true;\n return normalized.endsWith('.localhost') || normalized.endsWith('.local') || normalized.endsWith('.internal');\n}\n\n// ── IP address checking via ipaddr.js ──\n\n/**\n * Validate a single IPv4 octet string: must be a plain decimal integer 0-255\n * with no leading zeros, hex prefixes, or other non-standard forms.\n */\nfunction isStrictDecimalOctet(part: string): boolean {\n if (!/^[0-9]+$/.test(part)) return false;\n const n = parseInt(part, 10);\n if (n < 0 || n > 255) return false;\n if (String(n) !== part) return false;\n return true;\n}\n\n/**\n * Returns true if the string looks like a legacy/non-standard IPv4 literal\n * that should be treated as internal and blocked (fail closed).\n */\nfunction isUnsupportedIPv4Literal(ip: string): boolean {\n if (/^[0-9]+$/.test(ip)) return true;\n const parts = ip.split('.');\n if (parts.length !== 4) return true;\n if (!parts.every(isStrictDecimalOctet)) return true;\n return false;\n}\n\nconst BLOCKED_IPV4_RANGES = new Set([\n 'unspecified', 'broadcast', 'multicast', 'linkLocal',\n 'loopback', 'carrierGradeNat', 'private', 'reserved',\n]);\n\nconst BLOCKED_IPV6_RANGES = new Set([\n 'unspecified', 'loopback', 'linkLocal', 'uniqueLocal', 'multicast',\n]);\n\nconst RFC2544_BENCHMARK_PREFIX: [ipaddr.IPv4, number] = [ipaddr.IPv4.parse('198.18.0.0'), 15];\n\ntype IsPrivateIpOpts = { allowRfc2544BenchmarkRange?: boolean };\n\nfunction isBlockedSpecialUseIpv4Address(address: ipaddr.IPv4, opts?: IsPrivateIpOpts): boolean {\n const inRfc2544 = address.match(RFC2544_BENCHMARK_PREFIX);\n if (inRfc2544 && opts?.allowRfc2544BenchmarkRange === true) return false;\n return BLOCKED_IPV4_RANGES.has(address.range()) || inRfc2544;\n}\n\nfunction isBlockedSpecialUseIpv6Address(address: ipaddr.IPv6): boolean {\n if (BLOCKED_IPV6_RANGES.has(address.range())) return true;\n // Deprecated site-local range (fec0::/10) — may not be caught by ipaddr.js range()\n return (address.parts[0] & 0xffc0) === 0xfec0;\n}\n\n/**\n * Extract embedded IPv4 from IPv6 transition formats (IPv4-mapped, NAT64, 6to4, Teredo)\n * and check if the embedded IPv4 is blocked. Returns null if not a transition format.\n */\nfunction extractEmbeddedIpv4FromIpv6(v6: ipaddr.IPv6, opts?: IsPrivateIpOpts): boolean | null {\n // IPv4-mapped (::ffff:a.b.c.d)\n if (v6.isIPv4MappedAddress()) {\n return isBlockedSpecialUseIpv4Address(v6.toIPv4Address(), opts);\n }\n\n const parts = v6.parts; // 8 x 16-bit groups\n\n // NAT64 well-known prefix: 64:ff9b::/96\n if (parts[0] === 0x0064 && parts[1] === 0xff9b &&\n parts[2] === 0x0000 && parts[3] === 0x0000 &&\n parts[4] === 0x0000 && parts[5] === 0x0000) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // NAT64 local-use prefix: 64:ff9b:1::/48\n if (parts[0] === 0x0064 && parts[1] === 0xff9b && parts[2] === 0x0001) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // 6to4 prefix: 2002::/16\n if (parts[0] === 0x2002) {\n const ip4str = `${(parts[1] >> 8) & 0xff}.${parts[1] & 0xff}.${(parts[2] >> 8) & 0xff}.${parts[2] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // Teredo prefix: 2001:0000::/32 — client IPv4 is in last 32 bits XOR'd with 0xFFFF\n if (parts[0] === 0x2001 && parts[1] === 0x0000) {\n const hiXored = parts[6] ^ 0xffff;\n const loXored = parts[7] ^ 0xffff;\n const ip4str = `${(hiXored >> 8) & 0xff}.${hiXored & 0xff}.${(loXored >> 8) & 0xff}.${loXored & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // SIIT/stateless translation prefix (::ffff:0:a.b.c.d) — rfc6145, parts[4]=0xffff, parts[0-3]=0, parts[5]=0\n if (parts[0] === 0 && parts[1] === 0 && parts[2] === 0 && parts[3] === 0 && parts[4] === 0xffff && parts[5] === 0) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // IPv4-compatible address (deprecated ::a.b.c.d) — parts[0-5] all zero, embedded IPv4 in parts[6-7]\n if (parts[0] === 0 && parts[1] === 0 && parts[2] === 0 && parts[3] === 0 && parts[4] === 0 && parts[5] === 0) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n // ISATAP — embedded IPv4 in parts[6-7], sentinel in parts[4-5]: 0x0000:0x5efe or 0x0200:0x5efe\n if ((parts[4] & 0xfdff) === 0 && parts[5] === 0x5efe) {\n const ip4str = `${(parts[6] >> 8) & 0xff}.${parts[6] & 0xff}.${(parts[7] >> 8) & 0xff}.${parts[7] & 0xff}`;\n try { return isBlockedSpecialUseIpv4Address(ipaddr.IPv4.parse(ip4str), opts); } catch { return true; }\n }\n\n return null; // not a known transition format\n}\n\n/**\n * Check whether an IP address string is private/internal/loopback.\n * Uses ipaddr.js for proper CIDR matching.\n */\nfunction isPrivateIpAddress(address: string, opts?: IsPrivateIpOpts): boolean {\n let normalized = address.trim().toLowerCase();\n if (normalized.startsWith('[') && normalized.endsWith(']')) normalized = normalized.slice(1, -1);\n if (!normalized) return false;\n\n // Try strict parse via ipaddr.js\n try {\n const parsed = ipaddr.parse(normalized);\n if (parsed.kind() === 'ipv4') {\n return isBlockedSpecialUseIpv4Address(parsed as ipaddr.IPv4, opts);\n }\n // IPv6\n const v6 = parsed as ipaddr.IPv6;\n if (isBlockedSpecialUseIpv6Address(v6)) return true;\n // Check for embedded IPv4 in transition formats\n const embeddedV4 = extractEmbeddedIpv4FromIpv6(v6, opts);\n if (embeddedV4 !== null) return embeddedV4;\n return false;\n } catch {\n // Parse failed\n }\n\n // Defense-in-depth: legacy IPv4 literal check (fail closed)\n if (!normalized.includes(':') && isUnsupportedIPv4Literal(normalized)) return true;\n\n // Unparseable IPv6-looking address — fail closed\n if (normalized.includes(':')) return true;\n\n return false;\n}\n\n// ── URL-level checks ──\n\n/**\n * Check whether a URL targets a loopback or private/internal network address.\n * Synchronous hostname-based check. Used to prevent SSRF attacks.\n */\nexport function isInternalUrl(url: string, opts?: IsPrivateIpOpts): boolean {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return true;\n }\n\n const hostname = normalizeHostname(parsed.hostname);\n if (isBlockedHostnameNormalized(hostname)) return true;\n if (isPrivateIpAddress(hostname, opts)) return true;\n\n return false;\n}\n\n// ── Hostname allowlist with wildcard pattern support ──\n\nfunction normalizeHostnameSet(values?: string[]): Set<string> {\n if (!values || values.length === 0) return new Set();\n return new Set(values.map((v) => normalizeHostname(v)).filter(Boolean));\n}\n\nfunction normalizeHostnameAllowlist(values?: string[]): string[] {\n if (!values || values.length === 0) return [];\n return Array.from(\n new Set(\n values\n .map((v) => normalizeHostname(v))\n .filter((v) => v !== '*' && v !== '*.' && v.length > 0)\n )\n );\n}\n\nfunction isHostnameAllowedByPattern(hostname: string, pattern: string): boolean {\n if (pattern.startsWith('*.')) {\n const suffix = pattern.slice(2);\n if (!suffix || hostname === suffix) return false;\n return hostname.endsWith(`.${suffix}`);\n }\n return hostname === pattern;\n}\n\nfunction matchesHostnameAllowlist(hostname: string, allowlist: string[]): boolean {\n if (allowlist.length === 0) return true; // empty allowlist = no restriction\n return allowlist.some((pattern) => isHostnameAllowedByPattern(hostname, pattern));\n}\n\n// ── DNS pinning (prevents TOCTOU rebinding) ──\n\nfunction dedupeAndPreferIpv4(results: { address: string; family: number }[]): string[] {\n const seen = new Set<string>();\n const ipv4: string[] = [];\n const ipv6: string[] = [];\n for (const r of results) {\n if (seen.has(r.address)) continue;\n seen.add(r.address);\n if (r.family === 4) ipv4.push(r.address);\n else ipv6.push(r.address);\n }\n return [...ipv4, ...ipv6];\n}\n\n/**\n * Create a pinned DNS lookup function that always resolves to the pre-resolved\n * addresses for the given hostname. Falls back to real DNS for other hostnames.\n */\nexport function createPinnedLookup(params: {\n hostname: string;\n addresses: string[];\n fallback?: typeof dnsLookupCb;\n}): typeof dnsLookupCb {\n const normalizedHost = normalizeHostname(params.hostname);\n const fallback = params.fallback ?? dnsLookupCb;\n const records = params.addresses.map((address) => ({\n address,\n family: address.includes(':') ? 6 as const : 4 as const,\n }));\n let index = 0;\n\n return ((host: string, options: any, callback?: any) => {\n const cb = typeof options === 'function' ? options : callback;\n if (!cb) return;\n\n const normalized = normalizeHostname(host);\n if (!normalized || normalized !== normalizedHost) {\n if (typeof options === 'function' || options === undefined) return (fallback as any)(host, cb);\n return (fallback as any)(host, options, cb);\n }\n\n const opts = typeof options === 'object' && options !== null ? options : {};\n const requestedFamily = typeof options === 'number' ? options : typeof opts.family === 'number' ? opts.family : 0;\n const candidates = requestedFamily === 4 || requestedFamily === 6\n ? records.filter((entry) => entry.family === requestedFamily)\n : records;\n const usable = candidates.length > 0 ? candidates : records;\n\n if (opts.all) {\n cb(null, usable);\n return;\n }\n const chosen = usable[index % usable.length];\n index += 1;\n cb(null, chosen.address, chosen.family);\n }) as typeof dnsLookupCb;\n}\n\n/**\n * Resolve DNS for a hostname and validate resolved addresses against SSRF policy.\n * Returns a PinnedHostname with pre-resolved addresses and a pinned lookup function.\n */\nexport async function resolvePinnedHostnameWithPolicy(hostname: string, params: {\n lookupFn?: LookupFn;\n policy?: SsrfPolicy;\n} = {}): Promise<PinnedHostname> {\n const normalized = normalizeHostname(hostname);\n if (!normalized) throw new InvalidBrowserNavigationUrlError(`Invalid hostname: \"${hostname}\"`);\n\n const allowPrivateNetwork = isPrivateNetworkAllowedByPolicy(params.policy);\n const allowedHostnames = normalizeHostnameSet(params.policy?.allowedHostnames);\n const hostnameAllowlist = normalizeHostnameAllowlist(params.policy?.hostnameAllowlist);\n const isExplicitlyAllowed = allowedHostnames.has(normalized);\n const skipPrivateNetworkChecks = allowPrivateNetwork || isExplicitlyAllowed;\n\n // hostnameAllowlist is a restriction: if specified, hostname must match a pattern\n if (!matchesHostnameAllowlist(normalized, hostnameAllowlist)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation blocked: hostname \"${hostname}\" is not in the allowlist.`\n );\n }\n\n // Check hostname itself\n if (!skipPrivateNetworkChecks) {\n if (isBlockedHostnameNormalized(normalized)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n const ipOpts: IsPrivateIpOpts = { allowRfc2544BenchmarkRange: params.policy?.allowRfc2544BenchmarkRange };\n if (isPrivateIpAddress(normalized, ipOpts)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n }\n\n // Resolve DNS\n const lookupFn = params.lookupFn ?? dnsLookup;\n let results: { address: string; family: number }[];\n try {\n results = await lookupFn(normalized, { all: true }) as unknown as { address: string; family: number }[];\n } catch {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: unable to resolve \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n\n if (!results || results.length === 0) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: unable to resolve \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n\n // Validate resolved addresses\n if (!skipPrivateNetworkChecks) {\n const ipOpts: IsPrivateIpOpts = { allowRfc2544BenchmarkRange: params.policy?.allowRfc2544BenchmarkRange };\n for (const r of results) {\n if (isPrivateIpAddress(r.address, ipOpts)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\" resolves to \"${r.address}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`\n );\n }\n }\n }\n\n const addresses = dedupeAndPreferIpv4(results);\n if (addresses.length === 0) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: unable to resolve \"${hostname}\".`\n );\n }\n\n return {\n hostname: normalized,\n addresses,\n lookup: createPinnedLookup({ hostname: normalized, addresses }),\n };\n}\n\n/**\n * Assert that a URL is allowed for browser navigation under the given SSRF policy.\n * Throws `InvalidBrowserNavigationUrlError` if the URL is blocked.\n */\nexport async function assertBrowserNavigationAllowed(opts: {\n url: string;\n lookupFn?: LookupFn;\n} & BrowserNavigationPolicyOptions): Promise<void> {\n const rawUrl = String(opts.url ?? '').trim();\n\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n throw new InvalidBrowserNavigationUrlError(`Invalid URL: \"${rawUrl}\"`);\n }\n\n // Block non-network protocols (file:, data:, javascript:, etc.) — only http/https allowed.\n if (!NETWORK_NAVIGATION_PROTOCOLS.has(parsed.protocol)) {\n if (isAllowedNonNetworkNavigationUrl(parsed)) return;\n throw new InvalidBrowserNavigationUrlError(`Navigation blocked: unsupported protocol \"${parsed.protocol}\"`);\n }\n\n // Fail closed when proxy env vars are set — SSRF checks cannot be reliably enforced\n if (hasProxyEnvConfigured() && !isPrivateNetworkAllowedByPolicy(opts.ssrfPolicy)) {\n throw new InvalidBrowserNavigationUrlError(\n 'Navigation blocked: strict browser SSRF policy cannot be enforced while env proxy variables are set'\n );\n }\n\n await resolvePinnedHostnameWithPolicy(parsed.hostname, {\n lookupFn: opts.lookupFn,\n policy: opts.ssrfPolicy,\n });\n}\n\n/**\n * Validate that an output file path is safe — no directory traversal or escape.\n */\nexport async function assertSafeOutputPath(path: string, allowedRoots?: string[]): Promise<void> {\n if (!path || typeof path !== 'string') {\n throw new Error('Output path is required.');\n }\n\n const normalized = normalize(path);\n\n if (normalized.includes('..')) {\n throw new Error(`Unsafe output path: directory traversal detected in \"${path}\".`);\n }\n\n if (allowedRoots?.length) {\n const resolved = resolve(normalized);\n\n let parentReal: string;\n try {\n parentReal = await realpath(dirname(resolved));\n } catch {\n throw new Error(`Unsafe output path: parent directory is inaccessible for \"${path}\".`);\n }\n\n try {\n const targetStat = await lstat(resolved);\n if (targetStat.isSymbolicLink()) {\n throw new Error(`Unsafe output path: \"${path}\" is a symbolic link.`);\n }\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n }\n\n const results = await Promise.all(\n allowedRoots.map(async (root) => {\n try {\n const rootStat = await lstat(resolve(root));\n if (!rootStat.isDirectory() || rootStat.isSymbolicLink()) return false;\n const rootReal = await realpath(resolve(root));\n return parentReal === rootReal || parentReal.startsWith(rootReal + sep);\n } catch {\n return false;\n }\n })\n );\n if (!results.some(Boolean)) {\n throw new Error(`Unsafe output path: \"${path}\" is outside allowed directories.`);\n }\n }\n}\n\n/**\n * Validate upload file paths immediately before use.\n */\nexport async function assertSafeUploadPaths(paths: string[]): Promise<void> {\n for (const filePath of paths) {\n let stat: Awaited<ReturnType<typeof lstat>>;\n try {\n stat = await lstat(filePath);\n } catch {\n throw new Error(`Upload path does not exist or is inaccessible: \"${filePath}\".`);\n }\n if (stat.isSymbolicLink()) {\n throw new Error(`Upload path is a symbolic link: \"${filePath}\".`);\n }\n if (!stat.isFile()) {\n throw new Error(`Upload path is not a regular file: \"${filePath}\".`);\n }\n }\n}\n\n// ── Atomic file write utilities ──\n\n/**\n * Sanitize an untrusted file name (e.g. from a download) to prevent path traversal.\n */\nexport function sanitizeUntrustedFileName(fileName: string, fallbackName: string): string {\n const trimmed = String(fileName ?? '').trim();\n if (!trimmed) return fallbackName;\n\n let base = posix.basename(trimmed);\n base = win32.basename(base);\n\n // Strip control characters\n let cleaned = '';\n for (let i = 0; i < base.length; i++) {\n const code = base.charCodeAt(i);\n if (code < 32 || code === 127) continue;\n cleaned += base[i];\n }\n base = cleaned.trim();\n\n if (!base || base === '.' || base === '..') return fallbackName;\n if (base.length > 200) base = base.slice(0, 200);\n return base;\n}\n\n/**\n * Build a sibling temp path for atomic writes.\n */\nfunction buildSiblingTempPath(targetPath: string): string {\n const id = randomUUID();\n const safeTail = sanitizeUntrustedFileName(basename(targetPath), 'output.bin');\n return join(dirname(targetPath), `.browserclaw-output-${id}-${safeTail}.part`);\n}\n\n/**\n * Write a file atomically via a sibling temp path.\n * The writeTemp callback should write the content to tempPath.\n * After writeTemp completes, the temp file is renamed to the target path.\n */\nexport async function writeViaSiblingTempPath(params: {\n rootDir: string;\n targetPath: string;\n writeTemp: (tempPath: string) => Promise<void>;\n}): Promise<void> {\n const rootDir = await realpath(resolve(params.rootDir)).catch(() => resolve(params.rootDir));\n const requestedTargetPath = resolve(params.targetPath);\n const targetPath = await realpath(dirname(requestedTargetPath))\n .then((realDir) => join(realDir, basename(requestedTargetPath)))\n .catch(() => requestedTargetPath);\n\n const relativeTargetPath = relative(rootDir, targetPath);\n if (\n !relativeTargetPath ||\n relativeTargetPath === '..' ||\n relativeTargetPath.startsWith(`..${sep}`) ||\n isAbsolute(relativeTargetPath)\n ) {\n throw new Error('Target path is outside the allowed root');\n }\n\n const tempPath = buildSiblingTempPath(targetPath);\n let renameSucceeded = false;\n try {\n await params.writeTemp(tempPath);\n await rename(tempPath, targetPath);\n renameSucceeded = true;\n } finally {\n if (!renameSucceeded) await rm(tempPath, { force: true }).catch(() => {});\n }\n}\n\nfunction isAbsolute(p: string): boolean {\n return p.startsWith('/') || /^[a-zA-Z]:/.test(p);\n}\n\n/**\n * Best-effort post-navigation guard for the final page URL.\n */\nexport async function assertBrowserNavigationResultAllowed(opts: {\n url: string;\n lookupFn?: LookupFn;\n} & BrowserNavigationPolicyOptions): Promise<void> {\n const rawUrl = String(opts.url ?? '').trim();\n if (!rawUrl) return;\n\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return;\n }\n\n if (NETWORK_NAVIGATION_PROTOCOLS.has(parsed.protocol) || isAllowedNonNetworkNavigationUrl(parsed)) {\n await assertBrowserNavigationAllowed(opts);\n }\n}\n\n/**\n * Walk the full redirect chain and validate each hop against the SSRF policy.\n */\nexport async function assertBrowserNavigationRedirectChainAllowed(opts: {\n request?: BrowserNavigationRequestLike | null;\n lookupFn?: LookupFn;\n} & BrowserNavigationPolicyOptions): Promise<void> {\n const chain: string[] = [];\n let current = opts.request ?? null;\n while (current) {\n chain.push(current.url());\n current = current.redirectedFrom();\n }\n for (const url of [...chain].reverse()) {\n await assertBrowserNavigationAllowed({ url, lookupFn: opts.lookupFn, ssrfPolicy: opts.ssrfPolicy });\n }\n}\n\n/**\n * Returns true if the SSRF policy requires redirect chain inspection.\n */\nexport function requiresInspectableBrowserNavigationRedirects(ssrfPolicy?: SsrfPolicy): boolean {\n return !isPrivateNetworkAllowedByPolicy(ssrfPolicy);\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpUploadArmId,\n bumpDialogArmId,\n} from '../connection.js';\nimport { assertSafeUploadPaths } from '../security.js';\nimport type { FormField } from '../types.js';\n\ntype MouseButton = 'left' | 'right' | 'middle';\ntype KeyModifier = 'Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift';\n\nconst MAX_CLICK_DELAY_MS = 5000;\n\nfunction resolveBoundedDelayMs(value: number | undefined, label: string, maxMs: number): number {\n const normalized = Math.floor(value ?? 0);\n if (!Number.isFinite(normalized) || normalized < 0) throw new Error(`${label} must be >= 0`);\n if (normalized > maxMs) throw new Error(`${label} exceeds maximum of ${maxMs}ms`);\n return normalized;\n}\n\nexport async function clickViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n doubleClick?: boolean;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n delayMs?: number;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const locator = refLocator(page, opts.ref);\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 8000, 60000);\n\n try {\n const delayMs = resolveBoundedDelayMs(opts.delayMs, 'click delayMs', MAX_CLICK_DELAY_MS);\n if (delayMs > 0) {\n await locator.hover({ timeout });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n if (opts.doubleClick) {\n await locator.dblclick({ timeout, button: opts.button, modifiers: opts.modifiers });\n } else {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers });\n }\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function hoverViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).hover({\n timeout: normalizeTimeoutMs(opts.timeoutMs, 8000, 60000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function typeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n text: string;\n submit?: boolean;\n slowly?: boolean;\n timeoutMs?: number;\n}): Promise<void> {\n const text = String(opts.text ?? '');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const locator = refLocator(page, opts.ref);\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 8000, 60000);\n\n try {\n if (opts.slowly) {\n await locator.click({ timeout });\n await locator.pressSequentially(text, { timeout, delay: 75 });\n } else {\n await locator.fill(text, { timeout });\n }\n if (opts.submit) await locator.press('Enter', { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function selectOptionViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n values: string[];\n timeoutMs?: number;\n}): Promise<void> {\n if (!opts.values?.length) throw new Error('values are required');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).selectOption(opts.values, {\n timeout: normalizeTimeoutMs(opts.timeoutMs, 8000, 60000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function dragViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n startRef: string;\n endRef: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.startRef).dragTo(refLocator(page, opts.endRef), {\n timeout: normalizeTimeoutMs(opts.timeoutMs, 8000, 60000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, `${opts.startRef} -> ${opts.endRef}`);\n }\n}\n\nexport async function fillFormViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fields: FormField[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 8000, 60000);\n\n for (const field of opts.fields) {\n const ref = field.ref.trim();\n const type = (typeof field.type === 'string' ? field.type.trim() : '') || 'text';\n const rawValue = field.value;\n const value = typeof rawValue === 'string' ? rawValue\n : typeof rawValue === 'number' || typeof rawValue === 'boolean' ? String(rawValue)\n : '';\n\n if (!ref) continue;\n const locator = refLocator(page, ref);\n\n if (type === 'checkbox' || type === 'radio') {\n const checked = rawValue === true || rawValue === 1 || rawValue === '1' || rawValue === 'true';\n try {\n await locator.setChecked(checked, { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, ref);\n }\n continue;\n }\n\n try {\n await locator.fill(value, { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, ref);\n }\n }\n}\n\nexport async function scrollIntoViewViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).scrollIntoViewIfNeeded({\n timeout: normalizeTimeoutMs(opts.timeoutMs, 20000),\n });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function highlightViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n try {\n await refLocator(page, opts.ref).highlight();\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function setInputFilesViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n element?: string;\n paths: string[];\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n if (!opts.paths.length) throw new Error('paths are required');\n\n const inputRef = typeof opts.ref === 'string' ? opts.ref.trim() : '';\n const element = typeof opts.element === 'string' ? opts.element.trim() : '';\n if (inputRef && element) throw new Error('ref and element are mutually exclusive');\n if (!inputRef && !element) throw new Error('Either ref or element is required for setInputFiles');\n\n const locator = inputRef\n ? refLocator(page, inputRef)\n : page.locator(element).first();\n\n await assertSafeUploadPaths(opts.paths);\n\n try {\n await locator.setInputFiles(opts.paths);\n } catch (err) {\n throw toAIFriendlyError(err, inputRef || element);\n }\n\n // Dispatch input+change events for frameworks that listen on these\n try {\n const handle = await locator.elementHandle();\n if (handle) {\n await handle.evaluate((el: Element) => {\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n });\n }\n } catch {\n // Best effort\n }\n}\n\nexport async function armDialogViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n accept: boolean;\n promptText?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const state = ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n state.armIdDialog = bumpDialogArmId();\n const armId = state.armIdDialog;\n\n page.waitForEvent('dialog', { timeout }).then(async (dialog) => {\n if (state.armIdDialog !== armId) return;\n if (opts.accept) await dialog.accept(opts.promptText);\n else await dialog.dismiss();\n }).catch(() => {});\n}\n\nexport async function armFileUploadViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n paths?: string[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const state = ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n state.armIdUpload = bumpUploadArmId();\n const armId = state.armIdUpload;\n\n page.waitForEvent('filechooser', { timeout }).then(async (fileChooser) => {\n if (state.armIdUpload !== armId) return;\n\n if (!opts.paths?.length) {\n try { await page.keyboard.press('Escape'); } catch {}\n return;\n }\n\n try {\n await assertSafeUploadPaths(opts.paths);\n } catch {\n try { await page.keyboard.press('Escape'); } catch {}\n return;\n }\n await fileChooser.setFiles(opts.paths);\n\n // Dispatch input+change events\n try {\n const input = typeof fileChooser.element === 'function' ? await Promise.resolve(fileChooser.element()) : null;\n if (input) {\n await (input as any).evaluate((el: Element) => {\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n });\n }\n } catch {}\n }).catch(() => {});\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\n\nexport async function pressKeyViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n key: string;\n delayMs?: number;\n}): Promise<void> {\n const key = String(opts.key ?? '').trim();\n if (!key) throw new Error('key is required');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.keyboard.press(key, { delay: Math.max(0, Math.floor(opts.delayMs ?? 0)) });\n}\n","import { connectBrowser, getPageForTargetId, ensurePageState, ensureContextState, pageTargetId, findPageByTargetId, getAllPages, normalizeTimeoutMs, forceDisconnectPlaywrightForTarget } from '../connection.js';\nimport { assertBrowserNavigationAllowed, assertBrowserNavigationResultAllowed, assertBrowserNavigationRedirectChainAllowed, withBrowserNavigationPolicy } from '../security.js';\nimport type { BrowserTab, SsrfPolicy } from '../types.js';\n\nfunction isRetryableNavigateError(err: unknown): boolean {\n const msg = typeof err === 'string' ? err.toLowerCase() : err instanceof Error ? err.message.toLowerCase() : '';\n return msg.includes('frame has been detached') || msg.includes('target page, context or browser has been closed');\n}\n\nexport async function navigateViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n url: string;\n timeoutMs?: number;\n ssrfPolicy?: SsrfPolicy;\n /** @deprecated Use ssrfPolicy: { dangerouslyAllowPrivateNetwork: true } instead */\n allowInternal?: boolean;\n}): Promise<{ url: string }> {\n const url = String(opts.url ?? '').trim();\n if (!url) throw new Error('url is required');\n const policy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n await assertBrowserNavigationAllowed({ url, ...withBrowserNavigationPolicy(policy) });\n\n const timeout = Math.max(1000, Math.min(120000, opts.timeoutMs ?? 20000));\n let page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const navigate = async () => await page.goto(url, { timeout });\n\n let response;\n try {\n response = await navigate();\n } catch (err) {\n if (!isRetryableNavigateError(err)) throw err;\n await forceDisconnectPlaywrightForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'retry navigate after detached frame',\n }).catch(() => {});\n page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n response = await navigate();\n }\n\n await assertBrowserNavigationRedirectChainAllowed({ request: response?.request(), ...withBrowserNavigationPolicy(policy) });\n const finalUrl = page.url();\n await assertBrowserNavigationResultAllowed({ url: finalUrl, ...withBrowserNavigationPolicy(policy) });\n return { url: finalUrl };\n}\n\nexport async function listPagesViaPlaywright(opts: { cdpUrl: string }): Promise<BrowserTab[]> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = await getAllPages(browser);\n const results: BrowserTab[] = [];\n for (const page of pages) {\n const tid = await pageTargetId(page).catch(() => null);\n if (tid) results.push({\n targetId: tid,\n title: await page.title().catch(() => ''),\n url: page.url(),\n type: 'page',\n });\n }\n return results;\n}\n\nexport async function createPageViaPlaywright(opts: {\n cdpUrl: string;\n url?: string;\n ssrfPolicy?: SsrfPolicy;\n /** @deprecated Use ssrfPolicy: { dangerouslyAllowPrivateNetwork: true } instead */\n allowInternal?: boolean;\n}): Promise<BrowserTab> {\n const targetUrl = (opts.url ?? '').trim() || 'about:blank';\n const policy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n if (targetUrl !== 'about:blank') {\n await assertBrowserNavigationAllowed({ url: targetUrl, ssrfPolicy: policy });\n }\n const { browser } = await connectBrowser(opts.cdpUrl);\n const context = browser.contexts()[0] ?? await browser.newContext();\n ensureContextState(context);\n const page = await context.newPage();\n ensurePageState(page);\n if (targetUrl !== 'about:blank') {\n const navigationPolicy = withBrowserNavigationPolicy(policy);\n const response = await page.goto(targetUrl, { timeout: 30000 }).catch(() => null);\n await assertBrowserNavigationRedirectChainAllowed({ request: response?.request(), ...navigationPolicy });\n await assertBrowserNavigationResultAllowed({ url: page.url(), ssrfPolicy: policy });\n }\n const tid = await pageTargetId(page).catch(() => null);\n if (!tid) throw new Error('Failed to get targetId for new page');\n return {\n targetId: tid,\n title: await page.title().catch(() => ''),\n url: page.url(),\n type: 'page',\n };\n}\n\nexport async function closePageViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.close();\n}\n\nexport async function closePageByTargetIdViaPlaywright(opts: {\n cdpUrl: string;\n targetId: string;\n}): Promise<void> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!page) throw new Error(`Tab not found (targetId: ${opts.targetId}). Use browser.tabs() to list open tabs.`);\n await page.close();\n}\n\nexport async function focusPageByTargetIdViaPlaywright(opts: {\n cdpUrl: string;\n targetId: string;\n}): Promise<void> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!page) throw new Error(`Tab not found (targetId: ${opts.targetId}). Use browser.tabs() to list open tabs.`);\n try {\n await page.bringToFront();\n } catch (err) {\n const session = await page.context().newCDPSession(page);\n try {\n await session.send('Page.bringToFront');\n } catch {\n throw err;\n } finally {\n await session.detach().catch(() => {});\n }\n }\n}\n\nexport async function resizeViewportViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n width: number;\n height: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.setViewportSize({\n width: Math.max(1, Math.floor(opts.width)),\n height: Math.max(1, Math.floor(opts.height)),\n });\n}\n","import { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from '../connection.js';\n\nconst MAX_WAIT_TIME_MS = 30000;\n\nexport async function waitForViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n timeMs?: number;\n text?: string;\n textGone?: string;\n selector?: string;\n url?: string;\n loadState?: 'load' | 'domcontentloaded' | 'networkidle';\n fn?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 20000);\n\n if (typeof opts.timeMs === 'number' && Number.isFinite(opts.timeMs)) {\n const bounded = Math.max(0, Math.min(MAX_WAIT_TIME_MS, Math.floor(opts.timeMs)));\n await page.waitForTimeout(bounded);\n }\n if (opts.text) {\n await page.getByText(opts.text).first().waitFor({ state: 'visible', timeout });\n }\n if (opts.textGone) {\n await page.getByText(opts.textGone).first().waitFor({ state: 'hidden', timeout });\n }\n if (opts.selector) {\n const selector = String(opts.selector).trim();\n if (selector) await page.locator(selector).first().waitFor({ state: 'visible', timeout });\n }\n if (opts.url) {\n const url = String(opts.url).trim();\n if (url) await page.waitForURL(url, { timeout });\n }\n if (opts.loadState) {\n await page.waitForLoadState(opts.loadState, { timeout });\n }\n if (opts.fn) {\n const fn = String(opts.fn).trim();\n if (fn) await page.waitForFunction(fn, undefined, { timeout });\n }\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n normalizeTimeoutMs,\n forceDisconnectPlaywrightForTarget,\n} from '../connection.js';\n\nexport interface FrameEvalResult {\n frameUrl: string;\n frameName: string;\n result: unknown;\n}\n\n/**\n * Evaluate JavaScript in ALL frames (including cross-origin iframes).\n * Playwright can access cross-origin frames via CDP, bypassing same-origin policy.\n * Returns results from each frame where evaluation succeeded.\n */\nexport async function evaluateInAllFramesViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fn: string;\n}): Promise<FrameEvalResult[]> {\n const fnText = String(opts.fn ?? '').trim();\n if (!fnText) throw new Error('function is required');\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const frames = page.frames();\n const results: FrameEvalResult[] = [];\n\n for (const frame of frames) {\n try {\n // Runs in the frame's browser context (sandboxed), not in Node.js\n const result = await frame.evaluate(\n // eslint-disable-next-line no-eval\n (fnBody: string) => {\n 'use strict';\n try {\n const candidate = (0, eval)('(' + fnBody + ')');\n return typeof candidate === 'function' ? candidate() : candidate;\n } catch (err: unknown) {\n throw new Error('Invalid evaluate function: ' + (err instanceof Error ? err.message : String(err)));\n }\n },\n fnText,\n );\n results.push({\n frameUrl: frame.url(),\n frameName: frame.name(),\n result,\n });\n } catch {\n // Frame may have been detached or navigation in progress — skip\n }\n }\n\n return results;\n}\n\n/**\n * Race an eval promise against an abort promise.\n */\nasync function awaitEvalWithAbort(evalPromise: Promise<unknown>, abortPromise?: Promise<never>): Promise<unknown> {\n if (!abortPromise) return await evalPromise;\n try {\n return await Promise.race([evalPromise, abortPromise]);\n } catch (err) {\n // Suppress unhandled rejection from the eval promise if abort won the race\n evalPromise.catch(() => {});\n throw err;\n }\n}\n\n// Browser-side evaluator that wraps async results with a timeout via Promise.race.\n// This runs inside the browser sandbox (not Node.js) — `new Function` is the standard\n// pattern for browser-context evaluation with timeout, matching OpenClaw's implementation.\n// eslint-disable-next-line no-new-func\nconst BROWSER_EVALUATOR = new Function('args', `\n \"use strict\";\n var fnBody = args.fnBody, timeoutMs = args.timeoutMs;\n try {\n var candidate = eval(\"(\" + fnBody + \")\");\n var result = typeof candidate === \"function\" ? candidate() : candidate;\n if (result && typeof result.then === \"function\") {\n return Promise.race([\n result,\n new Promise(function(_, reject) {\n setTimeout(function() { reject(new Error(\"evaluate timed out after \" + timeoutMs + \"ms\")); }, timeoutMs);\n })\n ]);\n }\n return result;\n } catch (err) {\n throw new Error(\"Invalid evaluate function: \" + (err && err.message ? err.message : String(err)));\n }\n`);\n\n// eslint-disable-next-line no-new-func\nconst ELEMENT_EVALUATOR = new Function('el', 'args', `\n \"use strict\";\n var fnBody = args.fnBody, timeoutMs = args.timeoutMs;\n try {\n var candidate = eval(\"(\" + fnBody + \")\");\n var result = typeof candidate === \"function\" ? candidate(el) : candidate;\n if (result && typeof result.then === \"function\") {\n return Promise.race([\n result,\n new Promise(function(_, reject) {\n setTimeout(function() { reject(new Error(\"evaluate timed out after \" + timeoutMs + \"ms\")); }, timeoutMs);\n })\n ]);\n }\n return result;\n } catch (err) {\n throw new Error(\"Invalid evaluate function: \" + (err && err.message ? err.message : String(err)));\n }\n`);\n\n/**\n * Evaluate JavaScript in the browser page context.\n * This is intentionally using eval() to execute user-provided browser-side code,\n * which is the core purpose of this function — running arbitrary JS in the page.\n * The code runs in the browser sandbox, not in Node.js.\n */\nexport async function evaluateViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fn: string;\n ref?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n}): Promise<unknown> {\n const fnText = String(opts.fn ?? '').trim();\n if (!fnText) throw new Error('function is required');\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const outerTimeout = normalizeTimeoutMs(opts.timeoutMs, 20000);\n let evaluateTimeout = Math.max(1000, Math.min(120000, outerTimeout - 500));\n evaluateTimeout = Math.min(evaluateTimeout, outerTimeout);\n\n const signal = opts.signal;\n let abortListener: (() => void) | undefined;\n let abortReject: ((reason: unknown) => void) | undefined;\n let abortPromise: Promise<never> | undefined;\n\n if (signal) {\n abortPromise = new Promise<never>((_, reject) => {\n abortReject = reject;\n });\n abortPromise.catch(() => {});\n }\n\n if (signal) {\n const disconnect = () => {\n forceDisconnectPlaywrightForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'evaluate aborted',\n }).catch(() => {});\n };\n if (signal.aborted) {\n disconnect();\n throw signal.reason ?? new Error('aborted');\n }\n abortListener = () => {\n disconnect();\n abortReject?.(signal.reason ?? new Error('aborted'));\n };\n signal.addEventListener('abort', abortListener, { once: true });\n if (signal.aborted) {\n abortListener();\n throw signal.reason ?? new Error('aborted');\n }\n }\n\n try {\n if (opts.ref) {\n const locator = refLocator(page, opts.ref);\n return await awaitEvalWithAbort(\n locator.evaluate(ELEMENT_EVALUATOR as any, { fnBody: fnText, timeoutMs: evaluateTimeout }),\n abortPromise,\n );\n }\n\n return await awaitEvalWithAbort(\n page.evaluate(BROWSER_EVALUATOR as any, { fnBody: fnText, timeoutMs: evaluateTimeout }),\n abortPromise,\n );\n } finally {\n if (signal && abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpDownloadArmId,\n} from '../connection.js';\nimport { dirname } from 'node:path';\nimport { assertSafeOutputPath, writeViaSiblingTempPath } from '../security.js';\nimport type { DownloadResult } from '../types.js';\n\nexport async function downloadViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref: string;\n path: string;\n timeoutMs?: number;\n allowedOutputRoots?: string[];\n}): Promise<DownloadResult> {\n await assertSafeOutputPath(opts.path, opts.allowedOutputRoots);\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n const state = ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n const locator = refLocator(page, opts.ref);\n\n state.armIdDownload = bumpDownloadArmId();\n\n try {\n const [download] = await Promise.all([\n page.waitForEvent('download', { timeout }),\n locator.click({ timeout }),\n ]);\n\n // Atomic write via sibling temp path\n const outPath = opts.path;\n await writeViaSiblingTempPath({\n rootDir: dirname(outPath),\n targetPath: outPath,\n writeTemp: async (tempPath) => {\n await download.saveAs(tempPath);\n },\n });\n\n return {\n url: download.url(),\n suggestedFilename: download.suggestedFilename(),\n path: outPath,\n };\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n}\n\nexport async function waitForDownloadViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n path?: string;\n timeoutMs?: number;\n allowedOutputRoots?: string[];\n}): Promise<DownloadResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n\n const download = await page.waitForEvent('download', { timeout });\n const savePath = opts.path ?? download.suggestedFilename();\n await assertSafeOutputPath(savePath, opts.allowedOutputRoots);\n\n await writeViaSiblingTempPath({\n rootDir: dirname(savePath),\n targetPath: savePath,\n writeTemp: async (tempPath) => {\n await download.saveAs(tempPath);\n },\n });\n\n return {\n url: download.url(),\n suggestedFilename: download.suggestedFilename(),\n path: savePath,\n };\n}\n","import { devices } from 'playwright-core';\nimport {\n getPageForTargetId,\n ensurePageState,\n} from '../connection.js';\nimport type { ColorScheme } from '../types.js';\n\nexport async function emulateMediaViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n colorScheme: ColorScheme;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.emulateMedia({ colorScheme: opts.colorScheme });\n}\n\nexport async function setDeviceViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n name: string;\n}): Promise<void> {\n const name = String(opts.name ?? '').trim();\n if (!name) throw new Error('device name is required');\n\n const device = devices[name];\n if (!device) {\n throw new Error(`Unknown device \"${name}\".`);\n }\n\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n if (device.viewport) {\n await page.setViewportSize({\n width: device.viewport.width,\n height: device.viewport.height,\n });\n }\n\n const session = await page.context().newCDPSession(page);\n try {\n const locale = (device as any).locale as string | undefined;\n if (device.userAgent || locale) {\n await session.send('Emulation.setUserAgentOverride', {\n userAgent: device.userAgent ?? '',\n acceptLanguage: locale ?? undefined,\n });\n }\n if (device.viewport) {\n await session.send('Emulation.setDeviceMetricsOverride', {\n mobile: Boolean(device.isMobile),\n width: device.viewport.width,\n height: device.viewport.height,\n deviceScaleFactor: device.deviceScaleFactor ?? 1,\n screenWidth: device.viewport.width,\n screenHeight: device.viewport.height,\n });\n }\n if (device.hasTouch) {\n await session.send('Emulation.setTouchEmulationEnabled', { enabled: true });\n }\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nexport async function setExtraHTTPHeadersViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n headers: Record<string, string>;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.context().setExtraHTTPHeaders(opts.headers);\n}\n\nexport async function setGeolocationViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n latitude?: number;\n longitude?: number;\n accuracy?: number;\n origin?: string;\n clear?: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const context = page.context();\n\n if (opts.clear) {\n await context.setGeolocation(null);\n await context.clearPermissions().catch(() => {});\n return;\n }\n\n if (typeof opts.latitude !== 'number' || typeof opts.longitude !== 'number') {\n throw new Error('latitude and longitude are required (or set clear=true)');\n }\n\n await context.setGeolocation({\n latitude: opts.latitude,\n longitude: opts.longitude,\n accuracy: typeof opts.accuracy === 'number' ? opts.accuracy : undefined,\n });\n\n const origin = opts.origin?.trim() || (() => {\n try { return new URL(page.url()).origin; } catch { return ''; }\n })();\n if (origin) await context.grantPermissions(['geolocation'], { origin }).catch(() => {});\n}\n\n/**\n * Set or clear HTTP credentials for the browser context.\n * Note: Playwright's `setHTTPCredentials()` is deprecated — prefer providing credentials\n * at context creation time. This function is retained for CDP-connected contexts where\n * context creation is not controlled by the library.\n */\nexport async function setHttpCredentialsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n username?: string;\n password?: string;\n clear?: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n if (opts.clear) {\n await page.context().setHTTPCredentials(null as any);\n return;\n }\n\n const username = String(opts.username ?? '');\n const password = String(opts.password ?? '');\n if (!username) throw new Error('username is required (or set clear=true)');\n\n await page.context().setHTTPCredentials({ username, password });\n}\n\nexport async function setLocaleViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n locale: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const locale = String(opts.locale ?? '').trim();\n if (!locale) throw new Error('locale is required');\n\n const session = await page.context().newCDPSession(page);\n try {\n try {\n await session.send('Emulation.setLocaleOverride', { locale });\n } catch (err) {\n if (String(err).includes('Another locale override is already in effect')) return;\n throw err;\n }\n } finally {\n await session.detach().catch(() => {});\n }\n}\n\nexport async function setOfflineViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n offline: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.context().setOffline(opts.offline);\n}\n\nexport async function setTimezoneViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n timezoneId: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timezoneId = String(opts.timezoneId ?? '').trim();\n if (!timezoneId) throw new Error('timezoneId is required');\n\n const session = await page.context().newCDPSession(page);\n try {\n try {\n await session.send('Emulation.setTimezoneOverride', { timezoneId });\n } catch (err) {\n const msg = String(err);\n if (msg.includes('Timezone override is already in effect')) return;\n if (msg.includes('Invalid timezone')) throw new Error(`Invalid timezone ID: ${timezoneId}`, { cause: err });\n throw err;\n }\n } finally {\n await session.detach().catch(() => {});\n }\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n} from '../connection.js';\n\nexport async function takeScreenshotViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n fullPage?: boolean;\n ref?: string;\n element?: string;\n type?: 'png' | 'jpeg';\n}): Promise<{ buffer: Buffer }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n const type = opts.type ?? 'png';\n\n if (opts.ref) {\n if (opts.fullPage) throw new Error('fullPage is not supported for element screenshots');\n return { buffer: await refLocator(page, opts.ref).screenshot({ type }) };\n }\n if (opts.element) {\n if (opts.fullPage) throw new Error('fullPage is not supported for element screenshots');\n return { buffer: await page.locator(opts.element).first().screenshot({ type }) };\n }\n return { buffer: await page.screenshot({ type, fullPage: Boolean(opts.fullPage) }) };\n}\n\nexport async function screenshotWithLabelsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n refs: string[];\n maxLabels?: number;\n type?: 'png' | 'jpeg';\n}): Promise<{ buffer: Buffer; labels: Array<{ ref: string; index: number; box: { x: number; y: number; width: number; height: number } }>; skipped: string[] }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n\n const maxLabels = opts.maxLabels ?? 50;\n const type = opts.type ?? 'png';\n const refs = opts.refs.slice(0, maxLabels);\n const skipped = opts.refs.slice(maxLabels);\n\n // Collect bounding boxes for each ref\n const labels: Array<{ ref: string; index: number; box: { x: number; y: number; width: number; height: number } }> = [];\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]!;\n try {\n const locator = refLocator(page, ref);\n const box = await locator.boundingBox({ timeout: 2000 });\n if (box) {\n labels.push({ ref, index: i + 1, box });\n } else {\n skipped.push(ref);\n }\n } catch {\n skipped.push(ref);\n }\n }\n\n // Inject visible label overlays into the page\n await page.evaluate((labelData: Array<{ index: number; box: { x: number; y: number; width: number; height: number } }>) => {\n const container = document.createElement('div');\n container.id = '__browserclaw_labels__';\n container.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647;';\n for (const { index, box } of labelData) {\n // Border around element\n const border = document.createElement('div');\n border.style.cssText = `position:absolute;left:${box.x}px;top:${box.y}px;width:${box.width}px;height:${box.height}px;border:2px solid #FF4500;box-sizing:border-box;`;\n container.appendChild(border);\n // Label badge\n const badge = document.createElement('div');\n badge.textContent = String(index);\n badge.style.cssText = `position:absolute;left:${box.x}px;top:${Math.max(0, box.y - 18)}px;background:#FF4500;color:#fff;font:bold 12px/16px monospace;padding:0 4px;border-radius:2px;`;\n container.appendChild(badge);\n }\n document.body.appendChild(container);\n }, labels.map(l => ({ index: l.index, box: l.box })));\n\n // Take the screenshot with labels visible\n const buffer = await page.screenshot({ type });\n\n // Remove the label overlays (best-effort — page may have navigated)\n await page.evaluate(() => {\n const el = document.getElementById('__browserclaw_labels__');\n if (el) el.remove();\n }).catch(() => {});\n\n return { buffer, labels, skipped };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\n\nexport async function pdfViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<{ buffer: Buffer }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return { buffer: await page.pdf({ printBackground: true }) };\n}\n","import { dirname } from 'node:path';\nimport {\n getPageForTargetId,\n ensurePageState,\n ensureContextState,\n} from '../connection.js';\nimport { assertSafeOutputPath, writeViaSiblingTempPath } from '../security.js';\n\nexport async function traceStartViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n screenshots?: boolean;\n snapshots?: boolean;\n sources?: boolean;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const context = page.context();\n const ctxState = ensureContextState(context);\n\n if (ctxState.traceActive) {\n throw new Error('Trace already running. Stop the current trace before starting a new one.');\n }\n\n await context.tracing.start({\n screenshots: opts.screenshots ?? true,\n snapshots: opts.snapshots ?? true,\n sources: opts.sources ?? false,\n });\n ctxState.traceActive = true;\n}\n\nexport async function traceStopViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n path: string;\n allowedOutputRoots?: string[];\n}): Promise<void> {\n await assertSafeOutputPath(opts.path, opts.allowedOutputRoots);\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const context = page.context();\n const ctxState = ensureContextState(context);\n\n if (!ctxState.traceActive) {\n throw new Error('No active trace. Start a trace before stopping it.');\n }\n\n await writeViaSiblingTempPath({\n rootDir: dirname(opts.path),\n targetPath: opts.path,\n writeTemp: async (tempPath) => {\n await context.tracing.stop({ path: tempPath });\n },\n });\n ctxState.traceActive = false;\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n normalizeTimeoutMs,\n} from '../connection.js';\nimport type { ResponseBodyResult } from '../types.js';\n\nexport async function responseBodyViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n url: string;\n timeoutMs?: number;\n maxChars?: number;\n}): Promise<ResponseBodyResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 30000, 120000);\n\n const response = await page.waitForResponse(opts.url, { timeout });\n let body = await response.text();\n let truncated = false;\n\n const maxChars = typeof opts.maxChars === 'number' && Number.isFinite(opts.maxChars)\n ? Math.max(1, Math.min(5_000_000, Math.floor(opts.maxChars)))\n : undefined;\n if (maxChars !== undefined && body.length > maxChars) {\n body = body.slice(0, maxChars);\n truncated = true;\n }\n\n const headers: Record<string, string> = {};\n const allHeaders = response.headers();\n for (const [key, value] of Object.entries(allHeaders)) {\n headers[key] = value;\n }\n\n return {\n url: response.url(),\n status: response.status(),\n headers,\n body,\n truncated,\n };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\nimport type { ConsoleMessage, PageError, NetworkRequest } from '../types.js';\n\nfunction consolePriority(level: string): number {\n switch (level) {\n case 'error': return 3;\n case 'warning':\n case 'warn': return 2;\n case 'info':\n case 'log': return 1;\n case 'debug': return 0;\n default: return 1;\n }\n}\n\nexport async function getConsoleMessagesViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n level?: string;\n clear?: boolean;\n}): Promise<ConsoleMessage[]> {\n const state = ensurePageState(await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId }));\n const messages = opts.level\n ? state.console.filter(msg => consolePriority(msg.type) >= consolePriority(opts.level!))\n : [...state.console];\n if (opts.clear) state.console = [];\n return messages;\n}\n\nexport async function getPageErrorsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n clear?: boolean;\n}): Promise<{ errors: PageError[] }> {\n const state = ensurePageState(await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId }));\n const errors = [...state.errors];\n if (opts.clear) state.errors = [];\n return { errors };\n}\n\nexport async function getNetworkRequestsViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n filter?: string;\n clear?: boolean;\n}): Promise<{ requests: NetworkRequest[] }> {\n const state = ensurePageState(await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId }));\n const raw = [...state.requests];\n const filter = typeof opts.filter === 'string' ? opts.filter.trim() : '';\n const requests = filter ? raw.filter(r => r.url.includes(filter)) : raw;\n if (opts.clear) {\n state.requests = [];\n state.requestIds = new WeakMap();\n }\n return { requests };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\nimport type { CookieData, StorageKind } from '../types.js';\n\n// ── Cookies ──\n\nexport async function cookiesGetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<{ cookies: Awaited<ReturnType<import('playwright-core').BrowserContext['cookies']>> }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return { cookies: await page.context().cookies() };\n}\n\nexport async function cookiesSetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n cookie: CookieData;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n const cookie = opts.cookie;\n if (!cookie.name || cookie.value === undefined) throw new Error('cookie name and value are required');\n const hasUrl = typeof cookie.url === 'string' && cookie.url.trim();\n const hasDomainPath = typeof cookie.domain === 'string' && cookie.domain.trim() && typeof cookie.path === 'string' && cookie.path.trim();\n if (!hasUrl && !hasDomainPath) throw new Error('cookie requires url, or domain+path');\n await page.context().addCookies([cookie]);\n}\n\nexport async function cookiesClearViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.context().clearCookies();\n}\n\n// ── localStorage / sessionStorage ──\n\nexport async function storageGetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n kind: StorageKind;\n key?: string;\n}): Promise<{ values: Record<string, string> }> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return {\n values: await page.evaluate(\n ({ kind, key }: { kind: string; key?: string }) => {\n const store = kind === 'session' ? window.sessionStorage : window.localStorage;\n if (key) {\n const value = store.getItem(key);\n return value === null ? {} : { [key]: value };\n }\n const out: Record<string, string> = {};\n for (let i = 0; i < store.length; i++) {\n const k = store.key(i);\n if (!k) continue;\n const v = store.getItem(k);\n if (v !== null) out[k] = v;\n }\n return out;\n },\n { kind: opts.kind, key: opts.key },\n ) ?? {},\n };\n}\n\nexport async function storageSetViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n kind: StorageKind;\n key: string;\n value: string;\n}): Promise<void> {\n const key = String(opts.key ?? '');\n if (!key) throw new Error('key is required');\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.evaluate(\n ({ kind, key: k, value }: { kind: string; key: string; value: string }) => {\n (kind === 'session' ? window.sessionStorage : window.localStorage).setItem(k, value);\n },\n { kind: opts.kind, key, value: String(opts.value ?? '') },\n );\n}\n\nexport async function storageClearViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n kind: StorageKind;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n await page.evaluate(\n ({ kind }: { kind: string }) => {\n (kind === 'session' ? window.sessionStorage : window.localStorage).clear();\n },\n { kind: opts.kind },\n );\n}\n","import { launchChrome, stopChrome, isChromeReachable } from './chrome-launcher.js';\nimport { connectBrowser, disconnectBrowser, getPageForTargetId, ensurePageState, restoreRoleRefsForTarget, refLocator, pageTargetId, getAllPages, normalizeTimeoutMs } from './connection.js';\nimport { snapshotAi } from './snapshot/ai-snapshot.js';\nimport { snapshotRole, snapshotAria } from './snapshot/aria-snapshot.js';\nimport { clickViaPlaywright, hoverViaPlaywright, typeViaPlaywright, selectOptionViaPlaywright, dragViaPlaywright, fillFormViaPlaywright, scrollIntoViewViaPlaywright, highlightViaPlaywright, setInputFilesViaPlaywright, armDialogViaPlaywright, armFileUploadViaPlaywright } from './actions/interaction.js';\nimport { pressKeyViaPlaywright } from './actions/keyboard.js';\nimport { navigateViaPlaywright, listPagesViaPlaywright, createPageViaPlaywright, closePageByTargetIdViaPlaywright, focusPageByTargetIdViaPlaywright, resizeViewportViaPlaywright } from './actions/navigation.js';\nimport { waitForViaPlaywright } from './actions/wait.js';\nimport { evaluateViaPlaywright, evaluateInAllFramesViaPlaywright, type FrameEvalResult } from './actions/evaluate.js';\nimport { downloadViaPlaywright, waitForDownloadViaPlaywright } from './actions/download.js';\nimport { emulateMediaViaPlaywright, setDeviceViaPlaywright, setExtraHTTPHeadersViaPlaywright, setGeolocationViaPlaywright, setHttpCredentialsViaPlaywright, setLocaleViaPlaywright, setOfflineViaPlaywright, setTimezoneViaPlaywright } from './actions/emulation.js';\nimport { takeScreenshotViaPlaywright, screenshotWithLabelsViaPlaywright } from './capture/screenshot.js';\nimport { pdfViaPlaywright } from './capture/pdf.js';\nimport { traceStartViaPlaywright, traceStopViaPlaywright } from './capture/trace.js';\nimport { responseBodyViaPlaywright } from './capture/response.js';\nimport { getConsoleMessagesViaPlaywright, getPageErrorsViaPlaywright, getNetworkRequestsViaPlaywright } from './capture/activity.js';\nimport { cookiesGetViaPlaywright, cookiesSetViaPlaywright, cookiesClearViaPlaywright, storageGetViaPlaywright, storageSetViaPlaywright, storageClearViaPlaywright } from './storage/index.js';\nimport type {\n LaunchOptions, ConnectOptions, SnapshotResult, SnapshotOptions, AriaSnapshotResult,\n BrowserTab, FormField, ClickOptions, TypeOptions, WaitOptions,\n ScreenshotOptions, ConsoleMessage, PageError, NetworkRequest,\n CookieData, StorageKind, RunningChrome, SsrfPolicy,\n DownloadResult, DialogOptions, ResponseBodyResult, TraceStartOptions,\n ColorScheme, GeolocationOptions, HttpCredentials,\n} from './types.js';\n\n/**\n * Represents a single browser page/tab with ref-based automation.\n *\n * The workflow is: **snapshot → read refs → act on refs**.\n *\n * @example\n * ```ts\n * const page = await browser.open('https://example.com');\n *\n * // 1. Take a snapshot to get refs\n * const { snapshot, refs } = await page.snapshot();\n * // snapshot: AI-readable text tree\n * // refs: { \"e1\": { role: \"link\", name: \"More info\" }, ... }\n *\n * // 2. Act on refs\n * await page.click('e1');\n * await page.type('e3', 'hello');\n * ```\n */\nexport class CrawlPage {\n private readonly cdpUrl: string;\n private readonly targetId: string;\n private readonly ssrfPolicy: SsrfPolicy | undefined;\n\n /** @internal */\n constructor(cdpUrl: string, targetId: string, ssrfPolicy?: SsrfPolicy) {\n this.cdpUrl = cdpUrl;\n this.targetId = targetId;\n this.ssrfPolicy = ssrfPolicy;\n }\n\n /** The CDP target ID for this page. Use this to identify the page in multi-tab scenarios. */\n get id(): string {\n return this.targetId;\n }\n\n // ── Snapshot ──────────────────────────────────────────────────\n\n /**\n * Take an AI-readable snapshot of the page.\n *\n * Returns a text tree with numbered refs (`e1`, `e2`, ...) that map to\n * interactive elements. Use these refs with actions like `click()` and `type()`.\n *\n * @param opts - Snapshot options (mode, filtering, depth limits)\n * @returns Snapshot text, ref map, and statistics\n *\n * @example\n * ```ts\n * // Default snapshot (aria mode)\n * const { snapshot, refs } = await page.snapshot();\n *\n * // Interactive elements only, compact\n * const result = await page.snapshot({ interactive: true, compact: true });\n *\n * // Role-based mode (uses getByRole resolution)\n * const result = await page.snapshot({ mode: 'role' });\n * ```\n */\n async snapshot(opts?: SnapshotOptions): Promise<SnapshotResult> {\n if (opts?.mode === 'role') {\n return snapshotRole({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n selector: opts.selector,\n frameSelector: opts.frameSelector,\n refsMode: opts.refsMode,\n timeoutMs: opts.timeoutMs,\n options: {\n interactive: opts.interactive,\n compact: opts.compact,\n maxDepth: opts.maxDepth,\n },\n });\n }\n if (opts?.selector || opts?.frameSelector) {\n throw new Error('selector and frameSelector are only supported in role mode. Use { mode: \"role\" } or omit these options.');\n }\n return snapshotAi({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n maxChars: opts?.maxChars,\n options: {\n interactive: opts?.interactive,\n compact: opts?.compact,\n maxDepth: opts?.maxDepth,\n },\n });\n }\n\n /**\n * Take a raw ARIA accessibility tree snapshot via CDP.\n *\n * Unlike `snapshot()`, this returns structured node data rather than\n * an AI-readable text tree. Useful for programmatic accessibility analysis.\n *\n * @param opts - Options (limit: max nodes to return, default 500)\n * @returns Array of accessibility tree nodes\n */\n async ariaSnapshot(opts?: { limit?: number }): Promise<AriaSnapshotResult> {\n return snapshotAria({ cdpUrl: this.cdpUrl, targetId: this.targetId, limit: opts?.limit });\n }\n\n // ── Interactions ─────────────────────────────────────────────\n\n /**\n * Click an element by ref.\n *\n * @param ref - Ref ID from a snapshot (e.g. `'e1'`)\n * @param opts - Click options (double-click, button, modifiers)\n *\n * @example\n * ```ts\n * await page.click('e1');\n * await page.click('e2', { doubleClick: true });\n * await page.click('e3', { button: 'right' });\n * await page.click('e4', { modifiers: ['Control'] });\n * ```\n */\n async click(ref: string, opts?: ClickOptions): Promise<void> {\n return clickViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n doubleClick: opts?.doubleClick,\n button: opts?.button,\n modifiers: opts?.modifiers,\n delayMs: opts?.delayMs,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Type text into an input element by ref.\n *\n * By default, uses Playwright's `fill()` for instant input. Use `slowly: true`\n * to simulate real keystroke typing with a 75ms delay per character.\n *\n * @param ref - Ref ID of the input element (e.g. `'e3'`)\n * @param text - Text to type\n * @param opts - Type options (submit, slowly)\n *\n * @example\n * ```ts\n * await page.type('e3', 'hello world');\n * await page.type('e3', 'slow typing', { slowly: true });\n * await page.type('e3', 'search query', { submit: true }); // press Enter after\n * ```\n */\n async type(ref: string, text: string, opts?: TypeOptions): Promise<void> {\n return typeViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n text,\n submit: opts?.submit,\n slowly: opts?.slowly,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Hover over an element by ref.\n *\n * @param ref - Ref ID from a snapshot\n * @param opts - Timeout options\n */\n async hover(ref: string, opts?: { timeoutMs?: number }): Promise<void> {\n return hoverViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Select option(s) in a `<select>` dropdown by ref.\n *\n * @param ref - Ref ID of the select element\n * @param values - One or more option labels/values to select\n *\n * @example\n * ```ts\n * await page.select('e5', 'Option A');\n * await page.select('e5', 'Option A', 'Option B'); // multi-select\n * ```\n */\n async select(ref: string, ...values: string[]): Promise<void> {\n return selectOptionViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n values,\n });\n }\n\n /**\n * Drag one element to another.\n *\n * @param startRef - Ref ID of the element to drag\n * @param endRef - Ref ID of the drop target\n * @param opts - Timeout options\n */\n async drag(startRef: string, endRef: string, opts?: { timeoutMs?: number }): Promise<void> {\n return dragViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n startRef,\n endRef,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Fill multiple form fields at once.\n *\n * Supports text inputs, checkboxes, and radio buttons.\n *\n * @param fields - Array of form fields to fill\n *\n * @example\n * ```ts\n * await page.fill([\n * { ref: 'e2', type: 'text', value: 'Jane Doe' },\n * { ref: 'e4', type: 'text', value: 'jane@example.com' },\n * { ref: 'e6', type: 'checkbox', value: true },\n * ]);\n * ```\n */\n async fill(fields: FormField[]): Promise<void> {\n return fillFormViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fields,\n });\n }\n\n /**\n * Scroll an element into the visible viewport.\n *\n * @param ref - Ref ID of the element to scroll to\n * @param opts - Timeout options\n */\n async scrollIntoView(ref: string, opts?: { timeoutMs?: number }): Promise<void> {\n return scrollIntoViewViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Highlight an element in the browser (Playwright built-in highlight).\n *\n * @param ref - Ref ID of the element to highlight\n */\n async highlight(ref: string): Promise<void> {\n return highlightViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n });\n }\n\n /**\n * Set files on an `<input type=\"file\">` element.\n *\n * @param ref - Ref ID of the file input element\n * @param paths - Array of file paths to upload\n */\n async uploadFile(ref: string, paths: string[]): Promise<void> {\n return setInputFilesViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n paths,\n });\n }\n\n /**\n * Arm a one-shot dialog handler (alert, confirm, prompt).\n *\n * Returns a promise — store it (don't await), trigger the dialog, then await it.\n *\n * @param opts - Dialog options (accept/dismiss, prompt text, timeout)\n *\n * @example\n * ```ts\n * const dialogDone = page.armDialog({ accept: true }); // don't await here\n * await page.click('e5'); // triggers confirm()\n * await dialogDone; // wait for dialog to be handled\n * ```\n */\n async armDialog(opts: DialogOptions): Promise<void> {\n return armDialogViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n accept: opts.accept,\n promptText: opts.promptText,\n timeoutMs: opts.timeoutMs,\n });\n }\n\n /**\n * Arm a one-shot file chooser handler.\n *\n * Returns a promise — store it (don't await), trigger the file picker, then await it.\n *\n * @param paths - File paths to set when the chooser appears (empty to clear)\n * @param opts - Timeout options\n *\n * @example\n * ```ts\n * const uploadDone = page.armFileUpload(['/path/to/file.pdf']); // don't await here\n * await page.click('e3'); // triggers file picker\n * await uploadDone; // wait for files to be set\n * ```\n */\n async armFileUpload(paths?: string[], opts?: { timeoutMs?: number }): Promise<void> {\n return armFileUploadViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n paths,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n // ── Keyboard ─────────────────────────────────────────────────\n\n /**\n * Press a keyboard key or key combination.\n *\n * Uses Playwright's key names. Supports combinations with `+`.\n *\n * @param key - Key to press (e.g. `'Enter'`, `'Tab'`, `'Control+a'`, `'Meta+c'`)\n * @param opts - Options (delayMs: hold time between keydown and keyup)\n *\n * @example\n * ```ts\n * await page.press('Enter');\n * await page.press('Control+a');\n * await page.press('Meta+Shift+p');\n * ```\n */\n async press(key: string, opts?: { delayMs?: number }): Promise<void> {\n return pressKeyViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n key,\n delayMs: opts?.delayMs,\n });\n }\n\n // ── Navigation ───────────────────────────────────────────────\n\n /**\n * Get the current URL of the page.\n */\n async url(): Promise<string> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return page.url();\n }\n\n /**\n * Get the page title.\n */\n async title(): Promise<string> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return page.title();\n }\n\n /**\n * Navigate to a URL.\n *\n * @param url - The URL to navigate to\n * @param opts - Timeout options\n * @returns The final URL after navigation (may differ due to redirects)\n */\n async goto(url: string, opts?: { timeoutMs?: number }): Promise<{ url: string }> {\n return navigateViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n url,\n timeoutMs: opts?.timeoutMs,\n ssrfPolicy: this.ssrfPolicy,\n });\n }\n\n /**\n * Reload the current page.\n *\n * @param opts - Timeout options\n */\n async reload(opts?: { timeoutMs?: number }): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n ensurePageState(page);\n await page.reload({ timeout: normalizeTimeoutMs(opts?.timeoutMs, 20000) });\n }\n\n /**\n * Navigate back in browser history.\n *\n * @param opts - Timeout options\n */\n async goBack(opts?: { timeoutMs?: number }): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n ensurePageState(page);\n await page.goBack({ timeout: normalizeTimeoutMs(opts?.timeoutMs, 20000) });\n }\n\n /**\n * Navigate forward in browser history.\n *\n * @param opts - Timeout options\n */\n async goForward(opts?: { timeoutMs?: number }): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n ensurePageState(page);\n await page.goForward({ timeout: normalizeTimeoutMs(opts?.timeoutMs, 20000) });\n }\n\n // ── Wait ─────────────────────────────────────────────────────\n\n /**\n * Wait for various conditions on the page.\n *\n * Multiple conditions can be specified — they are checked in order.\n *\n * @param opts - Wait conditions (text, URL, load state, selector, etc.)\n *\n * @example\n * ```ts\n * await page.waitFor({ loadState: 'networkidle' });\n * await page.waitFor({ text: 'Welcome back' });\n * await page.waitFor({ url: '**\\/dashboard' });\n * await page.waitFor({ timeMs: 1000 }); // sleep\n * ```\n */\n async waitFor(opts: WaitOptions): Promise<void> {\n return waitForViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ...opts,\n });\n }\n\n // ── Evaluate ─────────────────────────────────────────────────\n\n /**\n * Run JavaScript in the browser page context.\n *\n * The function string is evaluated in the browser's sandbox, not in Node.js.\n * Pass a `ref` to receive the element as the first argument.\n *\n * @param fn - JavaScript function body as a string\n * @param opts - Options (ref: scope evaluation to a specific element)\n * @returns The return value of the evaluated function\n *\n * @example\n * ```ts\n * const title = await page.evaluate('() => document.title');\n * const text = await page.evaluate('(el) => el.textContent', { ref: 'e1' });\n * const count = await page.evaluate('() => document.querySelectorAll(\"img\").length');\n * ```\n */\n async evaluate(fn: string, opts?: { ref?: string; timeoutMs?: number; signal?: AbortSignal }): Promise<unknown> {\n return evaluateViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fn,\n ref: opts?.ref,\n timeoutMs: opts?.timeoutMs,\n signal: opts?.signal,\n });\n }\n\n /**\n * Run JavaScript in ALL frames on the page (including cross-origin iframes).\n *\n * Playwright can access cross-origin frames via CDP, bypassing the same-origin policy.\n * This is essential for filling payment iframes (Stripe, etc.).\n *\n * @param fn - JavaScript function body as a string\n * @returns Array of results from each frame where evaluation succeeded\n *\n * @example\n * ```ts\n * const results = await page.evaluateInAllFrames(`() => {\n * const el = document.querySelector('input[name=\"cardnumber\"]');\n * return el ? 'found' : null;\n * }`);\n * ```\n */\n async evaluateInAllFrames(fn: string): Promise<FrameEvalResult[]> {\n return evaluateInAllFramesViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fn,\n });\n }\n\n // ── Capture ──────────────────────────────────────────────────\n\n /**\n * Take a screenshot of the page or a specific element.\n *\n * @param opts - Screenshot options (fullPage, ref, element, type)\n * @returns PNG or JPEG image as a Buffer\n *\n * @example\n * ```ts\n * const screenshot = await page.screenshot();\n * const fullPage = await page.screenshot({ fullPage: true });\n * const element = await page.screenshot({ ref: 'e1' });\n * ```\n */\n async screenshot(opts?: ScreenshotOptions): Promise<Buffer> {\n const result = await takeScreenshotViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n fullPage: opts?.fullPage,\n ref: opts?.ref,\n element: opts?.element,\n type: opts?.type,\n });\n return result.buffer;\n }\n\n /**\n * Export the page as a PDF.\n *\n * Only works in headless mode.\n *\n * @returns PDF document as a Buffer\n */\n async pdf(): Promise<Buffer> {\n const result = await pdfViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return result.buffer;\n }\n\n /**\n * Take a screenshot with numbered labels overlaid on referenced elements.\n *\n * Useful for visual debugging — each ref gets a numbered badge and border.\n *\n * @param refs - Array of ref IDs to label\n * @param opts - Options (maxLabels: limit, type: image format)\n * @returns Screenshot buffer, label positions, and any skipped refs\n *\n * @example\n * ```ts\n * const { buffer, labels, skipped } = await page.screenshotWithLabels(['e1', 'e2', 'e3']);\n * fs.writeFileSync('labeled.png', buffer);\n * ```\n */\n async screenshotWithLabels(refs: string[], opts?: { maxLabels?: number; type?: 'png' | 'jpeg' }): Promise<{\n buffer: Buffer;\n labels: Array<{ ref: string; index: number; box: { x: number; y: number; width: number; height: number } }>;\n skipped: string[];\n }> {\n return screenshotWithLabelsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n refs,\n maxLabels: opts?.maxLabels,\n type: opts?.type,\n });\n }\n\n /**\n * Start recording a Playwright trace.\n *\n * Traces capture screenshots, DOM snapshots, and network activity.\n * Stop with `traceStop()` to save the trace file.\n *\n * @param opts - Trace options (screenshots, snapshots, sources)\n */\n async traceStart(opts?: TraceStartOptions): Promise<void> {\n return traceStartViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n screenshots: opts?.screenshots,\n snapshots: opts?.snapshots,\n sources: opts?.sources,\n });\n }\n\n /**\n * Stop recording a trace and save it to a file.\n *\n * @param path - File path to save the trace (e.g. `'trace.zip'`)\n * @param opts - Options (allowedOutputRoots: constrain output to specific directories)\n */\n async traceStop(path: string, opts?: { allowedOutputRoots?: string[] }): Promise<void> {\n return traceStopViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n path,\n allowedOutputRoots: opts?.allowedOutputRoots,\n });\n }\n\n /**\n * Wait for a network response matching a URL pattern and return its body.\n *\n * @param url - URL string or pattern to match\n * @param opts - Options (timeoutMs, maxChars)\n * @returns Response body, status, headers, and truncation info\n *\n * @example\n * ```ts\n * const resp = await page.responseBody('/api/data');\n * console.log(resp.status, resp.body);\n * ```\n */\n async responseBody(url: string, opts?: { timeoutMs?: number; maxChars?: number }): Promise<ResponseBodyResult> {\n return responseBodyViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n url,\n timeoutMs: opts?.timeoutMs,\n maxChars: opts?.maxChars,\n });\n }\n\n /**\n * Get console messages captured from the page.\n *\n * Messages are buffered automatically. Use `level` to filter by minimum severity.\n *\n * @param opts - Filter options (level, clear)\n * @returns Array of captured console messages\n */\n async consoleLogs(opts?: { level?: string; clear?: boolean }): Promise<ConsoleMessage[]> {\n return getConsoleMessagesViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n level: opts?.level,\n clear: opts?.clear,\n });\n }\n\n /**\n * Get uncaught errors from the page.\n *\n * @param opts - Options (clear: reset the error buffer after reading)\n * @returns Array of captured page errors\n */\n async pageErrors(opts?: { clear?: boolean }): Promise<PageError[]> {\n const result = await getPageErrorsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n clear: opts?.clear,\n });\n return result.errors;\n }\n\n /**\n * Get network requests captured from the page.\n *\n * @param opts - Options (filter: URL substring match, clear: reset the buffer)\n * @returns Array of captured network requests\n *\n * @example\n * ```ts\n * const all = await page.networkRequests();\n * const apiCalls = await page.networkRequests({ filter: '/api/' });\n * const fresh = await page.networkRequests({ clear: true }); // read and clear\n * ```\n */\n async networkRequests(opts?: { filter?: string; clear?: boolean }): Promise<NetworkRequest[]> {\n const result = await getNetworkRequestsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n filter: opts?.filter,\n clear: opts?.clear,\n });\n return result.requests;\n }\n\n // ── Viewport ─────────────────────────────────────────────────\n\n /**\n * Resize the browser viewport.\n *\n * @param width - Viewport width in pixels\n * @param height - Viewport height in pixels\n */\n async resize(width: number, height: number): Promise<void> {\n return resizeViewportViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n width,\n height,\n });\n }\n\n // ── Storage ──────────────────────────────────────────────────\n\n /**\n * Get all cookies for the current browser context.\n *\n * @returns Array of cookie objects\n */\n async cookies(): Promise<Awaited<ReturnType<import('playwright-core').BrowserContext['cookies']>>> {\n const result = await cookiesGetViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return result.cookies;\n }\n\n /**\n * Set a cookie in the browser context.\n *\n * @param cookie - Cookie data (must include `name`, `value`, and either `url` or `domain`+`path`)\n *\n * @example\n * ```ts\n * await page.setCookie({\n * name: 'token',\n * value: 'abc123',\n * url: 'https://example.com',\n * });\n * ```\n */\n async setCookie(cookie: CookieData): Promise<void> {\n return cookiesSetViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId, cookie });\n }\n\n /** Clear all cookies in the browser context. */\n async clearCookies(): Promise<void> {\n return cookiesClearViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n }\n\n /**\n * Get values from localStorage or sessionStorage.\n *\n * @param kind - `'local'` for localStorage, `'session'` for sessionStorage\n * @param key - Optional specific key to retrieve (returns all if omitted)\n * @returns Key-value map of storage entries\n */\n async storageGet(kind: StorageKind, key?: string): Promise<Record<string, string>> {\n const result = await storageGetViaPlaywright({\n cdpUrl: this.cdpUrl, targetId: this.targetId, kind, key,\n });\n return result.values;\n }\n\n /**\n * Set a value in localStorage or sessionStorage.\n *\n * @param kind - `'local'` for localStorage, `'session'` for sessionStorage\n * @param key - Storage key\n * @param value - Storage value\n */\n async storageSet(kind: StorageKind, key: string, value: string): Promise<void> {\n return storageSetViaPlaywright({\n cdpUrl: this.cdpUrl, targetId: this.targetId, kind, key, value,\n });\n }\n\n /**\n * Clear all entries in localStorage or sessionStorage.\n *\n * @param kind - `'local'` for localStorage, `'session'` for sessionStorage\n */\n async storageClear(kind: StorageKind): Promise<void> {\n return storageClearViaPlaywright({\n cdpUrl: this.cdpUrl, targetId: this.targetId, kind,\n });\n }\n\n // ── Downloads ───────────────────────────────────────────────\n\n /**\n * Click a ref and save the resulting file download.\n *\n * @param ref - Ref ID of the element that triggers the download\n * @param path - Local file path to save the download to\n * @param opts - Timeout options\n * @returns Download result with URL, suggested filename, and saved path\n *\n * @example\n * ```ts\n * const result = await page.download('e7', '/tmp/report.pdf');\n * console.log(result.suggestedFilename); // 'report.pdf'\n * ```\n */\n async download(ref: string, path: string, opts?: { timeoutMs?: number; allowedOutputRoots?: string[] }): Promise<DownloadResult> {\n return downloadViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n ref,\n path,\n timeoutMs: opts?.timeoutMs,\n allowedOutputRoots: opts?.allowedOutputRoots,\n });\n }\n\n /**\n * Wait for the next download event (without clicking).\n *\n * Returns a promise — store it (don't await), trigger the download, then await it.\n *\n * @param opts - Options (path: save location, timeoutMs)\n * @returns Download result with URL, suggested filename, and saved path\n */\n async waitForDownload(opts?: { path?: string; timeoutMs?: number; allowedOutputRoots?: string[] }): Promise<DownloadResult> {\n return waitForDownloadViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n path: opts?.path,\n timeoutMs: opts?.timeoutMs,\n allowedOutputRoots: opts?.allowedOutputRoots,\n });\n }\n\n // ── Emulation ───────────────────────────────────────────────\n\n /**\n * Set the browser to offline or online mode.\n *\n * @param offline - `true` to go offline, `false` to go online\n */\n async setOffline(offline: boolean): Promise<void> {\n return setOfflineViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n offline,\n });\n }\n\n /**\n * Set extra HTTP headers for all requests.\n *\n * @param headers - Headers to add to every request\n *\n * @example\n * ```ts\n * await page.setExtraHeaders({ 'X-Custom': 'value' });\n * ```\n */\n async setExtraHeaders(headers: Record<string, string>): Promise<void> {\n return setExtraHTTPHeadersViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n headers,\n });\n }\n\n /**\n * Set HTTP authentication credentials.\n *\n * @param opts - Credentials (username, password) or `{ clear: true }` to remove\n */\n async setHttpCredentials(opts: HttpCredentials): Promise<void> {\n return setHttpCredentialsViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n username: opts.username,\n password: opts.password,\n clear: opts.clear,\n });\n }\n\n /**\n * Emulate a geolocation.\n *\n * @param opts - Geolocation coordinates or `{ clear: true }` to clear\n *\n * @example\n * ```ts\n * await page.setGeolocation({ latitude: 48.8566, longitude: 2.3522 }); // Paris\n * await page.setGeolocation({ clear: true }); // reset\n * ```\n */\n async setGeolocation(opts: GeolocationOptions): Promise<void> {\n return setGeolocationViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n latitude: opts.latitude,\n longitude: opts.longitude,\n accuracy: opts.accuracy,\n origin: opts.origin,\n clear: opts.clear,\n });\n }\n\n /**\n * Emulate a preferred color scheme.\n *\n * @param opts - Color scheme options\n *\n * @example\n * ```ts\n * await page.emulateMedia({ colorScheme: 'dark' });\n * ```\n */\n async emulateMedia(opts: { colorScheme: ColorScheme }): Promise<void> {\n return emulateMediaViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n colorScheme: opts.colorScheme,\n });\n }\n\n /**\n * Override the browser locale.\n *\n * @param locale - BCP-47 locale string (e.g. `'fr-FR'`, `'ja-JP'`)\n */\n async setLocale(locale: string): Promise<void> {\n return setLocaleViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n locale,\n });\n }\n\n /**\n * Override the browser timezone.\n *\n * @param timezoneId - IANA timezone ID (e.g. `'America/New_York'`, `'Asia/Tokyo'`)\n */\n async setTimezone(timezoneId: string): Promise<void> {\n return setTimezoneViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n timezoneId,\n });\n }\n\n /**\n * Emulate a specific device (viewport + user agent).\n *\n * @param name - Playwright device name (e.g. `'iPhone 13'`, `'Pixel 5'`)\n *\n * @example\n * ```ts\n * await page.setDevice('iPhone 13');\n * ```\n */\n async setDevice(name: string): Promise<void> {\n return setDeviceViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n name,\n });\n }\n}\n\n/**\n * Main entry point for browserclaw.\n *\n * Launch or connect to a browser, then open pages and automate them\n * using the snapshot + ref pattern.\n *\n * @example\n * ```ts\n * import { BrowserClaw } from 'browserclaw';\n *\n * const browser = await BrowserClaw.launch({ headless: false });\n * const page = await browser.open('https://example.com');\n *\n * const { snapshot, refs } = await page.snapshot();\n * console.log(snapshot); // AI-readable page tree\n * console.log(refs); // { \"e1\": { role: \"link\", name: \"More info\" }, ... }\n *\n * await page.click('e1');\n * await browser.stop();\n * ```\n */\nexport class BrowserClaw {\n private readonly cdpUrl: string;\n private readonly ssrfPolicy: SsrfPolicy | undefined;\n private chrome: RunningChrome | null;\n\n private constructor(cdpUrl: string, chrome: RunningChrome | null, ssrfPolicy?: SsrfPolicy) {\n this.cdpUrl = cdpUrl;\n this.chrome = chrome;\n this.ssrfPolicy = ssrfPolicy;\n }\n\n /**\n * Launch a new Chrome instance and connect to it.\n *\n * Automatically detects Chrome, Brave, Edge, or Chromium on the system.\n * Creates a dedicated browser profile to avoid conflicts with your daily browser.\n *\n * @param opts - Launch options (headless, executablePath, cdpPort, etc.)\n * @returns A connected BrowserClaw instance\n *\n * @example\n * ```ts\n * // Default: visible Chrome window\n * const browser = await BrowserClaw.launch();\n *\n * // Headless mode\n * const browser = await BrowserClaw.launch({ headless: true });\n *\n * // Specific browser\n * const browser = await BrowserClaw.launch({\n * executablePath: '/usr/bin/google-chrome',\n * });\n * ```\n */\n static async launch(opts: LaunchOptions = {}): Promise<BrowserClaw> {\n const chrome = await launchChrome(opts);\n const cdpUrl = `http://127.0.0.1:${chrome.cdpPort}`;\n const ssrfPolicy = opts.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n return new BrowserClaw(cdpUrl, chrome, ssrfPolicy);\n }\n\n /**\n * Connect to an already-running Chrome instance via its CDP endpoint.\n *\n * The Chrome instance must have been started with `--remote-debugging-port`.\n *\n * @param cdpUrl - CDP endpoint URL (e.g. `'http://localhost:9222'`)\n * @returns A connected BrowserClaw instance\n *\n * @example\n * ```ts\n * // Chrome started with: chrome --remote-debugging-port=9222\n * const browser = await BrowserClaw.connect('http://localhost:9222');\n * ```\n */\n static async connect(cdpUrl: string, opts?: ConnectOptions): Promise<BrowserClaw> {\n if (!await isChromeReachable(cdpUrl, 3000, opts?.authToken)) {\n throw new Error(`Cannot connect to Chrome at ${cdpUrl}. Is Chrome running with --remote-debugging-port?`);\n }\n await connectBrowser(cdpUrl, opts?.authToken);\n const ssrfPolicy = opts?.allowInternal ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts?.ssrfPolicy;\n return new BrowserClaw(cdpUrl, null, ssrfPolicy);\n }\n\n /**\n * Open a URL in a new tab and return the page handle.\n *\n * @param url - URL to navigate to\n * @returns A CrawlPage for the new tab\n *\n * @example\n * ```ts\n * const page = await browser.open('https://example.com');\n * const { snapshot, refs } = await page.snapshot();\n * ```\n */\n async open(url: string): Promise<CrawlPage> {\n const tab = await createPageViaPlaywright({ cdpUrl: this.cdpUrl, url, ssrfPolicy: this.ssrfPolicy });\n return new CrawlPage(this.cdpUrl, tab.targetId, this.ssrfPolicy);\n }\n\n /**\n * Get a CrawlPage handle for the currently active tab.\n *\n * @returns CrawlPage for the first/active page\n */\n async currentPage(): Promise<CrawlPage> {\n const { browser } = await connectBrowser(this.cdpUrl);\n const pages = await getAllPages(browser);\n if (!pages.length) throw new Error('No pages available. Use browser.open(url) to create a tab.');\n const tid = await pageTargetId(pages[0]!).catch(() => null);\n if (!tid) throw new Error('Failed to get targetId for the current page.');\n return new CrawlPage(this.cdpUrl, tid, this.ssrfPolicy);\n }\n\n /**\n * List all open tabs.\n *\n * @returns Array of tab information objects\n */\n async tabs(): Promise<BrowserTab[]> {\n return listPagesViaPlaywright({ cdpUrl: this.cdpUrl });\n }\n\n /**\n * Bring a tab to the foreground.\n *\n * @param targetId - CDP target ID of the tab (from `tabs()` or `page.id`)\n */\n async focus(targetId: string): Promise<void> {\n return focusPageByTargetIdViaPlaywright({ cdpUrl: this.cdpUrl, targetId });\n }\n\n /**\n * Close a tab.\n *\n * @param targetId - CDP target ID of the tab to close\n */\n async close(targetId: string): Promise<void> {\n return closePageByTargetIdViaPlaywright({ cdpUrl: this.cdpUrl, targetId });\n }\n\n /**\n * Get a CrawlPage handle for a specific tab by its target ID.\n *\n * Unlike `open()`, this doesn't create a new tab — it wraps an existing one.\n *\n * @param targetId - CDP target ID of the tab\n * @returns CrawlPage for the specified tab\n */\n page(targetId: string): CrawlPage {\n return new CrawlPage(this.cdpUrl, targetId, this.ssrfPolicy);\n }\n\n /** The CDP endpoint URL for this browser connection. */\n get url(): string {\n return this.cdpUrl;\n }\n\n /**\n * Stop the browser and clean up all resources.\n *\n * If the browser was launched by `BrowserClaw.launch()`, the Chrome process\n * will be terminated. If connected via `BrowserClaw.connect()`, only the\n * Playwright connection is closed.\n */\n async stop(): Promise<void> {\n await disconnectBrowser();\n if (this.chrome) {\n await stopChrome(this.chrome);\n this.chrome = null;\n }\n }\n}\n"]}