browserclaw 0.11.3 → 0.11.4

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":["../node_modules/ipaddr.js/lib/ipaddr.js","../src/chrome-launcher.ts","../src/stealth.ts","../src/page-utils.ts","../src/ref-resolver.ts","../src/connection.ts","../src/actions/evaluate.ts","../src/security.ts","../src/actions/interaction.ts","../src/actions/keyboard.ts","../src/actions/navigation.ts","../src/actions/wait.ts","../src/actions/batch.ts","../src/actions/download.ts","../src/actions/emulation.ts","../src/anti-bot.ts","../src/capture/activity.ts","../src/capture/pdf.ts","../src/capture/response.ts","../src/capture/screenshot.ts","../src/capture/trace.ts","../src/snapshot/ref-map.ts","../src/snapshot/ai-snapshot.ts","../src/snapshot/aria-snapshot.ts","../src/storage/index.ts","../src/browser.ts"],"names":["exports","ipaddr","IPv4","IPv6","fs","execFileSync","path","os","resolve","net","spawn","appendCdpPath","http","https","chromium","join","tmpdir","PROXY_ENV_KEYS","hasProxyEnvConfigured","dnsLookupCb","dnsLookup","normalize","realpath","dirname","lstat","sep","relative","pathIsAbsolute","posix","win32","randomUUID","basename","rename","rm","resolveBoundedDelayMs","devices","result","out","built"],"mappings":"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","file":"index.cjs","sourcesContent":["(function (root) {\n 'use strict';\n // A list of regular expressions that match arbitrary IPv4 addresses,\n // for which a number of weird notations exist.\n // Note that an address like 0010.0xa5.1.1 is considered legal.\n const ipv4Part = '(0?\\\\d+|0x[a-f0-9]+)';\n const ipv4Regexes = {\n fourOctet: new RegExp(`^${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}$`, 'i'),\n threeOctet: new RegExp(`^${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}$`, 'i'),\n twoOctet: new RegExp(`^${ipv4Part}\\\\.${ipv4Part}$`, 'i'),\n longValue: new RegExp(`^${ipv4Part}$`, 'i')\n };\n\n // Regular Expression for checking Octal numbers\n const octalRegex = new RegExp(`^0[0-7]+$`, 'i');\n const hexRegex = new RegExp(`^0x[a-f0-9]+$`, 'i');\n\n const zoneIndex = '%[0-9a-z]{1,}';\n\n // IPv6-matching regular expressions.\n // For IPv6, the task is simpler: it is enough to match the colon-delimited\n // hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at\n // the end.\n const ipv6Part = '(?:[0-9a-f]+::?)+';\n const ipv6Regexes = {\n zoneIndex: new RegExp(zoneIndex, 'i'),\n 'native': new RegExp(`^(::)?(${ipv6Part})?([0-9a-f]+)?(::)?(${zoneIndex})?$`, 'i'),\n deprecatedTransitional: new RegExp(`^(?:::)(${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}(${zoneIndex})?)$`, 'i'),\n transitional: new RegExp(`^((?:${ipv6Part})|(?:::)(?:${ipv6Part})?)${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}(${zoneIndex})?$`, 'i')\n };\n\n // Expand :: in an IPv6 address or address part consisting of `parts` groups.\n function expandIPv6 (string, parts) {\n // More than one '::' means invalid adddress\n if (string.indexOf('::') !== string.lastIndexOf('::')) {\n return null;\n }\n\n let colonCount = 0;\n let lastColon = -1;\n let zoneId = (string.match(ipv6Regexes.zoneIndex) || [])[0];\n let replacement, replacementCount;\n\n // Remove zone index and save it for later\n if (zoneId) {\n zoneId = zoneId.substring(1);\n string = string.replace(/%.+$/, '');\n }\n\n // How many parts do we already have?\n while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n colonCount++;\n }\n\n // 0::0 is two parts more than ::\n if (string.substr(0, 2) === '::') {\n colonCount--;\n }\n\n if (string.substr(-2, 2) === '::') {\n colonCount--;\n }\n\n // The following loop would hang if colonCount > parts\n if (colonCount > parts) {\n return null;\n }\n\n // replacement = ':' + '0:' * (parts - colonCount)\n replacementCount = parts - colonCount;\n replacement = ':';\n while (replacementCount--) {\n replacement += '0:';\n }\n\n // Insert the missing zeroes\n string = string.replace('::', replacement);\n\n // Trim any garbage which may be hanging around if :: was at the edge in\n // the source strin\n if (string[0] === ':') {\n string = string.slice(1);\n }\n\n if (string[string.length - 1] === ':') {\n string = string.slice(0, -1);\n }\n\n parts = (function () {\n const ref = string.split(':');\n const results = [];\n\n for (let i = 0; i < ref.length; i++) {\n results.push(parseInt(ref[i], 16));\n }\n\n return results;\n })();\n\n return {\n parts: parts,\n zoneId: zoneId\n };\n }\n\n // A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher.\n function matchCIDR (first, second, partSize, cidrBits) {\n if (first.length !== second.length) {\n throw new Error('ipaddr: cannot match CIDR for objects with different lengths');\n }\n\n let part = 0;\n let shift;\n\n while (cidrBits > 0) {\n shift = partSize - cidrBits;\n if (shift < 0) {\n shift = 0;\n }\n\n if (first[part] >> shift !== second[part] >> shift) {\n return false;\n }\n\n cidrBits -= partSize;\n part += 1;\n }\n\n return true;\n }\n\n function parseIntAuto (string) {\n // Hexadedimal base 16 (0x#)\n if (hexRegex.test(string)) {\n return parseInt(string, 16);\n }\n // While octal representation is discouraged by ECMAScript 3\n // and forbidden by ECMAScript 5, we silently allow it to\n // work only if the rest of the string has numbers less than 8.\n if (string[0] === '0' && !isNaN(parseInt(string[1], 10))) {\n if (octalRegex.test(string)) {\n return parseInt(string, 8);\n }\n throw new Error(`ipaddr: cannot parse ${string} as octal`);\n }\n // Always include the base 10 radix!\n return parseInt(string, 10);\n }\n\n function padPart (part, length) {\n while (part.length < length) {\n part = `0${part}`;\n }\n\n return part;\n }\n\n const ipaddr = {};\n\n // An IPv4 address (RFC791).\n ipaddr.IPv4 = (function () {\n // Constructs a new IPv4 address from an array of four octets\n // in network order (MSB first)\n // Verifies the input.\n function IPv4 (octets) {\n if (octets.length !== 4) {\n throw new Error('ipaddr: ipv4 octet count should be 4');\n }\n\n let i, octet;\n\n for (i = 0; i < octets.length; i++) {\n octet = octets[i];\n if (!((0 <= octet && octet <= 255))) {\n throw new Error('ipaddr: ipv4 octet should fit in 8 bits');\n }\n }\n\n this.octets = octets;\n }\n\n // Special IPv4 address ranges.\n // See also https://en.wikipedia.org/wiki/Reserved_IP_addresses\n IPv4.prototype.SpecialRanges = {\n unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n // RFC3171\n multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n // RFC3927\n linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n // RFC5735\n loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n // RFC6598\n carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n // RFC1918\n 'private': [\n [new IPv4([10, 0, 0, 0]), 8],\n [new IPv4([172, 16, 0, 0]), 12],\n [new IPv4([192, 168, 0, 0]), 16]\n ],\n // Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700\n reserved: [\n [new IPv4([192, 0, 0, 0]), 24],\n [new IPv4([192, 0, 2, 0]), 24],\n [new IPv4([192, 88, 99, 0]), 24],\n [new IPv4([198, 18, 0, 0]), 15],\n [new IPv4([198, 51, 100, 0]), 24],\n [new IPv4([203, 0, 113, 0]), 24],\n [new IPv4([240, 0, 0, 0]), 4]\n ],\n // RFC7534, RFC7535\n as112: [\n [new IPv4([192, 175, 48, 0]), 24],\n [new IPv4([192, 31, 196, 0]), 24],\n ],\n // RFC7450\n amt: [\n [new IPv4([192, 52, 193, 0]), 24],\n ],\n };\n\n // The 'kind' method exists on both IPv4 and IPv6 classes.\n IPv4.prototype.kind = function () {\n return 'ipv4';\n };\n\n // Checks if this address matches other one within given CIDR range.\n IPv4.prototype.match = function (other, cidrRange) {\n let ref;\n if (cidrRange === undefined) {\n ref = other;\n other = ref[0];\n cidrRange = ref[1];\n }\n\n if (other.kind() !== 'ipv4') {\n throw new Error('ipaddr: cannot match ipv4 address with non-ipv4 one');\n }\n\n return matchCIDR(this.octets, other.octets, 8, cidrRange);\n };\n\n // returns a number of leading ones in IPv4 address, making sure that\n // the rest is a solid sequence of 0's (valid netmask)\n // returns either the CIDR length or null if mask is not valid\n IPv4.prototype.prefixLengthFromSubnetMask = function () {\n let cidr = 0;\n // non-zero encountered stop scanning for zeroes\n let stop = false;\n // number of zeroes in octet\n const zerotable = {\n 0: 8,\n 128: 7,\n 192: 6,\n 224: 5,\n 240: 4,\n 248: 3,\n 252: 2,\n 254: 1,\n 255: 0\n };\n let i, octet, zeros;\n\n for (i = 3; i >= 0; i -= 1) {\n octet = this.octets[i];\n if (octet in zerotable) {\n zeros = zerotable[octet];\n if (stop && zeros !== 0) {\n return null;\n }\n\n if (zeros !== 8) {\n stop = true;\n }\n\n cidr += zeros;\n } else {\n return null;\n }\n }\n\n return 32 - cidr;\n };\n\n // Checks if the address corresponds to one of the special ranges.\n IPv4.prototype.range = function () {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n // Returns an array of byte-sized values in network order (MSB first)\n IPv4.prototype.toByteArray = function () {\n return this.octets.slice(0);\n };\n\n // Converts this IPv4 address to an IPv4-mapped IPv6 address.\n IPv4.prototype.toIPv4MappedAddress = function () {\n return ipaddr.IPv6.parse(`::ffff:${this.toString()}`);\n };\n\n // Symmetrical method strictly for aligning with the IPv6 methods.\n IPv4.prototype.toNormalizedString = function () {\n return this.toString();\n };\n\n // Returns the address in convenient, decimal-dotted format.\n IPv4.prototype.toString = function () {\n return this.octets.join('.');\n };\n\n return IPv4;\n })();\n\n // A utility function to return broadcast address given the IPv4 interface and prefix length in CIDR notation\n ipaddr.IPv4.broadcastAddressFromCIDR = function (string) {\n\n try {\n const cidr = this.parseCIDR(string);\n const ipInterfaceOctets = cidr[0].toByteArray();\n const subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n const octets = [];\n let i = 0;\n while (i < 4) {\n // Broadcast address is bitwise OR between ip interface and inverted mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n // Checks if a given string is formatted like IPv4 address.\n ipaddr.IPv4.isIPv4 = function (string) {\n return this.parser(string) !== null;\n };\n\n // Checks if a given string is a valid IPv4 address.\n ipaddr.IPv4.isValid = function (string) {\n try {\n new this(this.parser(string));\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // Checks if a given string is a valid IPv4 address in CIDR notation.\n ipaddr.IPv4.isValidCIDR = function (string) {\n try {\n this.parseCIDR(string);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // Checks if a given string is a full four-part IPv4 Address.\n ipaddr.IPv4.isValidFourPartDecimal = function (string) {\n if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n return true;\n } else {\n return false;\n }\n };\n\n // Checks if a given string is a full four-part IPv4 Address with CIDR prefix.\n ipaddr.IPv4.isValidCIDRFourPartDecimal = function (string) {\n const match = string.match(/^(.+)\\/(\\d+)$/);\n\n if (!ipaddr.IPv4.isValidCIDR(string) || !match) {\n return false;\n }\n\n return ipaddr.IPv4.isValidFourPartDecimal(match[1]);\n };\n\n // A utility function to return network address given the IPv4 interface and prefix length in CIDR notation\n ipaddr.IPv4.networkAddressFromCIDR = function (string) {\n let cidr, i, ipInterfaceOctets, octets, subnetMaskOctets;\n\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 4) {\n // Network address is bitwise AND between ip interface and mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n // Tries to parse and validate a string with IPv4 address.\n // Throws an error if it fails.\n ipaddr.IPv4.parse = function (string) {\n const parts = this.parser(string);\n\n if (parts === null) {\n throw new Error('ipaddr: string is not formatted like an IPv4 Address');\n }\n\n return new this(parts);\n };\n\n // Parses the string as an IPv4 Address with CIDR Notation.\n ipaddr.IPv4.parseCIDR = function (string) {\n let match;\n\n if ((match = string.match(/^(.+)\\/(\\d+)$/))) {\n const maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 32) {\n const parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function () {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n\n throw new Error('ipaddr: string is not formatted like an IPv4 CIDR range');\n };\n\n // Classful variants (like a.b, where a is an octet, and b is a 24-bit\n // value representing last three octets; this corresponds to a class C\n // address) are omitted due to classless nature of modern Internet.\n ipaddr.IPv4.parser = function (string) {\n let match, part, value;\n\n // parseInt recognizes all that octal & hexadecimal weirdness for us\n if ((match = string.match(ipv4Regexes.fourOctet))) {\n return (function () {\n const ref = match.slice(1, 6);\n const results = [];\n\n for (let i = 0; i < ref.length; i++) {\n part = ref[i];\n results.push(parseIntAuto(part));\n }\n\n return results;\n })();\n } else if ((match = string.match(ipv4Regexes.longValue))) {\n value = parseIntAuto(match[1]);\n if (value > 0xffffffff || value < 0) {\n throw new Error('ipaddr: address outside defined range');\n }\n\n return ((function () {\n const results = [];\n let shift;\n\n for (shift = 0; shift <= 24; shift += 8) {\n results.push((value >> shift) & 0xff);\n }\n\n return results;\n })()).reverse();\n } else if ((match = string.match(ipv4Regexes.twoOctet))) {\n return (function () {\n const ref = match.slice(1, 4);\n const results = [];\n\n value = parseIntAuto(ref[1]);\n if (value > 0xffffff || value < 0) {\n throw new Error('ipaddr: address outside defined range');\n }\n\n results.push(parseIntAuto(ref[0]));\n results.push((value >> 16) & 0xff);\n results.push((value >> 8) & 0xff);\n results.push( value & 0xff);\n\n return results;\n })();\n } else if ((match = string.match(ipv4Regexes.threeOctet))) {\n return (function () {\n const ref = match.slice(1, 5);\n const results = [];\n\n value = parseIntAuto(ref[2]);\n if (value > 0xffff || value < 0) {\n throw new Error('ipaddr: address outside defined range');\n }\n\n results.push(parseIntAuto(ref[0]));\n results.push(parseIntAuto(ref[1]));\n results.push((value >> 8) & 0xff);\n results.push( value & 0xff);\n\n return results;\n })();\n } else {\n return null;\n }\n };\n\n // A utility function to return subnet mask in IPv4 format given the prefix length\n ipaddr.IPv4.subnetMaskFromPrefixLength = function (prefix) {\n prefix = parseInt(prefix);\n if (prefix < 0 || prefix > 32) {\n throw new Error('ipaddr: invalid IPv4 prefix length');\n }\n\n const octets = [0, 0, 0, 0];\n let j = 0;\n const filledOctetCount = Math.floor(prefix / 8);\n\n while (j < filledOctetCount) {\n octets[j] = 255;\n j++;\n }\n\n if (filledOctetCount < 4) {\n octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n }\n\n return new this(octets);\n };\n\n // An IPv6 address (RFC2460)\n ipaddr.IPv6 = (function () {\n // Constructs an IPv6 address from an array of eight 16 - bit parts\n // or sixteen 8 - bit parts in network order(MSB first).\n // Throws an error if the input is invalid.\n function IPv6 (parts, zoneId) {\n let i, part;\n\n if (parts.length === 16) {\n this.parts = [];\n for (i = 0; i <= 14; i += 2) {\n this.parts.push((parts[i] << 8) | parts[i + 1]);\n }\n } else if (parts.length === 8) {\n this.parts = parts;\n } else {\n throw new Error('ipaddr: ipv6 part count should be 8 or 16');\n }\n\n for (i = 0; i < this.parts.length; i++) {\n part = this.parts[i];\n if (!((0 <= part && part <= 0xffff))) {\n throw new Error('ipaddr: ipv6 part should fit in 16 bits');\n }\n }\n\n if (zoneId) {\n this.zoneId = zoneId;\n }\n }\n\n // Special IPv6 ranges\n IPv6.prototype.SpecialRanges = {\n // RFC4291, here and after\n unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n // RFC6666\n discard: [new IPv6([0x100, 0, 0, 0, 0, 0, 0, 0]), 64],\n // RFC6145\n rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n // RFC6052\n rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n // RFC3056\n '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n // RFC6052, RFC6146\n teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n // RFC5180\n benchmarking: [new IPv6([0x2001, 0x2, 0, 0, 0, 0, 0, 0]), 48],\n // RFC7450\n amt: [new IPv6([0x2001, 0x3, 0, 0, 0, 0, 0, 0]), 32],\n as112v6: [\n [new IPv6([0x2001, 0x4, 0x112, 0, 0, 0, 0, 0]), 48],\n [new IPv6([0x2620, 0x4f, 0x8000, 0, 0, 0, 0, 0]), 48],\n ],\n deprecated: [new IPv6([0x2001, 0x10, 0, 0, 0, 0, 0, 0]), 28],\n orchid2: [new IPv6([0x2001, 0x20, 0, 0, 0, 0, 0, 0]), 28],\n droneRemoteIdProtocolEntityTags: [new IPv6([0x2001, 0x30, 0, 0, 0, 0, 0, 0]), 28],\n reserved: [\n // RFC3849\n [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 23],\n // RFC2928\n [new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32],\n ],\n };\n\n // Checks if this address is an IPv4-mapped IPv6 address.\n IPv6.prototype.isIPv4MappedAddress = function () {\n return this.range() === 'ipv4Mapped';\n };\n\n // The 'kind' method exists on both IPv4 and IPv6 classes.\n IPv6.prototype.kind = function () {\n return 'ipv6';\n };\n\n // Checks if this address matches other one within given CIDR range.\n IPv6.prototype.match = function (other, cidrRange) {\n let ref;\n\n if (cidrRange === undefined) {\n ref = other;\n other = ref[0];\n cidrRange = ref[1];\n }\n\n if (other.kind() !== 'ipv6') {\n throw new Error('ipaddr: cannot match ipv6 address with non-ipv6 one');\n }\n\n return matchCIDR(this.parts, other.parts, 16, cidrRange);\n };\n\n // returns a number of leading ones in IPv6 address, making sure that\n // the rest is a solid sequence of 0's (valid netmask)\n // returns either the CIDR length or null if mask is not valid\n IPv6.prototype.prefixLengthFromSubnetMask = function () {\n let cidr = 0;\n // non-zero encountered stop scanning for zeroes\n let stop = false;\n // number of zeroes in octet\n const zerotable = {\n 0: 16,\n 32768: 15,\n 49152: 14,\n 57344: 13,\n 61440: 12,\n 63488: 11,\n 64512: 10,\n 65024: 9,\n 65280: 8,\n 65408: 7,\n 65472: 6,\n 65504: 5,\n 65520: 4,\n 65528: 3,\n 65532: 2,\n 65534: 1,\n 65535: 0\n };\n let part, zeros;\n\n for (let i = 7; i >= 0; i -= 1) {\n part = this.parts[i];\n if (part in zerotable) {\n zeros = zerotable[part];\n if (stop && zeros !== 0) {\n return null;\n }\n\n if (zeros !== 16) {\n stop = true;\n }\n\n cidr += zeros;\n } else {\n return null;\n }\n }\n\n return 128 - cidr;\n };\n\n\n // Checks if the address corresponds to one of the special ranges.\n IPv6.prototype.range = function () {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n // Returns an array of byte-sized values in network order (MSB first)\n IPv6.prototype.toByteArray = function () {\n let part;\n const bytes = [];\n const ref = this.parts;\n for (let i = 0; i < ref.length; i++) {\n part = ref[i];\n bytes.push(part >> 8);\n bytes.push(part & 0xff);\n }\n\n return bytes;\n };\n\n // Returns the address in expanded format with all zeroes included, like\n // 2001:0db8:0008:0066:0000:0000:0000:0001\n IPv6.prototype.toFixedLengthString = function () {\n const addr = ((function () {\n const results = [];\n for (let i = 0; i < this.parts.length; i++) {\n results.push(padPart(this.parts[i].toString(16), 4));\n }\n\n return results;\n }).call(this)).join(':');\n\n let suffix = '';\n\n if (this.zoneId) {\n suffix = `%${this.zoneId}`;\n }\n\n return addr + suffix;\n };\n\n // Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address.\n // Throws an error otherwise.\n IPv6.prototype.toIPv4Address = function () {\n if (!this.isIPv4MappedAddress()) {\n throw new Error('ipaddr: trying to convert a generic ipv6 address to ipv4');\n }\n\n const ref = this.parts.slice(-2);\n const high = ref[0];\n const low = ref[1];\n\n return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n };\n\n // Returns the address in expanded format with all zeroes included, like\n // 2001:db8:8:66:0:0:0:1\n //\n // Deprecated: use toFixedLengthString() instead.\n IPv6.prototype.toNormalizedString = function () {\n const addr = ((function () {\n const results = [];\n\n for (let i = 0; i < this.parts.length; i++) {\n results.push(this.parts[i].toString(16));\n }\n\n return results;\n }).call(this)).join(':');\n\n let suffix = '';\n\n if (this.zoneId) {\n suffix = `%${this.zoneId}`;\n }\n\n return addr + suffix;\n };\n\n // Returns the address in compact, human-readable format like\n // 2001:db8:8:66::1\n // in line with RFC 5952 (see https://tools.ietf.org/html/rfc5952#section-4)\n IPv6.prototype.toRFC5952String = function () {\n const regex = /((^|:)(0(:|$)){2,})/g;\n const string = this.toNormalizedString();\n let bestMatchIndex = 0;\n let bestMatchLength = -1;\n let match;\n\n while ((match = regex.exec(string))) {\n if (match[0].length > bestMatchLength) {\n bestMatchIndex = match.index;\n bestMatchLength = match[0].length;\n }\n }\n\n if (bestMatchLength < 0) {\n return string;\n }\n\n return `${string.substring(0, bestMatchIndex)}::${string.substring(bestMatchIndex + bestMatchLength)}`;\n };\n\n // Returns the address in compact, human-readable format like\n // 2001:db8:8:66::1\n // Calls toRFC5952String under the hood.\n IPv6.prototype.toString = function () {\n return this.toRFC5952String();\n };\n\n return IPv6;\n\n })();\n\n // A utility function to return broadcast address given the IPv6 interface and prefix length in CIDR notation\n ipaddr.IPv6.broadcastAddressFromCIDR = function (string) {\n try {\n const cidr = this.parseCIDR(string);\n const ipInterfaceOctets = cidr[0].toByteArray();\n const subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n const octets = [];\n let i = 0;\n while (i < 16) {\n // Broadcast address is bitwise OR between ip interface and inverted mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${e})`);\n }\n };\n\n // Checks if a given string is formatted like IPv6 address.\n ipaddr.IPv6.isIPv6 = function (string) {\n return this.parser(string) !== null;\n };\n\n // Checks to see if string is a valid IPv6 Address\n ipaddr.IPv6.isValid = function (string) {\n\n // Since IPv6.isValid is always called first, this shortcut\n // provides a substantial performance gain.\n if (typeof string === 'string' && string.indexOf(':') === -1) {\n return false;\n }\n\n try {\n const addr = this.parser(string);\n new this(addr.parts, addr.zoneId);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // Checks if a given string is a valid IPv6 address in CIDR notation.\n ipaddr.IPv6.isValidCIDR = function (string) {\n\n // See note in IPv6.isValid\n if (typeof string === 'string' && string.indexOf(':') === -1) {\n return false;\n }\n\n try {\n this.parseCIDR(string);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // A utility function to return network address given the IPv6 interface and prefix length in CIDR notation\n ipaddr.IPv6.networkAddressFromCIDR = function (string) {\n let cidr, i, ipInterfaceOctets, octets, subnetMaskOctets;\n\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 16) {\n // Network address is bitwise AND between ip interface and mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${e})`);\n }\n };\n\n // Tries to parse and validate a string with IPv6 address.\n // Throws an error if it fails.\n ipaddr.IPv6.parse = function (string) {\n const addr = this.parser(string);\n\n if (addr.parts === null) {\n throw new Error('ipaddr: string is not formatted like an IPv6 Address');\n }\n\n return new this(addr.parts, addr.zoneId);\n };\n\n ipaddr.IPv6.parseCIDR = function (string) {\n let maskLength, match, parsed;\n\n if ((match = string.match(/^(.+)\\/(\\d+)$/))) {\n maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 128) {\n parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function () {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n\n throw new Error('ipaddr: string is not formatted like an IPv6 CIDR range');\n };\n\n // Parse an IPv6 address.\n ipaddr.IPv6.parser = function (string) {\n let addr, i, match, octet, octets, zoneId;\n\n if ((match = string.match(ipv6Regexes.deprecatedTransitional))) {\n return this.parser(`::ffff:${match[1]}`);\n }\n if (ipv6Regexes.native.test(string)) {\n return expandIPv6(string, 8);\n }\n if ((match = string.match(ipv6Regexes.transitional))) {\n zoneId = match[6] || '';\n addr = match[1]\n if (!match[1].endsWith('::')) {\n addr = addr.slice(0, -1)\n }\n addr = expandIPv6(addr + zoneId, 6);\n if (addr.parts) {\n octets = [\n parseInt(match[2]),\n parseInt(match[3]),\n parseInt(match[4]),\n parseInt(match[5])\n ];\n for (i = 0; i < octets.length; i++) {\n octet = octets[i];\n if (!((0 <= octet && octet <= 255))) {\n return null;\n }\n }\n\n addr.parts.push(octets[0] << 8 | octets[1]);\n addr.parts.push(octets[2] << 8 | octets[3]);\n return {\n parts: addr.parts,\n zoneId: addr.zoneId\n };\n }\n }\n\n return null;\n };\n\n // A utility function to return subnet mask in IPv6 format given the prefix length\n ipaddr.IPv6.subnetMaskFromPrefixLength = function (prefix) {\n prefix = parseInt(prefix);\n if (prefix < 0 || prefix > 128) {\n throw new Error('ipaddr: invalid IPv6 prefix length');\n }\n\n const octets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n let j = 0;\n const filledOctetCount = Math.floor(prefix / 8);\n\n while (j < filledOctetCount) {\n octets[j] = 255;\n j++;\n }\n\n if (filledOctetCount < 16) {\n octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n }\n\n return new this(octets);\n };\n\n // Try to parse an array in network order (MSB first) for IPv4 and IPv6\n ipaddr.fromByteArray = function (bytes) {\n const length = bytes.length;\n\n if (length === 4) {\n return new ipaddr.IPv4(bytes);\n } else if (length === 16) {\n return new ipaddr.IPv6(bytes);\n } else {\n throw new Error('ipaddr: the binary input is neither an IPv6 nor IPv4 address');\n }\n };\n\n // Checks if the address is valid IP address\n ipaddr.isValid = function (string) {\n return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n };\n\n // Checks if the address is valid IP address in CIDR notation\n ipaddr.isValidCIDR = function (string) {\n return ipaddr.IPv6.isValidCIDR(string) || ipaddr.IPv4.isValidCIDR(string);\n };\n\n\n // Attempts to parse an IP Address, first through IPv6 then IPv4.\n // Throws an error if it could not be parsed.\n ipaddr.parse = function (string) {\n if (ipaddr.IPv6.isValid(string)) {\n return ipaddr.IPv6.parse(string);\n } else if (ipaddr.IPv4.isValid(string)) {\n return ipaddr.IPv4.parse(string);\n } else {\n throw new Error('ipaddr: the address has neither IPv6 nor IPv4 format');\n }\n };\n\n // Attempt to parse CIDR notation, first through IPv6 then IPv4.\n // Throws an error if it could not be parsed.\n ipaddr.parseCIDR = function (string) {\n try {\n return ipaddr.IPv6.parseCIDR(string);\n } catch (e) {\n try {\n return ipaddr.IPv4.parseCIDR(string);\n } catch (e2) {\n throw new Error('ipaddr: the address has neither IPv6 nor IPv4 CIDR format');\n }\n }\n };\n\n // Parse an address and return plain IPv4 address if it is an IPv4-mapped address\n ipaddr.process = function (string) {\n const addr = this.parse(string);\n\n if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n return addr.toIPv4Address();\n } else {\n return addr;\n }\n };\n\n // An utility function to ease named range matching. See examples below.\n // rangeList can contain both IPv4 and IPv6 subnet entries and will not throw errors\n // on matching IPv4 addresses to IPv6 ranges or vice versa.\n ipaddr.subnetMatch = function (address, rangeList, defaultName) {\n let i, rangeName, rangeSubnets, subnet;\n\n if (defaultName === undefined || defaultName === null) {\n defaultName = 'unicast';\n }\n\n for (rangeName in rangeList) {\n if (Object.prototype.hasOwnProperty.call(rangeList, rangeName)) {\n rangeSubnets = rangeList[rangeName];\n // ECMA5 Array.isArray isn't available everywhere\n if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n rangeSubnets = [rangeSubnets];\n }\n\n for (i = 0; i < rangeSubnets.length; i++) {\n subnet = rangeSubnets[i];\n if (address.kind() === subnet[0].kind() && address.match.apply(address, subnet)) {\n return rangeName;\n }\n }\n }\n }\n\n return defaultName;\n };\n\n // Export for both the CommonJS and browser-like environment\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = ipaddr;\n\n } else {\n root.ipaddr = ipaddr;\n }\n\n}(this));\n","import { execFileSync, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\n\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 'com.microsoft.edgemac',\n 'com.microsoft.edgemac.beta',\n 'com.microsoft.edgemac.dev',\n 'com.microsoft.edgemac.canary',\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',\n 'msedge.exe',\n 'brave.exe',\n 'brave-browser.exe',\n 'chromium.exe',\n 'vivaldi.exe',\n 'opera.exe',\n 'launcher.exe',\n 'yandex.exe',\n 'yandexbrowser.exe',\n 'google chrome',\n 'google chrome canary',\n 'brave browser',\n 'microsoft edge',\n 'chromium',\n 'chrome',\n 'brave',\n 'msedge',\n 'brave-browser',\n 'google-chrome',\n 'google-chrome-stable',\n 'google-chrome-beta',\n 'google-chrome-unstable',\n 'microsoft-edge',\n 'microsoft-edge-beta',\n 'microsoft-edge-dev',\n 'microsoft-edge-canary',\n 'chromium-browser',\n 'vivaldi',\n 'vivaldi-stable',\n 'opera',\n 'opera-stable',\n 'opera-gx',\n 'yandex-browser',\n]);\n\nfunction fileExists(filePath: string): boolean {\n try {\n return fs.existsSync(filePath);\n } catch {\n return false;\n }\n}\n\nfunction execText(command: string, args: string[], timeoutMs = 1200, maxBuffer = 1024 * 1024): string | null {\n try {\n const output = execFileSync(command, args, {\n timeout: timeoutMs,\n encoding: 'utf8',\n maxBuffer,\n });\n return output.trim() || null;\n } catch {\n return null;\n }\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'))\n 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(\n os.homedir(),\n 'Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist',\n );\n if (!fileExists(plistPath)) return null;\n const handlersRaw = execText(\n '/usr/bin/plutil',\n ['-extract', 'LSHandlers', 'json', '-o', '-', '--', plistPath],\n 2000,\n 5 * 1024 * 1024,\n );\n if (handlersRaw === null) return null;\n let handlers: unknown[];\n try {\n const parsed: unknown = JSON.parse(handlersRaw);\n if (!Array.isArray(parsed)) return null;\n handlers = parsed;\n } catch {\n return null;\n }\n\n const resolveScheme = (scheme: string): string | null => {\n let candidate: string | null = null;\n for (const entry of handlers) {\n if (entry === null || entry === undefined || typeof entry !== 'object') continue;\n const rec = entry as Record<string, unknown>;\n if (rec.LSHandlerURLScheme !== scheme) continue;\n const role =\n (typeof rec.LSHandlerRoleAll === 'string' ? rec.LSHandlerRoleAll : null) ??\n (typeof rec.LSHandlerRoleViewer === 'string' ? rec.LSHandlerRoleViewer : null) ??\n null;\n if (role !== null) 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 === null || !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 === null) 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 === null) 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 {\n kind: 'canary',\n path: path.join(os.homedir(), 'Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'),\n },\n ]);\n}\n\nfunction splitExecLine(line: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = '';\n for (const ch of line) {\n if ((ch === '\"' || ch === \"'\") && (!inQuotes || ch === quoteChar)) {\n if (inQuotes) {\n inQuotes = false;\n quoteChar = '';\n } else {\n inQuotes = true;\n quoteChar = ch;\n }\n continue;\n }\n if (!inQuotes && /\\s/.test(ch)) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n current += ch;\n }\n if (current) tokens.push(current);\n return tokens;\n}\n\n// ── Linux Detection ──\n\nfunction detectDefaultChromiumLinux(): ChromeExecutable | null {\n const desktopId =\n execText('xdg-settings', ['get', 'default-web-browser']) ??\n execText('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n if (desktopId === null) 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)) {\n desktopPath = candidate;\n break;\n }\n }\n if (desktopPath === null) 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)\n if (line.startsWith('Exec=')) {\n execLine = line.slice(5).trim();\n break;\n }\n } catch {\n /* no exec line found */\n }\n if (execLine === null) return null;\n\n const tokens = splitExecLine(execLine);\n let command: string | null = null;\n for (const token of tokens) {\n if (!token || token === 'env' || (token.includes('=') && !token.startsWith('/') && !token.includes('\\\\'))) continue;\n command = token.replace(/^[\"']|[\"']$/g, '');\n break;\n }\n if (command === null) return null;\n\n const resolved = command.startsWith('/') ? command : (execText('which', [command], 800)?.trim() ?? null);\n if (resolved === null || 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({\n kind: 'brave',\n path: j(localAppData, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),\n });\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({\n kind: 'brave',\n path: j(programFiles, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),\n });\n candidates.push({\n kind: 'brave',\n path: j(programFilesX86, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),\n });\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// ── Windows Default Browser Detection ──\n\nfunction readWindowsProgId(): string | null {\n const output = execText('reg', [\n 'query',\n 'HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n '/v',\n 'ProgId',\n ]);\n if (output === null) return null;\n return /ProgId\\s+REG_\\w+\\s+(.+)$/im.exec(output)?.[1]?.trim() ?? null;\n}\n\nfunction readWindowsCommandForProgId(progId: string): string | null {\n const output = execText('reg', [\n 'query',\n progId === 'http' ? 'HKCR\\\\http\\\\shell\\\\open\\\\command' : `HKCR\\\\${progId}\\\\shell\\\\open\\\\command`,\n '/ve',\n ]);\n if (output === null) return null;\n return /REG_\\w+\\s+(.+)$/im.exec(output)?.[1]?.trim() ?? null;\n}\n\nfunction expandWindowsEnvVars(value: string): string {\n return value.replace(/%([^%]+)%/g, (_match, name: string) => {\n const key = name.trim();\n return key !== '' ? (process.env[key] ?? `%${key}%`) : _match;\n });\n}\n\nfunction extractWindowsExecutablePath(command: string): string | null {\n const quoted = /\"([^\"]+\\.exe)\"/i.exec(command);\n if (quoted?.[1] !== undefined) return quoted[1];\n const unquoted = /([^\\s]+\\.exe)/i.exec(command);\n if (unquoted?.[1] !== undefined) return unquoted[1];\n return null;\n}\n\nfunction detectDefaultChromiumWindows(): ChromeExecutable | null {\n const progId = readWindowsProgId();\n const command = (progId !== null ? readWindowsCommandForProgId(progId) : null) ?? readWindowsCommandForProgId('http');\n if (command === null) return null;\n const exePath = extractWindowsExecutablePath(expandWindowsEnvVars(command));\n if (exePath === null) return null;\n if (!fileExists(exePath)) return null;\n const exeName = path.win32.basename(exePath).toLowerCase();\n if (!CHROMIUM_EXE_NAMES.has(exeName)) return null;\n return { kind: inferKindFromExeName(exeName), path: exePath };\n}\n\n// ── Resolve Executable ──\n\nexport function resolveBrowserExecutable(opts?: { executablePath?: string }): ChromeExecutable | null {\n if (opts?.executablePath !== undefined && 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 if (platform === 'darwin') return detectDefaultChromiumMac() ?? findChromeMac();\n if (platform === 'linux') return detectDefaultChromiumLinux() ?? findChromeLinux();\n if (platform === 'win32') return detectDefaultChromiumWindows() ?? 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\n .createServer()\n .once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') reject(new Error(`Port ${String(port)} is already in use`));\n else reject(err);\n })\n .once('listening', () => {\n tester.close(() => {\n resolve();\n });\n })\n .listen(port);\n });\n}\n\n// ── Profile Decoration ──\n\nfunction safeReadJson(filePath: string): Record<string, unknown> | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const parsed: unknown = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return null;\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction safeWriteJson(filePath: string, data: Record<string, unknown>): 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, unknown>, keys: string[], value: unknown): void {\n let node: Record<string, unknown> = obj;\n for (const key of keys.slice(0, -1)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') return;\n const next = node[key];\n if (typeof next !== 'object' || next === null || Array.isArray(next)) node[key] = {};\n // nosemgrep: prototype-pollution-loop -- guarded above\n node = node[key] as Record<string, unknown>;\n }\n const lastKey = keys[keys.length - 1];\n if (lastKey === '__proto__' || lastKey === 'constructor' || lastKey === 'prototype') return;\n node[lastKey] = 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 {\n return false;\n }\n}\n\nexport function isLoopbackHost(hostname: string): boolean {\n const h = hostname.replace(/\\.+$/, '');\n return h === 'localhost' || h === '127.0.0.1' || h === '::1' || h === '[::1]';\n}\n\nconst PROXY_ENV_KEYS = ['HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'http_proxy', 'https_proxy', 'all_proxy'];\n\nexport function 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/**\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 */\nexport function 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 {\n ws.close();\n } catch {}\n resolve(value);\n };\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(50, timeoutMs + 25),\n );\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n finish(false);\n return;\n }\n ws.onopen = () => {\n finish(true);\n };\n ws.onerror = () => {\n finish(false);\n };\n });\n}\n\nasync function fetchChromeVersion(\n cdpUrl: string,\n timeoutMs = 500,\n authToken?: string,\n): Promise<Record<string, unknown> | null> {\n const ctrl = new AbortController();\n const t = setTimeout(() => {\n ctrl.abort();\n }, timeoutMs);\n try {\n const httpBase = isWebSocketUrl(cdpUrl) ? normalizeCdpHttpBaseForJsonEndpoints(cdpUrl) : cdpUrl;\n const headers: Record<string, string> = {};\n if (authToken !== undefined && 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: unknown = await res.json();\n if (data === null || data === undefined || typeof data !== 'object') return null;\n return data as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nconst COMMON_CDP_PORTS = [9222, 9223, 9224, 9225, 9226, 9229];\n\nexport async function discoverChromeCdpUrl(timeoutMs = 500): Promise<string | null> {\n const results = await Promise.all(\n COMMON_CDP_PORTS.map(async (port) => {\n const url = `http://127.0.0.1:${String(port)}`;\n return (await isChromeReachable(url, timeoutMs)) ? url : null;\n }),\n );\n return results.find((url) => url !== null) ?? null;\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 version !== null;\n}\n\nexport async function getChromeWebSocketUrl(\n cdpUrl: string,\n timeoutMs = 500,\n authToken?: string,\n): Promise<string | null> {\n if (isWebSocketUrl(cdpUrl)) return cdpUrl;\n const version = await fetchChromeVersion(cdpUrl, timeoutMs, authToken);\n const rawWsUrl = version?.webSocketDebuggerUrl;\n const wsUrl = typeof rawWsUrl === 'string' ? rawWsUrl.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 === null) 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 {\n ws.close();\n } catch {}\n resolve(value);\n };\n\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(50, timeoutMs + 25),\n );\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 {\n finish(false);\n }\n };\n ws.onmessage = (event) => {\n try {\n const parsed: unknown = JSON.parse(String(event.data));\n if (typeof parsed !== 'object' || parsed === null) return;\n const msg = parsed as Record<string, unknown>;\n if (msg.id !== 1) return;\n finish(typeof msg.result === 'object' && msg.result !== null);\n } catch {\n /* ignore non-JSON frames */\n }\n };\n ws.onerror = () => {\n finish(false);\n };\n ws.onclose = () => {\n finish(false);\n };\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)\n 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=${String(cdpPort)}`,\n '--remote-debugging-address=127.0.0.1',\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 === true) {\n args.push('--headless=new', '--disable-gpu');\n }\n if (opts.noSandbox === true) {\n args.push('--no-sandbox', '--disable-setuid-sandbox');\n }\n if (opts.ignoreHTTPSErrors === true) {\n args.push('--ignore-certificate-errors');\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 {\n bootstrap.kill('SIGTERM');\n } 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 {\n bootstrap.kill('SIGKILL');\n } catch {}\n }\n }\n\n try {\n decorateProfile(userDataDir, profileName, opts.profileColor ?? DEFAULT_PROFILE_COLOR);\n } catch {}\n\n try {\n ensureCleanExit(userDataDir);\n } catch {}\n\n const proc = spawnChrome();\n const cdpUrl = `http://127.0.0.1:${String(cdpPort)}`;\n\n // Capture stderr for diagnostics on failure\n const stderrChunks: Buffer[] = [];\n const onStderr = (chunk: Buffer) => {\n stderrChunks.push(chunk);\n };\n proc.stderr.on('data', onStderr);\n\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 =\n process.platform === 'linux' && opts.noSandbox !== true\n ? '\\nHint: If running in a container or as root, try setting noSandbox: true.'\n : '';\n try {\n proc.kill('SIGKILL');\n } catch {}\n throw new Error(`Failed to start Chrome CDP on port ${String(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 {\n proc.kill('SIGTERM');\n } catch {\n /* process may already be dead */\n }\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n // exitCode changes asynchronously after SIGTERM; re-read from proc\n if ((proc as { exitCode: number | null }).exitCode !== null) return;\n await new Promise((r) => setTimeout(r, 100));\n }\n try {\n proc.kill('SIGKILL');\n } catch {\n /* process may already be dead */\n }\n}\n","/**\n * Comprehensive browser stealth evasions.\n *\n * Injected via `addInitScript()` (runs before any page JS) and via\n * `page.evaluate()` for already-loaded pages. Each patch is wrapped\n * in try/catch so a single failure never breaks the rest.\n *\n * Covers: navigator.webdriver, plugins, languages, window.chrome,\n * Permissions API, WebGL fingerprint, Notification.permission,\n * navigator.connection, console toString, headless-mode quirks,\n * hardwareConcurrency, and deviceMemory.\n */\n\nexport const STEALTH_SCRIPT = `(function() {\n 'use strict';\n function p(fn) { try { fn(); } catch(_) {} }\n\n // ── 1. navigator.webdriver → undefined ──\n p(function() {\n Object.defineProperty(navigator, 'webdriver', { get: function() { return undefined; }, configurable: true });\n });\n\n // ── 2. navigator.plugins + mimeTypes (only if empty — Chrome 92+ populates them natively) ──\n p(function() {\n if (navigator.plugins && navigator.plugins.length > 0) return;\n\n function FakePlugin(name, fn, desc, mimes) {\n this.name = name; this.filename = fn; this.description = desc; this.length = mimes.length;\n for (var i = 0; i < mimes.length; i++) { this[i] = mimes[i]; mimes[i].enabledPlugin = this; }\n }\n FakePlugin.prototype.item = function(i) { return this[i] || null; };\n FakePlugin.prototype.namedItem = function(n) {\n for (var i = 0; i < this.length; i++) if (this[i].type === n) return this[i];\n return null;\n };\n\n function M(type, suf, desc) { this.type = type; this.suffixes = suf; this.description = desc; }\n\n var m1 = new M('application/pdf', 'pdf', 'Portable Document Format');\n var m2 = new M('application/x-google-chrome-pdf', 'pdf', 'Portable Document Format');\n var m3 = new M('application/x-nacl', '', 'Native Client Executable');\n var m4 = new M('application/x-pnacl', '', 'Portable Native Client Executable');\n\n var plugins = [\n new FakePlugin('Chrome PDF Plugin', 'internal-pdf-viewer', 'Portable Document Format', [m1]),\n new FakePlugin('Chrome PDF Viewer', 'mhjfbmdgcfjbbpaeojofohoefgiehjai', '', [m2]),\n new FakePlugin('Native Client', 'internal-nacl-plugin', '', [m3, m4]),\n ];\n\n function makeIterable(arr, items) {\n arr.length = items.length;\n for (var i = 0; i < items.length; i++) arr[i] = items[i];\n arr[Symbol.iterator] = function() {\n var idx = 0;\n return { next: function() {\n return idx < items.length ? { value: items[idx++], done: false } : { done: true };\n }};\n };\n }\n\n var pa = { item: function(i) { return plugins[i] || null; },\n namedItem: function(n) { for (var i = 0; i < plugins.length; i++) if (plugins[i].name === n) return plugins[i]; return null; },\n refresh: function() {} };\n makeIterable(pa, plugins);\n Object.defineProperty(navigator, 'plugins', { get: function() { return pa; } });\n\n var allMimes = [m1, m2, m3, m4];\n var ma = { item: function(i) { return allMimes[i] || null; },\n namedItem: function(n) { for (var i = 0; i < allMimes.length; i++) if (allMimes[i].type === n) return allMimes[i]; return null; } };\n makeIterable(ma, allMimes);\n Object.defineProperty(navigator, 'mimeTypes', { get: function() { return ma; } });\n });\n\n // ── 3. navigator.languages (cached + frozen so identity check passes) ──\n p(function() {\n if (!navigator.languages || navigator.languages.length === 0) {\n var langs = Object.freeze(['en-US', 'en']);\n Object.defineProperty(navigator, 'languages', { get: function() { return langs; } });\n }\n });\n\n // ── 4. window.chrome ──\n p(function() {\n if (window.chrome && window.chrome.runtime && window.chrome.runtime.connect) return;\n\n var chrome = window.chrome || {};\n var noop = function() {};\n var evtStub = { addListener: noop, removeListener: noop, hasListeners: function() { return false; } };\n chrome.runtime = chrome.runtime || {};\n chrome.runtime.onMessage = chrome.runtime.onMessage || evtStub;\n chrome.runtime.onConnect = chrome.runtime.onConnect || evtStub;\n chrome.runtime.sendMessage = chrome.runtime.sendMessage || noop;\n chrome.runtime.connect = chrome.runtime.connect || function() {\n return { onMessage: { addListener: noop }, postMessage: noop, disconnect: noop };\n };\n if (chrome.runtime.id === undefined) chrome.runtime.id = undefined;\n if (!chrome.loadTimes) chrome.loadTimes = function() { return {}; };\n if (!chrome.csi) chrome.csi = function() { return {}; };\n if (!chrome.app) {\n chrome.app = {\n isInstalled: false,\n InstallState: { INSTALLED: 'installed', NOT_INSTALLED: 'not_installed', DISABLED: 'disabled' },\n RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' },\n getDetails: function() { return null; },\n getIsInstalled: function() { return false; },\n runningState: function() { return 'cannot_run'; },\n };\n }\n\n if (!window.chrome) {\n Object.defineProperty(window, 'chrome', { value: chrome, writable: false, enumerable: true, configurable: false });\n }\n });\n\n // ── 5. Permissions API consistency ──\n p(function() {\n var orig = navigator.permissions.query.bind(navigator.permissions);\n function q(params) {\n if (params.name === 'notifications') {\n return Promise.resolve({\n state: typeof Notification !== 'undefined' ? Notification.permission : 'prompt',\n name: 'notifications', onchange: null,\n addEventListener: function(){}, removeEventListener: function(){}, dispatchEvent: function(){ return true; },\n });\n }\n return orig(params);\n }\n q.toString = function() { return 'function query() { [native code] }'; };\n navigator.permissions.query = q;\n });\n\n // ── 6. WebGL vendor / renderer ──\n p(function() {\n var h = {\n apply: function(target, self, args) {\n var param = args[0];\n if (param === 0x9245) return 'Intel Inc.';\n if (param === 0x9246) return 'Intel Iris OpenGL Engine';\n return Reflect.apply(target, self, args);\n }\n };\n if (typeof WebGLRenderingContext !== 'undefined')\n WebGLRenderingContext.prototype.getParameter = new Proxy(WebGLRenderingContext.prototype.getParameter, h);\n if (typeof WebGL2RenderingContext !== 'undefined')\n WebGL2RenderingContext.prototype.getParameter = new Proxy(WebGL2RenderingContext.prototype.getParameter, h);\n });\n\n // ── 7. Notification.permission ──\n p(function() {\n if (typeof Notification !== 'undefined' && Notification.permission === 'denied') {\n Object.defineProperty(Notification, 'permission', { get: function() { return 'default'; }, configurable: true });\n }\n });\n\n // ── 8. navigator.connection (cached so identity check passes) ──\n p(function() {\n if (navigator.connection) return;\n var conn = {\n effectiveType: '4g', rtt: 50, downlink: 10, saveData: false, onchange: null,\n addEventListener: function(){}, removeEventListener: function(){}, dispatchEvent: function(){ return true; },\n };\n Object.defineProperty(navigator, 'connection', { get: function() { return conn; } });\n });\n\n // ── 9. Iframe contentWindow.chrome ──\n // Handled by patch 4 — chrome object is now on window, propagates to iframes on same origin.\n\n // ── 10. console method toString ──\n p(function() {\n ['log','info','warn','error','debug','table','trace'].forEach(function(n) {\n if (console[n]) {\n console[n].toString = function() { return 'function ' + n + '() { [native code] }'; };\n }\n });\n });\n\n // ── 11. Headless-mode window / screen fixes ──\n p(function() {\n if (window.outerWidth === 0)\n Object.defineProperty(window, 'outerWidth', { get: function() { return window.innerWidth || 1920; } });\n if (window.outerHeight === 0)\n Object.defineProperty(window, 'outerHeight', { get: function() { return (window.innerHeight || 1080) + 85; } });\n });\n\n p(function() {\n if (screen.colorDepth === 0) {\n Object.defineProperty(screen, 'colorDepth', { get: function() { return 24; } });\n Object.defineProperty(screen, 'pixelDepth', { get: function() { return 24; } });\n }\n });\n\n // ── 12. navigator.hardwareConcurrency ──\n p(function() {\n if (!navigator.hardwareConcurrency)\n Object.defineProperty(navigator, 'hardwareConcurrency', { get: function() { return 4; } });\n });\n\n // ── 13. navigator.deviceMemory ──\n p(function() {\n if (!navigator.deviceMemory)\n Object.defineProperty(navigator, 'deviceMemory', { get: function() { return 8; } });\n });\n})()`;\n","import type { Page, BrowserContext, Browser } from 'playwright-core';\n\nimport { STEALTH_SCRIPT } from './stealth.js';\nimport type { PageState, ContextState, NetworkRequest, DialogHandler } from './types.js';\n\nconst MAX_CONSOLE_MESSAGES = 500;\nconst MAX_PAGE_ERRORS = 200;\nconst MAX_NETWORK_REQUESTS = 500;\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// ── Page State Management ──\n\n/** Read-only access to a page's state (returns undefined if not initialized). */\nexport function getPageState(page: Page): PageState | undefined {\n return pageStates.get(page);\n}\n\n/** Find a network request by ID in the page state. */\nexport function findNetworkRequestById(state: PageState, id: string): NetworkRequest | undefined {\n for (let i = state.requests.length - 1; i >= 0; i--) {\n const candidate = state.requests[i];\n if (candidate.id === id) return candidate;\n }\n return undefined;\n}\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 !== '' ? err.message : String(err),\n name: err.name !== '' ? err.name : undefined,\n stack: err.stack !== undefined && err.stack !== '' ? 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${String(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 === undefined) return;\n const rec = findNetworkRequestById(state, id);\n if (rec) {\n rec.status = resp.status();\n rec.ok = resp.ok();\n }\n });\n\n page.on('requestfailed', (req) => {\n const id = state.requestIds.get(req);\n if (id === undefined) return;\n const rec = findNetworkRequestById(state, id);\n if (rec) {\n rec.failureText = req.failure()?.errorText;\n rec.ok = false;\n }\n });\n\n page.on('dialog', (dialog) => {\n // If a one-shot armDialog is active, let it handle the dialog.\n if (state.armIdDialog > 0) return;\n\n // If a persistent onDialog handler is registered, invoke it.\n if (state.dialogHandler) {\n let handled = false;\n const event = {\n type: dialog.type(),\n message: dialog.message(),\n defaultValue: dialog.defaultValue(),\n accept: (promptText?: string) => {\n handled = true;\n return dialog.accept(promptText);\n },\n dismiss: () => {\n handled = true;\n return dialog.dismiss();\n },\n };\n Promise.resolve(state.dialogHandler(event))\n .then(() => {\n if (!handled) {\n dialog.dismiss().catch((err: unknown) => {\n console.warn(\n `[browserclaw] Failed to auto-dismiss dialog: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n })\n .catch((err: unknown) => {\n console.warn(`[browserclaw] onDialog handler error: ${err instanceof Error ? err.message : String(err)}`);\n if (!handled) {\n dialog.dismiss().catch((dismissErr: unknown) => {\n console.warn(\n `[browserclaw] Failed to dismiss dialog after handler error: ${dismissErr instanceof Error ? dismissErr.message : String(dismissErr)}`,\n );\n });\n }\n });\n return;\n }\n\n // Default: auto-dismiss unexpected dialogs.\n dialog.dismiss().catch((err: unknown) => {\n console.warn(`[browserclaw] Failed to dismiss dialog: ${err instanceof Error ? err.message : String(err)}`);\n });\n });\n\n page.on('close', () => {\n pageStates.delete(page);\n observedPages.delete(page);\n });\n }\n\n return state;\n}\n\n// ── Dialog Handler ──\n\n/**\n * Set or clear a persistent dialog handler for a page.\n * When set, this handler is called for every dialog that is not covered by armDialog().\n * Pass `undefined` to clear the handler and restore default auto-dismiss.\n */\nexport function setDialogHandlerOnPage(page: Page, handler?: DialogHandler): void {\n const state = ensurePageState(page);\n state.dialogHandler = handler;\n}\n\n// ── Stealth ──\n\nfunction applyStealthToPage(page: Page): void {\n page.evaluate(STEALTH_SCRIPT).catch((e: unknown) => {\n if (process.env.DEBUG !== undefined && process.env.DEBUG !== '')\n console.warn('[browserclaw] stealth evaluate failed:', e instanceof Error ? e.message : String(e));\n });\n}\n\nexport function 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: unknown) => {\n if (process.env.DEBUG !== undefined && process.env.DEBUG !== '')\n console.warn('[browserclaw] stealth initScript failed:', e instanceof Error ? e.message : String(e));\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\nexport function observeBrowser(browser: Browser): void {\n for (const context of browser.contexts()) observeContext(context);\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 = /resolved to (\\d+) elements/.exec(message);\n const count = countMatch ? countMatch[1] : 'multiple';\n return new Error(\n `Selector \"${selector}\" matched ${count} elements. Run a new snapshot to get updated refs, or use a different ref.`,\n );\n }\n if (\n (message.includes('Timeout') || message.includes('waiting for')) &&\n (message.includes('to be visible') || message.includes('not visible'))\n ) {\n return new Error(\n `Element \"${selector}\" not found or not visible. Run a new snapshot to see current page elements.`,\n );\n }\n if (\n message.includes('intercepts pointer events') ||\n message.includes('not visible') ||\n message.includes('not receive pointer events')\n ) {\n return new Error(\n `Element \"${selector}\" is not interactable (hidden or covered). Try scrolling it into view, closing overlays, or re-snapshotting.`,\n );\n }\n const timeoutMatch = /Timeout (\\d+)ms exceeded/.exec(message);\n if (timeoutMatch) {\n return new Error(\n `Element \"${selector}\" timed out after ${timeoutMatch[1]}ms — element may be hidden or not interactable. Run a new snapshot to see current page elements.`,\n );\n }\n // Strip Playwright locator internals so AI agents don't see implementation details\n const cleaned = message\n .replace(/locator\\([^)]*\\)\\./g, '')\n .replace(/waiting for locator\\([^)]*\\)/g, '')\n .trim();\n return new Error(cleaned || 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 { Page } from 'playwright-core';\n\nimport { ensurePageState, getPageState } from './page-utils.js';\nimport type { RoleRefs } from './types.js';\n\n// ── Ref cache: keyed by \"cdpUrl::targetId\" ──\n\nconst roleRefsByTarget = new Map<\n string,\n {\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n }\n>();\nconst MAX_ROLE_REFS_CACHE = 50;\n\nexport function 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// ── Role Refs Storage ──\n\n/**\n * Remember role refs in the target cache (without storing on page state).\n * Used to persist refs across page reconnections.\n */\nexport function rememberRoleRefsForTarget(opts: {\n cdpUrl: string;\n targetId: string;\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n}): void {\n const targetId = opts.targetId.trim();\n if (targetId === '') return;\n roleRefsByTarget.set(roleRefsKey(opts.cdpUrl, targetId), {\n refs: opts.refs,\n ...(opts.frameSelector !== undefined && opts.frameSelector !== '' ? { frameSelector: opts.frameSelector } : {}),\n ...(opts.mode !== undefined ? { mode: opts.mode } : {}),\n });\n while (roleRefsByTarget.size > MAX_ROLE_REFS_CACHE) {\n const first = roleRefsByTarget.keys().next();\n if (first.done === true) break;\n roleRefsByTarget.delete(first.value);\n }\n}\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 if (opts.targetId === undefined || opts.targetId.trim() === '') return;\n rememberRoleRefsForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: opts.refs,\n frameSelector: opts.frameSelector,\n mode: opts.mode,\n });\n}\n\nexport function restoreRoleRefsForTarget(opts: { cdpUrl: string; targetId?: string; page: Page }): 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/**\n * Clear role refs for all targets associated with a CDP URL.\n * Called when a browser disconnects.\n */\nexport function clearRoleRefsForCdpUrl(cdpUrl: string): void {\n const normalized = normalizeCdpUrl(cdpUrl);\n for (const key of roleRefsByTarget.keys()) {\n if (key.startsWith(normalized + '::')) roleRefsByTarget.delete(key);\n }\n}\n\n// ── Ref Parsing ──\n\n/**\n * Parse a role ref string (e.g. \"e1\", \"@e1\", \"ref=e1\") to a normalized ref ID.\n * Returns null if the string is not a valid role ref.\n */\nexport function parseRoleRef(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const normalized = trimmed.startsWith('@')\n ? trimmed.slice(1)\n : trimmed.startsWith('ref=')\n ? trimmed.slice(4)\n : trimmed;\n return /^e\\d+$/.test(normalized) ? normalized : null;\n}\n\n/**\n * Require a ref string, normalizing and validating it.\n * Throws if the ref is empty.\n */\nexport function requireRef(value: string | undefined): string {\n const raw = typeof value === 'string' ? value.trim() : '';\n const ref = (raw ? parseRoleRef(raw) : null) ?? (raw.startsWith('@') ? raw.slice(1) : raw);\n if (!ref) throw new Error('ref is required');\n return ref;\n}\n\n/**\n * Require either a ref or selector, returning whichever is provided.\n * Throws if neither is provided.\n */\nexport function requireRefOrSelector(ref?: string, selector?: string): { ref?: string; selector?: string } {\n const trimmedRef = typeof ref === 'string' ? ref.trim() : '';\n const trimmedSelector = typeof selector === 'string' ? selector.trim() : '';\n if (!trimmedRef && !trimmedSelector) throw new Error('ref or selector is required');\n return { ref: trimmedRef || undefined, selector: trimmedSelector || undefined };\n}\n\n/** Clamp interaction timeout to [500, 60000]ms range, defaulting to 8000ms. */\nexport function resolveInteractionTimeoutMs(timeoutMs?: number): number {\n return Math.max(500, Math.min(60000, Math.floor(timeoutMs ?? 8000)));\n}\n\n/** Bounded delay validator for animation/interaction delays. */\nexport function 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 ${String(maxMs)}ms`);\n return normalized;\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 = getPageState(page);\n\n // Aria mode: use aria-ref locator\n if (state?.roleRefsMode === 'aria') {\n return (\n state.roleRefsFrameSelector !== undefined && state.roleRefsFrameSelector !== ''\n ? page.frameLocator(state.roleRefsFrameSelector)\n : 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 =\n state.roleRefsFrameSelector !== undefined && state.roleRefsFrameSelector !== ''\n ? page.frameLocator(state.roleRefsFrameSelector)\n : page;\n const role = info.role as Parameters<Page['getByRole']>[0];\n const locator =\n info.name !== undefined && 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","import http from 'node:http';\nimport https from 'node:https';\n\nimport { chromium } from 'playwright-core';\nimport type { Browser, Page, CDPSession } from 'playwright-core';\n\nimport {\n getChromeWebSocketUrl,\n normalizeCdpHttpBaseForJsonEndpoints,\n normalizeCdpWsUrl,\n isLoopbackHost,\n hasProxyEnvConfigured,\n} from './chrome-launcher.js';\nimport { ensurePageState, observeBrowser, setDialogHandlerOnPage } from './page-utils.js';\nimport { clearRoleRefsForCdpUrl, normalizeCdpUrl, restoreRoleRefsForTarget } from './ref-resolver.js';\nimport type { DialogHandler } from './types.js';\n\n// Re-export everything from sub-modules so existing `import … from './connection.js'`\n// paths keep working. When adding a public function to page-utils or ref-resolver,\n// add a corresponding re-export here — otherwise downstream imports break silently.\nexport {\n ensurePageState,\n ensureContextState,\n observeContext,\n findNetworkRequestById,\n bumpUploadArmId,\n bumpDialogArmId,\n bumpDownloadArmId,\n toAIFriendlyError,\n normalizeTimeoutMs,\n} from './page-utils.js';\n\nexport {\n rememberRoleRefsForTarget,\n storeRoleRefsForTarget,\n restoreRoleRefsForTarget,\n clearRoleRefsForCdpUrl,\n parseRoleRef,\n requireRef,\n requireRefOrSelector,\n resolveInteractionTimeoutMs,\n resolveBoundedDelayMs,\n refLocator,\n} from './ref-resolver.js';\n\n// ── Errors ──\n\nexport class BrowserTabNotFoundError extends Error {\n constructor(message = 'Tab not found') {\n super(message);\n this.name = 'BrowserTabNotFoundError';\n }\n}\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\nasync function fetchJsonForCdp(url: string, timeoutMs: number): Promise<unknown> {\n const ctrl = new AbortController();\n const t = setTimeout(() => {\n ctrl.abort();\n }, timeoutMs);\n try {\n const res = await fetch(url, { signal: ctrl.signal });\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nfunction appendCdpPath(cdpUrl: string, cdpPath: string): string {\n try {\n const url = new URL(cdpUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, '')}${cdpPath.startsWith('/') ? cdpPath : `/${cdpPath}`}`;\n return url.toString();\n } catch {\n return `${cdpUrl.replace(/\\/$/, '')}${cdpPath}`;\n }\n}\n\n// ── CDP Session Helpers ──\n\n/**\n * Run a function with a scoped Playwright CDP session, detaching when done.\n */\nexport async function withPlaywrightPageCdpSession<T>(page: Page, fn: (session: CDPSession) => Promise<T>): Promise<T> {\n const CDP_SESSION_TIMEOUT_MS = 10_000;\n const session = await Promise.race([\n page.context().newCDPSession(page),\n new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error('newCDPSession timed out after 10s'));\n }, CDP_SESSION_TIMEOUT_MS);\n }),\n ]);\n try {\n return await fn(session);\n } finally {\n await session.detach().catch(() => {\n /* noop */\n });\n }\n}\n\n/**\n * Run a function with a page-scoped CDP client.\n */\nexport async function withPageScopedCdpClient<T>(opts: {\n cdpUrl: string;\n page: Page;\n targetId?: string;\n fn: (send: (method: string, params?: Record<string, unknown>) => Promise<unknown>) => Promise<T>;\n}): Promise<T> {\n return await withPlaywrightPageCdpSession(opts.page, async (session) => {\n return await opts.fn((method, params) => session.send(method as Parameters<CDPSession['send']>[0], params));\n });\n}\n\n// ── NO_PROXY Lease Manager (for loopback CDP URLs) ──\n\nconst LOOPBACK_ENTRIES = 'localhost,127.0.0.1,[::1]';\n\nfunction noProxyAlreadyCoversLocalhost(): boolean {\n const current = process.env.NO_PROXY ?? process.env.no_proxy ?? '';\n return current.includes('localhost') && current.includes('127.0.0.1') && current.includes('[::1]');\n}\n\nfunction isLoopbackCdpUrl(url: string): boolean {\n try {\n return isLoopbackHost(new URL(url).hostname);\n } catch {\n return false;\n }\n}\n\nclass NoProxyLeaseManager {\n private leaseCount = 0;\n private snapshot: { noProxy?: string; noProxyLower?: string; applied: string } | null = null;\n\n acquire(url: string): (() => void) | null {\n if (!isLoopbackCdpUrl(url) || !hasProxyEnvConfigured()) return null;\n if (this.leaseCount === 0 && !noProxyAlreadyCoversLocalhost()) {\n const noProxy = process.env.NO_PROXY;\n const noProxyLower = process.env.no_proxy;\n const current = noProxy ?? noProxyLower ?? '';\n const applied = current ? `${current},${LOOPBACK_ENTRIES}` : LOOPBACK_ENTRIES;\n process.env.NO_PROXY = applied;\n process.env.no_proxy = applied;\n this.snapshot = { noProxy, noProxyLower, applied };\n }\n this.leaseCount += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.release();\n };\n }\n\n release(): void {\n if (this.leaseCount <= 0) return;\n this.leaseCount -= 1;\n if (this.leaseCount > 0 || !this.snapshot) return;\n const { noProxy, noProxyLower, applied } = this.snapshot;\n const currentNoProxy = process.env.NO_PROXY;\n const currentNoProxyLower = process.env.no_proxy;\n if (currentNoProxy === applied && (currentNoProxyLower === applied || currentNoProxyLower === undefined)) {\n if (noProxy !== undefined) process.env.NO_PROXY = noProxy;\n else delete process.env.NO_PROXY;\n if (noProxyLower !== undefined) process.env.no_proxy = noProxyLower;\n else delete process.env.no_proxy;\n }\n this.snapshot = null;\n }\n}\n\nconst noProxyLeaseManager = new NoProxyLeaseManager();\n\n/**\n * Scoped NO_PROXY bypass for loopback CDP URLs.\n * This wrapper only mutates env vars for loopback destinations.\n */\nexport async function withNoProxyForCdpUrl<T>(url: string, fn: () => Promise<T>): Promise<T> {\n const release = noProxyLeaseManager.acquire(url);\n try {\n return await fn();\n } finally {\n release?.();\n }\n}\n\n/** HTTP agent that never uses a proxy — for localhost CDP connections. */\nconst directHttpAgent = new http.Agent();\nconst directHttpsAgent = new https.Agent();\n\n/**\n * Returns a plain (non-proxy) agent for WebSocket or HTTP connections\n * when the target is a loopback address. Returns `undefined` otherwise.\n */\nexport function getDirectAgentForCdp(url: string): http.Agent | https.Agent | undefined {\n try {\n const parsed = new URL(url);\n if (isLoopbackHost(parsed.hostname)) {\n return parsed.protocol === 'https:' || parsed.protocol === 'wss:' ? directHttpsAgent : directHttpAgent;\n }\n } catch {}\n return undefined;\n}\n\n// ── Auth Headers ──\n\n/**\n * Resolve auth headers for a CDP endpoint URL.\n * Supports URL credentials (user:pass@host).\n */\nexport function getHeadersWithAuth(endpoint: string, baseHeaders: Record<string, string> = {}): Record<string, string> {\n const headers = { ...baseHeaders };\n try {\n const parsed = new URL(endpoint);\n if (Object.keys(headers).some((k) => k.toLowerCase() === 'authorization')) return headers;\n if (parsed.username || parsed.password) {\n const credentials = Buffer.from(\n `${decodeURIComponent(parsed.username)}:${decodeURIComponent(parsed.password)}`,\n ).toString('base64');\n headers.Authorization = `Basic ${credentials}`;\n }\n } catch {}\n return headers;\n}\n\n// ── Persistent Connection Cache ──\n\ninterface CachedConnection {\n browser: Browser;\n cdpUrl: string;\n onDisconnected?: () => void;\n}\n\nconst cachedByCdpUrl = new Map<string, CachedConnection>();\nconst connectingByCdpUrl = new Map<string, Promise<CachedConnection>>();\n\n// ── Blocked Target Tracking ──\n\nexport class BlockedBrowserTargetError extends Error {\n constructor() {\n super('Browser target is unavailable after SSRF policy blocked its navigation.');\n this.name = 'BlockedBrowserTargetError';\n }\n}\n\nconst blockedTargetsByCdpUrl = new Set<string>();\nconst blockedPageRefsByCdpUrl = new Map<string, WeakSet<Page>>();\n\nfunction blockedTargetKey(cdpUrl: string, targetId: string): string {\n return `${normalizeCdpUrl(cdpUrl)}::${targetId}`;\n}\n\nexport function isBlockedTarget(cdpUrl: string, targetId?: string): boolean {\n const normalized = targetId?.trim() ?? '';\n if (normalized === '') return false;\n return blockedTargetsByCdpUrl.has(blockedTargetKey(cdpUrl, normalized));\n}\n\nexport function markTargetBlocked(cdpUrl: string, targetId?: string): void {\n const normalized = targetId?.trim() ?? '';\n if (normalized === '') return;\n blockedTargetsByCdpUrl.add(blockedTargetKey(cdpUrl, normalized));\n}\n\nexport function clearBlockedTarget(cdpUrl: string, targetId?: string): void {\n const normalized = targetId?.trim() ?? '';\n if (normalized === '') return;\n blockedTargetsByCdpUrl.delete(blockedTargetKey(cdpUrl, normalized));\n}\n\nfunction hasBlockedTargetsForCdpUrl(cdpUrl: string): boolean {\n const prefix = `${normalizeCdpUrl(cdpUrl)}::`;\n for (const key of blockedTargetsByCdpUrl) {\n if (key.startsWith(prefix)) return true;\n }\n return false;\n}\n\nfunction clearBlockedTargetsForCdpUrl(cdpUrl?: string): void {\n if (cdpUrl === undefined) {\n blockedTargetsByCdpUrl.clear();\n return;\n }\n const prefix = `${normalizeCdpUrl(cdpUrl)}::`;\n for (const key of blockedTargetsByCdpUrl) {\n if (key.startsWith(prefix)) blockedTargetsByCdpUrl.delete(key);\n }\n}\n\nfunction blockedPageRefsForCdpUrl(cdpUrl: string): WeakSet<Page> {\n const normalized = normalizeCdpUrl(cdpUrl);\n const existing = blockedPageRefsByCdpUrl.get(normalized);\n if (existing) return existing;\n const created = new WeakSet<Page>();\n blockedPageRefsByCdpUrl.set(normalized, created);\n return created;\n}\n\nexport function isBlockedPageRef(cdpUrl: string, page: Page): boolean {\n return blockedPageRefsByCdpUrl.get(normalizeCdpUrl(cdpUrl))?.has(page) ?? false;\n}\n\nexport function markPageRefBlocked(cdpUrl: string, page: Page): void {\n blockedPageRefsForCdpUrl(cdpUrl).add(page);\n}\n\nfunction clearBlockedPageRefsForCdpUrl(cdpUrl?: string): void {\n if (cdpUrl === undefined) {\n blockedPageRefsByCdpUrl.clear();\n return;\n }\n blockedPageRefsByCdpUrl.delete(normalizeCdpUrl(cdpUrl));\n}\n\nexport function clearBlockedPageRef(cdpUrl: string, page: Page): void {\n blockedPageRefsByCdpUrl.get(normalizeCdpUrl(cdpUrl))?.delete(page);\n}\n\n// ── Dialog Handler ──\n\n/**\n * Set or clear a persistent dialog handler for a page.\n * When set, this handler is called for every dialog that is not covered by armDialog().\n * Pass `undefined` to clear the handler and restore default auto-dismiss.\n */\nexport async function setDialogHandler(opts: {\n cdpUrl: string;\n targetId?: string;\n handler?: DialogHandler;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n setDialogHandlerOnPage(page, opts.handler);\n}\n\n// ── Connect to Browser ──\n\nexport async function connectBrowser(cdpUrl: string, authToken?: string): Promise<CachedConnection> {\n const normalized = normalizeCdpUrl(cdpUrl);\n const existing_cached = cachedByCdpUrl.get(normalized);\n if (existing_cached) return existing_cached;\n\n const existing = connectingByCdpUrl.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> = getHeadersWithAuth(endpoint);\n if (authToken !== undefined && authToken !== '' && !headers.Authorization)\n headers.Authorization = `Bearer ${authToken}`;\n const browser = await withNoProxyForCdpUrl(endpoint, () =>\n chromium.connectOverCDP(endpoint, { timeout, headers }),\n );\n const onDisconnected = () => {\n if (cachedByCdpUrl.get(normalized)?.browser === browser) {\n cachedByCdpUrl.delete(normalized);\n clearRoleRefsForCdpUrl(normalized);\n }\n };\n const connected: CachedConnection = { browser, cdpUrl: normalized, onDisconnected };\n cachedByCdpUrl.set(normalized, connected);\n observeBrowser(browser);\n browser.on('disconnected', onDisconnected);\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(() => {\n connectingByCdpUrl.delete(normalized);\n });\n connectingByCdpUrl.set(normalized, promise);\n return await promise;\n}\n\nexport async function disconnectBrowser(): Promise<void> {\n if (connectingByCdpUrl.size) {\n for (const p of connectingByCdpUrl.values()) {\n try {\n await p;\n } catch {}\n }\n }\n for (const cur of cachedByCdpUrl.values()) {\n if (cur.onDisconnected && typeof cur.browser.off === 'function')\n cur.browser.off('disconnected', cur.onDisconnected);\n await cur.browser.close().catch(() => {\n /* noop */\n });\n }\n cachedByCdpUrl.clear();\n}\n\n/**\n * Close the Playwright connection for a specific CDP URL without affecting other connections.\n */\nexport async function closePlaywrightBrowserConnection(opts?: { cdpUrl?: string }): Promise<void> {\n if (opts?.cdpUrl !== undefined && opts.cdpUrl !== '') {\n const normalized = normalizeCdpUrl(opts.cdpUrl);\n clearBlockedTargetsForCdpUrl(normalized);\n clearBlockedPageRefsForCdpUrl(normalized);\n const cur = cachedByCdpUrl.get(normalized);\n cachedByCdpUrl.delete(normalized);\n connectingByCdpUrl.delete(normalized);\n if (!cur) return;\n if (cur.onDisconnected && typeof cur.browser.off === 'function')\n cur.browser.off('disconnected', cur.onDisconnected);\n await cur.browser.close().catch(() => {\n /* noop */\n });\n } else {\n clearBlockedTargetsForCdpUrl();\n clearBlockedPageRefsForCdpUrl();\n await disconnectBrowser();\n }\n}\n\nfunction cdpSocketNeedsAttach(wsUrl: string): boolean {\n try {\n const pathname = new URL(wsUrl).pathname;\n return (\n pathname === '/cdp' || pathname.endsWith('/cdp') || pathname.includes('/devtools/browser/') || pathname === '/'\n );\n } catch {\n return false;\n }\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 * If the wsUrl is a browser-level endpoint, attaches to the target first.\n */\nasync function tryTerminateExecutionViaCdp(cdpUrl: string, targetId: string): Promise<void> {\n const httpBase = normalizeCdpHttpBaseForJsonEndpoints(cdpUrl);\n const ctrl = new AbortController();\n const t = setTimeout(() => {\n ctrl.abort();\n }, 2000);\n let targets: unknown;\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 {\n return;\n } finally {\n clearTimeout(t);\n }\n\n if (!Array.isArray(targets)) return;\n const target = targets.find((entry: unknown) => {\n const e = entry as { id?: string; webSocketDebuggerUrl?: string };\n return (e.id ?? '').trim() === targetId;\n }) as { id?: string; webSocketDebuggerUrl?: string } | undefined;\n const wsUrlRaw = (target?.webSocketDebuggerUrl ?? '').trim();\n if (wsUrlRaw === '') return;\n\n const wsUrl = normalizeCdpWsUrl(wsUrlRaw, httpBase);\n const needsAttach = cdpSocketNeedsAttach(wsUrl);\n\n await new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n try {\n ws.close();\n } catch {}\n resolve();\n };\n const timer = setTimeout(finish, 3000);\n let ws: WebSocket;\n let nextId = 1;\n try {\n ws = new WebSocket(wsUrl);\n } catch {\n finish();\n return;\n }\n ws.onopen = () => {\n if (needsAttach) {\n ws.send(JSON.stringify({ id: nextId++, method: 'Target.attachToTarget', params: { targetId, flatten: true } }));\n } else {\n ws.send(JSON.stringify({ id: nextId++, method: 'Runtime.terminateExecution' }));\n setTimeout(finish, 300);\n }\n };\n ws.onmessage = (event) => {\n if (!needsAttach) return;\n try {\n const msg = JSON.parse(String(event.data)) as Record<string, unknown>;\n const result = msg.result as Record<string, unknown> | undefined;\n if (msg.id !== undefined && result?.sessionId !== undefined) {\n const sessionId = result.sessionId as string;\n ws.send(JSON.stringify({ id: nextId++, sessionId, method: 'Runtime.terminateExecution' }));\n try {\n ws.send(\n JSON.stringify({\n id: nextId++,\n method: 'Target.detachFromTarget',\n params: { sessionId },\n }),\n );\n } catch {\n /* noop */\n }\n setTimeout(finish, 300);\n }\n } catch {\n /* noop */\n }\n };\n ws.onerror = () => {\n finish();\n };\n ws.onclose = () => {\n finish();\n };\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 = cachedByCdpUrl.get(normalized);\n if (!cur) return;\n\n cachedByCdpUrl.delete(normalized);\n connectingByCdpUrl.delete(normalized);\n\n if (cur.onDisconnected && typeof cur.browser.off === 'function') {\n cur.browser.off('disconnected', cur.onDisconnected);\n }\n\n const targetId = opts.targetId?.trim() ?? '';\n if (targetId !== '') {\n await tryTerminateExecutionViaCdp(normalized, targetId).catch(() => {\n /* noop */\n });\n }\n\n cur.browser.close().catch(() => {\n /* noop */\n });\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 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 (targetInfo?.targetId ?? '').trim() || null;\n } finally {\n await session.detach().catch(() => {\n /* noop */\n });\n }\n}\n\nfunction matchPageByTargetList(pages: Page[], targets: CdpTarget[], targetId: string): Page | null {\n const target = targets.find((entry) => entry.id === targetId);\n if (!target) return null;\n const urlMatch = pages.filter((page) => page.url() === target.url);\n if (urlMatch.length === 1) return urlMatch[0] ?? null;\n if (urlMatch.length > 1) {\n const sameUrlTargets = targets.filter((entry) => entry.url === target.url);\n if (sameUrlTargets.length === urlMatch.length) {\n const idx = sameUrlTargets.findIndex((entry) => entry.id === targetId);\n if (idx >= 0 && idx < urlMatch.length) return urlMatch[idx] ?? null;\n }\n }\n return null;\n}\n\nasync function findPageByTargetIdViaTargetList(pages: Page[], targetId: string, cdpUrl: string): Promise<Page | null> {\n const targets = await fetchJsonForCdp(\n appendCdpPath(normalizeCdpHttpBaseForJsonEndpoints(cdpUrl), '/json/list'),\n 2000,\n );\n if (!Array.isArray(targets)) return null;\n return matchPageByTargetList(pages, targets as CdpTarget[], targetId);\n}\n\nexport async function findPageByTargetId(browser: Browser, targetId: string, cdpUrl?: string) {\n const pages = getAllPages(browser);\n\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 !== null && tid !== '' && tid === targetId) return page;\n }\n\n if (cdpUrl !== undefined && cdpUrl !== '') {\n try {\n return await findPageByTargetIdViaTargetList(pages, targetId, cdpUrl);\n } catch {}\n }\n\n // Last resort: if CDP sessions failed for all pages and there's only one, return it\n if (!resolvedViaCdp && pages.length === 1) return pages[0] ?? null;\n return null;\n}\n\nasync function partitionAccessiblePages(opts: {\n cdpUrl: string;\n pages: Page[];\n}): Promise<{ accessible: Page[]; blockedCount: number }> {\n const accessible: Page[] = [];\n let blockedCount = 0;\n for (const page of opts.pages) {\n if (isBlockedPageRef(opts.cdpUrl, page)) {\n blockedCount += 1;\n continue;\n }\n const targetId = await pageTargetId(page).catch(() => null);\n if (targetId === null || targetId === '') {\n if (hasBlockedTargetsForCdpUrl(opts.cdpUrl)) {\n blockedCount += 1;\n continue;\n }\n accessible.push(page);\n continue;\n }\n if (isBlockedTarget(opts.cdpUrl, targetId)) {\n blockedCount += 1;\n continue;\n }\n accessible.push(page);\n }\n return { accessible, blockedCount };\n}\n\nexport async function getPageForTargetId(opts: { cdpUrl: string; targetId?: string }) {\n if (opts.targetId !== undefined && opts.targetId !== '' && isBlockedTarget(opts.cdpUrl, opts.targetId))\n throw new BlockedBrowserTargetError();\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = getAllPages(browser);\n if (!pages.length) throw new Error('No pages available in the connected browser.');\n const { accessible, blockedCount } = await partitionAccessiblePages({ cdpUrl: opts.cdpUrl, pages });\n if (!accessible.length) {\n if (blockedCount > 0) throw new BlockedBrowserTargetError();\n throw new Error('No pages available in the connected browser.');\n }\n const first = accessible[0];\n if (opts.targetId === undefined || 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 BrowserTabNotFoundError(\n `Tab not found (targetId: ${opts.targetId}). Call browser.tabs() to list open tabs.`,\n );\n }\n if (isBlockedPageRef(opts.cdpUrl, found)) throw new BlockedBrowserTargetError();\n const foundTargetId = await pageTargetId(found).catch(() => null);\n if (foundTargetId !== null && foundTargetId !== '' && isBlockedTarget(opts.cdpUrl, foundTargetId))\n throw new BlockedBrowserTargetError();\n return found;\n}\n\n/**\n * Resolve a page by targetId or throw BrowserTabNotFoundError.\n */\nexport async function resolvePageByTargetIdOrThrow(opts: { cdpUrl: string; targetId: string }): Promise<Page> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!page) throw new BrowserTabNotFoundError();\n return page;\n}\n\n/**\n * Get a page for a target, ensuring page state is initialized and role refs are restored.\n */\nexport async function getRestoredPageForTarget(opts: { cdpUrl: string; targetId?: string }): Promise<Page> {\n const page = await getPageForTargetId(opts);\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n return page;\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 = 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: unknown = await frame.evaluate((fnBody: string) => {\n 'use strict';\n try {\n const candidate: unknown = (0, eval)('(' + fnBody + ')');\n return typeof candidate === 'function' ? (candidate as () => unknown)() : candidate;\n } catch (err: unknown) {\n throw new Error('Invalid evaluate function: ' + (err instanceof Error ? err.message : String(err)));\n }\n }, fnText);\n results.push({\n frameUrl: frame.url(),\n frameName: frame.name(),\n result,\n });\n } catch (err) {\n console.warn('[browserclaw] frame evaluate failed:', err instanceof Error ? err.message : String(err));\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 /* suppress unhandled rejection */\n });\n throw err;\n }\n}\n\n// Browser-side evaluators: intentionally use eval() to execute user-provided\n// browser-side code. This is the core purpose — running arbitrary JS in the\n// page sandbox. The fallback path handles statement-form code (template\n// literals, multi-statement blocks) that fail expression-mode eval.\n\n// eslint-disable-next-line @typescript-eslint/no-implied-eval\nconst BROWSER_EVALUATOR = new Function(\n 'args',\n [\n '\"use strict\";',\n 'var fnBody = args.fnBody, timeoutMs = args.timeoutMs;',\n 'try {',\n ' var candidate;',\n ' try { candidate = eval(\"(\" + fnBody + \")\"); }',\n ' catch (_) { candidate = (0, 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 ].join('\\n'),\n);\n\n// eslint-disable-next-line @typescript-eslint/no-implied-eval\nconst ELEMENT_EVALUATOR = new Function(\n 'el',\n 'args',\n [\n '\"use strict\";',\n 'var fnBody = args.fnBody, timeoutMs = args.timeoutMs;',\n 'try {',\n ' var candidate;',\n ' try { candidate = eval(\"(\" + fnBody + \")\"); }',\n ' catch (_) { candidate = (0, 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 ].join('\\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 = 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 !== undefined) {\n abortPromise = new Promise<never>((_, reject) => {\n abortReject = reject;\n });\n abortPromise.catch(() => {\n /* suppress unhandled rejection */\n });\n }\n\n if (signal !== undefined) {\n const disconnect = () => {\n forceDisconnectPlaywrightForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'evaluate aborted',\n }).catch(() => {\n /* intentional no-op */\n });\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 // Re-check after adding listener to handle race where signal was aborted between checks\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (signal.aborted) {\n abortListener();\n throw signal.reason ?? new Error('aborted');\n }\n }\n\n try {\n if (opts.ref !== undefined && opts.ref !== '') {\n const locator = refLocator(page, opts.ref);\n return await awaitEvalWithAbort(\n locator.evaluate(ELEMENT_EVALUATOR as (...args: unknown[]) => unknown, {\n fnBody: fnText,\n timeoutMs: evaluateTimeout,\n }),\n abortPromise,\n );\n }\n\n return await awaitEvalWithAbort(\n page.evaluate(BROWSER_EVALUATOR as (...args: unknown[]) => unknown, {\n fnBody: fnText,\n timeoutMs: evaluateTimeout,\n }),\n abortPromise,\n );\n } finally {\n if (signal && abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { lookup as dnsLookupCb } from 'node:dns';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { lstat, realpath, rename, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport {\n resolve,\n normalize,\n dirname,\n basename,\n join,\n sep,\n relative,\n posix,\n win32,\n isAbsolute as pathIsAbsolute,\n} from 'node:path';\n\nimport * as ipaddr from 'ipaddr.js';\n\nimport type { SsrfPolicy, PinnedHostname } from './types.js';\n\n// ── Default temp directories for downloads/uploads ──\n\nfunction resolveDefaultBrowserTmpDir(): string {\n try {\n if (process.platform === 'linux' || process.platform === 'darwin') {\n return '/tmp/browserclaw';\n }\n } catch {\n /* fallback below */\n }\n return join(tmpdir(), 'browserclaw');\n}\n\nexport const DEFAULT_BROWSER_TMP_DIR = resolveDefaultBrowserTmpDir();\nexport const DEFAULT_DOWNLOAD_DIR = join(DEFAULT_BROWSER_TMP_DIR, 'downloads');\nexport const DEFAULT_UPLOAD_DIR = join(DEFAULT_BROWSER_TMP_DIR, 'uploads');\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 interface BrowserNavigationPolicyOptions {\n ssrfPolicy?: SsrfPolicy;\n}\n\n/** Playwright-compatible request interface for redirect chain inspection. */\nexport interface 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(['localhost', 'localhost.localdomain', 'metadata.google.internal']);\n\nfunction isAllowedNonNetworkNavigationUrl(parsed: URL): boolean {\n return SAFE_NON_NETWORK_URLS.has(parsed.href);\n}\n\nfunction isPrivateNetworkAllowedByPolicy(policy?: SsrfPolicy): boolean {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\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 = hostname.trim().toLowerCase();\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\nconst BLOCKED_IPV4_RANGES = new Set([\n 'unspecified',\n 'broadcast',\n 'multicast',\n 'linkLocal',\n 'loopback',\n 'carrierGradeNat',\n 'private',\n 'reserved',\n]);\n\nconst BLOCKED_IPV6_RANGES = new Set([\n 'unspecified',\n 'loopback',\n 'linkLocal',\n 'uniqueLocal',\n 'multicast',\n 'reserved',\n 'benchmarking',\n 'discard',\n 'orchid2',\n]);\n\nconst RFC2544_BENCHMARK_PREFIX: [ipaddr.IPv4, number] = [ipaddr.IPv4.parse('198.18.0.0'), 15];\n\ninterface IsPrivateIpOpts {\n allowRfc2544BenchmarkRange?: boolean;\n}\n\nconst EMBEDDED_IPV4_SENTINEL_RULES: {\n matches: (parts: number[]) => boolean;\n toHextets: (parts: number[]) => [number, number];\n}[] = [\n // IPv4-compatible (::a.b.c.d)\n {\n matches: (parts) =>\n parts[0] === 0 && parts[1] === 0 && parts[2] === 0 && parts[3] === 0 && parts[4] === 0 && parts[5] === 0,\n toHextets: (parts) => [parts[6], parts[7]],\n },\n // NAT64 local-use (64:ff9b:1::/48)\n {\n matches: (parts) =>\n parts[0] === 100 && parts[1] === 65435 && parts[2] === 1 && parts[3] === 0 && parts[4] === 0 && parts[5] === 0,\n toHextets: (parts) => [parts[6], parts[7]],\n },\n // 6to4 (2002::/16)\n {\n matches: (parts) => parts[0] === 0x2002,\n toHextets: (parts) => [parts[1], parts[2]],\n },\n // Teredo (2001:0000::/32) — IPv4 XOR'd\n {\n matches: (parts) => parts[0] === 0x2001 && parts[1] === 0x0000,\n toHextets: (parts) => [parts[6] ^ 0xffff, parts[7] ^ 0xffff],\n },\n // ISATAP — sentinel in parts[4-5]: 0x0000:0x5efe or 0x0200:0x5efe\n {\n matches: (parts) => (parts[4] & 0xfcff) === 0 && parts[5] === 0x5efe,\n toHextets: (parts) => [parts[6], parts[7]],\n },\n];\n\nfunction stripIpv6Brackets(value: string): string {\n if (value.startsWith('[') && value.endsWith(']')) return value.slice(1, -1);\n return value;\n}\n\nfunction isNumericIpv4LiteralPart(value: string): boolean {\n return /^[0-9]+$/.test(value) || /^0x[0-9a-f]+$/i.test(value);\n}\n\nfunction parseIpv6WithEmbeddedIpv4(raw: string): ipaddr.IPv6 | undefined {\n if (!raw.includes(':') || !raw.includes('.')) return;\n const match = /^(.*:)([^:%]+(?:\\.[^:%]+){3})(%[0-9A-Za-z]+)?$/i.exec(raw);\n if (!match) return;\n const [, prefix, embeddedIpv4, zoneSuffix = ''] = match;\n if (!ipaddr.IPv4.isValidFourPartDecimal(embeddedIpv4)) return;\n const octets = embeddedIpv4.split('.').map((part) => Number.parseInt(part, 10));\n const normalizedIpv6 = `${prefix}${((octets[0] << 8) | octets[1]).toString(16)}:${((octets[2] << 8) | octets[3]).toString(16)}${zoneSuffix}`;\n if (!ipaddr.IPv6.isValid(normalizedIpv6)) return;\n return ipaddr.IPv6.parse(normalizedIpv6);\n}\n\nfunction normalizeIpParseInput(raw: string | undefined | null): string | undefined {\n const trimmed = raw?.trim();\n if (trimmed === undefined || trimmed === '') return;\n return stripIpv6Brackets(trimmed);\n}\n\nfunction parseCanonicalIpAddress(raw: string): ipaddr.IPv4 | ipaddr.IPv6 | undefined {\n const normalized = normalizeIpParseInput(raw);\n if (normalized === undefined) return;\n if (ipaddr.IPv4.isValid(normalized)) {\n if (!ipaddr.IPv4.isValidFourPartDecimal(normalized)) return;\n return ipaddr.IPv4.parse(normalized);\n }\n if (ipaddr.IPv6.isValid(normalized)) return ipaddr.IPv6.parse(normalized);\n return parseIpv6WithEmbeddedIpv4(normalized);\n}\n\nfunction parseLooseIpAddress(raw: string): ipaddr.IPv4 | ipaddr.IPv6 | undefined {\n const normalized = normalizeIpParseInput(raw);\n if (normalized === undefined) return;\n if (ipaddr.isValid(normalized)) return ipaddr.parse(normalized);\n return parseIpv6WithEmbeddedIpv4(normalized);\n}\n\nfunction isCanonicalDottedDecimalIPv4(raw: string): boolean {\n const trimmed = raw.trim();\n if (trimmed === '') return false;\n const normalized = stripIpv6Brackets(trimmed);\n if (!normalized) return false;\n return ipaddr.IPv4.isValidFourPartDecimal(normalized);\n}\n\nfunction isLegacyIpv4Literal(raw: string): boolean {\n const trimmed = raw.trim();\n if (trimmed === '') return false;\n const normalized = stripIpv6Brackets(trimmed);\n if (!normalized || normalized.includes(':')) return false;\n if (isCanonicalDottedDecimalIPv4(normalized)) return false;\n const parts = normalized.split('.');\n if (parts.length === 0 || parts.length > 4) return false;\n if (parts.some((part) => part.length === 0)) return false;\n if (!parts.every((part) => isNumericIpv4LiteralPart(part))) return false;\n return true;\n}\n\nfunction looksLikeUnsupportedIpv4Literal(address: string): boolean {\n const parts = address.split('.');\n if (parts.length === 0 || parts.length > 4) return false;\n if (parts.some((part) => part.length === 0)) return true;\n return parts.every((part) => /^[0-9]+$/.test(part) || /^0x/i.test(part));\n}\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 return (address.parts[0] & 0xffc0) === 0xfec0;\n}\n\nfunction decodeIpv4FromHextets(high: number, low: number): ipaddr.IPv4 {\n const octets = [(high >>> 8) & 0xff, high & 0xff, (low >>> 8) & 0xff, low & 0xff];\n return ipaddr.IPv4.parse(octets.join('.'));\n}\n\nfunction extractEmbeddedIpv4FromIpv6(address: ipaddr.IPv6): ipaddr.IPv4 | undefined {\n if (address.isIPv4MappedAddress()) return address.toIPv4Address();\n if (address.range() === 'rfc6145') return decodeIpv4FromHextets(address.parts[6], address.parts[7]);\n if (address.range() === 'rfc6052') return decodeIpv4FromHextets(address.parts[6], address.parts[7]);\n for (const rule of EMBEDDED_IPV4_SENTINEL_RULES) {\n if (!rule.matches(address.parts)) continue;\n const [high, low] = rule.toHextets(address.parts);\n return decodeIpv4FromHextets(high, low);\n }\n}\n\nfunction resolveIpv4SpecialUseBlockOptions(policy?: SsrfPolicy): IsPrivateIpOpts {\n return { allowRfc2544BenchmarkRange: policy?.allowRfc2544BenchmarkRange === true };\n}\n\nfunction isBlockedHostnameOrIp(hostname: string, policy?: SsrfPolicy): boolean {\n const normalized = normalizeHostname(hostname);\n if (!normalized) return false;\n return isBlockedHostnameNormalized(normalized) || isPrivateIpAddress(normalized, policy);\n}\n\nfunction isPrivateIpAddress(address: string, policy?: SsrfPolicy): 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 const blockOptions = resolveIpv4SpecialUseBlockOptions(policy);\n\n const strictIp = parseCanonicalIpAddress(normalized);\n if (strictIp) {\n if (strictIp.kind() === 'ipv4') return isBlockedSpecialUseIpv4Address(strictIp as ipaddr.IPv4, blockOptions);\n const v6 = strictIp as ipaddr.IPv6;\n if (isBlockedSpecialUseIpv6Address(v6)) return true;\n const embeddedIpv4 = extractEmbeddedIpv4FromIpv6(v6);\n if (embeddedIpv4) return isBlockedSpecialUseIpv4Address(embeddedIpv4, blockOptions);\n return false;\n }\n\n if (normalized.includes(':') && !parseLooseIpAddress(normalized)) return true;\n if (!isCanonicalDottedDecimalIPv4(normalized) && isLegacyIpv4Literal(normalized)) return true;\n if (looksLikeUnsupportedIpv4Literal(normalized)) return true;\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, policy?: SsrfPolicy): 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, policy)) 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(values.map((v) => normalizeHostname(v)).filter((v) => v !== '*' && v !== '*.' && v.length > 0)),\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 if (params.addresses.length === 0)\n throw new Error(`Pinned lookup requires at least one address for ${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 // dns.lookup has complex overloads; we use a loosely-typed inner signature\n // and cast the result back to the proper type at the boundary.\n type DnsLookupArg = string | number | { all?: boolean; family?: number } | ((...a: unknown[]) => void) | undefined;\n return ((_host: string, ...rest: DnsLookupArg[]) => {\n const second = rest[0];\n const third = rest[1];\n const cb = typeof second === 'function' ? second : typeof third === 'function' ? third : undefined;\n if (cb === undefined) return;\n\n const normalized = normalizeHostname(_host);\n if (normalized === '' || normalized !== normalizedHost) {\n if (typeof second === 'function' || second === undefined) {\n (fallback as (...a: unknown[]) => void)(_host, cb);\n return;\n }\n (fallback as (...a: unknown[]) => void)(_host, second, cb);\n return;\n }\n\n const opts: { all?: boolean; family?: number } =\n typeof second === 'object' ? (second as { all?: boolean; family?: number }) : {};\n const requestedFamily = typeof second === 'number' ? second : typeof opts.family === 'number' ? opts.family : 0;\n const candidates =\n 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 === true) {\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(\n hostname: string,\n params: {\n lookupFn?: LookupFn;\n policy?: SsrfPolicy;\n } = {},\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(`Navigation blocked: hostname \"${hostname}\" is not in the allowlist.`);\n }\n\n if (!skipPrivateNetworkChecks) {\n if (isBlockedHostnameOrIp(normalized, params.policy)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`,\n );\n }\n }\n\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.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 if (!skipPrivateNetworkChecks) {\n for (const r of results) {\n if (isBlockedHostnameOrIp(r.address, params.policy)) {\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(\n opts: {\n url: string;\n lookupFn?: LookupFn;\n } & BrowserNavigationPolicyOptions,\n): Promise<void> {\n const rawUrl = opts.url.trim();\n if (rawUrl === '') throw new InvalidBrowserNavigationUrlError('url is required');\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 !== undefined && allowedRoots.length > 0) {\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/**\n * Resolve and validate upload file paths, returning them if all are safe.\n * Returns `{ ok: true, paths }` or `{ ok: false, error }`.\n */\nexport async function resolveStrictExistingUploadPaths(params: {\n requestedPaths: string[];\n scopeLabel?: string;\n}): Promise<{ ok: true; paths: string[] } | { ok: false; error: string }> {\n try {\n await assertSafeUploadPaths(params.requestedPaths);\n return { ok: true, paths: params.requestedPaths };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// ── Path confinement utilities ──\n\ntype PathResult = { ok: true; path: string } | { ok: false; error: string };\ntype PathsResult = { ok: true; paths: string[] } | { ok: false; error: string };\n\n/**\n * Lexical confinement: resolve(root, raw) must not escape root.\n */\nexport function resolvePathWithinRoot(params: {\n rootDir: string;\n requestedPath: string;\n scopeLabel: string;\n defaultFileName?: string;\n}): PathResult {\n const root = resolve(params.rootDir);\n const raw = params.requestedPath.trim();\n const effectivePath =\n raw === '' && params.defaultFileName != null && params.defaultFileName !== '' ? params.defaultFileName : raw;\n if (effectivePath === '') return { ok: false, error: `Empty path is not allowed (${params.scopeLabel}).` };\n\n const resolved = resolve(root, effectivePath);\n const rel = relative(root, resolved);\n if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || pathIsAbsolute(rel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel}: \"${params.requestedPath}\".` };\n }\n return { ok: true, path: resolved };\n}\n\n/**\n * Async writable-path check: verifies parent dir realpath is within root,\n * and that the target (if it exists) is not a symlink.\n */\nexport async function resolveWritablePathWithinRoot(params: {\n rootDir: string;\n requestedPath: string;\n scopeLabel: string;\n defaultFileName?: string;\n}): Promise<PathResult> {\n const lexical = resolvePathWithinRoot(params);\n if (!lexical.ok) return lexical;\n\n const root = resolve(params.rootDir);\n const target = lexical.path;\n\n let parentReal: string;\n try {\n parentReal = await realpath(dirname(target));\n } catch {\n return {\n ok: false,\n error: `Parent directory is inaccessible for \"${params.requestedPath}\" (${params.scopeLabel}).`,\n };\n }\n\n const parentRel = relative(root, parentReal);\n if (parentRel === '..' || parentRel.startsWith(`..${sep}`) || pathIsAbsolute(parentRel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel} via symlink: \"${params.requestedPath}\".` };\n }\n\n try {\n const stat = await lstat(target);\n if (stat.isSymbolicLink()) {\n return { ok: false, error: `Path is a symbolic link (${params.scopeLabel}): \"${params.requestedPath}\".` };\n }\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') {\n return {\n ok: false,\n error: `Cannot stat \"${params.requestedPath}\" (${params.scopeLabel}): ${(e as Error).message}`,\n };\n }\n }\n\n return { ok: true, path: target };\n}\n\n/**\n * For each path: lexical check then realpath check. Missing files are allowed\n * (returns the fallback resolved path).\n */\nexport async function resolveExistingPathsWithinRoot(params: {\n rootDir: string;\n requestedPaths: string[];\n scopeLabel: string;\n}): Promise<PathsResult> {\n const root = resolve(params.rootDir);\n const resolved: string[] = [];\n\n for (const raw of params.requestedPaths) {\n const lexical = resolvePathWithinRoot({ rootDir: root, requestedPath: raw, scopeLabel: params.scopeLabel });\n if (!lexical.ok) return lexical;\n\n try {\n const real = await realpath(lexical.path);\n const rel = relative(root, real);\n if (rel === '..' || rel.startsWith(`..${sep}`) || pathIsAbsolute(rel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel} via symlink: \"${raw}\".` };\n }\n resolved.push(real);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') {\n resolved.push(lexical.path);\n } else {\n return { ok: false, error: `Cannot resolve \"${raw}\" (${params.scopeLabel}): ${(e as Error).message}` };\n }\n }\n }\n\n return { ok: true, paths: resolved };\n}\n\n/**\n * Same as resolveExistingPathsWithinRoot but missing files are NOT allowed.\n */\nexport async function resolveStrictExistingPathsWithinRoot(params: {\n rootDir: string;\n requestedPaths: string[];\n scopeLabel: string;\n}): Promise<PathsResult> {\n const root = resolve(params.rootDir);\n const resolved: string[] = [];\n\n for (const raw of params.requestedPaths) {\n const lexical = resolvePathWithinRoot({ rootDir: root, requestedPath: raw, scopeLabel: params.scopeLabel });\n if (!lexical.ok) return lexical;\n\n let real: string;\n try {\n real = await realpath(lexical.path);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') {\n return { ok: false, error: `Path does not exist (${params.scopeLabel}): \"${raw}\".` };\n }\n return { ok: false, error: `Cannot resolve \"${raw}\" (${params.scopeLabel}): ${(e as Error).message}` };\n }\n\n const rel = relative(root, real);\n if (rel === '..' || rel.startsWith(`..${sep}`) || pathIsAbsolute(rel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel} via symlink: \"${raw}\".` };\n }\n\n const stat = await lstat(real);\n if (stat.isSymbolicLink()) {\n return { ok: false, error: `Path is a symbolic link (${params.scopeLabel}): \"${raw}\".` };\n }\n if (!stat.isFile()) {\n return { ok: false, error: `Path is not a regular file (${params.scopeLabel}): \"${raw}\".` };\n }\n\n resolved.push(real);\n }\n\n return { ok: true, paths: resolved };\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 = fileName.trim();\n if (trimmed === '') return fallbackName;\n\n let base = posix.basename(trimmed);\n base = win32.basename(base);\n\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)\n await rm(tempPath, { force: true }).catch(() => {\n /* noop */\n });\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(\n opts: {\n url: string;\n lookupFn?: LookupFn;\n } & BrowserNavigationPolicyOptions,\n): Promise<void> {\n const rawUrl = 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(\n opts: {\n request?: BrowserNavigationRequestLike | null;\n lookupFn?: LookupFn;\n } & BrowserNavigationPolicyOptions,\n): 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 type { Locator, Page } from 'playwright-core';\n\nimport {\n getPageForTargetId,\n ensurePageState,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpUploadArmId,\n bumpDialogArmId,\n requireRef,\n requireRefOrSelector,\n resolveInteractionTimeoutMs,\n resolveBoundedDelayMs,\n getRestoredPageForTarget,\n parseRoleRef,\n withPageScopedCdpClient,\n} from '../connection.js';\nimport { resolveStrictExistingPathsWithinRoot, DEFAULT_UPLOAD_DIR } 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;\nconst DEFAULT_SCROLL_TIMEOUT_MS = 20_000;\nconst CHECKABLE_ROLES = new Set(['menuitemcheckbox', 'menuitemradio', 'checkbox', 'radio', 'switch']);\n\n/**\n * Fallback for setChecked on hidden styled inputs (opacity:0, position:absolute).\n * Sets the checked property directly via the native setter and dispatches events.\n */\nasync function setCheckedViaEvaluate(locator: Locator, checked: boolean): Promise<void> {\n await locator.evaluate((el: Element, desired: boolean) => {\n const input = el as HTMLInputElement;\n const desc = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked');\n if (desc?.set) desc.set.call(input, desired);\n else input.checked = desired;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.click();\n }, checked);\n}\n\nfunction resolveLocator(page: Page, resolved: { ref?: string; selector?: string }) {\n if (resolved.ref !== undefined && resolved.ref !== '') return refLocator(page, resolved.ref);\n const sel = resolved.selector ?? '';\n return page.locator(sel);\n}\n\nexport async function mouseClickViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n x: number;\n y: number;\n button?: MouseButton;\n clickCount?: number;\n delayMs?: number;\n}): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n await page.mouse.click(opts.x, opts.y, {\n button: opts.button,\n clickCount: opts.clickCount,\n delay: opts.delayMs,\n });\n}\n\nexport async function pressAndHoldViaCdp(opts: {\n cdpUrl: string;\n targetId?: string;\n x: number;\n y: number;\n delay?: number;\n holdMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const { x, y } = opts;\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n await send('Input.dispatchMouseEvent', { type: 'mouseMoved', x, y, button: 'none' });\n if (opts.delay !== undefined && opts.delay !== 0) await new Promise((r) => setTimeout(r, opts.delay));\n await send('Input.dispatchMouseEvent', { type: 'mousePressed', x, y, button: 'left', clickCount: 1 });\n if (opts.holdMs !== undefined && opts.holdMs !== 0) await new Promise((r) => setTimeout(r, opts.holdMs));\n await send('Input.dispatchMouseEvent', { type: 'mouseReleased', x, y, button: 'left', clickCount: 1 });\n },\n });\n}\n\nexport async function clickByTextViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n text: string;\n exact?: boolean;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n const locator = page\n .getByText(opts.text, { exact: opts.exact })\n .or(page.getByTitle(opts.text, { exact: opts.exact }))\n .and(page.locator(':visible'))\n .first();\n try {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers });\n } catch (err) {\n throw toAIFriendlyError(err, `text=\"${opts.text}\"`);\n }\n}\n\nexport async function clickByRoleViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n role: string;\n name?: string;\n index?: number;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n const label = `role=${opts.role}${opts.name !== undefined && opts.name !== '' ? ` name=\"${opts.name}\"` : ''}`;\n const locator = page\n .getByRole(opts.role as Parameters<typeof page.getByRole>[0], { name: opts.name })\n .nth(opts.index ?? 0);\n try {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function clickViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n doubleClick?: boolean;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n delayMs?: number;\n timeoutMs?: number;\n force?: boolean;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n\n // Determine if this is a checkable role element so we can verify the click worked.\n let checkableRole = false;\n if (resolved.ref !== undefined && resolved.ref !== '') {\n const refId = parseRoleRef(resolved.ref);\n if (refId !== null) {\n const state = ensurePageState(page);\n const info = state.roleRefs?.[refId];\n if (info && CHECKABLE_ROLES.has(info.role)) checkableRole = true;\n }\n }\n\n try {\n const delayMs = resolveBoundedDelayMs(opts.delayMs, 'click delayMs', MAX_CLICK_DELAY_MS);\n if (delayMs > 0) {\n await locator.hover({ timeout, force: opts.force });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n // For checkable roles, capture aria-checked before the click.\n let ariaCheckedBefore: string | null | undefined;\n if (checkableRole && opts.doubleClick !== true) {\n ariaCheckedBefore = await locator.getAttribute('aria-checked', { timeout }).catch(() => undefined);\n }\n\n if (opts.doubleClick === true) {\n await locator.dblclick({ timeout, button: opts.button, modifiers: opts.modifiers, force: opts.force });\n } else {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers, force: opts.force });\n }\n\n // If this is a checkable role and aria-checked didn't change, fall back to JS click.\n // Poll briefly to give async frameworks time to update the DOM before concluding\n // the click didn't work — otherwise we'd fire a second click that un-toggles it.\n if (checkableRole && opts.doubleClick !== true && ariaCheckedBefore !== undefined) {\n const POLL_INTERVAL_MS = 50;\n const POLL_TIMEOUT_MS = 500;\n let changed = false;\n for (let elapsed = 0; elapsed < POLL_TIMEOUT_MS; elapsed += POLL_INTERVAL_MS) {\n const current = await locator.getAttribute('aria-checked', { timeout }).catch(() => undefined);\n if (current === undefined || current !== ariaCheckedBefore) {\n changed = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n if (!changed) {\n await locator\n .evaluate((el: Element) => {\n (el as HTMLElement).click();\n })\n .catch(() => {\n /* intentional no-op */\n });\n }\n }\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function hoverViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n\n try {\n await locator.hover({ timeout: resolveInteractionTimeoutMs(opts.timeoutMs) });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function typeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n text: string;\n submit?: boolean;\n slowly?: boolean;\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const text = opts.text;\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n\n try {\n if (opts.slowly === true) {\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 === true) await locator.press('Enter', { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function selectOptionViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n values: string[];\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n if (opts.values.length === 0) throw new Error('values are required');\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n\n try {\n await locator.selectOption(opts.values, { timeout: resolveInteractionTimeoutMs(opts.timeoutMs) });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function dragViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n startRef?: string;\n startSelector?: string;\n endRef?: string;\n endSelector?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const resolvedStart = requireRefOrSelector(opts.startRef, opts.startSelector);\n const resolvedEnd = requireRefOrSelector(opts.endRef, opts.endSelector);\n const page = await getRestoredPageForTarget(opts);\n const startLocator = resolveLocator(page, resolvedStart);\n const endLocator = resolveLocator(page, resolvedEnd);\n const startLabel = resolvedStart.ref ?? resolvedStart.selector ?? '';\n const endLabel = resolvedEnd.ref ?? resolvedEnd.selector ?? '';\n\n try {\n await startLocator.dragTo(endLocator, { timeout: resolveInteractionTimeoutMs(opts.timeoutMs) });\n } catch (err) {\n throw toAIFriendlyError(err, `${startLabel} -> ${endLabel}`);\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 getRestoredPageForTarget(opts);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\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 =\n typeof rawValue === 'string'\n ? rawValue\n : typeof rawValue === 'number' || typeof rawValue === 'boolean'\n ? 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, force: true });\n } catch {\n try {\n await setCheckedViaEvaluate(locator, checked);\n } catch (err) {\n throw toAIFriendlyError(err, ref);\n }\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 selector?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n\n try {\n await locator.waitFor({\n state: 'attached',\n timeout: normalizeTimeoutMs(opts.timeoutMs, DEFAULT_SCROLL_TIMEOUT_MS),\n });\n await locator.evaluate((el: Element) => {\n el.scrollIntoView({ block: 'center', behavior: 'instant' });\n });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function highlightViaPlaywright(opts: { cdpUrl: string; targetId?: string; ref: string }): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n const ref = requireRef(opts.ref);\n\n try {\n await refLocator(page, ref).highlight();\n } catch (err) {\n throw toAIFriendlyError(err, 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 getRestoredPageForTarget(opts);\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 ? refLocator(page, inputRef) : page.locator(element).first();\n\n const uploadPathsResult = await resolveStrictExistingPathsWithinRoot({\n rootDir: DEFAULT_UPLOAD_DIR,\n requestedPaths: opts.paths,\n scopeLabel: `uploads directory (${DEFAULT_UPLOAD_DIR})`,\n });\n if (!uploadPathsResult.ok) throw new Error(uploadPathsResult.error);\n const resolvedPaths = uploadPathsResult.paths;\n\n try {\n await locator.setInputFiles(resolvedPaths);\n } catch (err) {\n throw toAIFriendlyError(err, inputRef || element);\n }\n\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 /* intentional no-op */\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\n .waitForEvent('dialog', { timeout })\n .then(async (dialog) => {\n if (state.armIdDialog !== armId) return;\n try {\n if (opts.accept) await dialog.accept(opts.promptText);\n else await dialog.dismiss();\n } finally {\n if (state.armIdDialog === armId) state.armIdDialog = 0;\n }\n })\n .catch(() => {\n if (state.armIdDialog === armId) state.armIdDialog = 0;\n });\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\n .waitForEvent('filechooser', { timeout })\n .then(async (fileChooser) => {\n if (state.armIdUpload !== armId) return;\n\n if (opts.paths === undefined || opts.paths.length === 0) {\n try {\n await page.keyboard.press('Escape');\n } catch {\n /* intentional no-op */\n }\n return;\n }\n\n const uploadPathsResult = await resolveStrictExistingPathsWithinRoot({\n rootDir: DEFAULT_UPLOAD_DIR,\n requestedPaths: opts.paths,\n scopeLabel: `uploads directory (${DEFAULT_UPLOAD_DIR})`,\n });\n if (!uploadPathsResult.ok) {\n try {\n await page.keyboard.press('Escape');\n } catch {\n /* intentional no-op */\n }\n return;\n }\n\n await fileChooser.setFiles(uploadPathsResult.paths);\n\n try {\n const input = typeof fileChooser.element === 'function' ? await Promise.resolve(fileChooser.element()) : null;\n if (input !== null) {\n await input.evaluate((el: Element) => {\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n });\n }\n } catch {\n /* intentional no-op */\n }\n })\n .catch(() => {\n /* intentional no-op */\n });\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 = 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 type { Browser, BrowserContext, Page, Route, Request } from 'playwright-core';\n\nimport {\n BrowserTabNotFoundError,\n BlockedBrowserTargetError,\n connectBrowser,\n getPageForTargetId,\n ensurePageState,\n ensureContextState,\n observeContext,\n pageTargetId,\n getAllPages,\n forceDisconnectPlaywrightForTarget,\n resolvePageByTargetIdOrThrow,\n withPageScopedCdpClient,\n isBlockedTarget,\n isBlockedPageRef,\n markTargetBlocked,\n markPageRefBlocked,\n clearBlockedPageRef,\n clearBlockedTarget,\n} from '../connection.js';\nimport {\n InvalidBrowserNavigationUrlError,\n assertBrowserNavigationAllowed,\n assertBrowserNavigationResultAllowed,\n assertBrowserNavigationRedirectChainAllowed,\n withBrowserNavigationPolicy,\n} from '../security.js';\nimport type { BrowserTab, SsrfPolicy } from '../types.js';\n\nconst recordingContexts = new Map<string, BrowserContext>();\n\nexport function clearRecordingContext(cdpUrl: string): void {\n recordingContexts.delete(cdpUrl);\n}\n\nasync function createRecordingContext(\n browser: Browser,\n cdpUrl: string,\n recordVideo: { dir: string; size?: { width: number; height: number } },\n): Promise<BrowserContext> {\n const context = await browser.newContext({ recordVideo });\n observeContext(context);\n recordingContexts.set(cdpUrl, context);\n context.on('close', () => recordingContexts.delete(cdpUrl));\n return context;\n}\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\nfunction isPolicyDenyNavigationError(err: unknown): boolean {\n return err instanceof InvalidBrowserNavigationUrlError;\n}\n\nfunction isTopLevelNavigationRequest(page: Page, request: Request): boolean {\n if (!request.isNavigationRequest()) return false;\n try {\n return request.frame() === page.mainFrame();\n } catch {\n return true;\n }\n}\n\nasync function closeBlockedNavigationTarget(opts: { cdpUrl: string; page: Page; targetId?: string }): Promise<void> {\n markPageRefBlocked(opts.cdpUrl, opts.page);\n const resolvedTargetId = await pageTargetId(opts.page).catch(() => null);\n const fallbackTargetId = opts.targetId?.trim() ?? '';\n const targetIdToBlock = resolvedTargetId ?? fallbackTargetId;\n if (targetIdToBlock) markTargetBlocked(opts.cdpUrl, targetIdToBlock);\n await opts.page.close().catch((e: unknown) => {\n console.warn('[browserclaw] failed to close blocked page', e);\n });\n}\n\nasync function assertPageNavigationCompletedSafely(opts: {\n cdpUrl: string;\n page: Page;\n response: Awaited<ReturnType<Page['goto']>>;\n ssrfPolicy?: SsrfPolicy;\n targetId?: string;\n}): Promise<void> {\n const navigationPolicy = withBrowserNavigationPolicy(opts.ssrfPolicy);\n try {\n await assertBrowserNavigationRedirectChainAllowed({ request: opts.response?.request(), ...navigationPolicy });\n await assertBrowserNavigationResultAllowed({ url: opts.page.url(), ...navigationPolicy });\n } catch (err) {\n if (isPolicyDenyNavigationError(err))\n await closeBlockedNavigationTarget({ cdpUrl: opts.cdpUrl, page: opts.page, targetId: opts.targetId });\n throw err;\n }\n}\n\nasync function gotoPageWithNavigationGuard(opts: {\n cdpUrl: string;\n page: Page;\n url: string;\n timeoutMs: number;\n ssrfPolicy?: SsrfPolicy;\n targetId?: string;\n}): Promise<Awaited<ReturnType<Page['goto']>>> {\n const navigationPolicy = withBrowserNavigationPolicy(opts.ssrfPolicy);\n const state: { blocked: Error | null } = { blocked: null };\n const handler = async (route: Route, request: Request) => {\n if (state.blocked !== null) {\n await route.abort().catch((e: unknown) => {\n console.warn('[browserclaw] route abort failed', e);\n });\n return;\n }\n if (!isTopLevelNavigationRequest(opts.page, request)) {\n await route.continue();\n return;\n }\n try {\n await assertBrowserNavigationAllowed({ url: request.url(), ...navigationPolicy });\n } catch (err) {\n if (isPolicyDenyNavigationError(err)) {\n state.blocked = err as Error;\n await route.abort().catch((e: unknown) => {\n console.warn('[browserclaw] route abort failed', e);\n });\n return;\n }\n throw err;\n }\n await route.continue();\n };\n await opts.page.route('**', handler);\n try {\n const response = await opts.page.goto(opts.url, { timeout: opts.timeoutMs });\n if (state.blocked !== null) throw state.blocked;\n return response;\n } catch (err) {\n if (state.blocked !== null) throw state.blocked;\n throw err;\n } finally {\n await opts.page.unroute('**', handler).catch((e: unknown) => {\n console.warn('[browserclaw] route unroute failed', e);\n });\n if (state.blocked !== null)\n await closeBlockedNavigationTarget({ cdpUrl: opts.cdpUrl, page: opts.page, targetId: opts.targetId });\n }\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 = opts.url.trim();\n if (!url) throw new Error('url is required');\n /* eslint-disable @typescript-eslint/no-deprecated */\n const policy =\n opts.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\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 () =>\n await gotoPageWithNavigationGuard({\n cdpUrl: opts.cdpUrl,\n page,\n url,\n timeoutMs: timeout,\n ssrfPolicy: policy,\n targetId: opts.targetId,\n });\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 /* intentional no-op */\n });\n page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n response = await navigate();\n }\n\n await assertPageNavigationCompletedSafely({\n cdpUrl: opts.cdpUrl,\n page,\n response,\n ssrfPolicy: policy,\n targetId: opts.targetId,\n });\n return { url: page.url() };\n}\n\nexport async function listPagesViaPlaywright(opts: { cdpUrl: string }): Promise<BrowserTab[]> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = getAllPages(browser);\n const results: BrowserTab[] = [];\n for (const page of pages) {\n if (isBlockedPageRef(opts.cdpUrl, page)) continue;\n const tid = await pageTargetId(page).catch(() => null);\n if (tid !== null && tid !== '' && !isBlockedTarget(opts.cdpUrl, tid))\n 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 recordVideo?: { dir: string; size?: { width: number; height: number } };\n}): Promise<BrowserTab> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const context = opts.recordVideo\n ? (recordingContexts.get(opts.cdpUrl) ?? (await createRecordingContext(browser, opts.cdpUrl, opts.recordVideo)))\n : (browser.contexts()[0] ?? (await browser.newContext()));\n ensureContextState(context);\n const page = await context.newPage();\n ensurePageState(page);\n clearBlockedPageRef(opts.cdpUrl, page);\n const createdTargetId = await pageTargetId(page).catch(() => null);\n clearBlockedTarget(opts.cdpUrl, createdTargetId ?? undefined);\n\n const targetUrl = (opts.url ?? '').trim() || 'about:blank';\n /* eslint-disable @typescript-eslint/no-deprecated */\n const policy =\n opts.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\n\n if (targetUrl !== 'about:blank') {\n await assertBrowserNavigationAllowed({ url: targetUrl, ...withBrowserNavigationPolicy(policy) });\n let response: Awaited<ReturnType<Page['goto']>> = null;\n try {\n response = await gotoPageWithNavigationGuard({\n cdpUrl: opts.cdpUrl,\n page,\n url: targetUrl,\n timeoutMs: 30000,\n ssrfPolicy: policy,\n targetId: createdTargetId ?? undefined,\n });\n } catch (err) {\n if (isPolicyDenyNavigationError(err) || err instanceof BlockedBrowserTargetError) throw err;\n }\n await assertPageNavigationCompletedSafely({\n cdpUrl: opts.cdpUrl,\n page,\n response,\n ssrfPolicy: policy,\n targetId: createdTargetId ?? undefined,\n });\n }\n\n const tid = createdTargetId ?? (await pageTargetId(page).catch(() => null));\n if (tid === null || 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: { cdpUrl: string; targetId?: string }): 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: { cdpUrl: string; targetId: string }): Promise<void> {\n try {\n await (await resolvePageByTargetIdOrThrow(opts)).close();\n } catch (err) {\n if (err instanceof BrowserTabNotFoundError) return;\n throw err;\n }\n}\n\nexport async function focusPageByTargetIdViaPlaywright(opts: { cdpUrl: string; targetId: string }): Promise<void> {\n const page = await resolvePageByTargetIdOrThrow(opts);\n try {\n await page.bringToFront();\n } catch (err) {\n try {\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n await send('Page.bringToFront');\n },\n });\n return;\n } catch {\n throw err;\n }\n }\n}\n\nexport async function waitForTabViaPlaywright(opts: {\n cdpUrl: string;\n urlContains?: string;\n titleContains?: string;\n timeoutMs?: number;\n}): Promise<BrowserTab> {\n if (opts.urlContains === undefined && opts.titleContains === undefined)\n throw new Error('urlContains or titleContains is required');\n const timeout = Math.max(1000, Math.min(120000, opts.timeoutMs ?? 30000));\n const start = Date.now();\n const POLL_INTERVAL_MS = 250;\n\n while (Date.now() - start < timeout) {\n const tabs = await listPagesViaPlaywright({ cdpUrl: opts.cdpUrl });\n const match = tabs.find((t) => {\n if (opts.urlContains !== undefined && !t.url.includes(opts.urlContains)) return false;\n if (opts.titleContains !== undefined && !t.title.includes(opts.titleContains)) return false;\n return true;\n });\n if (match) return match;\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n const criteria: string[] = [];\n if (opts.urlContains !== undefined) criteria.push(`url contains \"${opts.urlContains}\"`);\n if (opts.titleContains !== undefined) criteria.push(`title contains \"${opts.titleContains}\"`);\n throw new Error(`Timed out waiting for tab: ${criteria.join(', ')}`);\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\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 ${String(maxMs)}ms`);\n return normalized;\n}\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 | ((arg?: unknown) => unknown);\n arg?: unknown;\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(resolveBoundedDelayMs(opts.timeMs, 'wait timeMs', MAX_WAIT_TIME_MS));\n }\n if (opts.text !== undefined && opts.text !== '') {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- document.body is null before DOM ready\n await page.waitForFunction((text) => (document.body?.innerText ?? '').includes(text), opts.text, { timeout });\n }\n if (opts.textGone !== undefined && opts.textGone !== '') {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- document.body is null before DOM ready\n await page.waitForFunction((text) => !(document.body?.innerText ?? '').includes(text), opts.textGone, { timeout });\n }\n if (opts.selector !== undefined && opts.selector !== '') {\n const selector = opts.selector.trim();\n if (selector !== '') await page.locator(selector).first().waitFor({ state: 'visible', timeout });\n }\n if (opts.url !== undefined && opts.url !== '') {\n const url = opts.url.trim();\n if (url !== '') await page.waitForURL(url, { timeout });\n }\n if (opts.loadState !== undefined) {\n await page.waitForLoadState(opts.loadState, { timeout });\n }\n if (opts.fn !== undefined) {\n if (typeof opts.fn === 'function') {\n await page.waitForFunction(opts.fn, opts.arg, { timeout });\n } else {\n const fn = opts.fn.trim();\n if (fn !== '') await page.waitForFunction(fn, opts.arg, { timeout });\n }\n }\n}\n","import { evaluateViaPlaywright } from './evaluate.js';\nimport {\n clickViaPlaywright,\n hoverViaPlaywright,\n typeViaPlaywright,\n selectOptionViaPlaywright,\n dragViaPlaywright,\n fillFormViaPlaywright,\n scrollIntoViewViaPlaywright,\n} from './interaction.js';\nimport { pressKeyViaPlaywright } from './keyboard.js';\nimport { resizeViewportViaPlaywright, closePageViaPlaywright } from './navigation.js';\nimport { waitForViaPlaywright } from './wait.js';\n\nconst MAX_BATCH_DEPTH = 5;\nconst MAX_BATCH_ACTIONS = 100;\n\n/** A single action within a batch. */\nexport type BatchAction =\n | {\n kind: 'click';\n ref?: string;\n selector?: string;\n targetId?: string;\n doubleClick?: boolean;\n button?: string;\n modifiers?: string[];\n delayMs?: number;\n timeoutMs?: number;\n }\n | {\n kind: 'type';\n ref?: string;\n selector?: string;\n text: string;\n targetId?: string;\n submit?: boolean;\n slowly?: boolean;\n timeoutMs?: number;\n }\n | { kind: 'press'; key: string; targetId?: string; delayMs?: number }\n | { kind: 'hover'; ref?: string; selector?: string; targetId?: string; timeoutMs?: number }\n | { kind: 'scrollIntoView'; ref?: string; selector?: string; targetId?: string; timeoutMs?: number }\n | {\n kind: 'drag';\n startRef?: string;\n startSelector?: string;\n endRef?: string;\n endSelector?: string;\n targetId?: string;\n timeoutMs?: number;\n }\n | { kind: 'select'; ref?: string; selector?: string; values: string[]; targetId?: string; timeoutMs?: number }\n | {\n kind: 'fill';\n fields: { ref: string; type?: string; value?: string | number | boolean }[];\n targetId?: string;\n timeoutMs?: number;\n }\n | { kind: 'resize'; width: number; height: number; targetId?: string }\n | {\n kind: 'wait';\n timeMs?: number;\n text?: string;\n textGone?: string;\n selector?: string;\n url?: string;\n loadState?: 'load' | 'domcontentloaded' | 'networkidle';\n fn?: string;\n arg?: unknown;\n targetId?: string;\n timeoutMs?: number;\n }\n | { kind: 'evaluate'; fn: string; ref?: string; targetId?: string; timeoutMs?: number }\n | { kind: 'close'; targetId?: string }\n | { kind: 'batch'; actions: BatchAction[]; targetId?: string; stopOnError?: boolean };\n\n/** Result of a single action within a batch. */\nexport type BatchActionResult = { ok: true } | { ok: false; error: string };\n\n/**\n * Execute a single batch action.\n */\nexport async function executeSingleAction(\n action: BatchAction,\n cdpUrl: string,\n targetId: string | undefined,\n evaluateEnabled: boolean,\n depth = 0,\n): Promise<void> {\n if (depth > MAX_BATCH_DEPTH) throw new Error(`Batch nesting depth exceeds maximum of ${String(MAX_BATCH_DEPTH)}`);\n const effectiveTargetId = action.targetId ?? targetId;\n\n switch (action.kind) {\n case 'click':\n await clickViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n doubleClick: action.doubleClick,\n button: action.button as 'left' | 'right' | 'middle' | undefined,\n modifiers: action.modifiers as ('Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift')[] | undefined,\n delayMs: action.delayMs,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'type':\n await typeViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n text: action.text,\n submit: action.submit,\n slowly: action.slowly,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'press':\n await pressKeyViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n key: action.key,\n delayMs: action.delayMs,\n });\n break;\n case 'hover':\n await hoverViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'scrollIntoView':\n await scrollIntoViewViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'drag':\n await dragViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n startRef: action.startRef,\n startSelector: action.startSelector,\n endRef: action.endRef,\n endSelector: action.endSelector,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'select':\n await selectOptionViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n values: action.values,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'fill':\n await fillFormViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n fields: action.fields,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'resize':\n await resizeViewportViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n width: action.width,\n height: action.height,\n });\n break;\n case 'wait':\n if (action.fn !== undefined && action.fn !== '' && !evaluateEnabled)\n throw new Error('wait --fn is disabled by config (browser.evaluateEnabled=false)');\n await waitForViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n timeMs: action.timeMs,\n text: action.text,\n textGone: action.textGone,\n selector: action.selector,\n url: action.url,\n loadState: action.loadState,\n fn: action.fn,\n arg: action.arg,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'evaluate':\n if (!evaluateEnabled) throw new Error('act:evaluate is disabled by config (browser.evaluateEnabled=false)');\n await evaluateViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n fn: action.fn,\n ref: action.ref,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'close':\n await closePageViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n });\n break;\n case 'batch':\n await batchViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n actions: action.actions,\n stopOnError: action.stopOnError,\n evaluateEnabled,\n depth: depth + 1,\n });\n break;\n default:\n throw new Error(`Unsupported batch action kind: ${String((action as Record<string, unknown>).kind)}`);\n }\n}\n\n/**\n * Execute multiple browser actions in sequence.\n *\n * @param opts.actions - Array of actions to execute\n * @param opts.stopOnError - Stop on first error (default: true)\n * @param opts.evaluateEnabled - Whether evaluate/wait:fn actions are permitted\n * @param opts.depth - Internal recursion depth (do not set manually)\n */\nexport async function batchViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n actions: BatchAction[];\n stopOnError?: boolean;\n evaluateEnabled?: boolean;\n depth?: number;\n}): Promise<{ results: BatchActionResult[] }> {\n const depth = opts.depth ?? 0;\n if (depth > MAX_BATCH_DEPTH) throw new Error(`Batch nesting depth exceeds maximum of ${String(MAX_BATCH_DEPTH)}`);\n if (opts.actions.length > MAX_BATCH_ACTIONS)\n throw new Error(`Batch exceeds maximum of ${String(MAX_BATCH_ACTIONS)} actions`);\n\n const results: BatchActionResult[] = [];\n const evaluateEnabled = opts.evaluateEnabled !== false;\n\n for (const action of opts.actions) {\n try {\n await executeSingleAction(action, opts.cdpUrl, opts.targetId, evaluateEnabled, depth);\n results.push({ ok: true });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n results.push({ ok: false, error: message });\n if (opts.stopOnError !== false) break;\n }\n }\n\n return { results };\n}\n","import { dirname } from 'node:path';\n\nimport type { Page, Download } from 'playwright-core';\n\nimport {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpDownloadArmId,\n} from '../connection.js';\nimport { assertSafeOutputPath, writeViaSiblingTempPath, sanitizeUntrustedFileName } from '../security.js';\nimport type { DownloadResult, PageState } from '../types.js';\n\nfunction createPageDownloadWaiter(page: Page, timeoutMs: number) {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let handler: ((download: Download) => void) | undefined;\n\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (handler) {\n page.off('download', handler);\n handler = undefined;\n }\n };\n\n return {\n promise: new Promise<Download>((resolve, reject) => {\n handler = (download: Download) => {\n if (done) return;\n done = true;\n cleanup();\n resolve(download);\n };\n page.on('download', handler);\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n cleanup();\n reject(new Error('Timeout waiting for download'));\n }, timeoutMs);\n }),\n cancel: () => {\n if (done) return;\n done = true;\n cleanup();\n },\n };\n}\n\nasync function saveDownloadPayload(download: Download, outPath: string): Promise<DownloadResult> {\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}\n\nasync function awaitDownloadPayload(params: {\n waiter: ReturnType<typeof createPageDownloadWaiter>;\n state: PageState;\n armId: number;\n outPath: string;\n}): Promise<DownloadResult> {\n try {\n const download = await params.waiter.promise;\n if (params.state.armIdDownload !== params.armId) throw new Error('Download was superseded by another waiter');\n return await saveDownloadPayload(download, params.outPath);\n } catch (err) {\n params.waiter.cancel();\n throw err;\n }\n}\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 outPath = opts.path.trim();\n if (!outPath) throw new Error('path is required');\n\n state.armIdDownload = bumpDownloadArmId();\n const armId = state.armIdDownload;\n const waiter = createPageDownloadWaiter(page, timeout);\n\n try {\n const locator = refLocator(page, opts.ref);\n try {\n await locator.click({ timeout });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n return await awaitDownloadPayload({ waiter, state, armId, outPath });\n } catch (err) {\n waiter.cancel();\n throw err;\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 const state = ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n\n state.armIdDownload = bumpDownloadArmId();\n const armId = state.armIdDownload;\n\n const waiter = createPageDownloadWaiter(page, timeout);\n try {\n const download = await waiter.promise;\n if (state.armIdDownload !== armId) throw new Error('Download was superseded by another waiter');\n const savePath =\n opts.path ?? sanitizeUntrustedFileName(download.suggestedFilename() || 'download.bin', 'download.bin');\n await assertSafeOutputPath(savePath, opts.allowedOutputRoots);\n return await saveDownloadPayload(download, savePath);\n } catch (err) {\n waiter.cancel();\n throw err;\n }\n}\n","import { devices } from 'playwright-core';\n\nimport { getPageForTargetId, ensurePageState, withPageScopedCdpClient } 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: { cdpUrl: string; targetId?: string; name: string }): Promise<void> {\n const name = opts.name.trim();\n if (!name) throw new Error('device name is required');\n\n const device:\n | {\n viewport: { width: number; height: number } | null;\n userAgent: string;\n deviceScaleFactor: number;\n isMobile: boolean;\n hasTouch: boolean;\n defaultBrowserType: string;\n locale?: string;\n }\n | undefined = devices[name] as ((typeof devices)[string] & { locale?: string }) | undefined;\n if (device === undefined) {\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 !== null) {\n await page.setViewportSize({\n width: device.viewport.width,\n height: device.viewport.height,\n });\n }\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n const locale = device.locale;\n if (device.userAgent !== '' || (locale !== undefined && locale !== '')) {\n await send('Emulation.setUserAgentOverride', {\n userAgent: device.userAgent,\n acceptLanguage: locale,\n });\n }\n if (device.viewport !== null) {\n await send('Emulation.setDeviceMetricsOverride', {\n mobile: device.isMobile,\n width: device.viewport.width,\n height: device.viewport.height,\n deviceScaleFactor: device.deviceScaleFactor,\n screenWidth: device.viewport.width,\n screenHeight: device.viewport.height,\n });\n }\n if (device.hasTouch) {\n await send('Emulation.setTouchEmulationEnabled', { enabled: true });\n }\n },\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 === true) {\n await context.setGeolocation(null);\n await context.clearPermissions().catch(() => {\n /* intentional no-op */\n });\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 =\n (opts.origin !== undefined && opts.origin !== '' ? opts.origin.trim() : '') ||\n (() => {\n try {\n return new URL(page.url()).origin;\n } catch {\n return '';\n }\n })();\n if (origin !== '')\n await context.grantPermissions(['geolocation'], { origin }).catch(() => {\n /* intentional no-op */\n });\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 === true) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n await page.context().setHTTPCredentials(null);\n return;\n }\n\n const username = opts.username ?? '';\n const password = opts.password ?? '';\n if (!username) throw new Error('username is required (or set clear=true)');\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated\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 = opts.locale.trim();\n if (!locale) throw new Error('locale is required');\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n try {\n await 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 },\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 = opts.timezoneId.trim();\n if (!timezoneId) throw new Error('timezoneId is required');\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n try {\n await 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 },\n });\n}\n","import { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from './connection.js';\nimport type { ChallengeInfo, ChallengeWaitResult } from './types.js';\n\n// ── Detection script (runs in browser context) ──\n\nconst DETECT_CHALLENGE_SCRIPT = `(function() {\n var title = (document.title || '').toLowerCase();\n\n // Cloudflare JS challenge\n if (title === 'just a moment...'\n || document.querySelector('#challenge-running, #cf-please-wait, #challenge-form')\n || title.indexOf('checking your browser') !== -1) {\n return { kind: 'cloudflare-js', message: 'Cloudflare JS challenge' };\n }\n\n // Cloudflare block page (needs body text — read lazily)\n var body = null;\n function getBody() { if (body === null) body = (document.body && document.body.textContent) || ''; return body; }\n\n if (title.indexOf('attention required') !== -1\n || (document.querySelector('.cf-error-details') && getBody().indexOf('blocked') !== -1)) {\n return { kind: 'cloudflare-block', message: 'Cloudflare block page' };\n }\n\n // Cloudflare Turnstile\n if (document.querySelector('.cf-turnstile, iframe[src*=\"challenges.cloudflare.com\"]')) {\n return { kind: 'cloudflare-turnstile', message: 'Cloudflare Turnstile challenge' };\n }\n\n // hCaptcha\n if (document.querySelector('.h-captcha, iframe[src*=\"hcaptcha.com\"]')) {\n return { kind: 'hcaptcha', message: 'hCaptcha challenge' };\n }\n\n // reCAPTCHA\n if (document.querySelector('.g-recaptcha, iframe[src*=\"google.com/recaptcha\"]')) {\n return { kind: 'recaptcha', message: 'reCAPTCHA challenge' };\n }\n\n // Generic access-denied / rate-limit pages (only read body for short pages)\n var b = getBody();\n if (b.length < 5000) {\n if (/access denied|403 forbidden/i.test(title) || /access denied/i.test(b)) {\n return { kind: 'blocked', message: 'Access denied' };\n }\n if (/\\\\b429\\\\b/i.test(title) || /too many requests|rate limit/i.test(b)) {\n return { kind: 'rate-limited', message: 'Rate limited' };\n }\n }\n\n return null;\n})()`;\n\nfunction parseChallengeResult(raw: unknown): ChallengeInfo | null {\n if (raw !== null && typeof raw === 'object' && 'kind' in (raw as Record<string, unknown>)) {\n return raw as ChallengeInfo;\n }\n return null;\n}\n\n/**\n * Detect whether the current page is showing an anti-bot challenge.\n * Returns `null` if no challenge is detected.\n */\nexport async function detectChallengeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<ChallengeInfo | null> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return parseChallengeResult(await page.evaluate(DETECT_CHALLENGE_SCRIPT));\n}\n\n/**\n * Wait for an anti-bot challenge to resolve on its own (e.g. Cloudflare JS challenge).\n *\n * Returns `{ resolved: true }` if the challenge cleared within the timeout,\n * or `{ resolved: false, challenge }` with the still-present challenge info.\n *\n * For challenges that require human interaction (CAPTCHA), this will time out\n * unless the user solves the challenge in the visible browser window.\n */\nexport async function waitForChallengeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n timeoutMs?: number;\n pollMs?: number;\n}): Promise<ChallengeWaitResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 15000);\n const poll = Math.max(250, Math.min(5000, opts.pollMs ?? 500));\n\n const detect = async () => parseChallengeResult(await page.evaluate(DETECT_CHALLENGE_SCRIPT));\n\n // Check if there's actually a challenge present\n const initial = await detect();\n if (initial === null) return { resolved: true, challenge: null };\n\n // For Cloudflare JS challenges, wait for the title to change (it navigates on success)\n if (initial.kind === 'cloudflare-js') {\n try {\n await page.waitForFunction(\n \"document.title.toLowerCase() !== 'just a moment...' && !document.querySelector('#challenge-running')\",\n undefined,\n { timeout },\n );\n // Cloudflare redirects after the challenge — let the page settle\n await page.waitForLoadState('domcontentloaded', { timeout: 5000 }).catch(() => {\n /* page may have already settled */\n });\n const after = await detect();\n return { resolved: after === null, challenge: after };\n } catch {\n const after = await detect();\n return { resolved: after === null, challenge: after };\n }\n }\n\n // For everything else, poll until challenge disappears or timeout\n const deadline = Date.now() + timeout;\n while (Date.now() < deadline) {\n await page.waitForTimeout(poll);\n const current = await detect();\n if (current === null) return { resolved: true, challenge: null };\n }\n\n const final = await detect();\n return { resolved: final === null, challenge: final };\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':\n return 3;\n case 'warning':\n case 'warn':\n return 2;\n case 'info':\n case 'log':\n return 1;\n case 'debug':\n return 0;\n default:\n 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 =\n opts.level !== undefined && opts.level !== ''\n ? state.console.filter((msg) => consolePriority(msg.type) >= consolePriority(opts.level ?? ''))\n : [...state.console];\n if (opts.clear === true) 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 === true) 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 === true) {\n state.requests = [];\n state.requestIds = new WeakMap();\n }\n return { requests };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\n\nexport async function pdfViaPlaywright(opts: { cdpUrl: string; targetId?: string }): 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 { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from '../connection.js';\nimport type { RequestResult, ResponseBodyResult } from '../types.js';\n\nfunction matchUrlPattern(pattern: string, url: string): boolean {\n if (!pattern || !url) return false;\n if (pattern === url) return true;\n if (pattern.includes('*')) {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n try {\n return new RegExp(`^${escaped}$`).test(url);\n } catch {\n return false;\n }\n }\n return url.includes(pattern);\n}\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 const pattern = opts.url.trim();\n if (!pattern) throw new Error('url is required');\n\n const response = await page.waitForResponse((resp) => matchUrlPattern(pattern, resp.url()), { timeout });\n let body = await response.text();\n let truncated = false;\n\n const maxChars =\n typeof opts.maxChars === 'number' && Number.isFinite(opts.maxChars)\n ? Math.max(1, Math.min(5_000_000, Math.floor(opts.maxChars)))\n : 200000;\n if (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\nexport async function waitForRequestViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n url: string;\n method?: string;\n timeoutMs?: number;\n maxChars?: number;\n}): Promise<RequestResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 30000, 120000);\n const pattern = opts.url.trim();\n if (!pattern) throw new Error('url is required');\n const upperMethod = opts.method !== undefined ? opts.method.toUpperCase() : undefined;\n\n const response = await page.waitForResponse(\n (resp) =>\n matchUrlPattern(pattern, resp.url()) && (upperMethod === undefined || resp.request().method() === upperMethod),\n { timeout },\n );\n\n const request = response.request();\n let responseBody: string | undefined;\n let truncated = false;\n\n try {\n responseBody = await response.text();\n const maxChars =\n typeof opts.maxChars === 'number' && Number.isFinite(opts.maxChars)\n ? Math.max(1, Math.min(5_000_000, Math.floor(opts.maxChars)))\n : 200000;\n if (responseBody.length > maxChars) {\n responseBody = responseBody.slice(0, maxChars);\n truncated = true;\n }\n } catch (err) {\n console.warn('[browserclaw] response body unavailable:', err instanceof Error ? err.message : String(err));\n }\n\n return {\n url: response.url(),\n method: request.method(),\n postData: request.postData() ?? undefined,\n status: response.status(),\n ok: response.ok(),\n responseBody,\n truncated,\n };\n}\n","import { getPageForTargetId, ensurePageState, restoreRoleRefsForTarget, refLocator } 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 !== undefined && opts.ref !== '') {\n if (opts.fullPage === true) 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 !== undefined && opts.element !== '') {\n if (opts.fullPage === true) 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<{\n buffer: Buffer;\n labels: { ref: string; index: number; box: { x: number; y: number; width: number; height: number } }[];\n skipped: string[];\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 maxLabels =\n typeof opts.maxLabels === 'number' && Number.isFinite(opts.maxLabels)\n ? Math.max(1, Math.floor(opts.maxLabels))\n : 150;\n const type = opts.type ?? 'png';\n const refs = opts.refs.slice(0, maxLabels);\n const skipped = opts.refs.slice(maxLabels);\n\n const viewport = await page.evaluate(() => ({\n width: window.innerWidth || 0,\n height: window.innerHeight || 0,\n }));\n\n const labels: { 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 skipped.push(ref);\n continue;\n }\n // Viewport clipping: skip elements entirely outside the visible area\n const x1 = box.x + box.width;\n const y1 = box.y + box.height;\n if (x1 < 0 || box.x > viewport.width || y1 < 0 || box.y > viewport.height) {\n skipped.push(ref);\n continue;\n }\n labels.push({ ref, index: i + 1, box });\n } catch {\n skipped.push(ref);\n }\n }\n\n try {\n if (labels.length > 0) {\n await page.evaluate(\n (labelData: { index: number; box: { x: number; y: number; width: number; height: number } }[]) => {\n document.querySelectorAll('[data-browserclaw-labels]').forEach((el) => {\n el.remove();\n });\n const container = document.createElement('div');\n container.setAttribute('data-browserclaw-labels', '1');\n container.style.cssText =\n 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647;';\n for (const { index, box } of labelData) {\n const border = document.createElement('div');\n border.style.cssText = `position:absolute;left:${String(box.x)}px;top:${String(box.y)}px;width:${String(box.width)}px;height:${String(box.height)}px;border:2px solid #FF4500;box-sizing:border-box;`;\n container.appendChild(border);\n const badge = document.createElement('div');\n badge.textContent = String(index);\n badge.style.cssText = `position:absolute;left:${String(box.x)}px;top:${String(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.documentElement.appendChild(container);\n },\n labels.map((l) => ({ index: l.index, box: l.box })),\n );\n }\n return {\n buffer: await page.screenshot({ type }),\n labels,\n skipped,\n };\n } finally {\n await page\n .evaluate(() => {\n document.querySelectorAll('[data-browserclaw-labels]').forEach((el) => {\n el.remove();\n });\n })\n .catch(() => {\n /* intentional no-op */\n });\n }\n}\n","import { dirname } from 'node:path';\n\nimport { getPageForTargetId, ensurePageState, ensureContextState } 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 type { RoleRefInfo, RoleRefs } from '../types.js';\n\nfunction parseStateFromSuffix(suffix: string): Pick<RoleRefInfo, 'disabled' | 'checked'> {\n const state: Pick<RoleRefInfo, 'disabled' | 'checked'> = {};\n if (/\\[disabled\\]/i.test(suffix)) state.disabled = true;\n if (/\\[checked\\s*=\\s*\"?mixed\"?\\]/i.test(suffix)) state.checked = 'mixed';\n else if (/\\[checked\\]/i.test(suffix)) state.checked = true;\n return state;\n}\n\nexport const INTERACTIVE_ROLES = new Set([\n 'button',\n 'link',\n 'textbox',\n 'checkbox',\n 'radio',\n 'combobox',\n 'listbox',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'option',\n 'searchbox',\n 'slider',\n 'spinbutton',\n 'switch',\n 'tab',\n 'treeitem',\n]);\n\nexport const CONTENT_ROLES = new Set([\n 'heading',\n 'cell',\n 'gridcell',\n 'columnheader',\n 'rowheader',\n 'listitem',\n 'article',\n 'region',\n 'main',\n 'navigation',\n]);\n\nexport const STRUCTURAL_ROLES = new Set([\n 'generic',\n 'group',\n 'ignored',\n 'list',\n 'table',\n 'row',\n 'rowgroup',\n 'grid',\n 'treegrid',\n 'menu',\n 'menubar',\n 'toolbar',\n 'tablist',\n 'tree',\n 'directory',\n 'document',\n 'application',\n 'presentation',\n 'none',\n]);\n\nfunction getIndentLevel(line: string): number {\n const match = /^(\\s*)/.exec(line);\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(line: string, options: SnapshotBuildOptions): ParsedSnapshotLine | null {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) {\n return null;\n }\n const match = /^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/.exec(line);\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=')) {\n result.push(line);\n continue;\n }\n if (line.includes(':') && !line.trimEnd().endsWith(':')) {\n result.push(line);\n continue;\n }\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=')) {\n hasRelevantChildren = true;\n break;\n }\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 = () => {\n counter++;\n return `e${String(counter)}`;\n };\n\n if (options.interactive === true) {\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 = /^(\\s*-\\s*)/.exec(line)?.[1] ?? '';\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n const state = parseStateFromSuffix(suffix);\n refs[ref] = { role, name, nth, ...state };\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== undefined && name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${String(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 = /^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/.exec(line);\n if (!match) {\n result.push(line);\n continue;\n }\n const [, prefix, roleRaw, name, suffix] = match;\n if (roleRaw.startsWith('/')) {\n result.push(line);\n continue;\n }\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 === true && isStructural && name === '') continue;\n if (!(isInteractive || (isContent && name !== ''))) {\n result.push(line);\n continue;\n }\n\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n const state = parseStateFromSuffix(suffix);\n refs[ref] = { role, name, nth, ...state };\n\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${String(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 === true ? 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 = aiSnapshot.split('\\n');\n const refs: RoleRefs = {};\n\n function parseAiSnapshotRef(suffix: string): string | null {\n const match = /\\[ref=(e\\d+)\\]/i.exec(suffix);\n return match ? match[1] : null;\n }\n\n if (options.interactive === true) {\n let interactiveMaxRef = 0;\n for (const line of lines) {\n const refMatch = /\\[ref=e(\\d+)\\]/.exec(line);\n if (refMatch) interactiveMaxRef = Math.max(interactiveMaxRef, Number.parseInt(refMatch[1], 10));\n }\n let interactiveCounter = interactiveMaxRef;\n const nextInteractiveRef = () => {\n interactiveCounter++;\n return `e${String(interactiveCounter)}`;\n };\n\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 const prefix = /^(\\s*-\\s*)/.exec(line)?.[1] ?? '';\n const state = parseStateFromSuffix(suffix);\n if (ref !== null) {\n refs[ref] = { role, ...(name !== undefined && name !== '' ? { name } : {}), ...state };\n out.push(`${prefix}${roleRaw}${name !== undefined && name !== '' ? ` \"${name}\"` : ''}${suffix}`);\n } else {\n const generatedRef = nextInteractiveRef();\n refs[generatedRef] = { role, ...(name !== undefined && name !== '' ? { name } : {}), ...state };\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== undefined && name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${generatedRef}]`;\n if (suffix.trim() !== '') enhanced += suffix;\n out.push(enhanced);\n }\n }\n return { snapshot: out.join('\\n') || '(no interactive elements)', refs };\n }\n\n let maxRef = 0;\n for (const line of lines) {\n const refMatch = /\\[ref=e(\\d+)\\]/.exec(line);\n if (refMatch) maxRef = Math.max(maxRef, Number.parseInt(refMatch[1], 10));\n }\n let generatedCounter = maxRef;\n const nextGeneratedRef = () => {\n generatedCounter++;\n return `e${String(generatedCounter)}`;\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 = /^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/.exec(line);\n if (!match) {\n out.push(line);\n continue;\n }\n const [, prefix, roleRaw, name, suffix] = match;\n if (roleRaw.startsWith('/')) {\n out.push(line);\n continue;\n }\n const role = roleRaw.toLowerCase();\n const isStructural = STRUCTURAL_ROLES.has(role);\n if (options.compact === true && isStructural && name === '') continue;\n const ref = parseAiSnapshotRef(suffix);\n const state = parseStateFromSuffix(suffix);\n if (ref !== null) {\n refs[ref] = { role, ...(name !== '' ? { name } : {}), ...state };\n out.push(line);\n } else if (INTERACTIVE_ROLES.has(role)) {\n const generatedRef = nextGeneratedRef();\n refs[generatedRef] = { role, ...(name !== '' ? { name } : {}), ...state };\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${generatedRef}]`;\n if (suffix.trim() !== '') enhanced += suffix;\n out.push(enhanced);\n } else {\n out.push(line);\n }\n }\n const tree = out.join('\\n') || '(empty)';\n return { snapshot: options.compact === true ? 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 type { SnapshotResult, SnapshotOptions } from '../types.js';\n\nimport { buildRoleSnapshotFromAiSnapshot, getRoleSnapshotStats } from './ref-map.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 =\n typeof maxChars === 'number' && Number.isFinite(maxChars) && maxChars > 0 ? Math.floor(maxChars) : undefined;\n\n let truncated = false;\n if (limit !== undefined && 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 truncated = true;\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 ...(truncated ? { truncated } : {}),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n storeRoleRefsForTarget,\n normalizeTimeoutMs,\n withPlaywrightPageCdpSession,\n} from '../connection.js';\nimport type { PageWithAI } from '../connection.js';\nimport type { SnapshotResult, AriaSnapshotResult, AriaNode } from '../types.js';\n\nimport { buildRoleSnapshotFromAriaSnapshot, buildRoleSnapshotFromAiSnapshot, getRoleSnapshotStats } from './ref-map.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 (\n (opts.selector !== undefined && opts.selector.trim() !== '') ||\n (opts.frameSelector !== undefined && opts.frameSelector.trim() !== '')\n ) {\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(ariaSnapshot, opts.options);\n\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n frameSelector: 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 res = await withPlaywrightPageCdpSession(page, async (session) => {\n await session.send('Accessibility.enable' as unknown as Parameters<typeof session.send>[0]).catch(() => {\n /* intentional no-op */\n });\n return (await session.send('Accessibility.getFullAXTree' as unknown as Parameters<typeof session.send>[0])) as {\n nodes?: CdpAXNode[];\n };\n });\n\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}\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 if (nodes.length === 0) return [];\n\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: { 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${String(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 type { BrowserContext } from 'playwright-core';\n\nimport { 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<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 === '') throw new Error('cookie name and value are required');\n const hasUrl = typeof cookie.url === 'string' && cookie.url.trim() !== '';\n const hasDomainPath =\n typeof cookie.domain === 'string' &&\n cookie.domain.trim() !== '' &&\n typeof cookie.path === 'string' &&\n 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: { cdpUrl: string; targetId?: string }): 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 !== undefined && 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 === null || 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 = 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: 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 type { BrowserContext, Page, Locator } from 'playwright-core';\n\nimport { batchViaPlaywright } from './actions/batch.js';\nimport type { BatchAction, BatchActionResult } from './actions/batch.js';\nimport { downloadViaPlaywright, waitForDownloadViaPlaywright } from './actions/download.js';\nimport {\n emulateMediaViaPlaywright,\n setDeviceViaPlaywright,\n setExtraHTTPHeadersViaPlaywright,\n setGeolocationViaPlaywright,\n setHttpCredentialsViaPlaywright,\n setLocaleViaPlaywright,\n setOfflineViaPlaywright,\n setTimezoneViaPlaywright,\n} from './actions/emulation.js';\nimport { evaluateViaPlaywright, evaluateInAllFramesViaPlaywright, type FrameEvalResult } from './actions/evaluate.js';\nimport {\n clickViaPlaywright,\n mouseClickViaPlaywright,\n pressAndHoldViaCdp,\n clickByTextViaPlaywright,\n clickByRoleViaPlaywright,\n hoverViaPlaywright,\n typeViaPlaywright,\n selectOptionViaPlaywright,\n dragViaPlaywright,\n fillFormViaPlaywright,\n scrollIntoViewViaPlaywright,\n highlightViaPlaywright,\n setInputFilesViaPlaywright,\n armDialogViaPlaywright,\n armFileUploadViaPlaywright,\n} from './actions/interaction.js';\nimport { pressKeyViaPlaywright } from './actions/keyboard.js';\nimport {\n navigateViaPlaywright,\n listPagesViaPlaywright,\n createPageViaPlaywright,\n closePageByTargetIdViaPlaywright,\n focusPageByTargetIdViaPlaywright,\n waitForTabViaPlaywright,\n resizeViewportViaPlaywright,\n clearRecordingContext,\n} from './actions/navigation.js';\nimport { waitForViaPlaywright } from './actions/wait.js';\nimport { detectChallengeViaPlaywright, waitForChallengeViaPlaywright } from './anti-bot.js';\nimport {\n getConsoleMessagesViaPlaywright,\n getPageErrorsViaPlaywright,\n getNetworkRequestsViaPlaywright,\n} from './capture/activity.js';\nimport { pdfViaPlaywright } from './capture/pdf.js';\nimport { responseBodyViaPlaywright, waitForRequestViaPlaywright } from './capture/response.js';\nimport { takeScreenshotViaPlaywright, screenshotWithLabelsViaPlaywright } from './capture/screenshot.js';\nimport { traceStartViaPlaywright, traceStopViaPlaywright } from './capture/trace.js';\nimport { launchChrome, stopChrome, isChromeReachable, discoverChromeCdpUrl } from './chrome-launcher.js';\nimport {\n connectBrowser,\n disconnectBrowser,\n getPageForTargetId,\n ensurePageState,\n pageTargetId,\n getAllPages,\n normalizeTimeoutMs,\n setDialogHandler,\n getRestoredPageForTarget,\n} from './connection.js';\nimport { snapshotAi } from './snapshot/ai-snapshot.js';\nimport { snapshotRole, snapshotAria } from './snapshot/aria-snapshot.js';\nimport {\n cookiesGetViaPlaywright,\n cookiesSetViaPlaywright,\n cookiesClearViaPlaywright,\n storageGetViaPlaywright,\n storageSetViaPlaywright,\n storageClearViaPlaywright,\n} from './storage/index.js';\nimport type {\n LaunchOptions,\n ConnectOptions,\n SnapshotResult,\n SnapshotOptions,\n AriaSnapshotResult,\n BrowserTab,\n FormField,\n ClickOptions,\n TypeOptions,\n WaitOptions,\n ScreenshotOptions,\n ConsoleMessage,\n PageError,\n NetworkRequest,\n CookieData,\n StorageKind,\n RunningChrome,\n SsrfPolicy,\n DownloadResult,\n DialogOptions,\n DialogHandler,\n RequestResult,\n ResponseBodyResult,\n TraceStartOptions,\n ColorScheme,\n GeolocationOptions,\n HttpCredentials,\n ChallengeInfo,\n ChallengeWaitResult,\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 (\n (opts?.selector !== undefined && opts.selector !== '') ||\n (opts?.frameSelector !== undefined && opts.frameSelector !== '')\n ) {\n throw new Error(\n 'selector and frameSelector are only supported in role mode. Use { mode: \"role\" } or omit these options.',\n );\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 force: opts?.force,\n });\n }\n\n /**\n * Click an element by CSS selector (no snapshot/ref needed).\n *\n * Finds and clicks atomically — no stale ref problem.\n *\n * @param selector - CSS selector (e.g. `'#submit-btn'`, `'.modal button'`)\n * @param opts - Click options (double-click, button, modifiers)\n *\n * @example\n * ```ts\n * await page.clickBySelector('#submit-btn');\n * await page.clickBySelector('.modal .close', { button: 'right' });\n * ```\n */\n async clickBySelector(selector: string, opts?: ClickOptions): Promise<void> {\n return clickViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n selector,\n doubleClick: opts?.doubleClick,\n button: opts?.button,\n modifiers: opts?.modifiers,\n delayMs: opts?.delayMs,\n timeoutMs: opts?.timeoutMs,\n force: opts?.force,\n });\n }\n\n /**\n * Click at specific page coordinates.\n *\n * Useful for canvas elements, custom widgets, or elements without ARIA roles.\n *\n * @param x - X coordinate in pixels\n * @param y - Y coordinate in pixels\n * @param opts - Click options (button, clickCount, delayMs)\n *\n * @example\n * ```ts\n * await page.mouseClick(100, 200);\n * await page.mouseClick(100, 200, { button: 'right' });\n * await page.mouseClick(100, 200, { clickCount: 2 }); // double-click\n * ```\n */\n async mouseClick(\n x: number,\n y: number,\n opts?: { button?: 'left' | 'right' | 'middle'; clickCount?: number; delayMs?: number },\n ): Promise<void> {\n return mouseClickViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n x,\n y,\n button: opts?.button,\n clickCount: opts?.clickCount,\n delayMs: opts?.delayMs,\n });\n }\n\n /**\n * Press and hold at page coordinates using raw CDP events.\n *\n * Bypasses Playwright's automation layer by dispatching CDP\n * `Input.dispatchMouseEvent` directly — useful for anti-bot challenges\n * that detect automated clicks.\n *\n * @param x - X coordinate in CSS pixels\n * @param y - Y coordinate in CSS pixels\n * @param opts - Options (delay: ms before press, holdMs: hold duration)\n *\n * @example\n * ```ts\n * await page.pressAndHold(400, 300, { delay: 150, holdMs: 5000 });\n * ```\n */\n async pressAndHold(x: number, y: number, opts?: { delay?: number; holdMs?: number }): Promise<void> {\n return pressAndHoldViaCdp({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n x,\n y,\n delay: opts?.delay,\n holdMs: opts?.holdMs,\n });\n }\n\n /**\n * Click an element by its visible text content (no snapshot/ref needed).\n *\n * Finds and clicks atomically — no stale ref problem.\n *\n * @param text - Text content to match\n * @param opts - Options (exact: require full match, button, modifiers)\n *\n * @example\n * ```ts\n * await page.clickByText('Submit');\n * await page.clickByText('Save Changes', { exact: true });\n * ```\n */\n async clickByText(\n text: string,\n opts?: {\n exact?: boolean;\n button?: 'left' | 'right' | 'middle';\n modifiers?: ('Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift')[];\n timeoutMs?: number;\n },\n ): Promise<void> {\n return clickByTextViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n text,\n exact: opts?.exact,\n button: opts?.button,\n modifiers: opts?.modifiers,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Click an element by its ARIA role and accessible name (no snapshot/ref needed).\n *\n * Finds and clicks atomically — no stale ref problem.\n *\n * @param role - ARIA role (e.g. `'button'`, `'link'`, `'menuitem'`)\n * @param name - Accessible name to match (optional)\n * @param opts - Click options\n *\n * @example\n * ```ts\n * await page.clickByRole('button', 'Save');\n * await page.clickByRole('link', 'Settings');\n * await page.clickByRole('menuitem', 'Delete');\n * ```\n */\n async clickByRole(\n role: string,\n name?: string,\n opts?: {\n index?: number;\n button?: 'left' | 'right' | 'middle';\n modifiers?: ('Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift')[];\n timeoutMs?: number;\n },\n ): Promise<void> {\n return clickByRoleViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n role,\n name,\n index: opts?.index,\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 * Register a persistent dialog handler for all dialogs (alert, confirm, prompt, beforeunload).\n *\n * Unlike `armDialog()` which handles a single expected dialog, `onDialog()` handles\n * every dialog that appears until cleared. This prevents unexpected dialogs from\n * blocking the page.\n *\n * The handler receives a `DialogEvent` with `accept()` and `dismiss()` methods.\n * If the handler throws or doesn't call either, the dialog is auto-dismissed.\n *\n * Pass `undefined` or `null` to clear the handler and restore default auto-dismiss.\n *\n * Note: `armDialog()` takes priority — if a one-shot handler is armed, it handles\n * the next dialog instead of the persistent handler.\n *\n * @param handler - Callback for dialog events, or `undefined`/`null` to clear\n *\n * @example\n * ```ts\n * // Accept all confirm dialogs, dismiss everything else\n * page.onDialog((event) => {\n * if (event.type === 'confirm') event.accept();\n * else event.dismiss();\n * });\n *\n * // Log and auto-accept all dialogs\n * page.onDialog(async (event) => {\n * console.log(`Dialog: ${event.type} — ${event.message}`);\n * await event.accept();\n * });\n *\n * // Clear the handler (restore default auto-dismiss)\n * page.onDialog(undefined);\n * ```\n */\n async onDialog(handler: DialogHandler | undefined | null): Promise<void> {\n return setDialogHandler({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n handler: handler ?? undefined,\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 /**\n * Execute multiple browser actions in sequence.\n *\n * @param actions - Array of actions to execute\n * @param opts - Options (stopOnError: stop on first failure, default true)\n * @returns Array of per-action results\n */\n async batch(\n actions: BatchAction[],\n opts?: { stopOnError?: boolean; evaluateEnabled?: boolean },\n ): Promise<{ results: BatchActionResult[] }> {\n return batchViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n actions,\n stopOnError: opts?.stopOnError,\n evaluateEnabled: opts?.evaluateEnabled,\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(\n refs: string[],\n opts?: { maxLabels?: number; type?: 'png' | 'jpeg' },\n ): Promise<{\n buffer: Buffer;\n labels: { 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 * Wait for a network request matching a URL pattern and return request + response details.\n *\n * Unlike `networkRequests()` which only captures metadata, this method captures\n * the full request body (POST data) and response body.\n *\n * @param url - URL string or pattern to match (supports `*` wildcards and substring matching)\n * @param opts - Options (method filter, timeoutMs, maxChars for response body)\n * @returns Request method, postData, response status, and response body\n *\n * @example\n * ```ts\n * const reqPromise = page.waitForRequest('/api/submit', { method: 'POST' });\n * await page.click('e5'); // submit a form\n * const req = await reqPromise;\n * console.log(req.postData); // form body\n * console.log(req.status, req.responseBody); // response\n * ```\n */\n async waitForRequest(\n url: string,\n opts?: { method?: string; timeoutMs?: number; maxChars?: number },\n ): Promise<RequestResult> {\n return waitForRequestViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n url,\n method: opts?.method,\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<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,\n targetId: this.targetId,\n kind,\n 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,\n targetId: this.targetId,\n kind,\n key,\n 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,\n targetId: this.targetId,\n 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(\n ref: string,\n path: string,\n opts?: { timeoutMs?: number; allowedOutputRoots?: string[] },\n ): 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?: {\n path?: string;\n timeoutMs?: number;\n allowedOutputRoots?: string[];\n }): 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 // ── Anti-Bot ──────────────────────────────────────────────────\n\n /**\n * Detect whether the page is showing an anti-bot challenge\n * (Cloudflare, hCaptcha, reCAPTCHA, access-denied, rate-limit, etc.).\n *\n * Returns `null` if no challenge is detected.\n *\n * @example\n * ```ts\n * const challenge = await page.detectChallenge();\n * if (challenge) {\n * console.log(challenge.kind); // 'cloudflare-js'\n * console.log(challenge.message); // 'Cloudflare JS challenge'\n * }\n * ```\n */\n async detectChallenge(): Promise<ChallengeInfo | null> {\n return detectChallengeViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n }\n\n /**\n * Wait for an anti-bot challenge to resolve on its own.\n *\n * Cloudflare JS challenges typically auto-resolve in ~5 seconds.\n * CAPTCHA challenges will only resolve if solved in a visible browser window.\n *\n * @param opts.timeoutMs - Maximum wait time (default: `15000`)\n * @param opts.pollMs - Poll interval (default: `500`)\n * @returns Whether the challenge resolved, and the remaining challenge info if not\n *\n * @example\n * ```ts\n * await page.goto('https://example.com');\n * const challenge = await page.detectChallenge();\n * if (challenge?.kind === 'cloudflare-js') {\n * const { resolved } = await page.waitForChallenge({ timeoutMs: 20000 });\n * if (!resolved) throw new Error('Challenge did not resolve');\n * }\n * ```\n */\n async waitForChallenge(opts?: { timeoutMs?: number; pollMs?: number }): Promise<ChallengeWaitResult> {\n return waitForChallengeViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n timeoutMs: opts?.timeoutMs,\n pollMs: opts?.pollMs,\n });\n }\n\n // ── Playwright Escape Hatches ─────────────────────────────────\n\n /**\n * Get the underlying Playwright `Page` object for this tab.\n *\n * Use this when browserclaw's API doesn't cover your use case and you need\n * direct access to Playwright's full API (custom locator strategies,\n * frame manipulation, request interception, etc.).\n *\n * **Warning:** Modifications made via the raw Playwright page may conflict\n * with browserclaw's internal state (e.g. ref tracking). Use with care.\n *\n * @returns The Playwright `Page` instance\n *\n * @example\n * ```ts\n * const pwPage = await page.playwrightPage();\n *\n * // Use Playwright's full API directly\n * await pwPage.locator('.my-component').waitFor({ state: 'visible' });\n * await pwPage.route('**\\/api/**', route => route.fulfill({ body: '{}' }));\n *\n * // Access frames\n * const frame = pwPage.frameLocator('#my-iframe');\n * ```\n */\n async playwrightPage(): Promise<Page> {\n return getRestoredPageForTarget({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n }\n\n /**\n * Create a Playwright `Locator` for a CSS selector on this page.\n *\n * Convenience method that returns a Playwright locator without needing\n * to first obtain the Page object. Useful for one-off Playwright operations.\n *\n * @param selector - CSS selector or Playwright selector string\n * @returns A Playwright `Locator` instance\n *\n * @example\n * ```ts\n * const loc = await page.locator('.modal-dialog button.confirm');\n * await loc.waitFor({ state: 'visible' });\n * await loc.click();\n *\n * // Use Playwright selectors\n * const input = await page.locator('input[name=\"email\"]');\n * await input.fill('test@example.com');\n * ```\n */\n async locator(selector: string): Promise<Locator> {\n const pwPage = await getRestoredPageForTarget({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return pwPage.locator(selector);\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({ url: 'https://example.com' });\n * const page = await browser.currentPage();\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 readonly recordVideo: { dir: string; size?: { width: number; height: number } } | undefined;\n private chrome: RunningChrome | null;\n\n private constructor(\n cdpUrl: string,\n chrome: RunningChrome | null,\n ssrfPolicy?: SsrfPolicy,\n recordVideo?: { dir: string; size?: { width: number; height: number } },\n ) {\n this.cdpUrl = cdpUrl;\n this.chrome = chrome;\n this.ssrfPolicy = ssrfPolicy;\n this.recordVideo = recordVideo;\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 * // Launch and navigate to a URL\n * const browser = await BrowserClaw.launch({ url: 'https://example.com' });\n *\n * // Headless mode\n * const browser = await BrowserClaw.launch({ url: 'https://example.com', headless: true });\n *\n * // Specific browser\n * const browser = await BrowserClaw.launch({\n * url: 'https://example.com',\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:${String(chrome.cdpPort)}`;\n /* eslint-disable @typescript-eslint/no-deprecated -- backward-compat bridge for allowInternal */\n const ssrfPolicy =\n opts.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\n const browser = new BrowserClaw(cdpUrl, chrome, ssrfPolicy, opts.recordVideo);\n if (opts.url !== undefined && opts.url !== '') {\n const page = await browser.currentPage();\n await page.goto(opts.url);\n }\n return browser;\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 let resolvedUrl = cdpUrl;\n if (resolvedUrl === undefined || resolvedUrl === '') {\n const discovered = await discoverChromeCdpUrl();\n if (discovered === null) {\n throw new Error(\n 'No Chrome instance found on common CDP ports (9222-9226, 9229). Start Chrome with --remote-debugging-port=9222, or pass a CDP URL.',\n );\n }\n resolvedUrl = discovered;\n }\n if (!(await isChromeReachable(resolvedUrl, 3000, opts?.authToken))) {\n throw new Error(`Cannot connect to Chrome at ${resolvedUrl}. Is Chrome running with --remote-debugging-port?`);\n }\n await connectBrowser(resolvedUrl, opts?.authToken);\n /* eslint-disable @typescript-eslint/no-deprecated -- backward-compat bridge for allowInternal */\n const ssrfPolicy =\n opts?.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts?.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\n return new BrowserClaw(resolvedUrl, null, ssrfPolicy, opts?.recordVideo);\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({\n cdpUrl: this.cdpUrl,\n url,\n ssrfPolicy: this.ssrfPolicy,\n recordVideo: this.recordVideo,\n });\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 = 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 === null || 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 * Wait for a tab matching the given criteria and return a page handle.\n *\n * Polls open tabs until one matches, then focuses it and returns a CrawlPage.\n *\n * @param opts - Match criteria (urlContains, titleContains) and timeout\n * @returns A CrawlPage for the matched tab\n *\n * @example\n * ```ts\n * await page.click('e5'); // opens a new tab\n * const appPage = await browser.waitForTab({ urlContains: 'app-web' });\n * const { snapshot } = await appPage.snapshot();\n * ```\n */\n async waitForTab(opts: { urlContains?: string; titleContains?: string; timeoutMs?: number }): Promise<CrawlPage> {\n const tab = await waitForTabViaPlaywright({\n cdpUrl: this.cdpUrl,\n urlContains: opts.urlContains,\n titleContains: opts.titleContains,\n timeoutMs: opts.timeoutMs,\n });\n await focusPageByTargetIdViaPlaywright({ cdpUrl: this.cdpUrl, targetId: tab.targetId });\n return new CrawlPage(this.cdpUrl, tab.targetId, this.ssrfPolicy);\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 clearRecordingContext(this.cdpUrl);\n await disconnectBrowser();\n if (this.chrome) {\n await stopChrome(this.chrome);\n this.chrome = null;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../node_modules/ipaddr.js/lib/ipaddr.js","../src/chrome-launcher.ts","../src/stealth.ts","../src/page-utils.ts","../src/ref-resolver.ts","../src/connection.ts","../src/actions/evaluate.ts","../src/security.ts","../src/actions/interaction.ts","../src/actions/keyboard.ts","../src/actions/navigation.ts","../src/actions/wait.ts","../src/actions/batch.ts","../src/actions/download.ts","../src/actions/emulation.ts","../src/anti-bot.ts","../src/capture/activity.ts","../src/capture/pdf.ts","../src/capture/response.ts","../src/capture/screenshot.ts","../src/capture/trace.ts","../src/snapshot/ref-map.ts","../src/snapshot/ai-snapshot.ts","../src/snapshot/aria-snapshot.ts","../src/storage/index.ts","../src/browser.ts"],"names":["exports","ipaddr","IPv4","IPv6","fs","execFileSync","path","os","resolve","net","spawn","appendCdpPath","http","https","chromium","join","tmpdir","dnsLookupCb","dnsLookup","normalize","realpath","dirname","lstat","sep","relative","pathIsAbsolute","posix","win32","randomUUID","basename","rename","rm","devices","result","out","built"],"mappings":"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","file":"index.cjs","sourcesContent":["(function (root) {\n 'use strict';\n // A list of regular expressions that match arbitrary IPv4 addresses,\n // for which a number of weird notations exist.\n // Note that an address like 0010.0xa5.1.1 is considered legal.\n const ipv4Part = '(0?\\\\d+|0x[a-f0-9]+)';\n const ipv4Regexes = {\n fourOctet: new RegExp(`^${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}$`, 'i'),\n threeOctet: new RegExp(`^${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}$`, 'i'),\n twoOctet: new RegExp(`^${ipv4Part}\\\\.${ipv4Part}$`, 'i'),\n longValue: new RegExp(`^${ipv4Part}$`, 'i')\n };\n\n // Regular Expression for checking Octal numbers\n const octalRegex = new RegExp(`^0[0-7]+$`, 'i');\n const hexRegex = new RegExp(`^0x[a-f0-9]+$`, 'i');\n\n const zoneIndex = '%[0-9a-z]{1,}';\n\n // IPv6-matching regular expressions.\n // For IPv6, the task is simpler: it is enough to match the colon-delimited\n // hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at\n // the end.\n const ipv6Part = '(?:[0-9a-f]+::?)+';\n const ipv6Regexes = {\n zoneIndex: new RegExp(zoneIndex, 'i'),\n 'native': new RegExp(`^(::)?(${ipv6Part})?([0-9a-f]+)?(::)?(${zoneIndex})?$`, 'i'),\n deprecatedTransitional: new RegExp(`^(?:::)(${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}(${zoneIndex})?)$`, 'i'),\n transitional: new RegExp(`^((?:${ipv6Part})|(?:::)(?:${ipv6Part})?)${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}\\\\.${ipv4Part}(${zoneIndex})?$`, 'i')\n };\n\n // Expand :: in an IPv6 address or address part consisting of `parts` groups.\n function expandIPv6 (string, parts) {\n // More than one '::' means invalid adddress\n if (string.indexOf('::') !== string.lastIndexOf('::')) {\n return null;\n }\n\n let colonCount = 0;\n let lastColon = -1;\n let zoneId = (string.match(ipv6Regexes.zoneIndex) || [])[0];\n let replacement, replacementCount;\n\n // Remove zone index and save it for later\n if (zoneId) {\n zoneId = zoneId.substring(1);\n string = string.replace(/%.+$/, '');\n }\n\n // How many parts do we already have?\n while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n colonCount++;\n }\n\n // 0::0 is two parts more than ::\n if (string.substr(0, 2) === '::') {\n colonCount--;\n }\n\n if (string.substr(-2, 2) === '::') {\n colonCount--;\n }\n\n // The following loop would hang if colonCount > parts\n if (colonCount > parts) {\n return null;\n }\n\n // replacement = ':' + '0:' * (parts - colonCount)\n replacementCount = parts - colonCount;\n replacement = ':';\n while (replacementCount--) {\n replacement += '0:';\n }\n\n // Insert the missing zeroes\n string = string.replace('::', replacement);\n\n // Trim any garbage which may be hanging around if :: was at the edge in\n // the source strin\n if (string[0] === ':') {\n string = string.slice(1);\n }\n\n if (string[string.length - 1] === ':') {\n string = string.slice(0, -1);\n }\n\n parts = (function () {\n const ref = string.split(':');\n const results = [];\n\n for (let i = 0; i < ref.length; i++) {\n results.push(parseInt(ref[i], 16));\n }\n\n return results;\n })();\n\n return {\n parts: parts,\n zoneId: zoneId\n };\n }\n\n // A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher.\n function matchCIDR (first, second, partSize, cidrBits) {\n if (first.length !== second.length) {\n throw new Error('ipaddr: cannot match CIDR for objects with different lengths');\n }\n\n let part = 0;\n let shift;\n\n while (cidrBits > 0) {\n shift = partSize - cidrBits;\n if (shift < 0) {\n shift = 0;\n }\n\n if (first[part] >> shift !== second[part] >> shift) {\n return false;\n }\n\n cidrBits -= partSize;\n part += 1;\n }\n\n return true;\n }\n\n function parseIntAuto (string) {\n // Hexadedimal base 16 (0x#)\n if (hexRegex.test(string)) {\n return parseInt(string, 16);\n }\n // While octal representation is discouraged by ECMAScript 3\n // and forbidden by ECMAScript 5, we silently allow it to\n // work only if the rest of the string has numbers less than 8.\n if (string[0] === '0' && !isNaN(parseInt(string[1], 10))) {\n if (octalRegex.test(string)) {\n return parseInt(string, 8);\n }\n throw new Error(`ipaddr: cannot parse ${string} as octal`);\n }\n // Always include the base 10 radix!\n return parseInt(string, 10);\n }\n\n function padPart (part, length) {\n while (part.length < length) {\n part = `0${part}`;\n }\n\n return part;\n }\n\n const ipaddr = {};\n\n // An IPv4 address (RFC791).\n ipaddr.IPv4 = (function () {\n // Constructs a new IPv4 address from an array of four octets\n // in network order (MSB first)\n // Verifies the input.\n function IPv4 (octets) {\n if (octets.length !== 4) {\n throw new Error('ipaddr: ipv4 octet count should be 4');\n }\n\n let i, octet;\n\n for (i = 0; i < octets.length; i++) {\n octet = octets[i];\n if (!((0 <= octet && octet <= 255))) {\n throw new Error('ipaddr: ipv4 octet should fit in 8 bits');\n }\n }\n\n this.octets = octets;\n }\n\n // Special IPv4 address ranges.\n // See also https://en.wikipedia.org/wiki/Reserved_IP_addresses\n IPv4.prototype.SpecialRanges = {\n unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n // RFC3171\n multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n // RFC3927\n linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n // RFC5735\n loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n // RFC6598\n carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n // RFC1918\n 'private': [\n [new IPv4([10, 0, 0, 0]), 8],\n [new IPv4([172, 16, 0, 0]), 12],\n [new IPv4([192, 168, 0, 0]), 16]\n ],\n // Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700\n reserved: [\n [new IPv4([192, 0, 0, 0]), 24],\n [new IPv4([192, 0, 2, 0]), 24],\n [new IPv4([192, 88, 99, 0]), 24],\n [new IPv4([198, 18, 0, 0]), 15],\n [new IPv4([198, 51, 100, 0]), 24],\n [new IPv4([203, 0, 113, 0]), 24],\n [new IPv4([240, 0, 0, 0]), 4]\n ],\n // RFC7534, RFC7535\n as112: [\n [new IPv4([192, 175, 48, 0]), 24],\n [new IPv4([192, 31, 196, 0]), 24],\n ],\n // RFC7450\n amt: [\n [new IPv4([192, 52, 193, 0]), 24],\n ],\n };\n\n // The 'kind' method exists on both IPv4 and IPv6 classes.\n IPv4.prototype.kind = function () {\n return 'ipv4';\n };\n\n // Checks if this address matches other one within given CIDR range.\n IPv4.prototype.match = function (other, cidrRange) {\n let ref;\n if (cidrRange === undefined) {\n ref = other;\n other = ref[0];\n cidrRange = ref[1];\n }\n\n if (other.kind() !== 'ipv4') {\n throw new Error('ipaddr: cannot match ipv4 address with non-ipv4 one');\n }\n\n return matchCIDR(this.octets, other.octets, 8, cidrRange);\n };\n\n // returns a number of leading ones in IPv4 address, making sure that\n // the rest is a solid sequence of 0's (valid netmask)\n // returns either the CIDR length or null if mask is not valid\n IPv4.prototype.prefixLengthFromSubnetMask = function () {\n let cidr = 0;\n // non-zero encountered stop scanning for zeroes\n let stop = false;\n // number of zeroes in octet\n const zerotable = {\n 0: 8,\n 128: 7,\n 192: 6,\n 224: 5,\n 240: 4,\n 248: 3,\n 252: 2,\n 254: 1,\n 255: 0\n };\n let i, octet, zeros;\n\n for (i = 3; i >= 0; i -= 1) {\n octet = this.octets[i];\n if (octet in zerotable) {\n zeros = zerotable[octet];\n if (stop && zeros !== 0) {\n return null;\n }\n\n if (zeros !== 8) {\n stop = true;\n }\n\n cidr += zeros;\n } else {\n return null;\n }\n }\n\n return 32 - cidr;\n };\n\n // Checks if the address corresponds to one of the special ranges.\n IPv4.prototype.range = function () {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n // Returns an array of byte-sized values in network order (MSB first)\n IPv4.prototype.toByteArray = function () {\n return this.octets.slice(0);\n };\n\n // Converts this IPv4 address to an IPv4-mapped IPv6 address.\n IPv4.prototype.toIPv4MappedAddress = function () {\n return ipaddr.IPv6.parse(`::ffff:${this.toString()}`);\n };\n\n // Symmetrical method strictly for aligning with the IPv6 methods.\n IPv4.prototype.toNormalizedString = function () {\n return this.toString();\n };\n\n // Returns the address in convenient, decimal-dotted format.\n IPv4.prototype.toString = function () {\n return this.octets.join('.');\n };\n\n return IPv4;\n })();\n\n // A utility function to return broadcast address given the IPv4 interface and prefix length in CIDR notation\n ipaddr.IPv4.broadcastAddressFromCIDR = function (string) {\n\n try {\n const cidr = this.parseCIDR(string);\n const ipInterfaceOctets = cidr[0].toByteArray();\n const subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n const octets = [];\n let i = 0;\n while (i < 4) {\n // Broadcast address is bitwise OR between ip interface and inverted mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n // Checks if a given string is formatted like IPv4 address.\n ipaddr.IPv4.isIPv4 = function (string) {\n return this.parser(string) !== null;\n };\n\n // Checks if a given string is a valid IPv4 address.\n ipaddr.IPv4.isValid = function (string) {\n try {\n new this(this.parser(string));\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // Checks if a given string is a valid IPv4 address in CIDR notation.\n ipaddr.IPv4.isValidCIDR = function (string) {\n try {\n this.parseCIDR(string);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // Checks if a given string is a full four-part IPv4 Address.\n ipaddr.IPv4.isValidFourPartDecimal = function (string) {\n if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n return true;\n } else {\n return false;\n }\n };\n\n // Checks if a given string is a full four-part IPv4 Address with CIDR prefix.\n ipaddr.IPv4.isValidCIDRFourPartDecimal = function (string) {\n const match = string.match(/^(.+)\\/(\\d+)$/);\n\n if (!ipaddr.IPv4.isValidCIDR(string) || !match) {\n return false;\n }\n\n return ipaddr.IPv4.isValidFourPartDecimal(match[1]);\n };\n\n // A utility function to return network address given the IPv4 interface and prefix length in CIDR notation\n ipaddr.IPv4.networkAddressFromCIDR = function (string) {\n let cidr, i, ipInterfaceOctets, octets, subnetMaskOctets;\n\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 4) {\n // Network address is bitwise AND between ip interface and mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n // Tries to parse and validate a string with IPv4 address.\n // Throws an error if it fails.\n ipaddr.IPv4.parse = function (string) {\n const parts = this.parser(string);\n\n if (parts === null) {\n throw new Error('ipaddr: string is not formatted like an IPv4 Address');\n }\n\n return new this(parts);\n };\n\n // Parses the string as an IPv4 Address with CIDR Notation.\n ipaddr.IPv4.parseCIDR = function (string) {\n let match;\n\n if ((match = string.match(/^(.+)\\/(\\d+)$/))) {\n const maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 32) {\n const parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function () {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n\n throw new Error('ipaddr: string is not formatted like an IPv4 CIDR range');\n };\n\n // Classful variants (like a.b, where a is an octet, and b is a 24-bit\n // value representing last three octets; this corresponds to a class C\n // address) are omitted due to classless nature of modern Internet.\n ipaddr.IPv4.parser = function (string) {\n let match, part, value;\n\n // parseInt recognizes all that octal & hexadecimal weirdness for us\n if ((match = string.match(ipv4Regexes.fourOctet))) {\n return (function () {\n const ref = match.slice(1, 6);\n const results = [];\n\n for (let i = 0; i < ref.length; i++) {\n part = ref[i];\n results.push(parseIntAuto(part));\n }\n\n return results;\n })();\n } else if ((match = string.match(ipv4Regexes.longValue))) {\n value = parseIntAuto(match[1]);\n if (value > 0xffffffff || value < 0) {\n throw new Error('ipaddr: address outside defined range');\n }\n\n return ((function () {\n const results = [];\n let shift;\n\n for (shift = 0; shift <= 24; shift += 8) {\n results.push((value >> shift) & 0xff);\n }\n\n return results;\n })()).reverse();\n } else if ((match = string.match(ipv4Regexes.twoOctet))) {\n return (function () {\n const ref = match.slice(1, 4);\n const results = [];\n\n value = parseIntAuto(ref[1]);\n if (value > 0xffffff || value < 0) {\n throw new Error('ipaddr: address outside defined range');\n }\n\n results.push(parseIntAuto(ref[0]));\n results.push((value >> 16) & 0xff);\n results.push((value >> 8) & 0xff);\n results.push( value & 0xff);\n\n return results;\n })();\n } else if ((match = string.match(ipv4Regexes.threeOctet))) {\n return (function () {\n const ref = match.slice(1, 5);\n const results = [];\n\n value = parseIntAuto(ref[2]);\n if (value > 0xffff || value < 0) {\n throw new Error('ipaddr: address outside defined range');\n }\n\n results.push(parseIntAuto(ref[0]));\n results.push(parseIntAuto(ref[1]));\n results.push((value >> 8) & 0xff);\n results.push( value & 0xff);\n\n return results;\n })();\n } else {\n return null;\n }\n };\n\n // A utility function to return subnet mask in IPv4 format given the prefix length\n ipaddr.IPv4.subnetMaskFromPrefixLength = function (prefix) {\n prefix = parseInt(prefix);\n if (prefix < 0 || prefix > 32) {\n throw new Error('ipaddr: invalid IPv4 prefix length');\n }\n\n const octets = [0, 0, 0, 0];\n let j = 0;\n const filledOctetCount = Math.floor(prefix / 8);\n\n while (j < filledOctetCount) {\n octets[j] = 255;\n j++;\n }\n\n if (filledOctetCount < 4) {\n octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n }\n\n return new this(octets);\n };\n\n // An IPv6 address (RFC2460)\n ipaddr.IPv6 = (function () {\n // Constructs an IPv6 address from an array of eight 16 - bit parts\n // or sixteen 8 - bit parts in network order(MSB first).\n // Throws an error if the input is invalid.\n function IPv6 (parts, zoneId) {\n let i, part;\n\n if (parts.length === 16) {\n this.parts = [];\n for (i = 0; i <= 14; i += 2) {\n this.parts.push((parts[i] << 8) | parts[i + 1]);\n }\n } else if (parts.length === 8) {\n this.parts = parts;\n } else {\n throw new Error('ipaddr: ipv6 part count should be 8 or 16');\n }\n\n for (i = 0; i < this.parts.length; i++) {\n part = this.parts[i];\n if (!((0 <= part && part <= 0xffff))) {\n throw new Error('ipaddr: ipv6 part should fit in 16 bits');\n }\n }\n\n if (zoneId) {\n this.zoneId = zoneId;\n }\n }\n\n // Special IPv6 ranges\n IPv6.prototype.SpecialRanges = {\n // RFC4291, here and after\n unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n // RFC6666\n discard: [new IPv6([0x100, 0, 0, 0, 0, 0, 0, 0]), 64],\n // RFC6145\n rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n // RFC6052\n rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n // RFC3056\n '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n // RFC6052, RFC6146\n teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n // RFC5180\n benchmarking: [new IPv6([0x2001, 0x2, 0, 0, 0, 0, 0, 0]), 48],\n // RFC7450\n amt: [new IPv6([0x2001, 0x3, 0, 0, 0, 0, 0, 0]), 32],\n as112v6: [\n [new IPv6([0x2001, 0x4, 0x112, 0, 0, 0, 0, 0]), 48],\n [new IPv6([0x2620, 0x4f, 0x8000, 0, 0, 0, 0, 0]), 48],\n ],\n deprecated: [new IPv6([0x2001, 0x10, 0, 0, 0, 0, 0, 0]), 28],\n orchid2: [new IPv6([0x2001, 0x20, 0, 0, 0, 0, 0, 0]), 28],\n droneRemoteIdProtocolEntityTags: [new IPv6([0x2001, 0x30, 0, 0, 0, 0, 0, 0]), 28],\n reserved: [\n // RFC3849\n [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 23],\n // RFC2928\n [new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32],\n ],\n };\n\n // Checks if this address is an IPv4-mapped IPv6 address.\n IPv6.prototype.isIPv4MappedAddress = function () {\n return this.range() === 'ipv4Mapped';\n };\n\n // The 'kind' method exists on both IPv4 and IPv6 classes.\n IPv6.prototype.kind = function () {\n return 'ipv6';\n };\n\n // Checks if this address matches other one within given CIDR range.\n IPv6.prototype.match = function (other, cidrRange) {\n let ref;\n\n if (cidrRange === undefined) {\n ref = other;\n other = ref[0];\n cidrRange = ref[1];\n }\n\n if (other.kind() !== 'ipv6') {\n throw new Error('ipaddr: cannot match ipv6 address with non-ipv6 one');\n }\n\n return matchCIDR(this.parts, other.parts, 16, cidrRange);\n };\n\n // returns a number of leading ones in IPv6 address, making sure that\n // the rest is a solid sequence of 0's (valid netmask)\n // returns either the CIDR length or null if mask is not valid\n IPv6.prototype.prefixLengthFromSubnetMask = function () {\n let cidr = 0;\n // non-zero encountered stop scanning for zeroes\n let stop = false;\n // number of zeroes in octet\n const zerotable = {\n 0: 16,\n 32768: 15,\n 49152: 14,\n 57344: 13,\n 61440: 12,\n 63488: 11,\n 64512: 10,\n 65024: 9,\n 65280: 8,\n 65408: 7,\n 65472: 6,\n 65504: 5,\n 65520: 4,\n 65528: 3,\n 65532: 2,\n 65534: 1,\n 65535: 0\n };\n let part, zeros;\n\n for (let i = 7; i >= 0; i -= 1) {\n part = this.parts[i];\n if (part in zerotable) {\n zeros = zerotable[part];\n if (stop && zeros !== 0) {\n return null;\n }\n\n if (zeros !== 16) {\n stop = true;\n }\n\n cidr += zeros;\n } else {\n return null;\n }\n }\n\n return 128 - cidr;\n };\n\n\n // Checks if the address corresponds to one of the special ranges.\n IPv6.prototype.range = function () {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n // Returns an array of byte-sized values in network order (MSB first)\n IPv6.prototype.toByteArray = function () {\n let part;\n const bytes = [];\n const ref = this.parts;\n for (let i = 0; i < ref.length; i++) {\n part = ref[i];\n bytes.push(part >> 8);\n bytes.push(part & 0xff);\n }\n\n return bytes;\n };\n\n // Returns the address in expanded format with all zeroes included, like\n // 2001:0db8:0008:0066:0000:0000:0000:0001\n IPv6.prototype.toFixedLengthString = function () {\n const addr = ((function () {\n const results = [];\n for (let i = 0; i < this.parts.length; i++) {\n results.push(padPart(this.parts[i].toString(16), 4));\n }\n\n return results;\n }).call(this)).join(':');\n\n let suffix = '';\n\n if (this.zoneId) {\n suffix = `%${this.zoneId}`;\n }\n\n return addr + suffix;\n };\n\n // Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address.\n // Throws an error otherwise.\n IPv6.prototype.toIPv4Address = function () {\n if (!this.isIPv4MappedAddress()) {\n throw new Error('ipaddr: trying to convert a generic ipv6 address to ipv4');\n }\n\n const ref = this.parts.slice(-2);\n const high = ref[0];\n const low = ref[1];\n\n return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n };\n\n // Returns the address in expanded format with all zeroes included, like\n // 2001:db8:8:66:0:0:0:1\n //\n // Deprecated: use toFixedLengthString() instead.\n IPv6.prototype.toNormalizedString = function () {\n const addr = ((function () {\n const results = [];\n\n for (let i = 0; i < this.parts.length; i++) {\n results.push(this.parts[i].toString(16));\n }\n\n return results;\n }).call(this)).join(':');\n\n let suffix = '';\n\n if (this.zoneId) {\n suffix = `%${this.zoneId}`;\n }\n\n return addr + suffix;\n };\n\n // Returns the address in compact, human-readable format like\n // 2001:db8:8:66::1\n // in line with RFC 5952 (see https://tools.ietf.org/html/rfc5952#section-4)\n IPv6.prototype.toRFC5952String = function () {\n const regex = /((^|:)(0(:|$)){2,})/g;\n const string = this.toNormalizedString();\n let bestMatchIndex = 0;\n let bestMatchLength = -1;\n let match;\n\n while ((match = regex.exec(string))) {\n if (match[0].length > bestMatchLength) {\n bestMatchIndex = match.index;\n bestMatchLength = match[0].length;\n }\n }\n\n if (bestMatchLength < 0) {\n return string;\n }\n\n return `${string.substring(0, bestMatchIndex)}::${string.substring(bestMatchIndex + bestMatchLength)}`;\n };\n\n // Returns the address in compact, human-readable format like\n // 2001:db8:8:66::1\n // Calls toRFC5952String under the hood.\n IPv6.prototype.toString = function () {\n return this.toRFC5952String();\n };\n\n return IPv6;\n\n })();\n\n // A utility function to return broadcast address given the IPv6 interface and prefix length in CIDR notation\n ipaddr.IPv6.broadcastAddressFromCIDR = function (string) {\n try {\n const cidr = this.parseCIDR(string);\n const ipInterfaceOctets = cidr[0].toByteArray();\n const subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n const octets = [];\n let i = 0;\n while (i < 16) {\n // Broadcast address is bitwise OR between ip interface and inverted mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${e})`);\n }\n };\n\n // Checks if a given string is formatted like IPv6 address.\n ipaddr.IPv6.isIPv6 = function (string) {\n return this.parser(string) !== null;\n };\n\n // Checks to see if string is a valid IPv6 Address\n ipaddr.IPv6.isValid = function (string) {\n\n // Since IPv6.isValid is always called first, this shortcut\n // provides a substantial performance gain.\n if (typeof string === 'string' && string.indexOf(':') === -1) {\n return false;\n }\n\n try {\n const addr = this.parser(string);\n new this(addr.parts, addr.zoneId);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // Checks if a given string is a valid IPv6 address in CIDR notation.\n ipaddr.IPv6.isValidCIDR = function (string) {\n\n // See note in IPv6.isValid\n if (typeof string === 'string' && string.indexOf(':') === -1) {\n return false;\n }\n\n try {\n this.parseCIDR(string);\n return true;\n } catch (e) {\n return false;\n }\n };\n\n // A utility function to return network address given the IPv6 interface and prefix length in CIDR notation\n ipaddr.IPv6.networkAddressFromCIDR = function (string) {\n let cidr, i, ipInterfaceOctets, octets, subnetMaskOctets;\n\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 16) {\n // Network address is bitwise AND between ip interface and mask\n octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n i++;\n }\n\n return new this(octets);\n } catch (e) {\n throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${e})`);\n }\n };\n\n // Tries to parse and validate a string with IPv6 address.\n // Throws an error if it fails.\n ipaddr.IPv6.parse = function (string) {\n const addr = this.parser(string);\n\n if (addr.parts === null) {\n throw new Error('ipaddr: string is not formatted like an IPv6 Address');\n }\n\n return new this(addr.parts, addr.zoneId);\n };\n\n ipaddr.IPv6.parseCIDR = function (string) {\n let maskLength, match, parsed;\n\n if ((match = string.match(/^(.+)\\/(\\d+)$/))) {\n maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 128) {\n parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function () {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n\n throw new Error('ipaddr: string is not formatted like an IPv6 CIDR range');\n };\n\n // Parse an IPv6 address.\n ipaddr.IPv6.parser = function (string) {\n let addr, i, match, octet, octets, zoneId;\n\n if ((match = string.match(ipv6Regexes.deprecatedTransitional))) {\n return this.parser(`::ffff:${match[1]}`);\n }\n if (ipv6Regexes.native.test(string)) {\n return expandIPv6(string, 8);\n }\n if ((match = string.match(ipv6Regexes.transitional))) {\n zoneId = match[6] || '';\n addr = match[1]\n if (!match[1].endsWith('::')) {\n addr = addr.slice(0, -1)\n }\n addr = expandIPv6(addr + zoneId, 6);\n if (addr.parts) {\n octets = [\n parseInt(match[2]),\n parseInt(match[3]),\n parseInt(match[4]),\n parseInt(match[5])\n ];\n for (i = 0; i < octets.length; i++) {\n octet = octets[i];\n if (!((0 <= octet && octet <= 255))) {\n return null;\n }\n }\n\n addr.parts.push(octets[0] << 8 | octets[1]);\n addr.parts.push(octets[2] << 8 | octets[3]);\n return {\n parts: addr.parts,\n zoneId: addr.zoneId\n };\n }\n }\n\n return null;\n };\n\n // A utility function to return subnet mask in IPv6 format given the prefix length\n ipaddr.IPv6.subnetMaskFromPrefixLength = function (prefix) {\n prefix = parseInt(prefix);\n if (prefix < 0 || prefix > 128) {\n throw new Error('ipaddr: invalid IPv6 prefix length');\n }\n\n const octets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n let j = 0;\n const filledOctetCount = Math.floor(prefix / 8);\n\n while (j < filledOctetCount) {\n octets[j] = 255;\n j++;\n }\n\n if (filledOctetCount < 16) {\n octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n }\n\n return new this(octets);\n };\n\n // Try to parse an array in network order (MSB first) for IPv4 and IPv6\n ipaddr.fromByteArray = function (bytes) {\n const length = bytes.length;\n\n if (length === 4) {\n return new ipaddr.IPv4(bytes);\n } else if (length === 16) {\n return new ipaddr.IPv6(bytes);\n } else {\n throw new Error('ipaddr: the binary input is neither an IPv6 nor IPv4 address');\n }\n };\n\n // Checks if the address is valid IP address\n ipaddr.isValid = function (string) {\n return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n };\n\n // Checks if the address is valid IP address in CIDR notation\n ipaddr.isValidCIDR = function (string) {\n return ipaddr.IPv6.isValidCIDR(string) || ipaddr.IPv4.isValidCIDR(string);\n };\n\n\n // Attempts to parse an IP Address, first through IPv6 then IPv4.\n // Throws an error if it could not be parsed.\n ipaddr.parse = function (string) {\n if (ipaddr.IPv6.isValid(string)) {\n return ipaddr.IPv6.parse(string);\n } else if (ipaddr.IPv4.isValid(string)) {\n return ipaddr.IPv4.parse(string);\n } else {\n throw new Error('ipaddr: the address has neither IPv6 nor IPv4 format');\n }\n };\n\n // Attempt to parse CIDR notation, first through IPv6 then IPv4.\n // Throws an error if it could not be parsed.\n ipaddr.parseCIDR = function (string) {\n try {\n return ipaddr.IPv6.parseCIDR(string);\n } catch (e) {\n try {\n return ipaddr.IPv4.parseCIDR(string);\n } catch (e2) {\n throw new Error('ipaddr: the address has neither IPv6 nor IPv4 CIDR format');\n }\n }\n };\n\n // Parse an address and return plain IPv4 address if it is an IPv4-mapped address\n ipaddr.process = function (string) {\n const addr = this.parse(string);\n\n if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n return addr.toIPv4Address();\n } else {\n return addr;\n }\n };\n\n // An utility function to ease named range matching. See examples below.\n // rangeList can contain both IPv4 and IPv6 subnet entries and will not throw errors\n // on matching IPv4 addresses to IPv6 ranges or vice versa.\n ipaddr.subnetMatch = function (address, rangeList, defaultName) {\n let i, rangeName, rangeSubnets, subnet;\n\n if (defaultName === undefined || defaultName === null) {\n defaultName = 'unicast';\n }\n\n for (rangeName in rangeList) {\n if (Object.prototype.hasOwnProperty.call(rangeList, rangeName)) {\n rangeSubnets = rangeList[rangeName];\n // ECMA5 Array.isArray isn't available everywhere\n if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n rangeSubnets = [rangeSubnets];\n }\n\n for (i = 0; i < rangeSubnets.length; i++) {\n subnet = rangeSubnets[i];\n if (address.kind() === subnet[0].kind() && address.match.apply(address, subnet)) {\n return rangeName;\n }\n }\n }\n }\n\n return defaultName;\n };\n\n // Export for both the CommonJS and browser-like environment\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = ipaddr;\n\n } else {\n root.ipaddr = ipaddr;\n }\n\n}(this));\n","import { execFileSync, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\n\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 'com.microsoft.edgemac',\n 'com.microsoft.edgemac.beta',\n 'com.microsoft.edgemac.dev',\n 'com.microsoft.edgemac.canary',\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',\n 'msedge.exe',\n 'brave.exe',\n 'brave-browser.exe',\n 'chromium.exe',\n 'vivaldi.exe',\n 'opera.exe',\n 'launcher.exe',\n 'yandex.exe',\n 'yandexbrowser.exe',\n 'google chrome',\n 'google chrome canary',\n 'brave browser',\n 'microsoft edge',\n 'chromium',\n 'chrome',\n 'brave',\n 'msedge',\n 'brave-browser',\n 'google-chrome',\n 'google-chrome-stable',\n 'google-chrome-beta',\n 'google-chrome-unstable',\n 'microsoft-edge',\n 'microsoft-edge-beta',\n 'microsoft-edge-dev',\n 'microsoft-edge-canary',\n 'chromium-browser',\n 'vivaldi',\n 'vivaldi-stable',\n 'opera',\n 'opera-stable',\n 'opera-gx',\n 'yandex-browser',\n]);\n\nfunction fileExists(filePath: string): boolean {\n try {\n return fs.existsSync(filePath);\n } catch {\n return false;\n }\n}\n\nfunction execText(command: string, args: string[], timeoutMs = 1200, maxBuffer = 1024 * 1024): string | null {\n try {\n const output = execFileSync(command, args, {\n timeout: timeoutMs,\n encoding: 'utf8',\n maxBuffer,\n });\n return output.trim() || null;\n } catch {\n return null;\n }\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'))\n 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(\n os.homedir(),\n 'Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist',\n );\n if (!fileExists(plistPath)) return null;\n const handlersRaw = execText(\n '/usr/bin/plutil',\n ['-extract', 'LSHandlers', 'json', '-o', '-', '--', plistPath],\n 2000,\n 5 * 1024 * 1024,\n );\n if (handlersRaw === null) return null;\n let handlers: unknown[];\n try {\n const parsed: unknown = JSON.parse(handlersRaw);\n if (!Array.isArray(parsed)) return null;\n handlers = parsed;\n } catch {\n return null;\n }\n\n const resolveScheme = (scheme: string): string | null => {\n let candidate: string | null = null;\n for (const entry of handlers) {\n if (entry === null || entry === undefined || typeof entry !== 'object') continue;\n const rec = entry as Record<string, unknown>;\n if (rec.LSHandlerURLScheme !== scheme) continue;\n const role =\n (typeof rec.LSHandlerRoleAll === 'string' ? rec.LSHandlerRoleAll : null) ??\n (typeof rec.LSHandlerRoleViewer === 'string' ? rec.LSHandlerRoleViewer : null) ??\n null;\n if (role !== null) 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 === null || !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 === null) 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 === null) 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 {\n kind: 'canary',\n path: path.join(os.homedir(), 'Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'),\n },\n ]);\n}\n\nfunction splitExecLine(line: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inQuotes = false;\n let quoteChar = '';\n for (const ch of line) {\n if ((ch === '\"' || ch === \"'\") && (!inQuotes || ch === quoteChar)) {\n if (inQuotes) {\n inQuotes = false;\n quoteChar = '';\n } else {\n inQuotes = true;\n quoteChar = ch;\n }\n continue;\n }\n if (!inQuotes && /\\s/.test(ch)) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n current += ch;\n }\n if (current) tokens.push(current);\n return tokens;\n}\n\n// ── Linux Detection ──\n\nfunction detectDefaultChromiumLinux(): ChromeExecutable | null {\n const desktopId =\n execText('xdg-settings', ['get', 'default-web-browser']) ??\n execText('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n if (desktopId === null) 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)) {\n desktopPath = candidate;\n break;\n }\n }\n if (desktopPath === null) 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)\n if (line.startsWith('Exec=')) {\n execLine = line.slice(5).trim();\n break;\n }\n } catch {\n /* no exec line found */\n }\n if (execLine === null) return null;\n\n const tokens = splitExecLine(execLine);\n let command: string | null = null;\n for (const token of tokens) {\n if (!token || token === 'env' || (token.includes('=') && !token.startsWith('/') && !token.includes('\\\\'))) continue;\n command = token.replace(/^[\"']|[\"']$/g, '');\n break;\n }\n if (command === null) return null;\n\n const resolved = command.startsWith('/') ? command : (execText('which', [command], 800)?.trim() ?? null);\n if (resolved === null || 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({\n kind: 'brave',\n path: j(localAppData, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),\n });\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({\n kind: 'brave',\n path: j(programFiles, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),\n });\n candidates.push({\n kind: 'brave',\n path: j(programFilesX86, 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),\n });\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// ── Windows Default Browser Detection ──\n\nfunction readWindowsProgId(): string | null {\n const output = execText('reg', [\n 'query',\n 'HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n '/v',\n 'ProgId',\n ]);\n if (output === null) return null;\n return /ProgId\\s+REG_\\w+\\s+(.+)$/im.exec(output)?.[1]?.trim() ?? null;\n}\n\nfunction readWindowsCommandForProgId(progId: string): string | null {\n const output = execText('reg', [\n 'query',\n progId === 'http' ? 'HKCR\\\\http\\\\shell\\\\open\\\\command' : `HKCR\\\\${progId}\\\\shell\\\\open\\\\command`,\n '/ve',\n ]);\n if (output === null) return null;\n return /REG_\\w+\\s+(.+)$/im.exec(output)?.[1]?.trim() ?? null;\n}\n\nfunction expandWindowsEnvVars(value: string): string {\n return value.replace(/%([^%]+)%/g, (_match, name: string) => {\n const key = name.trim();\n return key !== '' ? (process.env[key] ?? `%${key}%`) : _match;\n });\n}\n\nfunction extractWindowsExecutablePath(command: string): string | null {\n const quoted = /\"([^\"]+\\.exe)\"/i.exec(command);\n if (quoted?.[1] !== undefined) return quoted[1];\n const unquoted = /([^\\s]+\\.exe)/i.exec(command);\n if (unquoted?.[1] !== undefined) return unquoted[1];\n return null;\n}\n\nfunction detectDefaultChromiumWindows(): ChromeExecutable | null {\n const progId = readWindowsProgId();\n const command = (progId !== null ? readWindowsCommandForProgId(progId) : null) ?? readWindowsCommandForProgId('http');\n if (command === null) return null;\n const exePath = extractWindowsExecutablePath(expandWindowsEnvVars(command));\n if (exePath === null) return null;\n if (!fileExists(exePath)) return null;\n const exeName = path.win32.basename(exePath).toLowerCase();\n if (!CHROMIUM_EXE_NAMES.has(exeName)) return null;\n return { kind: inferKindFromExeName(exeName), path: exePath };\n}\n\n// ── Resolve Executable ──\n\nexport function resolveBrowserExecutable(opts?: { executablePath?: string }): ChromeExecutable | null {\n if (opts?.executablePath !== undefined && 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 if (platform === 'darwin') return detectDefaultChromiumMac() ?? findChromeMac();\n if (platform === 'linux') return detectDefaultChromiumLinux() ?? findChromeLinux();\n if (platform === 'win32') return detectDefaultChromiumWindows() ?? 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\n .createServer()\n .once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') reject(new Error(`Port ${String(port)} is already in use`));\n else reject(err);\n })\n .once('listening', () => {\n tester.close(() => {\n resolve();\n });\n })\n .listen(port);\n });\n}\n\n// ── Profile Decoration ──\n\nfunction safeReadJson(filePath: string): Record<string, unknown> | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const parsed: unknown = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return null;\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction safeWriteJson(filePath: string, data: Record<string, unknown>): 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, unknown>, keys: string[], value: unknown): void {\n let node: Record<string, unknown> = obj;\n for (const key of keys.slice(0, -1)) {\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') return;\n const next = node[key];\n if (typeof next !== 'object' || next === null || Array.isArray(next)) node[key] = {};\n // nosemgrep: prototype-pollution-loop -- guarded above\n node = node[key] as Record<string, unknown>;\n }\n const lastKey = keys[keys.length - 1];\n if (lastKey === '__proto__' || lastKey === 'constructor' || lastKey === 'prototype') return;\n node[lastKey] = 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 {\n return false;\n }\n}\n\nexport function isLoopbackHost(hostname: string): boolean {\n const h = hostname.replace(/\\.+$/, '');\n return h === 'localhost' || h === '127.0.0.1' || h === '::1' || h === '[::1]';\n}\n\nconst PROXY_ENV_KEYS = ['HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'http_proxy', 'https_proxy', 'all_proxy'];\n\nexport function 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/**\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 */\nexport function 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 let normalized = cdpUrl.replace(/^ws:/, 'http:').replace(/^wss:/, 'https:');\n const dtIdx = normalized.indexOf('/devtools/browser/');\n if (dtIdx >= 0) normalized = normalized.slice(0, dtIdx);\n return normalized.replace(/\\/cdp$/, '').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 {\n ws.close();\n } catch {}\n resolve(value);\n };\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(50, timeoutMs + 25),\n );\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n finish(false);\n return;\n }\n ws.onopen = () => {\n finish(true);\n };\n ws.onerror = () => {\n finish(false);\n };\n });\n}\n\nasync function fetchChromeVersion(\n cdpUrl: string,\n timeoutMs = 500,\n authToken?: string,\n): Promise<Record<string, unknown> | null> {\n const ctrl = new AbortController();\n const t = setTimeout(() => {\n ctrl.abort();\n }, timeoutMs);\n try {\n const httpBase = isWebSocketUrl(cdpUrl) ? normalizeCdpHttpBaseForJsonEndpoints(cdpUrl) : cdpUrl;\n const headers: Record<string, string> = {};\n if (authToken !== undefined && 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: unknown = await res.json();\n if (data === null || data === undefined || typeof data !== 'object') return null;\n return data as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nconst COMMON_CDP_PORTS = [9222, 9223, 9224, 9225, 9226, 9229];\n\nexport async function discoverChromeCdpUrl(timeoutMs = 500): Promise<string | null> {\n const results = await Promise.all(\n COMMON_CDP_PORTS.map(async (port) => {\n const url = `http://127.0.0.1:${String(port)}`;\n return (await isChromeReachable(url, timeoutMs)) ? url : null;\n }),\n );\n return results.find((url) => url !== null) ?? null;\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 version !== null;\n}\n\nexport async function getChromeWebSocketUrl(\n cdpUrl: string,\n timeoutMs = 500,\n authToken?: string,\n): Promise<string | null> {\n if (isWebSocketUrl(cdpUrl)) return cdpUrl;\n const version = await fetchChromeVersion(cdpUrl, timeoutMs, authToken);\n const rawWsUrl = version?.webSocketDebuggerUrl;\n const wsUrl = typeof rawWsUrl === 'string' ? rawWsUrl.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 === null) 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 {\n ws.close();\n } catch {}\n resolve(value);\n };\n\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(50, timeoutMs + 25),\n );\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 {\n finish(false);\n }\n };\n ws.onmessage = (event) => {\n try {\n const parsed: unknown = JSON.parse(String(event.data));\n if (typeof parsed !== 'object' || parsed === null) return;\n const msg = parsed as Record<string, unknown>;\n if (msg.id !== 1) return;\n finish(typeof msg.result === 'object' && msg.result !== null);\n } catch {\n /* ignore non-JSON frames */\n }\n };\n ws.onerror = () => {\n finish(false);\n };\n ws.onclose = () => {\n finish(false);\n };\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)\n 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=${String(cdpPort)}`,\n '--remote-debugging-address=127.0.0.1',\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 === true) {\n args.push('--headless=new', '--disable-gpu');\n }\n if (opts.noSandbox === true) {\n args.push('--no-sandbox', '--disable-setuid-sandbox');\n }\n if (opts.ignoreHTTPSErrors === true) {\n args.push('--ignore-certificate-errors');\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 {\n bootstrap.kill('SIGTERM');\n } 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 {\n bootstrap.kill('SIGKILL');\n } catch {}\n }\n }\n\n try {\n decorateProfile(userDataDir, profileName, opts.profileColor ?? DEFAULT_PROFILE_COLOR);\n } catch {}\n\n try {\n ensureCleanExit(userDataDir);\n } catch {}\n\n const proc = spawnChrome();\n const cdpUrl = `http://127.0.0.1:${String(cdpPort)}`;\n\n // Capture stderr for diagnostics on failure\n const stderrChunks: Buffer[] = [];\n const onStderr = (chunk: Buffer) => {\n stderrChunks.push(chunk);\n };\n proc.stderr.on('data', onStderr);\n\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 =\n process.platform === 'linux' && opts.noSandbox !== true\n ? '\\nHint: If running in a container or as root, try setting noSandbox: true.'\n : '';\n try {\n proc.kill('SIGKILL');\n } catch {}\n throw new Error(`Failed to start Chrome CDP on port ${String(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 {\n proc.kill('SIGTERM');\n } catch {\n /* process may already be dead */\n }\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n // exitCode changes asynchronously after SIGTERM; re-read from proc\n if ((proc as { exitCode: number | null }).exitCode !== null) return;\n await new Promise((r) => setTimeout(r, 100));\n }\n try {\n proc.kill('SIGKILL');\n } catch {\n /* process may already be dead */\n }\n}\n","/**\n * Comprehensive browser stealth evasions.\n *\n * Injected via `addInitScript()` (runs before any page JS) and via\n * `page.evaluate()` for already-loaded pages. Each patch is wrapped\n * in try/catch so a single failure never breaks the rest.\n *\n * Covers: navigator.webdriver, plugins, languages, window.chrome,\n * Permissions API, WebGL fingerprint, Notification.permission,\n * navigator.connection, console toString, headless-mode quirks,\n * hardwareConcurrency, and deviceMemory.\n */\n\nexport const STEALTH_SCRIPT = `(function() {\n 'use strict';\n function p(fn) { try { fn(); } catch(_) {} }\n\n // ── 1. navigator.webdriver → undefined ──\n p(function() {\n Object.defineProperty(navigator, 'webdriver', { get: function() { return undefined; }, configurable: true });\n });\n\n // ── 2. navigator.plugins + mimeTypes (only if empty — Chrome 92+ populates them natively) ──\n p(function() {\n if (navigator.plugins && navigator.plugins.length > 0) return;\n\n function FakePlugin(name, fn, desc, mimes) {\n this.name = name; this.filename = fn; this.description = desc; this.length = mimes.length;\n for (var i = 0; i < mimes.length; i++) { this[i] = mimes[i]; mimes[i].enabledPlugin = this; }\n }\n FakePlugin.prototype.item = function(i) { return this[i] || null; };\n FakePlugin.prototype.namedItem = function(n) {\n for (var i = 0; i < this.length; i++) if (this[i].type === n) return this[i];\n return null;\n };\n\n function M(type, suf, desc) { this.type = type; this.suffixes = suf; this.description = desc; }\n\n var m1 = new M('application/pdf', 'pdf', 'Portable Document Format');\n var m2 = new M('application/x-google-chrome-pdf', 'pdf', 'Portable Document Format');\n var m3 = new M('application/x-nacl', '', 'Native Client Executable');\n var m4 = new M('application/x-pnacl', '', 'Portable Native Client Executable');\n\n var plugins = [\n new FakePlugin('Chrome PDF Plugin', 'internal-pdf-viewer', 'Portable Document Format', [m1]),\n new FakePlugin('Chrome PDF Viewer', 'mhjfbmdgcfjbbpaeojofohoefgiehjai', '', [m2]),\n new FakePlugin('Native Client', 'internal-nacl-plugin', '', [m3, m4]),\n ];\n\n function makeIterable(arr, items) {\n arr.length = items.length;\n for (var i = 0; i < items.length; i++) arr[i] = items[i];\n arr[Symbol.iterator] = function() {\n var idx = 0;\n return { next: function() {\n return idx < items.length ? { value: items[idx++], done: false } : { done: true };\n }};\n };\n }\n\n var pa = { item: function(i) { return plugins[i] || null; },\n namedItem: function(n) { for (var i = 0; i < plugins.length; i++) if (plugins[i].name === n) return plugins[i]; return null; },\n refresh: function() {} };\n makeIterable(pa, plugins);\n Object.defineProperty(navigator, 'plugins', { get: function() { return pa; } });\n\n var allMimes = [m1, m2, m3, m4];\n var ma = { item: function(i) { return allMimes[i] || null; },\n namedItem: function(n) { for (var i = 0; i < allMimes.length; i++) if (allMimes[i].type === n) return allMimes[i]; return null; } };\n makeIterable(ma, allMimes);\n Object.defineProperty(navigator, 'mimeTypes', { get: function() { return ma; } });\n });\n\n // ── 3. navigator.languages (cached + frozen so identity check passes) ──\n p(function() {\n if (!navigator.languages || navigator.languages.length === 0) {\n var langs = Object.freeze(['en-US', 'en']);\n Object.defineProperty(navigator, 'languages', { get: function() { return langs; } });\n }\n });\n\n // ── 4. window.chrome ──\n p(function() {\n if (window.chrome && window.chrome.runtime && window.chrome.runtime.connect) return;\n\n var chrome = window.chrome || {};\n var noop = function() {};\n var evtStub = { addListener: noop, removeListener: noop, hasListeners: function() { return false; } };\n chrome.runtime = chrome.runtime || {};\n chrome.runtime.onMessage = chrome.runtime.onMessage || evtStub;\n chrome.runtime.onConnect = chrome.runtime.onConnect || evtStub;\n chrome.runtime.sendMessage = chrome.runtime.sendMessage || noop;\n chrome.runtime.connect = chrome.runtime.connect || function() {\n return { onMessage: { addListener: noop }, postMessage: noop, disconnect: noop };\n };\n if (chrome.runtime.id === undefined) chrome.runtime.id = undefined;\n if (!chrome.loadTimes) chrome.loadTimes = function() { return {}; };\n if (!chrome.csi) chrome.csi = function() { return {}; };\n if (!chrome.app) {\n chrome.app = {\n isInstalled: false,\n InstallState: { INSTALLED: 'installed', NOT_INSTALLED: 'not_installed', DISABLED: 'disabled' },\n RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' },\n getDetails: function() { return null; },\n getIsInstalled: function() { return false; },\n runningState: function() { return 'cannot_run'; },\n };\n }\n\n if (!window.chrome) {\n Object.defineProperty(window, 'chrome', { value: chrome, writable: false, enumerable: true, configurable: false });\n }\n });\n\n // ── 5. Permissions API consistency ──\n p(function() {\n var orig = navigator.permissions.query.bind(navigator.permissions);\n function q(params) {\n if (params.name === 'notifications') {\n return Promise.resolve({\n state: typeof Notification !== 'undefined' ? Notification.permission : 'prompt',\n name: 'notifications', onchange: null,\n addEventListener: function(){}, removeEventListener: function(){}, dispatchEvent: function(){ return true; },\n });\n }\n return orig(params);\n }\n q.toString = function() { return 'function query() { [native code] }'; };\n navigator.permissions.query = q;\n });\n\n // ── 6. WebGL vendor / renderer ──\n p(function() {\n var h = {\n apply: function(target, self, args) {\n var param = args[0];\n if (param === 0x9245) return 'Intel Inc.';\n if (param === 0x9246) return 'Intel Iris OpenGL Engine';\n return Reflect.apply(target, self, args);\n }\n };\n if (typeof WebGLRenderingContext !== 'undefined')\n WebGLRenderingContext.prototype.getParameter = new Proxy(WebGLRenderingContext.prototype.getParameter, h);\n if (typeof WebGL2RenderingContext !== 'undefined')\n WebGL2RenderingContext.prototype.getParameter = new Proxy(WebGL2RenderingContext.prototype.getParameter, h);\n });\n\n // ── 7. Notification.permission ──\n p(function() {\n if (typeof Notification !== 'undefined' && Notification.permission === 'denied') {\n Object.defineProperty(Notification, 'permission', { get: function() { return 'default'; }, configurable: true });\n }\n });\n\n // ── 8. navigator.connection (cached so identity check passes) ──\n p(function() {\n if (navigator.connection) return;\n var conn = {\n effectiveType: '4g', rtt: 50, downlink: 10, saveData: false, onchange: null,\n addEventListener: function(){}, removeEventListener: function(){}, dispatchEvent: function(){ return true; },\n };\n Object.defineProperty(navigator, 'connection', { get: function() { return conn; } });\n });\n\n // ── 9. Iframe contentWindow.chrome ──\n // Handled by patch 4 — chrome object is now on window, propagates to iframes on same origin.\n\n // ── 10. console method toString ──\n p(function() {\n ['log','info','warn','error','debug','table','trace'].forEach(function(n) {\n if (console[n]) {\n console[n].toString = function() { return 'function ' + n + '() { [native code] }'; };\n }\n });\n });\n\n // ── 11. Headless-mode window / screen fixes ──\n p(function() {\n if (window.outerWidth === 0)\n Object.defineProperty(window, 'outerWidth', { get: function() { return window.innerWidth || 1920; } });\n if (window.outerHeight === 0)\n Object.defineProperty(window, 'outerHeight', { get: function() { return (window.innerHeight || 1080) + 85; } });\n });\n\n p(function() {\n if (screen.colorDepth === 0) {\n Object.defineProperty(screen, 'colorDepth', { get: function() { return 24; } });\n Object.defineProperty(screen, 'pixelDepth', { get: function() { return 24; } });\n }\n });\n\n // ── 12. navigator.hardwareConcurrency ──\n p(function() {\n if (!navigator.hardwareConcurrency)\n Object.defineProperty(navigator, 'hardwareConcurrency', { get: function() { return 4; } });\n });\n\n // ── 13. navigator.deviceMemory ──\n p(function() {\n if (!navigator.deviceMemory)\n Object.defineProperty(navigator, 'deviceMemory', { get: function() { return 8; } });\n });\n})()`;\n","import type { Page, BrowserContext, Browser } from 'playwright-core';\n\nimport { STEALTH_SCRIPT } from './stealth.js';\nimport type { PageState, ContextState, NetworkRequest, DialogHandler } from './types.js';\n\nconst MAX_CONSOLE_MESSAGES = 500;\nconst MAX_PAGE_ERRORS = 200;\nconst MAX_NETWORK_REQUESTS = 500;\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\nexport function bumpUploadArmId(state: PageState): number {\n state.nextArmIdUpload += 1;\n return state.nextArmIdUpload;\n}\nexport function bumpDialogArmId(state: PageState): number {\n state.nextArmIdDialog += 1;\n return state.nextArmIdDialog;\n}\nexport function bumpDownloadArmId(state: PageState): number {\n state.nextArmIdDownload += 1;\n return state.nextArmIdDownload;\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// ── Page State Management ──\n\n/** Read-only access to a page's state (returns undefined if not initialized). */\nexport function getPageState(page: Page): PageState | undefined {\n return pageStates.get(page);\n}\n\n/** Find a network request by ID in the page state. */\nexport function findNetworkRequestById(state: PageState, id: string): NetworkRequest | undefined {\n for (let i = state.requests.length - 1; i >= 0; i--) {\n const candidate = state.requests[i];\n if (candidate.id === id) return candidate;\n }\n return undefined;\n}\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 nextArmIdUpload: 0,\n nextArmIdDialog: 0,\n nextArmIdDownload: 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 !== '' ? err.message : String(err),\n name: err.name !== '' ? err.name : undefined,\n stack: err.stack !== undefined && err.stack !== '' ? 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${String(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 === undefined) return;\n const rec = findNetworkRequestById(state, id);\n if (rec) {\n rec.status = resp.status();\n rec.ok = resp.ok();\n }\n });\n\n page.on('requestfailed', (req) => {\n const id = state.requestIds.get(req);\n if (id === undefined) return;\n const rec = findNetworkRequestById(state, id);\n if (rec) {\n rec.failureText = req.failure()?.errorText;\n rec.ok = false;\n }\n });\n\n page.on('dialog', (dialog) => {\n // If a one-shot armDialog is active, let it handle the dialog.\n if (state.armIdDialog > 0) return;\n\n // If a persistent onDialog handler is registered, invoke it.\n if (state.dialogHandler) {\n let handled = false;\n const event = {\n type: dialog.type(),\n message: dialog.message(),\n defaultValue: dialog.defaultValue(),\n accept: (promptText?: string) => {\n handled = true;\n return dialog.accept(promptText);\n },\n dismiss: () => {\n handled = true;\n return dialog.dismiss();\n },\n };\n Promise.resolve(state.dialogHandler(event))\n .then(() => {\n if (!handled) {\n dialog.dismiss().catch((err: unknown) => {\n console.warn(\n `[browserclaw] Failed to auto-dismiss dialog: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n })\n .catch((err: unknown) => {\n console.warn(`[browserclaw] onDialog handler error: ${err instanceof Error ? err.message : String(err)}`);\n if (!handled) {\n dialog.dismiss().catch((dismissErr: unknown) => {\n console.warn(\n `[browserclaw] Failed to dismiss dialog after handler error: ${dismissErr instanceof Error ? dismissErr.message : String(dismissErr)}`,\n );\n });\n }\n });\n return;\n }\n\n // Default: auto-dismiss unexpected dialogs.\n dialog.dismiss().catch((err: unknown) => {\n console.warn(`[browserclaw] Failed to dismiss dialog: ${err instanceof Error ? err.message : String(err)}`);\n });\n });\n\n page.on('close', () => {\n pageStates.delete(page);\n observedPages.delete(page);\n });\n }\n\n return state;\n}\n\n// ── Dialog Handler ──\n\n/**\n * Set or clear a persistent dialog handler for a page.\n * When set, this handler is called for every dialog that is not covered by armDialog().\n * Pass `undefined` to clear the handler and restore default auto-dismiss.\n */\nexport function setDialogHandlerOnPage(page: Page, handler?: DialogHandler): void {\n const state = ensurePageState(page);\n state.dialogHandler = handler;\n}\n\n// ── Stealth ──\n\nfunction applyStealthToPage(page: Page): void {\n page.evaluate(STEALTH_SCRIPT).catch((e: unknown) => {\n if (process.env.DEBUG !== undefined && process.env.DEBUG !== '')\n console.warn('[browserclaw] stealth evaluate failed:', e instanceof Error ? e.message : String(e));\n });\n}\n\nexport function 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: unknown) => {\n if (process.env.DEBUG !== undefined && process.env.DEBUG !== '')\n console.warn('[browserclaw] stealth initScript failed:', e instanceof Error ? e.message : String(e));\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\nexport function observeBrowser(browser: Browser): void {\n for (const context of browser.contexts()) observeContext(context);\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 = /resolved to (\\d+) elements/.exec(message);\n const count = countMatch ? countMatch[1] : 'multiple';\n return new Error(\n `Selector \"${selector}\" matched ${count} elements. Run a new snapshot to get updated refs, or use a different ref.`,\n );\n }\n if (\n (message.includes('Timeout') || message.includes('waiting for')) &&\n (message.includes('to be visible') || message.includes('not visible'))\n ) {\n return new Error(\n `Element \"${selector}\" not found or not visible. Run a new snapshot to see current page elements.`,\n );\n }\n if (\n message.includes('intercepts pointer events') ||\n message.includes('not visible') ||\n message.includes('not receive pointer events')\n ) {\n return new Error(\n `Element \"${selector}\" is not interactable (hidden or covered). Try scrolling it into view, closing overlays, or re-snapshotting.`,\n );\n }\n const timeoutMatch = /Timeout (\\d+)ms exceeded/.exec(message);\n if (timeoutMatch) {\n return new Error(\n `Element \"${selector}\" timed out after ${timeoutMatch[1]}ms — element may be hidden or not interactable. Run a new snapshot to see current page elements.`,\n );\n }\n // Strip Playwright locator internals so AI agents don't see implementation details\n const cleaned = message\n .replace(/locator\\([^)]*\\)\\./g, '')\n .replace(/waiting for locator\\([^)]*\\)/g, '')\n .trim();\n return new Error(cleaned || 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 { Page } from 'playwright-core';\n\nimport { ensurePageState, getPageState } from './page-utils.js';\nimport type { RoleRefs } from './types.js';\n\n// ── Ref cache: keyed by \"cdpUrl::targetId\" ──\n\nconst roleRefsByTarget = new Map<\n string,\n {\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n }\n>();\nconst MAX_ROLE_REFS_CACHE = 50;\n\nexport function 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// ── Role Refs Storage ──\n\n/**\n * Remember role refs in the target cache (without storing on page state).\n * Used to persist refs across page reconnections.\n */\nexport function rememberRoleRefsForTarget(opts: {\n cdpUrl: string;\n targetId: string;\n refs: RoleRefs;\n frameSelector?: string;\n mode?: 'role' | 'aria';\n}): void {\n const targetId = opts.targetId.trim();\n if (targetId === '') return;\n roleRefsByTarget.set(roleRefsKey(opts.cdpUrl, targetId), {\n refs: opts.refs,\n ...(opts.frameSelector !== undefined && opts.frameSelector !== '' ? { frameSelector: opts.frameSelector } : {}),\n ...(opts.mode !== undefined ? { mode: opts.mode } : {}),\n });\n while (roleRefsByTarget.size > MAX_ROLE_REFS_CACHE) {\n const first = roleRefsByTarget.keys().next();\n if (first.done === true) break;\n roleRefsByTarget.delete(first.value);\n }\n}\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 if (opts.targetId === undefined || opts.targetId.trim() === '') return;\n rememberRoleRefsForTarget({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: opts.refs,\n frameSelector: opts.frameSelector,\n mode: opts.mode,\n });\n}\n\nexport function restoreRoleRefsForTarget(opts: { cdpUrl: string; targetId?: string; page: Page }): 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/**\n * Clear role refs for all targets associated with a CDP URL.\n * Called when a browser disconnects.\n */\nexport function clearRoleRefsForCdpUrl(cdpUrl: string): void {\n const normalized = normalizeCdpUrl(cdpUrl);\n for (const key of roleRefsByTarget.keys()) {\n if (key.startsWith(normalized + '::')) roleRefsByTarget.delete(key);\n }\n}\n\n// ── Ref Parsing ──\n\n/**\n * Parse a role ref string (e.g. \"e1\", \"@e1\", \"ref=e1\") to a normalized ref ID.\n * Returns null if the string is not a valid role ref.\n */\nexport function parseRoleRef(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const normalized = trimmed.startsWith('@')\n ? trimmed.slice(1)\n : trimmed.startsWith('ref=')\n ? trimmed.slice(4)\n : trimmed;\n return /^e\\d+$/.test(normalized) ? normalized : null;\n}\n\n/**\n * Require a ref string, normalizing and validating it.\n * Throws if the ref is empty.\n */\nexport function requireRef(value: string | undefined): string {\n const raw = typeof value === 'string' ? value.trim() : '';\n const ref = (raw ? parseRoleRef(raw) : null) ?? (raw.startsWith('@') ? raw.slice(1) : raw);\n if (!ref) throw new Error('ref is required');\n return ref;\n}\n\n/**\n * Require either a ref or selector, returning whichever is provided.\n * Throws if neither is provided.\n */\nexport function requireRefOrSelector(ref?: string, selector?: string): { ref?: string; selector?: string } {\n const trimmedRef = typeof ref === 'string' ? ref.trim() : '';\n const trimmedSelector = typeof selector === 'string' ? selector.trim() : '';\n if (!trimmedRef && !trimmedSelector) throw new Error('ref or selector is required');\n return { ref: trimmedRef || undefined, selector: trimmedSelector || undefined };\n}\n\n/** Clamp interaction timeout to [500, 60000]ms range, defaulting to 8000ms. */\nexport function resolveInteractionTimeoutMs(timeoutMs?: number): number {\n return Math.max(500, Math.min(60000, Math.floor(timeoutMs ?? 8000)));\n}\n\n/** Bounded delay validator for animation/interaction delays. */\nexport function 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 ${String(maxMs)}ms`);\n return normalized;\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 = getPageState(page);\n\n // Aria mode: use aria-ref locator\n if (state?.roleRefsMode === 'aria') {\n return (\n state.roleRefsFrameSelector !== undefined && state.roleRefsFrameSelector !== ''\n ? page.frameLocator(state.roleRefsFrameSelector)\n : 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 =\n state.roleRefsFrameSelector !== undefined && state.roleRefsFrameSelector !== ''\n ? page.frameLocator(state.roleRefsFrameSelector)\n : page;\n const role = info.role as Parameters<Page['getByRole']>[0];\n const locator =\n info.name !== undefined && 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","import http from 'node:http';\nimport https from 'node:https';\n\nimport { chromium } from 'playwright-core';\nimport type { Browser, Page, CDPSession } from 'playwright-core';\n\nimport {\n getChromeWebSocketUrl,\n normalizeCdpHttpBaseForJsonEndpoints,\n normalizeCdpWsUrl,\n isLoopbackHost,\n hasProxyEnvConfigured,\n} from './chrome-launcher.js';\nimport { ensurePageState, observeBrowser, setDialogHandlerOnPage } from './page-utils.js';\nimport { clearRoleRefsForCdpUrl, normalizeCdpUrl, restoreRoleRefsForTarget } from './ref-resolver.js';\nimport type { DialogHandler } from './types.js';\n\n// Re-export everything from sub-modules so existing `import … from './connection.js'`\n// paths keep working. When adding a public function to page-utils or ref-resolver,\n// add a corresponding re-export here — otherwise downstream imports break silently.\nexport {\n ensurePageState,\n ensureContextState,\n observeContext,\n findNetworkRequestById,\n bumpUploadArmId,\n bumpDialogArmId,\n bumpDownloadArmId,\n toAIFriendlyError,\n normalizeTimeoutMs,\n} from './page-utils.js';\n\nexport {\n rememberRoleRefsForTarget,\n storeRoleRefsForTarget,\n restoreRoleRefsForTarget,\n clearRoleRefsForCdpUrl,\n parseRoleRef,\n requireRef,\n requireRefOrSelector,\n resolveInteractionTimeoutMs,\n resolveBoundedDelayMs,\n refLocator,\n} from './ref-resolver.js';\n\n// ── Errors ──\n\nexport class BrowserTabNotFoundError extends Error {\n constructor(message = 'Tab not found') {\n super(message);\n this.name = 'BrowserTabNotFoundError';\n }\n}\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\nasync function fetchJsonForCdp(url: string, timeoutMs: number): Promise<unknown> {\n const ctrl = new AbortController();\n const t = setTimeout(() => {\n ctrl.abort();\n }, timeoutMs);\n try {\n const res = await fetch(url, { signal: ctrl.signal });\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n } finally {\n clearTimeout(t);\n }\n}\n\nfunction appendCdpPath(cdpUrl: string, cdpPath: string): string {\n try {\n const url = new URL(cdpUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, '')}${cdpPath.startsWith('/') ? cdpPath : `/${cdpPath}`}`;\n return url.toString();\n } catch {\n return `${cdpUrl.replace(/\\/$/, '')}${cdpPath}`;\n }\n}\n\n// ── CDP Session Helpers ──\n\n/**\n * Run a function with a scoped Playwright CDP session, detaching when done.\n */\nexport async function withPlaywrightPageCdpSession<T>(page: Page, fn: (session: CDPSession) => Promise<T>): Promise<T> {\n const CDP_SESSION_TIMEOUT_MS = 10_000;\n const session = await Promise.race([\n page.context().newCDPSession(page),\n new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error('newCDPSession timed out after 10s'));\n }, CDP_SESSION_TIMEOUT_MS);\n }),\n ]);\n try {\n return await fn(session);\n } finally {\n await session.detach().catch(() => {\n /* noop */\n });\n }\n}\n\n/**\n * Run a function with a page-scoped CDP client.\n */\nexport async function withPageScopedCdpClient<T>(opts: {\n cdpUrl: string;\n page: Page;\n targetId?: string;\n fn: (send: (method: string, params?: Record<string, unknown>) => Promise<unknown>) => Promise<T>;\n}): Promise<T> {\n return await withPlaywrightPageCdpSession(opts.page, async (session) => {\n return await opts.fn((method, params) => session.send(method as Parameters<CDPSession['send']>[0], params));\n });\n}\n\n// ── NO_PROXY Lease Manager (for loopback CDP URLs) ──\n\nconst LOOPBACK_ENTRIES = 'localhost,127.0.0.1,[::1]';\n\nfunction noProxyAlreadyCoversLocalhost(): boolean {\n const current = process.env.NO_PROXY ?? process.env.no_proxy ?? '';\n return current.includes('localhost') && current.includes('127.0.0.1') && current.includes('[::1]');\n}\n\nfunction isLoopbackCdpUrl(url: string): boolean {\n try {\n return isLoopbackHost(new URL(url).hostname);\n } catch {\n return false;\n }\n}\n\n/**\n * Mutex promise chain that serializes concurrent env mutations.\n *\n * Playwright reads proxy config from `process.env` at connect time — there is\n * no API to pass proxy bypass settings per-connection. When the CDP target is\n * loopback we must temporarily add localhost entries to `NO_PROXY` / `no_proxy`\n * so Playwright's underlying HTTP stack skips the proxy.\n *\n * Because multiple connections may be established concurrently, we serialize\n * the save → mutate → fn() → restore cycle through a promise chain so that\n * one caller's restore doesn't clobber another caller's mutation.\n */\nlet envMutexPromise: Promise<void> = Promise.resolve();\n\n/**\n * Scoped NO_PROXY bypass for loopback CDP URLs.\n * Serializes env mutations so concurrent connects don't interleave save/restore.\n * Only restores if the value hasn't been changed by someone else.\n */\nexport async function withNoProxyForCdpUrl<T>(url: string, fn: () => Promise<T>): Promise<T> {\n if (!isLoopbackCdpUrl(url) || !hasProxyEnvConfigured()) return fn();\n\n const prev = envMutexPromise;\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n let release: () => void = () => {};\n envMutexPromise = new Promise<void>((r) => {\n release = r;\n });\n await prev;\n\n if (noProxyAlreadyCoversLocalhost()) {\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n const savedNoProxy = process.env.NO_PROXY;\n const savedNoProxyLower = process.env.no_proxy;\n const current = savedNoProxy ?? savedNoProxyLower ?? '';\n const applied = current ? `${current},${LOOPBACK_ENTRIES}` : LOOPBACK_ENTRIES;\n process.env.NO_PROXY = applied;\n process.env.no_proxy = applied;\n try {\n return await fn();\n } finally {\n if (process.env.NO_PROXY === applied) {\n if (savedNoProxy !== undefined) process.env.NO_PROXY = savedNoProxy;\n else delete process.env.NO_PROXY;\n }\n if (process.env.no_proxy === applied) {\n if (savedNoProxyLower !== undefined) process.env.no_proxy = savedNoProxyLower;\n else delete process.env.no_proxy;\n }\n release();\n }\n}\n\n/** HTTP agent that never uses a proxy — for localhost CDP connections. */\nconst directHttpAgent = new http.Agent();\nconst directHttpsAgent = new https.Agent();\n\n/**\n * Returns a plain (non-proxy) agent for WebSocket or HTTP connections\n * when the target is a loopback address. Returns `undefined` otherwise.\n */\nexport function getDirectAgentForCdp(url: string): http.Agent | https.Agent | undefined {\n try {\n const parsed = new URL(url);\n if (isLoopbackHost(parsed.hostname)) {\n return parsed.protocol === 'https:' || parsed.protocol === 'wss:' ? directHttpsAgent : directHttpAgent;\n }\n } catch {}\n return undefined;\n}\n\n// ── Auth Headers ──\n\n/**\n * Resolve auth headers for a CDP endpoint URL.\n * Supports URL credentials (user:pass@host).\n */\nexport function getHeadersWithAuth(endpoint: string, baseHeaders: Record<string, string> = {}): Record<string, string> {\n const headers = { ...baseHeaders };\n try {\n const parsed = new URL(endpoint);\n if (Object.keys(headers).some((k) => k.toLowerCase() === 'authorization')) return headers;\n if (parsed.username || parsed.password) {\n const credentials = Buffer.from(\n `${decodeURIComponent(parsed.username)}:${decodeURIComponent(parsed.password)}`,\n ).toString('base64');\n headers.Authorization = `Basic ${credentials}`;\n }\n } catch {}\n return headers;\n}\n\n// ── Persistent Connection Cache ──\n\ninterface CachedConnection {\n browser: Browser;\n cdpUrl: string;\n onDisconnected?: () => void;\n}\n\nconst cachedByCdpUrl = new Map<string, CachedConnection>();\nconst connectingByCdpUrl = new Map<string, Promise<CachedConnection>>();\n\n// ── Blocked Target Tracking ──\n\nexport class BlockedBrowserTargetError extends Error {\n constructor() {\n super('Browser target is unavailable after SSRF policy blocked its navigation.');\n this.name = 'BlockedBrowserTargetError';\n }\n}\n\nconst blockedTargetsByCdpUrl = new Set<string>();\nconst blockedPageRefsByCdpUrl = new Map<string, WeakSet<Page>>();\n\nfunction blockedTargetKey(cdpUrl: string, targetId: string): string {\n return `${normalizeCdpUrl(cdpUrl)}::${targetId}`;\n}\n\nexport function isBlockedTarget(cdpUrl: string, targetId?: string): boolean {\n const normalized = targetId?.trim() ?? '';\n if (normalized === '') return false;\n return blockedTargetsByCdpUrl.has(blockedTargetKey(cdpUrl, normalized));\n}\n\nexport function markTargetBlocked(cdpUrl: string, targetId?: string): void {\n const normalized = targetId?.trim() ?? '';\n if (normalized === '') return;\n blockedTargetsByCdpUrl.add(blockedTargetKey(cdpUrl, normalized));\n}\n\nexport function clearBlockedTarget(cdpUrl: string, targetId?: string): void {\n const normalized = targetId?.trim() ?? '';\n if (normalized === '') return;\n blockedTargetsByCdpUrl.delete(blockedTargetKey(cdpUrl, normalized));\n}\n\nfunction hasBlockedTargetsForCdpUrl(cdpUrl: string): boolean {\n const prefix = `${normalizeCdpUrl(cdpUrl)}::`;\n for (const key of blockedTargetsByCdpUrl) {\n if (key.startsWith(prefix)) return true;\n }\n return false;\n}\n\nfunction clearBlockedTargetsForCdpUrl(cdpUrl?: string): void {\n if (cdpUrl === undefined) {\n blockedTargetsByCdpUrl.clear();\n return;\n }\n const prefix = `${normalizeCdpUrl(cdpUrl)}::`;\n for (const key of blockedTargetsByCdpUrl) {\n if (key.startsWith(prefix)) blockedTargetsByCdpUrl.delete(key);\n }\n}\n\nfunction blockedPageRefsForCdpUrl(cdpUrl: string): WeakSet<Page> {\n const normalized = normalizeCdpUrl(cdpUrl);\n const existing = blockedPageRefsByCdpUrl.get(normalized);\n if (existing) return existing;\n const created = new WeakSet<Page>();\n blockedPageRefsByCdpUrl.set(normalized, created);\n return created;\n}\n\nexport function isBlockedPageRef(cdpUrl: string, page: Page): boolean {\n return blockedPageRefsByCdpUrl.get(normalizeCdpUrl(cdpUrl))?.has(page) ?? false;\n}\n\nexport function markPageRefBlocked(cdpUrl: string, page: Page): void {\n blockedPageRefsForCdpUrl(cdpUrl).add(page);\n}\n\nfunction clearBlockedPageRefsForCdpUrl(cdpUrl?: string): void {\n if (cdpUrl === undefined) {\n blockedPageRefsByCdpUrl.clear();\n return;\n }\n blockedPageRefsByCdpUrl.delete(normalizeCdpUrl(cdpUrl));\n}\n\nexport function clearBlockedPageRef(cdpUrl: string, page: Page): void {\n blockedPageRefsByCdpUrl.get(normalizeCdpUrl(cdpUrl))?.delete(page);\n}\n\n// ── Dialog Handler ──\n\n/**\n * Set or clear a persistent dialog handler for a page.\n * When set, this handler is called for every dialog that is not covered by armDialog().\n * Pass `undefined` to clear the handler and restore default auto-dismiss.\n */\nexport async function setDialogHandler(opts: {\n cdpUrl: string;\n targetId?: string;\n handler?: DialogHandler;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n setDialogHandlerOnPage(page, opts.handler);\n}\n\n// ── Connect to Browser ──\n\nexport async function connectBrowser(cdpUrl: string, authToken?: string): Promise<CachedConnection> {\n const normalized = normalizeCdpUrl(cdpUrl);\n const existing_cached = cachedByCdpUrl.get(normalized);\n if (existing_cached) return existing_cached;\n\n const existing = connectingByCdpUrl.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> = getHeadersWithAuth(endpoint);\n if (authToken !== undefined && authToken !== '' && !headers.Authorization)\n headers.Authorization = `Bearer ${authToken}`;\n const browser = await withNoProxyForCdpUrl(endpoint, () =>\n chromium.connectOverCDP(endpoint, { timeout, headers }),\n );\n const onDisconnected = () => {\n if (cachedByCdpUrl.get(normalized)?.browser === browser) {\n cachedByCdpUrl.delete(normalized);\n clearRoleRefsForCdpUrl(normalized);\n }\n };\n const connected: CachedConnection = { browser, cdpUrl: normalized, onDisconnected };\n cachedByCdpUrl.set(normalized, connected);\n observeBrowser(browser);\n browser.on('disconnected', onDisconnected);\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(() => {\n connectingByCdpUrl.delete(normalized);\n });\n connectingByCdpUrl.set(normalized, promise);\n return await promise;\n}\n\nexport async function disconnectBrowser(): Promise<void> {\n if (connectingByCdpUrl.size) {\n for (const p of connectingByCdpUrl.values()) {\n try {\n await p;\n } catch {}\n }\n }\n for (const cur of cachedByCdpUrl.values()) {\n if (cur.onDisconnected && typeof cur.browser.off === 'function')\n cur.browser.off('disconnected', cur.onDisconnected);\n await cur.browser.close().catch(() => {\n /* noop */\n });\n }\n cachedByCdpUrl.clear();\n}\n\n/**\n * Close the Playwright connection for a specific CDP URL without affecting other connections.\n */\nexport async function closePlaywrightBrowserConnection(opts?: { cdpUrl?: string }): Promise<void> {\n if (opts?.cdpUrl !== undefined && opts.cdpUrl !== '') {\n const normalized = normalizeCdpUrl(opts.cdpUrl);\n clearBlockedTargetsForCdpUrl(normalized);\n clearBlockedPageRefsForCdpUrl(normalized);\n const cur = cachedByCdpUrl.get(normalized);\n cachedByCdpUrl.delete(normalized);\n connectingByCdpUrl.delete(normalized);\n if (!cur) return;\n if (cur.onDisconnected && typeof cur.browser.off === 'function')\n cur.browser.off('disconnected', cur.onDisconnected);\n await cur.browser.close().catch(() => {\n /* noop */\n });\n } else {\n clearBlockedTargetsForCdpUrl();\n clearBlockedPageRefsForCdpUrl();\n await disconnectBrowser();\n }\n}\n\nfunction cdpSocketNeedsAttach(wsUrl: string): boolean {\n try {\n const pathname = new URL(wsUrl).pathname;\n return (\n pathname === '/cdp' || pathname.endsWith('/cdp') || pathname.includes('/devtools/browser/') || pathname === '/'\n );\n } catch {\n return false;\n }\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 * If the wsUrl is a browser-level endpoint, attaches to the target first.\n */\nasync function tryTerminateExecutionViaCdp(cdpUrl: string, targetId: string): Promise<void> {\n const httpBase = normalizeCdpHttpBaseForJsonEndpoints(cdpUrl);\n const ctrl = new AbortController();\n const t = setTimeout(() => {\n ctrl.abort();\n }, 2000);\n let targets: unknown;\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 {\n return;\n } finally {\n clearTimeout(t);\n }\n\n if (!Array.isArray(targets)) return;\n const target = targets.find((entry: unknown) => {\n const e = entry as { id?: string; webSocketDebuggerUrl?: string };\n return (e.id ?? '').trim() === targetId;\n }) as { id?: string; webSocketDebuggerUrl?: string } | undefined;\n const wsUrlRaw = (target?.webSocketDebuggerUrl ?? '').trim();\n if (wsUrlRaw === '') return;\n\n const wsUrl = normalizeCdpWsUrl(wsUrlRaw, httpBase);\n const needsAttach = cdpSocketNeedsAttach(wsUrl);\n\n await new Promise<void>((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n try {\n ws.close();\n } catch {}\n resolve();\n };\n const timer = setTimeout(finish, 3000);\n let ws: WebSocket;\n let nextId = 1;\n try {\n ws = new WebSocket(wsUrl);\n } catch {\n finish();\n return;\n }\n ws.onopen = () => {\n if (needsAttach) {\n ws.send(JSON.stringify({ id: nextId++, method: 'Target.attachToTarget', params: { targetId, flatten: true } }));\n } else {\n ws.send(JSON.stringify({ id: nextId++, method: 'Runtime.terminateExecution' }));\n setTimeout(finish, 300);\n }\n };\n ws.onmessage = (event) => {\n if (!needsAttach) return;\n try {\n const msg = JSON.parse(String(event.data)) as Record<string, unknown>;\n const result = msg.result as Record<string, unknown> | undefined;\n if (msg.id !== undefined && result?.sessionId !== undefined) {\n const sessionId = result.sessionId as string;\n ws.send(JSON.stringify({ id: nextId++, sessionId, method: 'Runtime.terminateExecution' }));\n try {\n ws.send(\n JSON.stringify({\n id: nextId++,\n method: 'Target.detachFromTarget',\n params: { sessionId },\n }),\n );\n } catch {\n /* noop */\n }\n setTimeout(finish, 300);\n }\n } catch {\n /* noop */\n }\n };\n ws.onerror = () => {\n finish();\n };\n ws.onclose = () => {\n finish();\n };\n });\n}\n\n/**\n * Force-disconnect the ENTIRE Playwright browser connection, not just one target.\n * Clears the connection cache, optionally sends Runtime.terminateExecution to\n * a specific target via raw CDP websocket to kill stuck evals (bypassing\n * Playwright), then closes the browser — which disconnects ALL tabs.\n * The targetId parameter is only used to send Runtime.terminateExecution before closing.\n */\nexport async function forceDisconnectPlaywrightConnection(opts: {\n cdpUrl: string;\n targetId?: string;\n reason?: string;\n}): Promise<void> {\n const normalized = normalizeCdpUrl(opts.cdpUrl);\n const cur = cachedByCdpUrl.get(normalized);\n if (!cur) return;\n\n cachedByCdpUrl.delete(normalized);\n connectingByCdpUrl.delete(normalized);\n\n if (cur.onDisconnected && typeof cur.browser.off === 'function') {\n cur.browser.off('disconnected', cur.onDisconnected);\n }\n\n const targetId = opts.targetId?.trim() ?? '';\n if (targetId !== '') {\n await tryTerminateExecutionViaCdp(normalized, targetId).catch(() => {\n /* noop */\n });\n }\n\n cur.browser.close().catch(() => {\n /* noop */\n });\n}\n\n/** @deprecated Use `forceDisconnectPlaywrightConnection` instead. */\nexport const forceDisconnectPlaywrightForTarget = forceDisconnectPlaywrightConnection;\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 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 (targetInfo?.targetId ?? '').trim() || null;\n } finally {\n await session.detach().catch(() => {\n /* noop */\n });\n }\n}\n\nfunction matchPageByTargetList(pages: Page[], targets: CdpTarget[], targetId: string): Page | null {\n const target = targets.find((entry) => entry.id === targetId);\n if (!target) return null;\n const urlMatch = pages.filter((page) => page.url() === target.url);\n if (urlMatch.length === 1) return urlMatch[0] ?? null;\n if (urlMatch.length > 1) {\n const sameUrlTargets = targets.filter((entry) => entry.url === target.url);\n if (sameUrlTargets.length === urlMatch.length) {\n const idx = sameUrlTargets.findIndex((entry) => entry.id === targetId);\n if (idx >= 0 && idx < urlMatch.length) return urlMatch[idx] ?? null;\n }\n }\n return null;\n}\n\nasync function findPageByTargetIdViaTargetList(pages: Page[], targetId: string, cdpUrl: string): Promise<Page | null> {\n const targets = await fetchJsonForCdp(\n appendCdpPath(normalizeCdpHttpBaseForJsonEndpoints(cdpUrl), '/json/list'),\n 2000,\n );\n if (!Array.isArray(targets)) return null;\n return matchPageByTargetList(pages, targets as CdpTarget[], targetId);\n}\n\nexport async function findPageByTargetId(browser: Browser, targetId: string, cdpUrl?: string) {\n const pages = getAllPages(browser);\n\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 !== null && tid !== '' && tid === targetId) return page;\n }\n\n if (cdpUrl !== undefined && cdpUrl !== '') {\n try {\n return await findPageByTargetIdViaTargetList(pages, targetId, cdpUrl);\n } catch {}\n }\n\n // Last resort: if CDP sessions failed for all pages and there's only one, return it\n if (!resolvedViaCdp && pages.length === 1) return pages[0] ?? null;\n return null;\n}\n\nasync function partitionAccessiblePages(opts: {\n cdpUrl: string;\n pages: Page[];\n}): Promise<{ accessible: Page[]; blockedCount: number }> {\n const accessible: Page[] = [];\n let blockedCount = 0;\n for (const page of opts.pages) {\n if (isBlockedPageRef(opts.cdpUrl, page)) {\n blockedCount += 1;\n continue;\n }\n const targetId = await pageTargetId(page).catch(() => null);\n if (targetId === null || targetId === '') {\n if (hasBlockedTargetsForCdpUrl(opts.cdpUrl)) {\n blockedCount += 1;\n continue;\n }\n accessible.push(page);\n continue;\n }\n if (isBlockedTarget(opts.cdpUrl, targetId)) {\n blockedCount += 1;\n continue;\n }\n accessible.push(page);\n }\n return { accessible, blockedCount };\n}\n\nexport async function getPageForTargetId(opts: { cdpUrl: string; targetId?: string }) {\n if (opts.targetId !== undefined && opts.targetId !== '' && isBlockedTarget(opts.cdpUrl, opts.targetId))\n throw new BlockedBrowserTargetError();\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = getAllPages(browser);\n if (!pages.length) throw new Error('No pages available in the connected browser.');\n const { accessible, blockedCount } = await partitionAccessiblePages({ cdpUrl: opts.cdpUrl, pages });\n if (!accessible.length) {\n if (blockedCount > 0) throw new BlockedBrowserTargetError();\n throw new Error('No pages available in the connected browser.');\n }\n const first = accessible[0];\n if (opts.targetId === undefined || 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 BrowserTabNotFoundError(\n `Tab not found (targetId: ${opts.targetId}). Call browser.tabs() to list open tabs.`,\n );\n }\n if (isBlockedPageRef(opts.cdpUrl, found)) throw new BlockedBrowserTargetError();\n const foundTargetId = await pageTargetId(found).catch(() => null);\n if (foundTargetId !== null && foundTargetId !== '' && isBlockedTarget(opts.cdpUrl, foundTargetId))\n throw new BlockedBrowserTargetError();\n return found;\n}\n\n/**\n * Resolve a page by targetId or throw BrowserTabNotFoundError.\n */\nexport async function resolvePageByTargetIdOrThrow(opts: { cdpUrl: string; targetId: string }): Promise<Page> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const page = await findPageByTargetId(browser, opts.targetId, opts.cdpUrl);\n if (!page) throw new BrowserTabNotFoundError();\n return page;\n}\n\n/**\n * Get a page for a target, ensuring page state is initialized and role refs are restored.\n */\nexport async function getRestoredPageForTarget(opts: { cdpUrl: string; targetId?: string }): Promise<Page> {\n const page = await getPageForTargetId(opts);\n ensurePageState(page);\n restoreRoleRefsForTarget({ cdpUrl: opts.cdpUrl, targetId: opts.targetId, page });\n return page;\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n normalizeTimeoutMs,\n forceDisconnectPlaywrightConnection,\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 = 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: unknown = await frame.evaluate((fnBody: string) => {\n 'use strict';\n try {\n const candidate: unknown = (0, eval)('(' + fnBody + ')');\n return typeof candidate === 'function' ? (candidate as () => unknown)() : candidate;\n } catch (err: unknown) {\n throw new Error('Invalid evaluate function: ' + (err instanceof Error ? err.message : String(err)));\n }\n }, fnText);\n results.push({\n frameUrl: frame.url(),\n frameName: frame.name(),\n result,\n });\n } catch (err) {\n console.warn('[browserclaw] frame evaluate failed:', err instanceof Error ? err.message : String(err));\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 /* suppress unhandled rejection */\n });\n throw err;\n }\n}\n\n// Browser-side evaluators: intentionally use eval() to execute user-provided\n// browser-side code. This is the core purpose — running arbitrary JS in the\n// page sandbox. The fallback path handles statement-form code (template\n// literals, multi-statement blocks) that fail expression-mode eval.\n\n// eslint-disable-next-line @typescript-eslint/no-implied-eval\nconst BROWSER_EVALUATOR = new Function(\n 'args',\n [\n '\"use strict\";',\n 'var fnBody = args.fnBody, timeoutMs = args.timeoutMs;',\n 'try {',\n ' var candidate;',\n ' try { candidate = eval(\"(\" + fnBody + \")\"); }',\n ' catch (_) { candidate = (0, 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 ].join('\\n'),\n);\n\n// eslint-disable-next-line @typescript-eslint/no-implied-eval\nconst ELEMENT_EVALUATOR = new Function(\n 'el',\n 'args',\n [\n '\"use strict\";',\n 'var fnBody = args.fnBody, timeoutMs = args.timeoutMs;',\n 'try {',\n ' var candidate;',\n ' try { candidate = eval(\"(\" + fnBody + \")\"); }',\n ' catch (_) { candidate = (0, 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 ].join('\\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 = 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 !== undefined) {\n abortPromise = new Promise<never>((_, reject) => {\n abortReject = reject;\n });\n abortPromise.catch(() => {\n /* suppress unhandled rejection */\n });\n }\n\n if (signal !== undefined) {\n const disconnect = () => {\n forceDisconnectPlaywrightConnection({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'evaluate aborted',\n }).catch(() => {\n /* intentional no-op */\n });\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 // Re-check after adding listener to handle race where signal was aborted between checks\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (signal.aborted) {\n abortListener();\n throw signal.reason ?? new Error('aborted');\n }\n }\n\n try {\n if (opts.ref !== undefined && opts.ref !== '') {\n const locator = refLocator(page, opts.ref);\n return await awaitEvalWithAbort(\n locator.evaluate(ELEMENT_EVALUATOR as (...args: unknown[]) => unknown, {\n fnBody: fnText,\n timeoutMs: evaluateTimeout,\n }),\n abortPromise,\n );\n }\n\n return await awaitEvalWithAbort(\n page.evaluate(BROWSER_EVALUATOR as (...args: unknown[]) => unknown, {\n fnBody: fnText,\n timeoutMs: evaluateTimeout,\n }),\n abortPromise,\n );\n } finally {\n if (signal && abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { lookup as dnsLookupCb } from 'node:dns';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { lstat, realpath, rename, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport {\n resolve,\n normalize,\n dirname,\n basename,\n join,\n sep,\n relative,\n posix,\n win32,\n isAbsolute as pathIsAbsolute,\n} from 'node:path';\n\nimport * as ipaddr from 'ipaddr.js';\n\nimport { hasProxyEnvConfigured } from './chrome-launcher.js';\nimport type { SsrfPolicy, PinnedHostname } from './types.js';\n\n// ── Default temp directories for downloads/uploads ──\n\nfunction resolveDefaultBrowserTmpDir(): string {\n try {\n if (process.platform === 'linux' || process.platform === 'darwin') {\n return '/tmp/browserclaw';\n }\n } catch {\n /* fallback below */\n }\n return join(tmpdir(), 'browserclaw');\n}\n\nexport const DEFAULT_BROWSER_TMP_DIR = resolveDefaultBrowserTmpDir();\nexport const DEFAULT_DOWNLOAD_DIR = join(DEFAULT_BROWSER_TMP_DIR, 'downloads');\nexport const DEFAULT_UPLOAD_DIR = join(DEFAULT_BROWSER_TMP_DIR, 'uploads');\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 interface BrowserNavigationPolicyOptions {\n ssrfPolicy?: SsrfPolicy;\n}\n\n/** Playwright-compatible request interface for redirect chain inspection. */\nexport interface 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 BLOCKED_HOSTNAMES = new Set(['localhost', 'localhost.localdomain', 'metadata.google.internal']);\n\nfunction isAllowedNonNetworkNavigationUrl(parsed: URL): boolean {\n return SAFE_NON_NETWORK_URLS.has(parsed.href);\n}\n\nfunction isPrivateNetworkAllowedByPolicy(policy?: SsrfPolicy): boolean {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return policy?.dangerouslyAllowPrivateNetwork === true || policy?.allowPrivateNetwork === true;\n}\n\n// ── Hostname normalization & blocking ──\n\nfunction normalizeHostname(hostname: string): string {\n let h = hostname.trim().toLowerCase();\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\nconst BLOCKED_IPV4_RANGES = new Set([\n 'unspecified',\n 'broadcast',\n 'multicast',\n 'linkLocal',\n 'loopback',\n 'carrierGradeNat',\n 'private',\n 'reserved',\n]);\n\nconst BLOCKED_IPV6_RANGES = new Set([\n 'unspecified',\n 'loopback',\n 'linkLocal',\n 'uniqueLocal',\n 'multicast',\n 'reserved',\n 'benchmarking',\n 'discard',\n 'orchid2',\n]);\n\nconst RFC2544_BENCHMARK_PREFIX: [ipaddr.IPv4, number] = [ipaddr.IPv4.parse('198.18.0.0'), 15];\n\ninterface IsPrivateIpOpts {\n allowRfc2544BenchmarkRange?: boolean;\n}\n\nconst EMBEDDED_IPV4_SENTINEL_RULES: {\n matches: (parts: number[]) => boolean;\n toHextets: (parts: number[]) => [number, number];\n}[] = [\n // IPv4-compatible (::a.b.c.d)\n {\n matches: (parts) =>\n parts[0] === 0 && parts[1] === 0 && parts[2] === 0 && parts[3] === 0 && parts[4] === 0 && parts[5] === 0,\n toHextets: (parts) => [parts[6], parts[7]],\n },\n // NAT64 local-use (64:ff9b:1::/48)\n {\n matches: (parts) =>\n parts[0] === 100 && parts[1] === 65435 && parts[2] === 1 && parts[3] === 0 && parts[4] === 0 && parts[5] === 0,\n toHextets: (parts) => [parts[6], parts[7]],\n },\n // 6to4 (2002::/16)\n {\n matches: (parts) => parts[0] === 0x2002,\n toHextets: (parts) => [parts[1], parts[2]],\n },\n // Teredo (2001:0000::/32) — IPv4 XOR'd\n {\n matches: (parts) => parts[0] === 0x2001 && parts[1] === 0x0000,\n toHextets: (parts) => [parts[6] ^ 0xffff, parts[7] ^ 0xffff],\n },\n // ISATAP — sentinel in parts[4-5]: 0x0000:0x5efe or 0x0200:0x5efe\n {\n matches: (parts) => (parts[4] & 0xfcff) === 0 && parts[5] === 0x5efe,\n toHextets: (parts) => [parts[6], parts[7]],\n },\n];\n\nfunction stripIpv6Brackets(value: string): string {\n if (value.startsWith('[') && value.endsWith(']')) return value.slice(1, -1);\n return value;\n}\n\nfunction isNumericIpv4LiteralPart(value: string): boolean {\n return /^[0-9]+$/.test(value) || /^0x[0-9a-f]+$/i.test(value);\n}\n\nfunction parseIpv6WithEmbeddedIpv4(raw: string): ipaddr.IPv6 | undefined {\n if (!raw.includes(':') || !raw.includes('.')) return;\n const match = /^(.*:)([^:%]+(?:\\.[^:%]+){3})(%[0-9A-Za-z]+)?$/i.exec(raw);\n if (!match) return;\n const [, prefix, embeddedIpv4, zoneSuffix = ''] = match;\n if (!ipaddr.IPv4.isValidFourPartDecimal(embeddedIpv4)) return;\n const octets = embeddedIpv4.split('.').map((part) => Number.parseInt(part, 10));\n const normalizedIpv6 = `${prefix}${((octets[0] << 8) | octets[1]).toString(16)}:${((octets[2] << 8) | octets[3]).toString(16)}${zoneSuffix}`;\n if (!ipaddr.IPv6.isValid(normalizedIpv6)) return;\n return ipaddr.IPv6.parse(normalizedIpv6);\n}\n\nfunction normalizeIpParseInput(raw: string | undefined | null): string | undefined {\n const trimmed = raw?.trim();\n if (trimmed === undefined || trimmed === '') return;\n return stripIpv6Brackets(trimmed);\n}\n\nfunction parseCanonicalIpAddress(raw: string): ipaddr.IPv4 | ipaddr.IPv6 | undefined {\n const normalized = normalizeIpParseInput(raw);\n if (normalized === undefined) return;\n if (ipaddr.IPv4.isValid(normalized)) {\n if (!ipaddr.IPv4.isValidFourPartDecimal(normalized)) return;\n return ipaddr.IPv4.parse(normalized);\n }\n if (ipaddr.IPv6.isValid(normalized)) return ipaddr.IPv6.parse(normalized);\n return parseIpv6WithEmbeddedIpv4(normalized);\n}\n\nfunction parseLooseIpAddress(raw: string): ipaddr.IPv4 | ipaddr.IPv6 | undefined {\n const normalized = normalizeIpParseInput(raw);\n if (normalized === undefined) return;\n if (ipaddr.isValid(normalized)) return ipaddr.parse(normalized);\n return parseIpv6WithEmbeddedIpv4(normalized);\n}\n\nfunction isCanonicalDottedDecimalIPv4(raw: string): boolean {\n const trimmed = raw.trim();\n if (trimmed === '') return false;\n const normalized = stripIpv6Brackets(trimmed);\n if (!normalized) return false;\n return ipaddr.IPv4.isValidFourPartDecimal(normalized);\n}\n\nfunction isLegacyIpv4Literal(raw: string): boolean {\n const trimmed = raw.trim();\n if (trimmed === '') return false;\n const normalized = stripIpv6Brackets(trimmed);\n if (!normalized || normalized.includes(':')) return false;\n if (isCanonicalDottedDecimalIPv4(normalized)) return false;\n const parts = normalized.split('.');\n if (parts.length === 0 || parts.length > 4) return false;\n if (parts.some((part) => part.length === 0)) return false;\n if (!parts.every((part) => isNumericIpv4LiteralPart(part))) return false;\n return true;\n}\n\nfunction looksLikeUnsupportedIpv4Literal(address: string): boolean {\n const parts = address.split('.');\n if (parts.length === 0 || parts.length > 4) return false;\n if (parts.some((part) => part.length === 0)) return true;\n return parts.every((part) => /^[0-9]+$/.test(part) || /^0x/i.test(part));\n}\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 return (address.parts[0] & 0xffc0) === 0xfec0;\n}\n\nfunction decodeIpv4FromHextets(high: number, low: number): ipaddr.IPv4 {\n const octets = [(high >>> 8) & 0xff, high & 0xff, (low >>> 8) & 0xff, low & 0xff];\n return ipaddr.IPv4.parse(octets.join('.'));\n}\n\nfunction extractEmbeddedIpv4FromIpv6(address: ipaddr.IPv6): ipaddr.IPv4 | undefined {\n if (address.isIPv4MappedAddress()) return address.toIPv4Address();\n if (address.range() === 'rfc6145') return decodeIpv4FromHextets(address.parts[6], address.parts[7]);\n if (address.range() === 'rfc6052') return decodeIpv4FromHextets(address.parts[6], address.parts[7]);\n for (const rule of EMBEDDED_IPV4_SENTINEL_RULES) {\n if (!rule.matches(address.parts)) continue;\n const [high, low] = rule.toHextets(address.parts);\n return decodeIpv4FromHextets(high, low);\n }\n}\n\nfunction resolveIpv4SpecialUseBlockOptions(policy?: SsrfPolicy): IsPrivateIpOpts {\n return { allowRfc2544BenchmarkRange: policy?.allowRfc2544BenchmarkRange === true };\n}\n\nfunction isBlockedHostnameOrIp(hostname: string, policy?: SsrfPolicy): boolean {\n const normalized = normalizeHostname(hostname);\n if (!normalized) return false;\n return isBlockedHostnameNormalized(normalized) || isPrivateIpAddress(normalized, policy);\n}\n\nfunction isPrivateIpAddress(address: string, policy?: SsrfPolicy): 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 const blockOptions = resolveIpv4SpecialUseBlockOptions(policy);\n\n const strictIp = parseCanonicalIpAddress(normalized);\n if (strictIp) {\n if (strictIp.kind() === 'ipv4') return isBlockedSpecialUseIpv4Address(strictIp as ipaddr.IPv4, blockOptions);\n const v6 = strictIp as ipaddr.IPv6;\n if (isBlockedSpecialUseIpv6Address(v6)) return true;\n const embeddedIpv4 = extractEmbeddedIpv4FromIpv6(v6);\n if (embeddedIpv4) return isBlockedSpecialUseIpv4Address(embeddedIpv4, blockOptions);\n return false;\n }\n\n if (normalized.includes(':') && !parseLooseIpAddress(normalized)) return true;\n if (!isCanonicalDottedDecimalIPv4(normalized) && isLegacyIpv4Literal(normalized)) return true;\n if (looksLikeUnsupportedIpv4Literal(normalized)) return true;\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, policy?: SsrfPolicy): 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, policy)) 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(values.map((v) => normalizeHostname(v)).filter((v) => v !== '*' && v !== '*.' && v.length > 0)),\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 if (params.addresses.length === 0)\n throw new Error(`Pinned lookup requires at least one address for ${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 // dns.lookup has complex overloads; we use a loosely-typed inner signature\n // and cast the result back to the proper type at the boundary.\n type DnsLookupArg = string | number | { all?: boolean; family?: number } | ((...a: unknown[]) => void) | undefined;\n return ((_host: string, ...rest: DnsLookupArg[]) => {\n const second = rest[0];\n const third = rest[1];\n const cb = typeof second === 'function' ? second : typeof third === 'function' ? third : undefined;\n if (cb === undefined) return;\n\n const normalized = normalizeHostname(_host);\n if (normalized === '' || normalized !== normalizedHost) {\n if (typeof second === 'function' || second === undefined) {\n (fallback as (...a: unknown[]) => void)(_host, cb);\n return;\n }\n (fallback as (...a: unknown[]) => void)(_host, second, cb);\n return;\n }\n\n const opts: { all?: boolean; family?: number } =\n typeof second === 'object' ? (second as { all?: boolean; family?: number }) : {};\n const requestedFamily = typeof second === 'number' ? second : typeof opts.family === 'number' ? opts.family : 0;\n const candidates =\n 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 === true) {\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(\n hostname: string,\n params: {\n lookupFn?: LookupFn;\n policy?: SsrfPolicy;\n } = {},\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(`Navigation blocked: hostname \"${hostname}\" is not in the allowlist.`);\n }\n\n if (!skipPrivateNetworkChecks) {\n if (isBlockedHostnameOrIp(normalized, params.policy)) {\n throw new InvalidBrowserNavigationUrlError(\n `Navigation to internal/loopback address blocked: \"${hostname}\". ssrfPolicy.dangerouslyAllowPrivateNetwork is false (strict mode).`,\n );\n }\n }\n\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.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 if (!skipPrivateNetworkChecks) {\n for (const r of results) {\n if (isBlockedHostnameOrIp(r.address, params.policy)) {\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(\n opts: {\n url: string;\n lookupFn?: LookupFn;\n } & BrowserNavigationPolicyOptions,\n): Promise<void> {\n const rawUrl = opts.url.trim();\n if (rawUrl === '') throw new InvalidBrowserNavigationUrlError('url is required');\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 !== undefined && allowedRoots.length > 0) {\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/**\n * Resolve and validate upload file paths, returning them if all are safe.\n * Returns `{ ok: true, paths }` or `{ ok: false, error }`.\n */\nexport async function resolveStrictExistingUploadPaths(params: {\n requestedPaths: string[];\n scopeLabel?: string;\n}): Promise<{ ok: true; paths: string[] } | { ok: false; error: string }> {\n try {\n await assertSafeUploadPaths(params.requestedPaths);\n return { ok: true, paths: params.requestedPaths };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n// ── Path confinement utilities ──\n\ntype PathResult = { ok: true; path: string } | { ok: false; error: string };\ntype PathsResult = { ok: true; paths: string[] } | { ok: false; error: string };\n\n/**\n * Lexical confinement: resolve(root, raw) must not escape root.\n */\nexport function resolvePathWithinRoot(params: {\n rootDir: string;\n requestedPath: string;\n scopeLabel: string;\n defaultFileName?: string;\n}): PathResult {\n const root = resolve(params.rootDir);\n const raw = params.requestedPath.trim();\n const effectivePath =\n raw === '' && params.defaultFileName != null && params.defaultFileName !== '' ? params.defaultFileName : raw;\n if (effectivePath === '') return { ok: false, error: `Empty path is not allowed (${params.scopeLabel}).` };\n\n const resolved = resolve(root, effectivePath);\n const rel = relative(root, resolved);\n if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || pathIsAbsolute(rel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel}: \"${params.requestedPath}\".` };\n }\n return { ok: true, path: resolved };\n}\n\n/**\n * Async writable-path check: verifies parent dir realpath is within root,\n * and that the target (if it exists) is not a symlink.\n */\nexport async function resolveWritablePathWithinRoot(params: {\n rootDir: string;\n requestedPath: string;\n scopeLabel: string;\n defaultFileName?: string;\n}): Promise<PathResult> {\n const lexical = resolvePathWithinRoot(params);\n if (!lexical.ok) return lexical;\n\n const root = resolve(params.rootDir);\n const target = lexical.path;\n\n let parentReal: string;\n try {\n parentReal = await realpath(dirname(target));\n } catch {\n return {\n ok: false,\n error: `Parent directory is inaccessible for \"${params.requestedPath}\" (${params.scopeLabel}).`,\n };\n }\n\n const parentRel = relative(root, parentReal);\n if (parentRel === '..' || parentRel.startsWith(`..${sep}`) || pathIsAbsolute(parentRel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel} via symlink: \"${params.requestedPath}\".` };\n }\n\n try {\n const stat = await lstat(target);\n if (stat.isSymbolicLink()) {\n return { ok: false, error: `Path is a symbolic link (${params.scopeLabel}): \"${params.requestedPath}\".` };\n }\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') {\n return {\n ok: false,\n error: `Cannot stat \"${params.requestedPath}\" (${params.scopeLabel}): ${(e as Error).message}`,\n };\n }\n }\n\n return { ok: true, path: target };\n}\n\n/**\n * For each path: lexical check then realpath check. Missing files are allowed\n * (returns the fallback resolved path).\n */\nexport async function resolveExistingPathsWithinRoot(params: {\n rootDir: string;\n requestedPaths: string[];\n scopeLabel: string;\n}): Promise<PathsResult> {\n const root = resolve(params.rootDir);\n const resolved: string[] = [];\n\n for (const raw of params.requestedPaths) {\n const lexical = resolvePathWithinRoot({ rootDir: root, requestedPath: raw, scopeLabel: params.scopeLabel });\n if (!lexical.ok) return lexical;\n\n try {\n const real = await realpath(lexical.path);\n const rel = relative(root, real);\n if (rel === '..' || rel.startsWith(`..${sep}`) || pathIsAbsolute(rel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel} via symlink: \"${raw}\".` };\n }\n resolved.push(real);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') {\n resolved.push(lexical.path);\n } else {\n return { ok: false, error: `Cannot resolve \"${raw}\" (${params.scopeLabel}): ${(e as Error).message}` };\n }\n }\n }\n\n return { ok: true, paths: resolved };\n}\n\n/**\n * Same as resolveExistingPathsWithinRoot but missing files are NOT allowed.\n */\nexport async function resolveStrictExistingPathsWithinRoot(params: {\n rootDir: string;\n requestedPaths: string[];\n scopeLabel: string;\n}): Promise<PathsResult> {\n const root = resolve(params.rootDir);\n const resolved: string[] = [];\n\n for (const raw of params.requestedPaths) {\n const lexical = resolvePathWithinRoot({ rootDir: root, requestedPath: raw, scopeLabel: params.scopeLabel });\n if (!lexical.ok) return lexical;\n\n let real: string;\n try {\n real = await realpath(lexical.path);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') {\n return { ok: false, error: `Path does not exist (${params.scopeLabel}): \"${raw}\".` };\n }\n return { ok: false, error: `Cannot resolve \"${raw}\" (${params.scopeLabel}): ${(e as Error).message}` };\n }\n\n const rel = relative(root, real);\n if (rel === '..' || rel.startsWith(`..${sep}`) || pathIsAbsolute(rel)) {\n return { ok: false, error: `Path escapes ${params.scopeLabel} via symlink: \"${raw}\".` };\n }\n\n const stat = await lstat(real);\n if (stat.isSymbolicLink()) {\n return { ok: false, error: `Path is a symbolic link (${params.scopeLabel}): \"${raw}\".` };\n }\n if (!stat.isFile()) {\n return { ok: false, error: `Path is not a regular file (${params.scopeLabel}): \"${raw}\".` };\n }\n\n resolved.push(real);\n }\n\n return { ok: true, paths: resolved };\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 = fileName.trim();\n if (trimmed === '') return fallbackName;\n\n let base = posix.basename(trimmed);\n base = win32.basename(base);\n\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)\n await rm(tempPath, { force: true }).catch(() => {\n /* noop */\n });\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(\n opts: {\n url: string;\n lookupFn?: LookupFn;\n } & BrowserNavigationPolicyOptions,\n): Promise<void> {\n const rawUrl = 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(\n opts: {\n request?: BrowserNavigationRequestLike | null;\n lookupFn?: LookupFn;\n } & BrowserNavigationPolicyOptions,\n): 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 type { Locator, Page } from 'playwright-core';\n\nimport {\n getPageForTargetId,\n ensurePageState,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpUploadArmId,\n bumpDialogArmId,\n requireRef,\n requireRefOrSelector,\n resolveInteractionTimeoutMs,\n resolveBoundedDelayMs,\n getRestoredPageForTarget,\n parseRoleRef,\n withPageScopedCdpClient,\n} from '../connection.js';\nimport { resolveStrictExistingPathsWithinRoot, DEFAULT_UPLOAD_DIR } 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;\nconst DEFAULT_SCROLL_TIMEOUT_MS = 20_000;\nconst CHECKABLE_ROLES = new Set(['menuitemcheckbox', 'menuitemradio', 'checkbox', 'radio', 'switch']);\n\n/**\n * Fallback for setChecked on hidden styled inputs (opacity:0, position:absolute).\n * Sets the checked property directly via the native setter and dispatches events.\n */\nasync function setCheckedViaEvaluate(locator: Locator, checked: boolean): Promise<void> {\n await locator.evaluate((el: Element, desired: boolean) => {\n const input = el as HTMLInputElement;\n const desc = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked');\n if (desc?.set) desc.set.call(input, desired);\n else input.checked = desired;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n input.click();\n }, checked);\n}\n\nfunction resolveLocator(page: Page, resolved: { ref?: string; selector?: string }) {\n if (resolved.ref !== undefined && resolved.ref !== '') return refLocator(page, resolved.ref);\n const sel = resolved.selector ?? '';\n return page.locator(sel);\n}\n\nexport async function mouseClickViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n x: number;\n y: number;\n button?: MouseButton;\n clickCount?: number;\n delayMs?: number;\n}): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n await page.mouse.click(opts.x, opts.y, {\n button: opts.button,\n clickCount: opts.clickCount,\n delay: opts.delayMs,\n });\n}\n\nexport async function pressAndHoldViaCdp(opts: {\n cdpUrl: string;\n targetId?: string;\n x: number;\n y: number;\n delay?: number;\n holdMs?: number;\n}): Promise<void> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const { x, y } = opts;\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n await send('Input.dispatchMouseEvent', { type: 'mouseMoved', x, y, button: 'none' });\n if (opts.delay !== undefined && opts.delay !== 0) await new Promise((r) => setTimeout(r, opts.delay));\n await send('Input.dispatchMouseEvent', { type: 'mousePressed', x, y, button: 'left', clickCount: 1 });\n if (opts.holdMs !== undefined && opts.holdMs !== 0) await new Promise((r) => setTimeout(r, opts.holdMs));\n await send('Input.dispatchMouseEvent', { type: 'mouseReleased', x, y, button: 'left', clickCount: 1 });\n },\n });\n}\n\nexport async function clickByTextViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n text: string;\n exact?: boolean;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n const locator = page\n .getByText(opts.text, { exact: opts.exact })\n .or(page.getByTitle(opts.text, { exact: opts.exact }))\n .and(page.locator(':visible'))\n .first();\n try {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers });\n } catch (err) {\n throw toAIFriendlyError(err, `text=\"${opts.text}\"`);\n }\n}\n\nexport async function clickByRoleViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n role: string;\n name?: string;\n index?: number;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n timeoutMs?: number;\n}): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n const label = `role=${opts.role}${opts.name !== undefined && opts.name !== '' ? ` name=\"${opts.name}\"` : ''}`;\n const locator = page\n .getByRole(opts.role as Parameters<typeof page.getByRole>[0], { name: opts.name })\n .nth(opts.index ?? 0);\n try {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function clickViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n doubleClick?: boolean;\n button?: MouseButton;\n modifiers?: KeyModifier[];\n delayMs?: number;\n timeoutMs?: number;\n force?: boolean;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n\n // Determine if this is a checkable role element so we can verify the click worked.\n let checkableRole = false;\n if (resolved.ref !== undefined && resolved.ref !== '') {\n const refId = parseRoleRef(resolved.ref);\n if (refId !== null) {\n const state = ensurePageState(page);\n const info = state.roleRefs?.[refId];\n if (info && CHECKABLE_ROLES.has(info.role)) checkableRole = true;\n }\n }\n\n try {\n const delayMs = resolveBoundedDelayMs(opts.delayMs, 'click delayMs', MAX_CLICK_DELAY_MS);\n if (delayMs > 0) {\n await locator.hover({ timeout, force: opts.force });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n // For checkable roles, capture aria-checked before the click.\n let ariaCheckedBefore: string | null | undefined;\n if (checkableRole && opts.doubleClick !== true) {\n ariaCheckedBefore = await locator.getAttribute('aria-checked', { timeout }).catch(() => undefined);\n }\n\n if (opts.doubleClick === true) {\n await locator.dblclick({ timeout, button: opts.button, modifiers: opts.modifiers, force: opts.force });\n } else {\n await locator.click({ timeout, button: opts.button, modifiers: opts.modifiers, force: opts.force });\n }\n\n // If this is a checkable role and aria-checked didn't change, fall back to JS click.\n // Poll briefly to give async frameworks time to update the DOM before concluding\n // the click didn't work — otherwise we'd fire a second click that un-toggles it.\n if (checkableRole && opts.doubleClick !== true && ariaCheckedBefore !== undefined) {\n const POLL_INTERVAL_MS = 50;\n const POLL_TIMEOUT_MS = 500;\n let changed = false;\n for (let elapsed = 0; elapsed < POLL_TIMEOUT_MS; elapsed += POLL_INTERVAL_MS) {\n const current = await locator.getAttribute('aria-checked', { timeout }).catch(() => undefined);\n if (current === undefined || current !== ariaCheckedBefore) {\n changed = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n if (!changed) {\n await locator\n .evaluate((el: Element) => {\n (el as HTMLElement).click();\n })\n .catch(() => {\n /* intentional no-op */\n });\n }\n }\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function hoverViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n\n try {\n await locator.hover({ timeout: resolveInteractionTimeoutMs(opts.timeoutMs) });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function typeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n text: string;\n submit?: boolean;\n slowly?: boolean;\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const text = opts.text;\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\n\n try {\n if (opts.slowly === true) {\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 === true) await locator.press('Enter', { timeout });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function selectOptionViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n ref?: string;\n selector?: string;\n values: string[];\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n if (opts.values.length === 0) throw new Error('values are required');\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n\n try {\n await locator.selectOption(opts.values, { timeout: resolveInteractionTimeoutMs(opts.timeoutMs) });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function dragViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n startRef?: string;\n startSelector?: string;\n endRef?: string;\n endSelector?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const resolvedStart = requireRefOrSelector(opts.startRef, opts.startSelector);\n const resolvedEnd = requireRefOrSelector(opts.endRef, opts.endSelector);\n const page = await getRestoredPageForTarget(opts);\n const startLocator = resolveLocator(page, resolvedStart);\n const endLocator = resolveLocator(page, resolvedEnd);\n const startLabel = resolvedStart.ref ?? resolvedStart.selector ?? '';\n const endLabel = resolvedEnd.ref ?? resolvedEnd.selector ?? '';\n\n try {\n await startLocator.dragTo(endLocator, { timeout: resolveInteractionTimeoutMs(opts.timeoutMs) });\n } catch (err) {\n throw toAIFriendlyError(err, `${startLabel} -> ${endLabel}`);\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 getRestoredPageForTarget(opts);\n const timeout = resolveInteractionTimeoutMs(opts.timeoutMs);\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 =\n typeof rawValue === 'string'\n ? rawValue\n : typeof rawValue === 'number' || typeof rawValue === 'boolean'\n ? 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, force: true });\n } catch {\n try {\n await setCheckedViaEvaluate(locator, checked);\n } catch (err) {\n throw toAIFriendlyError(err, ref);\n }\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 selector?: string;\n timeoutMs?: number;\n}): Promise<void> {\n const resolved = requireRefOrSelector(opts.ref, opts.selector);\n const page = await getRestoredPageForTarget(opts);\n const label = resolved.ref ?? resolved.selector ?? '';\n const locator = resolveLocator(page, resolved);\n\n try {\n await locator.waitFor({\n state: 'attached',\n timeout: normalizeTimeoutMs(opts.timeoutMs, DEFAULT_SCROLL_TIMEOUT_MS),\n });\n await locator.evaluate((el: Element) => {\n el.scrollIntoView({ block: 'center', behavior: 'instant' });\n });\n } catch (err) {\n throw toAIFriendlyError(err, label);\n }\n}\n\nexport async function highlightViaPlaywright(opts: { cdpUrl: string; targetId?: string; ref: string }): Promise<void> {\n const page = await getRestoredPageForTarget(opts);\n const ref = requireRef(opts.ref);\n\n try {\n await refLocator(page, ref).highlight();\n } catch (err) {\n throw toAIFriendlyError(err, 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 getRestoredPageForTarget(opts);\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 ? refLocator(page, inputRef) : page.locator(element).first();\n\n const uploadPathsResult = await resolveStrictExistingPathsWithinRoot({\n rootDir: DEFAULT_UPLOAD_DIR,\n requestedPaths: opts.paths,\n scopeLabel: `uploads directory (${DEFAULT_UPLOAD_DIR})`,\n });\n if (!uploadPathsResult.ok) throw new Error(uploadPathsResult.error);\n const resolvedPaths = uploadPathsResult.paths;\n\n try {\n await locator.setInputFiles(resolvedPaths);\n } catch (err) {\n throw toAIFriendlyError(err, inputRef || element);\n }\n\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 /* intentional no-op */\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(state);\n const armId = state.armIdDialog;\n\n page\n .waitForEvent('dialog', { timeout })\n .then(async (dialog) => {\n if (state.armIdDialog !== armId) return;\n try {\n if (opts.accept) await dialog.accept(opts.promptText);\n else await dialog.dismiss();\n } finally {\n if (state.armIdDialog === armId) state.armIdDialog = 0;\n }\n })\n .catch(() => {\n if (state.armIdDialog === armId) state.armIdDialog = 0;\n });\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(state);\n const armId = state.armIdUpload;\n\n page\n .waitForEvent('filechooser', { timeout })\n .then(async (fileChooser) => {\n if (state.armIdUpload !== armId) return;\n\n if (opts.paths === undefined || opts.paths.length === 0) {\n try {\n await page.keyboard.press('Escape');\n } catch {\n /* intentional no-op */\n }\n return;\n }\n\n const uploadPathsResult = await resolveStrictExistingPathsWithinRoot({\n rootDir: DEFAULT_UPLOAD_DIR,\n requestedPaths: opts.paths,\n scopeLabel: `uploads directory (${DEFAULT_UPLOAD_DIR})`,\n });\n if (!uploadPathsResult.ok) {\n try {\n await page.keyboard.press('Escape');\n } catch {\n /* intentional no-op */\n }\n return;\n }\n\n await fileChooser.setFiles(uploadPathsResult.paths);\n\n try {\n const input = typeof fileChooser.element === 'function' ? await Promise.resolve(fileChooser.element()) : null;\n if (input !== null) {\n await input.evaluate((el: Element) => {\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n });\n }\n } catch {\n /* intentional no-op */\n }\n })\n .catch(() => {\n /* intentional no-op */\n });\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 = 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 type { Browser, BrowserContext, Page, Route, Request } from 'playwright-core';\n\nimport {\n BrowserTabNotFoundError,\n BlockedBrowserTargetError,\n connectBrowser,\n getPageForTargetId,\n ensurePageState,\n ensureContextState,\n observeContext,\n pageTargetId,\n getAllPages,\n forceDisconnectPlaywrightConnection,\n resolvePageByTargetIdOrThrow,\n withPageScopedCdpClient,\n isBlockedTarget,\n isBlockedPageRef,\n markTargetBlocked,\n markPageRefBlocked,\n clearBlockedPageRef,\n clearBlockedTarget,\n} from '../connection.js';\nimport {\n InvalidBrowserNavigationUrlError,\n assertBrowserNavigationAllowed,\n assertBrowserNavigationResultAllowed,\n assertBrowserNavigationRedirectChainAllowed,\n withBrowserNavigationPolicy,\n} from '../security.js';\nimport type { BrowserTab, SsrfPolicy } from '../types.js';\n\nconst recordingContexts = new Map<string, BrowserContext>();\n\nexport function clearRecordingContext(cdpUrl: string): void {\n recordingContexts.delete(cdpUrl);\n}\n\nasync function createRecordingContext(\n browser: Browser,\n cdpUrl: string,\n recordVideo: { dir: string; size?: { width: number; height: number } },\n): Promise<BrowserContext> {\n const context = await browser.newContext({ recordVideo });\n observeContext(context);\n recordingContexts.set(cdpUrl, context);\n context.on('close', () => recordingContexts.delete(cdpUrl));\n return context;\n}\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\nfunction isPolicyDenyNavigationError(err: unknown): boolean {\n return err instanceof InvalidBrowserNavigationUrlError;\n}\n\nfunction isTopLevelNavigationRequest(page: Page, request: Request): boolean {\n if (!request.isNavigationRequest()) return false;\n try {\n return request.frame() === page.mainFrame();\n } catch {\n return true;\n }\n}\n\nasync function closeBlockedNavigationTarget(opts: { cdpUrl: string; page: Page; targetId?: string }): Promise<void> {\n markPageRefBlocked(opts.cdpUrl, opts.page);\n const resolvedTargetId = await pageTargetId(opts.page).catch(() => null);\n const fallbackTargetId = opts.targetId?.trim() ?? '';\n const targetIdToBlock = resolvedTargetId ?? fallbackTargetId;\n if (targetIdToBlock) markTargetBlocked(opts.cdpUrl, targetIdToBlock);\n await opts.page.close().catch((e: unknown) => {\n console.warn('[browserclaw] failed to close blocked page', e);\n });\n}\n\nasync function assertPageNavigationCompletedSafely(opts: {\n cdpUrl: string;\n page: Page;\n response: Awaited<ReturnType<Page['goto']>>;\n ssrfPolicy?: SsrfPolicy;\n targetId?: string;\n}): Promise<void> {\n const navigationPolicy = withBrowserNavigationPolicy(opts.ssrfPolicy);\n try {\n await assertBrowserNavigationRedirectChainAllowed({ request: opts.response?.request(), ...navigationPolicy });\n await assertBrowserNavigationResultAllowed({ url: opts.page.url(), ...navigationPolicy });\n } catch (err) {\n if (isPolicyDenyNavigationError(err))\n await closeBlockedNavigationTarget({ cdpUrl: opts.cdpUrl, page: opts.page, targetId: opts.targetId });\n throw err;\n }\n}\n\nasync function gotoPageWithNavigationGuard(opts: {\n cdpUrl: string;\n page: Page;\n url: string;\n timeoutMs: number;\n ssrfPolicy?: SsrfPolicy;\n targetId?: string;\n}): Promise<Awaited<ReturnType<Page['goto']>>> {\n const navigationPolicy = withBrowserNavigationPolicy(opts.ssrfPolicy);\n const state: { blocked: Error | null } = { blocked: null };\n const handler = async (route: Route, request: Request) => {\n if (state.blocked !== null) {\n await route.abort().catch((e: unknown) => {\n console.warn('[browserclaw] route abort failed', e);\n });\n return;\n }\n if (!isTopLevelNavigationRequest(opts.page, request)) {\n await route.continue();\n return;\n }\n try {\n await assertBrowserNavigationAllowed({ url: request.url(), ...navigationPolicy });\n } catch (err) {\n if (isPolicyDenyNavigationError(err)) {\n state.blocked = err as Error;\n await route.abort().catch((e: unknown) => {\n console.warn('[browserclaw] route abort failed', e);\n });\n return;\n }\n throw err;\n }\n await route.continue();\n };\n await opts.page.route('**', handler);\n try {\n const response = await opts.page.goto(opts.url, { timeout: opts.timeoutMs });\n if (state.blocked !== null) throw state.blocked;\n return response;\n } catch (err) {\n if (state.blocked !== null) throw state.blocked;\n throw err;\n } finally {\n await opts.page.unroute('**', handler).catch((e: unknown) => {\n console.warn('[browserclaw] route unroute failed', e);\n });\n if (state.blocked !== null)\n await closeBlockedNavigationTarget({ cdpUrl: opts.cdpUrl, page: opts.page, targetId: opts.targetId });\n }\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 = opts.url.trim();\n if (!url) throw new Error('url is required');\n /* eslint-disable @typescript-eslint/no-deprecated */\n const policy =\n opts.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\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 () =>\n await gotoPageWithNavigationGuard({\n cdpUrl: opts.cdpUrl,\n page,\n url,\n timeoutMs: timeout,\n ssrfPolicy: policy,\n targetId: opts.targetId,\n });\n\n let response;\n try {\n response = await navigate();\n } catch (err) {\n if (!isRetryableNavigateError(err)) throw err;\n await forceDisconnectPlaywrightConnection({\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n reason: 'retry navigate after detached frame',\n }).catch(() => {\n /* intentional no-op */\n });\n page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n response = await navigate();\n }\n\n await assertPageNavigationCompletedSafely({\n cdpUrl: opts.cdpUrl,\n page,\n response,\n ssrfPolicy: policy,\n targetId: opts.targetId,\n });\n return { url: page.url() };\n}\n\nexport async function listPagesViaPlaywright(opts: { cdpUrl: string }): Promise<BrowserTab[]> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const pages = getAllPages(browser);\n const results: BrowserTab[] = [];\n for (const page of pages) {\n if (isBlockedPageRef(opts.cdpUrl, page)) continue;\n const tid = await pageTargetId(page).catch(() => null);\n if (tid !== null && tid !== '' && !isBlockedTarget(opts.cdpUrl, tid))\n 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 recordVideo?: { dir: string; size?: { width: number; height: number } };\n}): Promise<BrowserTab> {\n const { browser } = await connectBrowser(opts.cdpUrl);\n const context = opts.recordVideo\n ? (recordingContexts.get(opts.cdpUrl) ?? (await createRecordingContext(browser, opts.cdpUrl, opts.recordVideo)))\n : (browser.contexts()[0] ?? (await browser.newContext()));\n ensureContextState(context);\n const page = await context.newPage();\n ensurePageState(page);\n clearBlockedPageRef(opts.cdpUrl, page);\n const createdTargetId = await pageTargetId(page).catch(() => null);\n clearBlockedTarget(opts.cdpUrl, createdTargetId ?? undefined);\n\n const targetUrl = (opts.url ?? '').trim() || 'about:blank';\n /* eslint-disable @typescript-eslint/no-deprecated */\n const policy =\n opts.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\n\n if (targetUrl !== 'about:blank') {\n await assertBrowserNavigationAllowed({ url: targetUrl, ...withBrowserNavigationPolicy(policy) });\n let response: Awaited<ReturnType<Page['goto']>> = null;\n try {\n response = await gotoPageWithNavigationGuard({\n cdpUrl: opts.cdpUrl,\n page,\n url: targetUrl,\n timeoutMs: 30000,\n ssrfPolicy: policy,\n targetId: createdTargetId ?? undefined,\n });\n } catch (err) {\n if (isPolicyDenyNavigationError(err) || err instanceof BlockedBrowserTargetError) throw err;\n }\n await assertPageNavigationCompletedSafely({\n cdpUrl: opts.cdpUrl,\n page,\n response,\n ssrfPolicy: policy,\n targetId: createdTargetId ?? undefined,\n });\n }\n\n const tid = createdTargetId ?? (await pageTargetId(page).catch(() => null));\n if (tid === null || 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: { cdpUrl: string; targetId?: string }): 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: { cdpUrl: string; targetId: string }): Promise<void> {\n try {\n await (await resolvePageByTargetIdOrThrow(opts)).close();\n } catch (err) {\n if (err instanceof BrowserTabNotFoundError) return;\n throw err;\n }\n}\n\nexport async function focusPageByTargetIdViaPlaywright(opts: { cdpUrl: string; targetId: string }): Promise<void> {\n const page = await resolvePageByTargetIdOrThrow(opts);\n try {\n await page.bringToFront();\n } catch (err) {\n try {\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n await send('Page.bringToFront');\n },\n });\n return;\n } catch {\n throw err;\n }\n }\n}\n\nexport async function waitForTabViaPlaywright(opts: {\n cdpUrl: string;\n urlContains?: string;\n titleContains?: string;\n timeoutMs?: number;\n}): Promise<BrowserTab> {\n if (opts.urlContains === undefined && opts.titleContains === undefined)\n throw new Error('urlContains or titleContains is required');\n const timeout = Math.max(1000, Math.min(120000, opts.timeoutMs ?? 30000));\n const start = Date.now();\n const POLL_INTERVAL_MS = 250;\n\n while (Date.now() - start < timeout) {\n const tabs = await listPagesViaPlaywright({ cdpUrl: opts.cdpUrl });\n const match = tabs.find((t) => {\n if (opts.urlContains !== undefined && !t.url.includes(opts.urlContains)) return false;\n if (opts.titleContains !== undefined && !t.title.includes(opts.titleContains)) return false;\n return true;\n });\n if (match) return match;\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n const criteria: string[] = [];\n if (opts.urlContains !== undefined) criteria.push(`url contains \"${opts.urlContains}\"`);\n if (opts.titleContains !== undefined) criteria.push(`title contains \"${opts.titleContains}\"`);\n throw new Error(`Timed out waiting for tab: ${criteria.join(', ')}`);\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, resolveBoundedDelayMs } 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 | ((arg?: unknown) => unknown);\n arg?: unknown;\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(resolveBoundedDelayMs(opts.timeMs, 'wait timeMs', MAX_WAIT_TIME_MS));\n }\n if (opts.text !== undefined && opts.text !== '') {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- document.body is null before DOM ready\n await page.waitForFunction((text) => (document.body?.innerText ?? '').includes(text), opts.text, { timeout });\n }\n if (opts.textGone !== undefined && opts.textGone !== '') {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- document.body is null before DOM ready\n await page.waitForFunction((text) => !(document.body?.innerText ?? '').includes(text), opts.textGone, { timeout });\n }\n if (opts.selector !== undefined && opts.selector !== '') {\n const selector = opts.selector.trim();\n if (selector !== '') await page.locator(selector).first().waitFor({ state: 'visible', timeout });\n }\n if (opts.url !== undefined && opts.url !== '') {\n const url = opts.url.trim();\n if (url !== '') await page.waitForURL(url, { timeout });\n }\n if (opts.loadState !== undefined) {\n await page.waitForLoadState(opts.loadState, { timeout });\n }\n if (opts.fn !== undefined) {\n if (typeof opts.fn === 'function') {\n await page.waitForFunction(opts.fn, opts.arg, { timeout });\n } else {\n const fn = opts.fn.trim();\n if (fn !== '') await page.waitForFunction(fn, opts.arg, { timeout });\n }\n }\n}\n","import { evaluateViaPlaywright } from './evaluate.js';\nimport {\n clickViaPlaywright,\n hoverViaPlaywright,\n typeViaPlaywright,\n selectOptionViaPlaywright,\n dragViaPlaywright,\n fillFormViaPlaywright,\n scrollIntoViewViaPlaywright,\n} from './interaction.js';\nimport { pressKeyViaPlaywright } from './keyboard.js';\nimport { resizeViewportViaPlaywright, closePageViaPlaywright } from './navigation.js';\nimport { waitForViaPlaywright } from './wait.js';\n\nconst MAX_BATCH_DEPTH = 5;\nconst MAX_BATCH_ACTIONS = 100;\n\n/** A single action within a batch. */\nexport type BatchAction =\n | {\n kind: 'click';\n ref?: string;\n selector?: string;\n targetId?: string;\n doubleClick?: boolean;\n button?: string;\n modifiers?: string[];\n delayMs?: number;\n timeoutMs?: number;\n }\n | {\n kind: 'type';\n ref?: string;\n selector?: string;\n text: string;\n targetId?: string;\n submit?: boolean;\n slowly?: boolean;\n timeoutMs?: number;\n }\n | { kind: 'press'; key: string; targetId?: string; delayMs?: number }\n | { kind: 'hover'; ref?: string; selector?: string; targetId?: string; timeoutMs?: number }\n | { kind: 'scrollIntoView'; ref?: string; selector?: string; targetId?: string; timeoutMs?: number }\n | {\n kind: 'drag';\n startRef?: string;\n startSelector?: string;\n endRef?: string;\n endSelector?: string;\n targetId?: string;\n timeoutMs?: number;\n }\n | { kind: 'select'; ref?: string; selector?: string; values: string[]; targetId?: string; timeoutMs?: number }\n | {\n kind: 'fill';\n fields: { ref: string; type?: string; value?: string | number | boolean }[];\n targetId?: string;\n timeoutMs?: number;\n }\n | { kind: 'resize'; width: number; height: number; targetId?: string }\n | {\n kind: 'wait';\n timeMs?: number;\n text?: string;\n textGone?: string;\n selector?: string;\n url?: string;\n loadState?: 'load' | 'domcontentloaded' | 'networkidle';\n fn?: string;\n arg?: unknown;\n targetId?: string;\n timeoutMs?: number;\n }\n | { kind: 'evaluate'; fn: string; ref?: string; targetId?: string; timeoutMs?: number }\n | { kind: 'close'; targetId?: string }\n | { kind: 'batch'; actions: BatchAction[]; targetId?: string; stopOnError?: boolean };\n\n/** Result of a single action within a batch. */\nexport type BatchActionResult = { ok: true } | { ok: false; error: string };\n\n/**\n * Execute a single batch action.\n */\nexport async function executeSingleAction(\n action: BatchAction,\n cdpUrl: string,\n targetId: string | undefined,\n evaluateEnabled: boolean,\n depth = 0,\n): Promise<void> {\n if (depth > MAX_BATCH_DEPTH) throw new Error(`Batch nesting depth exceeds maximum of ${String(MAX_BATCH_DEPTH)}`);\n const effectiveTargetId = action.targetId ?? targetId;\n\n switch (action.kind) {\n case 'click':\n await clickViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n doubleClick: action.doubleClick,\n button: action.button as 'left' | 'right' | 'middle' | undefined,\n modifiers: action.modifiers as ('Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift')[] | undefined,\n delayMs: action.delayMs,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'type':\n await typeViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n text: action.text,\n submit: action.submit,\n slowly: action.slowly,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'press':\n await pressKeyViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n key: action.key,\n delayMs: action.delayMs,\n });\n break;\n case 'hover':\n await hoverViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'scrollIntoView':\n await scrollIntoViewViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'drag':\n await dragViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n startRef: action.startRef,\n startSelector: action.startSelector,\n endRef: action.endRef,\n endSelector: action.endSelector,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'select':\n await selectOptionViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n ref: action.ref,\n selector: action.selector,\n values: action.values,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'fill':\n await fillFormViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n fields: action.fields,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'resize':\n await resizeViewportViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n width: action.width,\n height: action.height,\n });\n break;\n case 'wait':\n if (action.fn !== undefined && action.fn !== '' && !evaluateEnabled)\n throw new Error('wait --fn is disabled by config (browser.evaluateEnabled=false)');\n await waitForViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n timeMs: action.timeMs,\n text: action.text,\n textGone: action.textGone,\n selector: action.selector,\n url: action.url,\n loadState: action.loadState,\n fn: action.fn,\n arg: action.arg,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'evaluate':\n if (!evaluateEnabled) throw new Error('act:evaluate is disabled by config (browser.evaluateEnabled=false)');\n await evaluateViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n fn: action.fn,\n ref: action.ref,\n timeoutMs: action.timeoutMs,\n });\n break;\n case 'close':\n await closePageViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n });\n break;\n case 'batch':\n await batchViaPlaywright({\n cdpUrl,\n targetId: effectiveTargetId,\n actions: action.actions,\n stopOnError: action.stopOnError,\n evaluateEnabled,\n depth: depth + 1,\n });\n break;\n default:\n throw new Error(`Unsupported batch action kind: ${String((action as Record<string, unknown>).kind)}`);\n }\n}\n\n/**\n * Execute multiple browser actions in sequence.\n *\n * @param opts.actions - Array of actions to execute\n * @param opts.stopOnError - Stop on first error (default: true)\n * @param opts.evaluateEnabled - Whether evaluate/wait:fn actions are permitted\n * @param opts.depth - Internal recursion depth (do not set manually)\n */\nexport async function batchViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n actions: BatchAction[];\n stopOnError?: boolean;\n evaluateEnabled?: boolean;\n depth?: number;\n}): Promise<{ results: BatchActionResult[] }> {\n const depth = opts.depth ?? 0;\n if (depth > MAX_BATCH_DEPTH) throw new Error(`Batch nesting depth exceeds maximum of ${String(MAX_BATCH_DEPTH)}`);\n if (opts.actions.length > MAX_BATCH_ACTIONS)\n throw new Error(`Batch exceeds maximum of ${String(MAX_BATCH_ACTIONS)} actions`);\n\n const results: BatchActionResult[] = [];\n const evaluateEnabled = opts.evaluateEnabled !== false;\n\n for (const action of opts.actions) {\n try {\n await executeSingleAction(action, opts.cdpUrl, opts.targetId, evaluateEnabled, depth);\n results.push({ ok: true });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n results.push({ ok: false, error: message });\n if (opts.stopOnError !== false) break;\n }\n }\n\n return { results };\n}\n","import { dirname } from 'node:path';\n\nimport type { Page, Download } from 'playwright-core';\n\nimport {\n getPageForTargetId,\n ensurePageState,\n restoreRoleRefsForTarget,\n refLocator,\n toAIFriendlyError,\n normalizeTimeoutMs,\n bumpDownloadArmId,\n} from '../connection.js';\nimport { assertSafeOutputPath, writeViaSiblingTempPath, sanitizeUntrustedFileName } from '../security.js';\nimport type { DownloadResult, PageState } from '../types.js';\n\nfunction createPageDownloadWaiter(page: Page, timeoutMs: number) {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let handler: ((download: Download) => void) | undefined;\n\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (handler) {\n page.off('download', handler);\n handler = undefined;\n }\n };\n\n return {\n promise: new Promise<Download>((resolve, reject) => {\n handler = (download: Download) => {\n if (done) return;\n done = true;\n cleanup();\n resolve(download);\n };\n page.on('download', handler);\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n cleanup();\n reject(new Error('Timeout waiting for download'));\n }, timeoutMs);\n }),\n cancel: () => {\n if (done) return;\n done = true;\n cleanup();\n },\n };\n}\n\nasync function saveDownloadPayload(download: Download, outPath: string): Promise<DownloadResult> {\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}\n\nasync function awaitDownloadPayload(params: {\n waiter: ReturnType<typeof createPageDownloadWaiter>;\n state: PageState;\n armId: number;\n outPath: string;\n}): Promise<DownloadResult> {\n try {\n const download = await params.waiter.promise;\n if (params.state.armIdDownload !== params.armId) throw new Error('Download was superseded by another waiter');\n return await saveDownloadPayload(download, params.outPath);\n } catch (err) {\n params.waiter.cancel();\n throw err;\n }\n}\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 outPath = opts.path.trim();\n if (!outPath) throw new Error('path is required');\n\n state.armIdDownload = bumpDownloadArmId(state);\n const armId = state.armIdDownload;\n const waiter = createPageDownloadWaiter(page, timeout);\n\n try {\n const locator = refLocator(page, opts.ref);\n try {\n await locator.click({ timeout });\n } catch (err) {\n throw toAIFriendlyError(err, opts.ref);\n }\n return await awaitDownloadPayload({ waiter, state, armId, outPath });\n } catch (err) {\n waiter.cancel();\n throw err;\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 const state = ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 120000);\n\n state.armIdDownload = bumpDownloadArmId(state);\n const armId = state.armIdDownload;\n\n const waiter = createPageDownloadWaiter(page, timeout);\n try {\n const download = await waiter.promise;\n if (state.armIdDownload !== armId) throw new Error('Download was superseded by another waiter');\n const savePath =\n opts.path ?? sanitizeUntrustedFileName(download.suggestedFilename() || 'download.bin', 'download.bin');\n await assertSafeOutputPath(savePath, opts.allowedOutputRoots);\n return await saveDownloadPayload(download, savePath);\n } catch (err) {\n waiter.cancel();\n throw err;\n }\n}\n","import { devices } from 'playwright-core';\n\nimport { getPageForTargetId, ensurePageState, withPageScopedCdpClient } 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: { cdpUrl: string; targetId?: string; name: string }): Promise<void> {\n const name = opts.name.trim();\n if (!name) throw new Error('device name is required');\n\n const device:\n | {\n viewport: { width: number; height: number } | null;\n userAgent: string;\n deviceScaleFactor: number;\n isMobile: boolean;\n hasTouch: boolean;\n defaultBrowserType: string;\n locale?: string;\n }\n | undefined = devices[name] as ((typeof devices)[string] & { locale?: string }) | undefined;\n if (device === undefined) {\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 !== null) {\n await page.setViewportSize({\n width: device.viewport.width,\n height: device.viewport.height,\n });\n }\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n const locale = device.locale;\n if (device.userAgent !== '' || (locale !== undefined && locale !== '')) {\n await send('Emulation.setUserAgentOverride', {\n userAgent: device.userAgent,\n acceptLanguage: locale,\n });\n }\n if (device.viewport !== null) {\n await send('Emulation.setDeviceMetricsOverride', {\n mobile: device.isMobile,\n width: device.viewport.width,\n height: device.viewport.height,\n deviceScaleFactor: device.deviceScaleFactor,\n screenWidth: device.viewport.width,\n screenHeight: device.viewport.height,\n });\n }\n if (device.hasTouch) {\n await send('Emulation.setTouchEmulationEnabled', { enabled: true });\n }\n },\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 === true) {\n await context.setGeolocation(null);\n await context.clearPermissions().catch(() => {\n /* intentional no-op */\n });\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 =\n (opts.origin !== undefined && opts.origin !== '' ? opts.origin.trim() : '') ||\n (() => {\n try {\n return new URL(page.url()).origin;\n } catch {\n return '';\n }\n })();\n if (origin !== '')\n await context.grantPermissions(['geolocation'], { origin }).catch(() => {\n /* intentional no-op */\n });\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 === true) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n await page.context().setHTTPCredentials(null);\n return;\n }\n\n const username = opts.username ?? '';\n const password = opts.password ?? '';\n if (!username) throw new Error('username is required (or set clear=true)');\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated\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 = opts.locale.trim();\n if (!locale) throw new Error('locale is required');\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n try {\n await 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 },\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 = opts.timezoneId.trim();\n if (!timezoneId) throw new Error('timezoneId is required');\n\n await withPageScopedCdpClient({\n cdpUrl: opts.cdpUrl,\n page,\n targetId: opts.targetId,\n fn: async (send) => {\n try {\n await 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 },\n });\n}\n","import { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from './connection.js';\nimport type { ChallengeInfo, ChallengeWaitResult } from './types.js';\n\n// ── Detection script (runs in browser context) ──\n\nconst DETECT_CHALLENGE_SCRIPT = `(function() {\n var title = (document.title || '').toLowerCase();\n\n // Cloudflare JS challenge\n if (title === 'just a moment...'\n || document.querySelector('#challenge-running, #cf-please-wait, #challenge-form')\n || title.indexOf('checking your browser') !== -1) {\n return { kind: 'cloudflare-js', message: 'Cloudflare JS challenge' };\n }\n\n // Cloudflare block page (needs body text — read lazily)\n var body = null;\n function getBody() { if (body === null) body = (document.body && document.body.textContent) || ''; return body; }\n\n if (title.indexOf('attention required') !== -1\n || (document.querySelector('.cf-error-details') && getBody().indexOf('blocked') !== -1)) {\n return { kind: 'cloudflare-block', message: 'Cloudflare block page' };\n }\n\n // Cloudflare Turnstile\n if (document.querySelector('.cf-turnstile, iframe[src*=\"challenges.cloudflare.com\"]')) {\n return { kind: 'cloudflare-turnstile', message: 'Cloudflare Turnstile challenge' };\n }\n\n // hCaptcha\n if (document.querySelector('.h-captcha, iframe[src*=\"hcaptcha.com\"]')) {\n return { kind: 'hcaptcha', message: 'hCaptcha challenge' };\n }\n\n // reCAPTCHA\n if (document.querySelector('.g-recaptcha, iframe[src*=\"google.com/recaptcha\"]')) {\n return { kind: 'recaptcha', message: 'reCAPTCHA challenge' };\n }\n\n // Generic access-denied / rate-limit pages (only read body for short pages)\n var b = getBody();\n if (b.length < 5000) {\n if (/access denied|403 forbidden/i.test(title) || /access denied/i.test(b)) {\n return { kind: 'blocked', message: 'Access denied' };\n }\n if (/\\\\b429\\\\b/i.test(title) || /too many requests|rate limit/i.test(b)) {\n return { kind: 'rate-limited', message: 'Rate limited' };\n }\n }\n\n return null;\n})()`;\n\nfunction parseChallengeResult(raw: unknown): ChallengeInfo | null {\n if (raw !== null && typeof raw === 'object' && 'kind' in (raw as Record<string, unknown>)) {\n return raw as ChallengeInfo;\n }\n return null;\n}\n\n/**\n * Detect whether the current page is showing an anti-bot challenge.\n * Returns `null` if no challenge is detected.\n */\nexport async function detectChallengeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n}): Promise<ChallengeInfo | null> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n return parseChallengeResult(await page.evaluate(DETECT_CHALLENGE_SCRIPT));\n}\n\n/**\n * Wait for an anti-bot challenge to resolve on its own (e.g. Cloudflare JS challenge).\n *\n * Returns `{ resolved: true }` if the challenge cleared within the timeout,\n * or `{ resolved: false, challenge }` with the still-present challenge info.\n *\n * For challenges that require human interaction (CAPTCHA), this will time out\n * unless the user solves the challenge in the visible browser window.\n */\nexport async function waitForChallengeViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n timeoutMs?: number;\n pollMs?: number;\n}): Promise<ChallengeWaitResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 15000);\n const poll = Math.max(250, Math.min(5000, opts.pollMs ?? 500));\n\n const detect = async () => parseChallengeResult(await page.evaluate(DETECT_CHALLENGE_SCRIPT));\n\n // Check if there's actually a challenge present\n const initial = await detect();\n if (initial === null) return { resolved: true, challenge: null };\n\n // For Cloudflare JS challenges, wait for the title to change (it navigates on success)\n if (initial.kind === 'cloudflare-js') {\n try {\n await page.waitForFunction(\n \"document.title.toLowerCase() !== 'just a moment...' && !document.querySelector('#challenge-running')\",\n undefined,\n { timeout },\n );\n // Cloudflare redirects after the challenge — let the page settle\n await page.waitForLoadState('domcontentloaded', { timeout: 5000 }).catch(() => {\n /* page may have already settled */\n });\n const after = await detect();\n return { resolved: after === null, challenge: after };\n } catch {\n const after = await detect();\n return { resolved: after === null, challenge: after };\n }\n }\n\n // For everything else, poll until challenge disappears or timeout\n const deadline = Date.now() + timeout;\n while (Date.now() < deadline) {\n await page.waitForTimeout(poll);\n const current = await detect();\n if (current === null) return { resolved: true, challenge: null };\n }\n\n const final = await detect();\n return { resolved: final === null, challenge: final };\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':\n return 3;\n case 'warning':\n case 'warn':\n return 2;\n case 'info':\n case 'log':\n return 1;\n case 'debug':\n return 0;\n default:\n 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 =\n opts.level !== undefined && opts.level !== ''\n ? state.console.filter((msg) => consolePriority(msg.type) >= consolePriority(opts.level ?? ''))\n : [...state.console];\n if (opts.clear === true) 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 === true) 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 === true) {\n state.requests = [];\n state.requestIds = new WeakMap();\n }\n return { requests };\n}\n","import { getPageForTargetId, ensurePageState } from '../connection.js';\n\nexport async function pdfViaPlaywright(opts: { cdpUrl: string; targetId?: string }): 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 { getPageForTargetId, ensurePageState, normalizeTimeoutMs } from '../connection.js';\nimport type { RequestResult, ResponseBodyResult } from '../types.js';\n\nfunction matchUrlPattern(pattern: string, url: string): boolean {\n if (!pattern || !url) return false;\n if (pattern === url) return true;\n if (pattern.includes('*')) {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n try {\n return new RegExp(`^${escaped}$`).test(url);\n } catch {\n return false;\n }\n }\n return url.includes(pattern);\n}\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 const pattern = opts.url.trim();\n if (!pattern) throw new Error('url is required');\n\n const response = await page.waitForResponse((resp) => matchUrlPattern(pattern, resp.url()), { timeout });\n let body = await response.text();\n let truncated = false;\n\n const maxChars =\n typeof opts.maxChars === 'number' && Number.isFinite(opts.maxChars)\n ? Math.max(1, Math.min(5_000_000, Math.floor(opts.maxChars)))\n : 200000;\n if (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\nexport async function waitForRequestViaPlaywright(opts: {\n cdpUrl: string;\n targetId?: string;\n url: string;\n method?: string;\n timeoutMs?: number;\n maxChars?: number;\n}): Promise<RequestResult> {\n const page = await getPageForTargetId({ cdpUrl: opts.cdpUrl, targetId: opts.targetId });\n ensurePageState(page);\n\n const timeout = normalizeTimeoutMs(opts.timeoutMs, 30000, 120000);\n const pattern = opts.url.trim();\n if (!pattern) throw new Error('url is required');\n const upperMethod = opts.method !== undefined ? opts.method.toUpperCase() : undefined;\n\n const response = await page.waitForResponse(\n (resp) =>\n matchUrlPattern(pattern, resp.url()) && (upperMethod === undefined || resp.request().method() === upperMethod),\n { timeout },\n );\n\n const request = response.request();\n let responseBody: string | undefined;\n let truncated = false;\n\n try {\n responseBody = await response.text();\n const maxChars =\n typeof opts.maxChars === 'number' && Number.isFinite(opts.maxChars)\n ? Math.max(1, Math.min(5_000_000, Math.floor(opts.maxChars)))\n : 200000;\n if (responseBody.length > maxChars) {\n responseBody = responseBody.slice(0, maxChars);\n truncated = true;\n }\n } catch (err) {\n console.warn('[browserclaw] response body unavailable:', err instanceof Error ? err.message : String(err));\n }\n\n return {\n url: response.url(),\n method: request.method(),\n postData: request.postData() ?? undefined,\n status: response.status(),\n ok: response.ok(),\n responseBody,\n truncated,\n };\n}\n","import { getPageForTargetId, ensurePageState, restoreRoleRefsForTarget, refLocator } 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 !== undefined && opts.ref !== '') {\n if (opts.fullPage === true) 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 !== undefined && opts.element !== '') {\n if (opts.fullPage === true) 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<{\n buffer: Buffer;\n labels: { ref: string; index: number; box: { x: number; y: number; width: number; height: number } }[];\n skipped: string[];\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 maxLabels =\n typeof opts.maxLabels === 'number' && Number.isFinite(opts.maxLabels)\n ? Math.max(1, Math.floor(opts.maxLabels))\n : 150;\n const type = opts.type ?? 'png';\n const refs = opts.refs.slice(0, maxLabels);\n const skipped = opts.refs.slice(maxLabels);\n\n const viewport = await page.evaluate(() => ({\n width: window.innerWidth || 0,\n height: window.innerHeight || 0,\n }));\n\n const labels: { 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 skipped.push(ref);\n continue;\n }\n // Viewport clipping: skip elements entirely outside the visible area\n const x1 = box.x + box.width;\n const y1 = box.y + box.height;\n if (x1 < 0 || box.x > viewport.width || y1 < 0 || box.y > viewport.height) {\n skipped.push(ref);\n continue;\n }\n labels.push({ ref, index: i + 1, box });\n } catch {\n skipped.push(ref);\n }\n }\n\n try {\n if (labels.length > 0) {\n await page.evaluate(\n (labelData: { index: number; box: { x: number; y: number; width: number; height: number } }[]) => {\n document.querySelectorAll('[data-browserclaw-labels]').forEach((el) => {\n el.remove();\n });\n const container = document.createElement('div');\n container.setAttribute('data-browserclaw-labels', '1');\n container.style.cssText =\n 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2147483647;';\n for (const { index, box } of labelData) {\n const border = document.createElement('div');\n border.style.cssText = `position:absolute;left:${String(box.x)}px;top:${String(box.y)}px;width:${String(box.width)}px;height:${String(box.height)}px;border:2px solid #FF4500;box-sizing:border-box;`;\n container.appendChild(border);\n const badge = document.createElement('div');\n badge.textContent = String(index);\n badge.style.cssText = `position:absolute;left:${String(box.x)}px;top:${String(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.documentElement.appendChild(container);\n },\n labels.map((l) => ({ index: l.index, box: l.box })),\n );\n }\n return {\n buffer: await page.screenshot({ type }),\n labels,\n skipped,\n };\n } finally {\n await page\n .evaluate(() => {\n document.querySelectorAll('[data-browserclaw-labels]').forEach((el) => {\n el.remove();\n });\n })\n .catch(() => {\n /* intentional no-op */\n });\n }\n}\n","import { dirname } from 'node:path';\n\nimport { getPageForTargetId, ensurePageState, ensureContextState } 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 type { RoleRefInfo, RoleRefs } from '../types.js';\n\nfunction parseStateFromSuffix(suffix: string): Pick<RoleRefInfo, 'disabled' | 'checked'> {\n const state: Pick<RoleRefInfo, 'disabled' | 'checked'> = {};\n if (/\\[disabled\\]/i.test(suffix)) state.disabled = true;\n if (/\\[checked\\s*=\\s*\"?mixed\"?\\]/i.test(suffix)) state.checked = 'mixed';\n else if (/\\[checked\\]/i.test(suffix)) state.checked = true;\n return state;\n}\n\nexport const INTERACTIVE_ROLES = new Set([\n 'button',\n 'link',\n 'textbox',\n 'checkbox',\n 'radio',\n 'combobox',\n 'listbox',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'option',\n 'searchbox',\n 'slider',\n 'spinbutton',\n 'switch',\n 'tab',\n 'treeitem',\n]);\n\nexport const CONTENT_ROLES = new Set([\n 'heading',\n 'cell',\n 'gridcell',\n 'columnheader',\n 'rowheader',\n 'listitem',\n 'article',\n 'region',\n 'main',\n 'navigation',\n]);\n\nexport const STRUCTURAL_ROLES = new Set([\n 'generic',\n 'group',\n 'ignored',\n 'list',\n 'table',\n 'row',\n 'rowgroup',\n 'grid',\n 'treegrid',\n 'menu',\n 'menubar',\n 'toolbar',\n 'tablist',\n 'tree',\n 'directory',\n 'document',\n 'application',\n 'presentation',\n 'none',\n]);\n\nfunction getIndentLevel(line: string): number {\n const match = /^(\\s*)/.exec(line);\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(line: string, options: SnapshotBuildOptions): ParsedSnapshotLine | null {\n const depth = getIndentLevel(line);\n if (options.maxDepth !== undefined && depth > options.maxDepth) {\n return null;\n }\n const match = /^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/.exec(line);\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=')) {\n result.push(line);\n continue;\n }\n if (line.includes(':') && !line.trimEnd().endsWith(':')) {\n result.push(line);\n continue;\n }\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=')) {\n hasRelevantChildren = true;\n break;\n }\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 = () => {\n counter++;\n return `e${String(counter)}`;\n };\n\n if (options.interactive === true) {\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 = /^(\\s*-\\s*)/.exec(line)?.[1] ?? '';\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n const state = parseStateFromSuffix(suffix);\n refs[ref] = { role, name, nth, ...state };\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== undefined && name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${String(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 = /^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/.exec(line);\n if (!match) {\n result.push(line);\n continue;\n }\n const [, prefix, roleRaw, name, suffix] = match;\n if (roleRaw.startsWith('/')) {\n result.push(line);\n continue;\n }\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 === true && isStructural && name === '') continue;\n if (!(isInteractive || (isContent && name !== ''))) {\n result.push(line);\n continue;\n }\n\n const ref = nextRef();\n const nth = tracker.getNextIndex(role, name);\n tracker.trackRef(role, name, ref);\n const state = parseStateFromSuffix(suffix);\n refs[ref] = { role, name, nth, ...state };\n\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${ref}]`;\n if (nth > 0) enhanced += ` [nth=${String(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 === true ? 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 = aiSnapshot.split('\\n');\n const refs: RoleRefs = {};\n\n function parseAiSnapshotRef(suffix: string): string | null {\n const match = /\\[ref=(e\\d+)\\]/i.exec(suffix);\n return match ? match[1] : null;\n }\n\n if (options.interactive === true) {\n let interactiveMaxRef = 0;\n for (const line of lines) {\n const refMatch = /\\[ref=e(\\d+)\\]/.exec(line);\n if (refMatch) interactiveMaxRef = Math.max(interactiveMaxRef, Number.parseInt(refMatch[1], 10));\n }\n let interactiveCounter = interactiveMaxRef;\n const nextInteractiveRef = () => {\n interactiveCounter++;\n return `e${String(interactiveCounter)}`;\n };\n\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 const prefix = /^(\\s*-\\s*)/.exec(line)?.[1] ?? '';\n const state = parseStateFromSuffix(suffix);\n if (ref !== null) {\n refs[ref] = { role, ...(name !== undefined && name !== '' ? { name } : {}), ...state };\n out.push(`${prefix}${roleRaw}${name !== undefined && name !== '' ? ` \"${name}\"` : ''}${suffix}`);\n } else {\n const generatedRef = nextInteractiveRef();\n refs[generatedRef] = { role, ...(name !== undefined && name !== '' ? { name } : {}), ...state };\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== undefined && name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${generatedRef}]`;\n if (suffix.trim() !== '') enhanced += suffix;\n out.push(enhanced);\n }\n }\n return { snapshot: out.join('\\n') || '(no interactive elements)', refs };\n }\n\n let maxRef = 0;\n for (const line of lines) {\n const refMatch = /\\[ref=e(\\d+)\\]/.exec(line);\n if (refMatch) maxRef = Math.max(maxRef, Number.parseInt(refMatch[1], 10));\n }\n let generatedCounter = maxRef;\n const nextGeneratedRef = () => {\n generatedCounter++;\n return `e${String(generatedCounter)}`;\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 = /^(\\s*-\\s*)(\\w+)(?:\\s+\"([^\"]*)\")?(.*)$/.exec(line);\n if (!match) {\n out.push(line);\n continue;\n }\n const [, prefix, roleRaw, name, suffix] = match;\n if (roleRaw.startsWith('/')) {\n out.push(line);\n continue;\n }\n const role = roleRaw.toLowerCase();\n const isStructural = STRUCTURAL_ROLES.has(role);\n if (options.compact === true && isStructural && name === '') continue;\n const ref = parseAiSnapshotRef(suffix);\n const state = parseStateFromSuffix(suffix);\n if (ref !== null) {\n refs[ref] = { role, ...(name !== '' ? { name } : {}), ...state };\n out.push(line);\n } else if (INTERACTIVE_ROLES.has(role)) {\n const generatedRef = nextGeneratedRef();\n refs[generatedRef] = { role, ...(name !== '' ? { name } : {}), ...state };\n let enhanced = `${prefix}${roleRaw}`;\n if (name !== '') enhanced += ` \"${name}\"`;\n enhanced += ` [ref=${generatedRef}]`;\n if (suffix.trim() !== '') enhanced += suffix;\n out.push(enhanced);\n } else {\n out.push(line);\n }\n }\n const tree = out.join('\\n') || '(empty)';\n return { snapshot: options.compact === true ? 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 type { SnapshotResult, SnapshotOptions } from '../types.js';\n\nimport { buildRoleSnapshotFromAiSnapshot, getRoleSnapshotStats } from './ref-map.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 =\n typeof maxChars === 'number' && Number.isFinite(maxChars) && maxChars > 0 ? Math.floor(maxChars) : undefined;\n\n let truncated = false;\n if (limit !== undefined && 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 truncated = true;\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 ...(truncated ? { truncated } : {}),\n untrusted: true,\n contentMeta: {\n sourceUrl,\n contentType: 'browser-snapshot',\n capturedAt: new Date().toISOString(),\n },\n };\n}\n","import {\n getPageForTargetId,\n ensurePageState,\n storeRoleRefsForTarget,\n normalizeTimeoutMs,\n withPlaywrightPageCdpSession,\n} from '../connection.js';\nimport type { PageWithAI } from '../connection.js';\nimport type { SnapshotResult, AriaSnapshotResult, AriaNode } from '../types.js';\n\nimport { buildRoleSnapshotFromAriaSnapshot, buildRoleSnapshotFromAiSnapshot, getRoleSnapshotStats } from './ref-map.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 (\n (opts.selector !== undefined && opts.selector.trim() !== '') ||\n (opts.frameSelector !== undefined && opts.frameSelector.trim() !== '')\n ) {\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(ariaSnapshot, opts.options);\n\n storeRoleRefsForTarget({\n page,\n cdpUrl: opts.cdpUrl,\n targetId: opts.targetId,\n refs: built.refs,\n frameSelector: 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 res = await withPlaywrightPageCdpSession(page, async (session) => {\n await session.send('Accessibility.enable' as unknown as Parameters<typeof session.send>[0]).catch(() => {\n /* intentional no-op */\n });\n return (await session.send('Accessibility.getFullAXTree' as unknown as Parameters<typeof session.send>[0])) as {\n nodes?: CdpAXNode[];\n };\n });\n\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}\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 if (nodes.length === 0) return [];\n\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: { 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${String(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 type { BrowserContext } from 'playwright-core';\n\nimport { 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<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 === '') throw new Error('cookie name and value are required');\n const hasUrl = typeof cookie.url === 'string' && cookie.url.trim() !== '';\n const hasDomainPath =\n typeof cookie.domain === 'string' &&\n cookie.domain.trim() !== '' &&\n typeof cookie.path === 'string' &&\n 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: { cdpUrl: string; targetId?: string }): 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 !== undefined && 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 === null || 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 = 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: 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 type { BrowserContext, Page, Locator } from 'playwright-core';\n\nimport { batchViaPlaywright } from './actions/batch.js';\nimport type { BatchAction, BatchActionResult } from './actions/batch.js';\nimport { downloadViaPlaywright, waitForDownloadViaPlaywright } from './actions/download.js';\nimport {\n emulateMediaViaPlaywright,\n setDeviceViaPlaywright,\n setExtraHTTPHeadersViaPlaywright,\n setGeolocationViaPlaywright,\n setHttpCredentialsViaPlaywright,\n setLocaleViaPlaywright,\n setOfflineViaPlaywright,\n setTimezoneViaPlaywright,\n} from './actions/emulation.js';\nimport { evaluateViaPlaywright, evaluateInAllFramesViaPlaywright, type FrameEvalResult } from './actions/evaluate.js';\nimport {\n clickViaPlaywright,\n mouseClickViaPlaywright,\n pressAndHoldViaCdp,\n clickByTextViaPlaywright,\n clickByRoleViaPlaywright,\n hoverViaPlaywright,\n typeViaPlaywright,\n selectOptionViaPlaywright,\n dragViaPlaywright,\n fillFormViaPlaywright,\n scrollIntoViewViaPlaywright,\n highlightViaPlaywright,\n setInputFilesViaPlaywright,\n armDialogViaPlaywright,\n armFileUploadViaPlaywright,\n} from './actions/interaction.js';\nimport { pressKeyViaPlaywright } from './actions/keyboard.js';\nimport {\n navigateViaPlaywright,\n listPagesViaPlaywright,\n createPageViaPlaywright,\n closePageByTargetIdViaPlaywright,\n focusPageByTargetIdViaPlaywright,\n waitForTabViaPlaywright,\n resizeViewportViaPlaywright,\n clearRecordingContext,\n} from './actions/navigation.js';\nimport { waitForViaPlaywright } from './actions/wait.js';\nimport { detectChallengeViaPlaywright, waitForChallengeViaPlaywright } from './anti-bot.js';\nimport {\n getConsoleMessagesViaPlaywright,\n getPageErrorsViaPlaywright,\n getNetworkRequestsViaPlaywright,\n} from './capture/activity.js';\nimport { pdfViaPlaywright } from './capture/pdf.js';\nimport { responseBodyViaPlaywright, waitForRequestViaPlaywright } from './capture/response.js';\nimport { takeScreenshotViaPlaywright, screenshotWithLabelsViaPlaywright } from './capture/screenshot.js';\nimport { traceStartViaPlaywright, traceStopViaPlaywright } from './capture/trace.js';\nimport { launchChrome, stopChrome, isChromeReachable, discoverChromeCdpUrl } from './chrome-launcher.js';\nimport {\n connectBrowser,\n disconnectBrowser,\n getPageForTargetId,\n ensurePageState,\n pageTargetId,\n getAllPages,\n normalizeTimeoutMs,\n setDialogHandler,\n getRestoredPageForTarget,\n} from './connection.js';\nimport { snapshotAi } from './snapshot/ai-snapshot.js';\nimport { snapshotRole, snapshotAria } from './snapshot/aria-snapshot.js';\nimport {\n cookiesGetViaPlaywright,\n cookiesSetViaPlaywright,\n cookiesClearViaPlaywright,\n storageGetViaPlaywright,\n storageSetViaPlaywright,\n storageClearViaPlaywright,\n} from './storage/index.js';\nimport type {\n LaunchOptions,\n ConnectOptions,\n SnapshotResult,\n SnapshotOptions,\n AriaSnapshotResult,\n BrowserTab,\n FormField,\n ClickOptions,\n TypeOptions,\n WaitOptions,\n ScreenshotOptions,\n ConsoleMessage,\n PageError,\n NetworkRequest,\n CookieData,\n StorageKind,\n RunningChrome,\n SsrfPolicy,\n DownloadResult,\n DialogOptions,\n DialogHandler,\n RequestResult,\n ResponseBodyResult,\n TraceStartOptions,\n ColorScheme,\n GeolocationOptions,\n HttpCredentials,\n ChallengeInfo,\n ChallengeWaitResult,\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 (\n (opts?.selector !== undefined && opts.selector !== '') ||\n (opts?.frameSelector !== undefined && opts.frameSelector !== '')\n ) {\n throw new Error(\n 'selector and frameSelector are only supported in role mode. Use { mode: \"role\" } or omit these options.',\n );\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 force: opts?.force,\n });\n }\n\n /**\n * Click an element by CSS selector (no snapshot/ref needed).\n *\n * Finds and clicks atomically — no stale ref problem.\n *\n * @param selector - CSS selector (e.g. `'#submit-btn'`, `'.modal button'`)\n * @param opts - Click options (double-click, button, modifiers)\n *\n * @example\n * ```ts\n * await page.clickBySelector('#submit-btn');\n * await page.clickBySelector('.modal .close', { button: 'right' });\n * ```\n */\n async clickBySelector(selector: string, opts?: ClickOptions): Promise<void> {\n return clickViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n selector,\n doubleClick: opts?.doubleClick,\n button: opts?.button,\n modifiers: opts?.modifiers,\n delayMs: opts?.delayMs,\n timeoutMs: opts?.timeoutMs,\n force: opts?.force,\n });\n }\n\n /**\n * Click at specific page coordinates.\n *\n * Useful for canvas elements, custom widgets, or elements without ARIA roles.\n *\n * @param x - X coordinate in pixels\n * @param y - Y coordinate in pixels\n * @param opts - Click options (button, clickCount, delayMs)\n *\n * @example\n * ```ts\n * await page.mouseClick(100, 200);\n * await page.mouseClick(100, 200, { button: 'right' });\n * await page.mouseClick(100, 200, { clickCount: 2 }); // double-click\n * ```\n */\n async mouseClick(\n x: number,\n y: number,\n opts?: { button?: 'left' | 'right' | 'middle'; clickCount?: number; delayMs?: number },\n ): Promise<void> {\n return mouseClickViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n x,\n y,\n button: opts?.button,\n clickCount: opts?.clickCount,\n delayMs: opts?.delayMs,\n });\n }\n\n /**\n * Press and hold at page coordinates using raw CDP events.\n *\n * Bypasses Playwright's automation layer by dispatching CDP\n * `Input.dispatchMouseEvent` directly — useful for anti-bot challenges\n * that detect automated clicks.\n *\n * @param x - X coordinate in CSS pixels\n * @param y - Y coordinate in CSS pixels\n * @param opts - Options (delay: ms before press, holdMs: hold duration)\n *\n * @example\n * ```ts\n * await page.pressAndHold(400, 300, { delay: 150, holdMs: 5000 });\n * ```\n */\n async pressAndHold(x: number, y: number, opts?: { delay?: number; holdMs?: number }): Promise<void> {\n return pressAndHoldViaCdp({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n x,\n y,\n delay: opts?.delay,\n holdMs: opts?.holdMs,\n });\n }\n\n /**\n * Click an element by its visible text content (no snapshot/ref needed).\n *\n * Finds and clicks atomically — no stale ref problem.\n *\n * @param text - Text content to match\n * @param opts - Options (exact: require full match, button, modifiers)\n *\n * @example\n * ```ts\n * await page.clickByText('Submit');\n * await page.clickByText('Save Changes', { exact: true });\n * ```\n */\n async clickByText(\n text: string,\n opts?: {\n exact?: boolean;\n button?: 'left' | 'right' | 'middle';\n modifiers?: ('Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift')[];\n timeoutMs?: number;\n },\n ): Promise<void> {\n return clickByTextViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n text,\n exact: opts?.exact,\n button: opts?.button,\n modifiers: opts?.modifiers,\n timeoutMs: opts?.timeoutMs,\n });\n }\n\n /**\n * Click an element by its ARIA role and accessible name (no snapshot/ref needed).\n *\n * Finds and clicks atomically — no stale ref problem.\n *\n * @param role - ARIA role (e.g. `'button'`, `'link'`, `'menuitem'`)\n * @param name - Accessible name to match (optional)\n * @param opts - Click options\n *\n * @example\n * ```ts\n * await page.clickByRole('button', 'Save');\n * await page.clickByRole('link', 'Settings');\n * await page.clickByRole('menuitem', 'Delete');\n * ```\n */\n async clickByRole(\n role: string,\n name?: string,\n opts?: {\n index?: number;\n button?: 'left' | 'right' | 'middle';\n modifiers?: ('Alt' | 'Control' | 'ControlOrMeta' | 'Meta' | 'Shift')[];\n timeoutMs?: number;\n },\n ): Promise<void> {\n return clickByRoleViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n role,\n name,\n index: opts?.index,\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 * Register a persistent dialog handler for all dialogs (alert, confirm, prompt, beforeunload).\n *\n * Unlike `armDialog()` which handles a single expected dialog, `onDialog()` handles\n * every dialog that appears until cleared. This prevents unexpected dialogs from\n * blocking the page.\n *\n * The handler receives a `DialogEvent` with `accept()` and `dismiss()` methods.\n * If the handler throws or doesn't call either, the dialog is auto-dismissed.\n *\n * Pass `undefined` or `null` to clear the handler and restore default auto-dismiss.\n *\n * Note: `armDialog()` takes priority — if a one-shot handler is armed, it handles\n * the next dialog instead of the persistent handler.\n *\n * @param handler - Callback for dialog events, or `undefined`/`null` to clear\n *\n * @example\n * ```ts\n * // Accept all confirm dialogs, dismiss everything else\n * page.onDialog((event) => {\n * if (event.type === 'confirm') event.accept();\n * else event.dismiss();\n * });\n *\n * // Log and auto-accept all dialogs\n * page.onDialog(async (event) => {\n * console.log(`Dialog: ${event.type} — ${event.message}`);\n * await event.accept();\n * });\n *\n * // Clear the handler (restore default auto-dismiss)\n * page.onDialog(undefined);\n * ```\n */\n async onDialog(handler: DialogHandler | undefined | null): Promise<void> {\n return setDialogHandler({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n handler: handler ?? undefined,\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 /**\n * Execute multiple browser actions in sequence.\n *\n * @param actions - Array of actions to execute\n * @param opts - Options (stopOnError: stop on first failure, default true)\n * @returns Array of per-action results\n */\n async batch(\n actions: BatchAction[],\n opts?: { stopOnError?: boolean; evaluateEnabled?: boolean },\n ): Promise<{ results: BatchActionResult[] }> {\n return batchViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n actions,\n stopOnError: opts?.stopOnError,\n evaluateEnabled: opts?.evaluateEnabled,\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(\n refs: string[],\n opts?: { maxLabels?: number; type?: 'png' | 'jpeg' },\n ): Promise<{\n buffer: Buffer;\n labels: { 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 * Wait for a network request matching a URL pattern and return request + response details.\n *\n * Unlike `networkRequests()` which only captures metadata, this method captures\n * the full request body (POST data) and response body.\n *\n * @param url - URL string or pattern to match (supports `*` wildcards and substring matching)\n * @param opts - Options (method filter, timeoutMs, maxChars for response body)\n * @returns Request method, postData, response status, and response body\n *\n * @example\n * ```ts\n * const reqPromise = page.waitForRequest('/api/submit', { method: 'POST' });\n * await page.click('e5'); // submit a form\n * const req = await reqPromise;\n * console.log(req.postData); // form body\n * console.log(req.status, req.responseBody); // response\n * ```\n */\n async waitForRequest(\n url: string,\n opts?: { method?: string; timeoutMs?: number; maxChars?: number },\n ): Promise<RequestResult> {\n return waitForRequestViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n url,\n method: opts?.method,\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<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,\n targetId: this.targetId,\n kind,\n 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,\n targetId: this.targetId,\n kind,\n key,\n 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,\n targetId: this.targetId,\n 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(\n ref: string,\n path: string,\n opts?: { timeoutMs?: number; allowedOutputRoots?: string[] },\n ): 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?: {\n path?: string;\n timeoutMs?: number;\n allowedOutputRoots?: string[];\n }): 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 // ── Anti-Bot ──────────────────────────────────────────────────\n\n /**\n * Detect whether the page is showing an anti-bot challenge\n * (Cloudflare, hCaptcha, reCAPTCHA, access-denied, rate-limit, etc.).\n *\n * Returns `null` if no challenge is detected.\n *\n * @example\n * ```ts\n * const challenge = await page.detectChallenge();\n * if (challenge) {\n * console.log(challenge.kind); // 'cloudflare-js'\n * console.log(challenge.message); // 'Cloudflare JS challenge'\n * }\n * ```\n */\n async detectChallenge(): Promise<ChallengeInfo | null> {\n return detectChallengeViaPlaywright({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n }\n\n /**\n * Wait for an anti-bot challenge to resolve on its own.\n *\n * Cloudflare JS challenges typically auto-resolve in ~5 seconds.\n * CAPTCHA challenges will only resolve if solved in a visible browser window.\n *\n * @param opts.timeoutMs - Maximum wait time (default: `15000`)\n * @param opts.pollMs - Poll interval (default: `500`)\n * @returns Whether the challenge resolved, and the remaining challenge info if not\n *\n * @example\n * ```ts\n * await page.goto('https://example.com');\n * const challenge = await page.detectChallenge();\n * if (challenge?.kind === 'cloudflare-js') {\n * const { resolved } = await page.waitForChallenge({ timeoutMs: 20000 });\n * if (!resolved) throw new Error('Challenge did not resolve');\n * }\n * ```\n */\n async waitForChallenge(opts?: { timeoutMs?: number; pollMs?: number }): Promise<ChallengeWaitResult> {\n return waitForChallengeViaPlaywright({\n cdpUrl: this.cdpUrl,\n targetId: this.targetId,\n timeoutMs: opts?.timeoutMs,\n pollMs: opts?.pollMs,\n });\n }\n\n // ── Playwright Escape Hatches ─────────────────────────────────\n\n /**\n * Get the underlying Playwright `Page` object for this tab.\n *\n * Use this when browserclaw's API doesn't cover your use case and you need\n * direct access to Playwright's full API (custom locator strategies,\n * frame manipulation, request interception, etc.).\n *\n * **Warning:** Modifications made via the raw Playwright page may conflict\n * with browserclaw's internal state (e.g. ref tracking). Use with care.\n *\n * @returns The Playwright `Page` instance\n *\n * @example\n * ```ts\n * const pwPage = await page.playwrightPage();\n *\n * // Use Playwright's full API directly\n * await pwPage.locator('.my-component').waitFor({ state: 'visible' });\n * await pwPage.route('**\\/api/**', route => route.fulfill({ body: '{}' }));\n *\n * // Access frames\n * const frame = pwPage.frameLocator('#my-iframe');\n * ```\n */\n async playwrightPage(): Promise<Page> {\n return getRestoredPageForTarget({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n }\n\n /**\n * Create a Playwright `Locator` for a CSS selector on this page.\n *\n * Convenience method that returns a Playwright locator without needing\n * to first obtain the Page object. Useful for one-off Playwright operations.\n *\n * @param selector - CSS selector or Playwright selector string\n * @returns A Playwright `Locator` instance\n *\n * @example\n * ```ts\n * const loc = await page.locator('.modal-dialog button.confirm');\n * await loc.waitFor({ state: 'visible' });\n * await loc.click();\n *\n * // Use Playwright selectors\n * const input = await page.locator('input[name=\"email\"]');\n * await input.fill('test@example.com');\n * ```\n */\n async locator(selector: string): Promise<Locator> {\n const pwPage = await getRestoredPageForTarget({ cdpUrl: this.cdpUrl, targetId: this.targetId });\n return pwPage.locator(selector);\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({ url: 'https://example.com' });\n * const page = await browser.currentPage();\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 readonly recordVideo: { dir: string; size?: { width: number; height: number } } | undefined;\n private chrome: RunningChrome | null;\n\n private constructor(\n cdpUrl: string,\n chrome: RunningChrome | null,\n ssrfPolicy?: SsrfPolicy,\n recordVideo?: { dir: string; size?: { width: number; height: number } },\n ) {\n this.cdpUrl = cdpUrl;\n this.chrome = chrome;\n this.ssrfPolicy = ssrfPolicy;\n this.recordVideo = recordVideo;\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 * // Launch and navigate to a URL\n * const browser = await BrowserClaw.launch({ url: 'https://example.com' });\n *\n * // Headless mode\n * const browser = await BrowserClaw.launch({ url: 'https://example.com', headless: true });\n *\n * // Specific browser\n * const browser = await BrowserClaw.launch({\n * url: 'https://example.com',\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:${String(chrome.cdpPort)}`;\n /* eslint-disable @typescript-eslint/no-deprecated -- backward-compat bridge for allowInternal */\n const ssrfPolicy =\n opts.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\n const browser = new BrowserClaw(cdpUrl, chrome, ssrfPolicy, opts.recordVideo);\n if (opts.url !== undefined && opts.url !== '') {\n const page = await browser.currentPage();\n await page.goto(opts.url);\n }\n return browser;\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 let resolvedUrl = cdpUrl;\n if (resolvedUrl === undefined || resolvedUrl === '') {\n const discovered = await discoverChromeCdpUrl();\n if (discovered === null) {\n throw new Error(\n 'No Chrome instance found on common CDP ports (9222-9226, 9229). Start Chrome with --remote-debugging-port=9222, or pass a CDP URL.',\n );\n }\n resolvedUrl = discovered;\n }\n if (!(await isChromeReachable(resolvedUrl, 3000, opts?.authToken))) {\n throw new Error(`Cannot connect to Chrome at ${resolvedUrl}. Is Chrome running with --remote-debugging-port?`);\n }\n await connectBrowser(resolvedUrl, opts?.authToken);\n /* eslint-disable @typescript-eslint/no-deprecated -- backward-compat bridge for allowInternal */\n const ssrfPolicy =\n opts?.allowInternal === true ? { ...opts.ssrfPolicy, dangerouslyAllowPrivateNetwork: true } : opts?.ssrfPolicy;\n /* eslint-enable @typescript-eslint/no-deprecated */\n return new BrowserClaw(resolvedUrl, null, ssrfPolicy, opts?.recordVideo);\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({\n cdpUrl: this.cdpUrl,\n url,\n ssrfPolicy: this.ssrfPolicy,\n recordVideo: this.recordVideo,\n });\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 = 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 === null || 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 * Wait for a tab matching the given criteria and return a page handle.\n *\n * Polls open tabs until one matches, then focuses it and returns a CrawlPage.\n *\n * @param opts - Match criteria (urlContains, titleContains) and timeout\n * @returns A CrawlPage for the matched tab\n *\n * @example\n * ```ts\n * await page.click('e5'); // opens a new tab\n * const appPage = await browser.waitForTab({ urlContains: 'app-web' });\n * const { snapshot } = await appPage.snapshot();\n * ```\n */\n async waitForTab(opts: { urlContains?: string; titleContains?: string; timeoutMs?: number }): Promise<CrawlPage> {\n const tab = await waitForTabViaPlaywright({\n cdpUrl: this.cdpUrl,\n urlContains: opts.urlContains,\n titleContains: opts.titleContains,\n timeoutMs: opts.timeoutMs,\n });\n await focusPageByTargetIdViaPlaywright({ cdpUrl: this.cdpUrl, targetId: tab.targetId });\n return new CrawlPage(this.cdpUrl, tab.targetId, this.ssrfPolicy);\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 clearRecordingContext(this.cdpUrl);\n await disconnectBrowser();\n if (this.chrome) {\n await stopChrome(this.chrome);\n this.chrome = null;\n }\n }\n}\n"]}