@volter-ai-dev/supercode-browser-playwright 0.1.1 → 0.2.0

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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/executor.ts", "../src/protocol.ts", "../src/provider.ts", "../src/serve.ts", "../src/cli.ts"],
4
- "sourcesContent": ["/**\n * Supercode's `supercode/browser-operation-v1` calls over a real Playwright\n * `Page`: every locator, action and snapshot is playwright-core's own, driven\n * over CDP. No Node API is used, so the executor also runs in a browser realm\n * with a browser build of playwright-core (`@volter/almostcdp/playwright`).\n */\n\nimport { errors, type Locator, type Page } from \"playwright-core\";\nimport {\n BROWSER_OPERATION_NAMES,\n BrowserActionRefusal,\n parseBrowserOperationCall,\n type BrowserLocator,\n type BrowserOperationCall,\n type BrowserOperationErrorCode,\n type BrowserOperationName,\n type BrowserOperationResult,\n type BrowserTarget,\n type ElementInspection,\n} from \"./protocol.js\";\n\n/** The implementation this provider reports; the pinned playwright-core. */\nexport const PLAYWRIGHT_IMPLEMENTATION = \"playwright-core 1.63.0\";\n/** The harness abandons a provider call at 12 s; a script must end before that. */\nexport const SCRIPT_TIMEOUT_CLAMP_MS = 9_000;\n/** Actionability budget for one locator action. */\nexport const ACTION_TIMEOUT_MS = 5_000;\n/** `browser.wait` accepts 30 s on the wire; the harness deadline caps what can be honoured. */\nexport const WAIT_TIMEOUT_CLAMP_MS = 9_000;\n\n/** The Playwright features `browser.status` reports. */\nexport const PLAYWRIGHT_FEATURES: readonly string[] = Object.freeze([\n \"page.ariaSnapshot\",\n \"page.keyboard\",\n \"page.navigation.history\",\n \"locator.css\",\n \"locator.ref\",\n \"locator.role\",\n \"locator.text\",\n \"locator.testId\",\n \"locator.label\",\n \"locator.placeholder\",\n \"locator.altText\",\n \"locator.title\",\n \"locator.first\",\n \"locator.nth\",\n \"locator.count\",\n \"locator.waitFor\",\n \"locator.textContent\",\n \"locator.inputValue\",\n \"locator.getAttribute\",\n \"locator.isVisible\",\n \"locator.click\",\n \"locator.fill\",\n \"locator.press\",\n \"locator.hover\",\n \"locator.focus\",\n \"locator.check\",\n \"locator.uncheck\",\n \"locator.selectOption\",\n \"locator.boundingBox\",\n \"locator.dragTo\",\n \"page.mouse\",\n \"page.mouse.wheel\",\n \"page.on.console\",\n \"page.on.pageerror\",\n \"page.consoleMessages\",\n \"page.pageErrors\",\n \"page.screenshot.png\",\n \"page.evaluate\",\n]);\n\nexport interface PlaywrightOperationExecutorOptions {\n /** True when the endpoint dispatches `isTrusted:false` input (an AlmostCDP endpoint); false for native Chrome. */\n syntheticEvents: boolean;\n /** `browser.version()` of the connected endpoint, reported by `browser.status`. */\n endpoint: string;\n /**\n * The host's policy for one action, asked before it runs: each locator\n * action, and each `browser.script` before its source is compiled. Throwing\n * a `BrowserActionRefusal` refuses the operation with that code.\n */\n actionGuard?: (action: PlaywrightAction) => void | Promise<void>;\n /**\n * A CSS selector (Playwright's, which pierces open shadow roots) for the\n * host's own elements: `browser.snapshot` leaves out every matching\n * element's nodes, and a node left with nothing by that. The page itself is\n * not changed, so what assistive technology reads stays the same.\n */\n snapshotExclude?: string;\n}\n\n/** One action an operation is about to perform. */\nexport type PlaywrightAction = PlaywrightLocatorAction | PlaywrightScriptAction;\n\n/** A locator action. */\nexport interface PlaywrightLocatorAction {\n action: \"click\" | \"fill\" | \"press\" | \"hover\" | \"focus\" | \"check\" | \"uncheck\" | \"select\" | \"drag\";\n locator: Locator;\n value?: unknown;\n}\n\nexport interface PlaywrightScriptAction {\n /** `browser.script`: the author's source, run with the real `page`. */\n action: \"script\";\n source: string;\n args: Record<string, unknown>;\n}\n\n/** At most this many excluded elements are looked up per snapshot. */\nconst SNAPSHOT_EXCLUDE_LIMIT = 16;\n\n/** Every aria ref in an AI-mode JSON aria snapshot. */\nfunction collectRefs(nodes: unknown, into: Set<string>): void {\n if (Array.isArray(nodes)) {\n for (const node of nodes) collectRefs(node, into);\n return;\n }\n if (!nodes || typeof nodes !== \"object\") return;\n const node = nodes as { ref?: unknown; children?: unknown };\n if (typeof node.ref === \"string\") into.add(node.ref);\n collectRefs(node.children, into);\n}\n\n/**\n * An AI-mode aria snapshot's YAML without the nodes whose `[ref=\u2026]` is in\n * `refs`, their subtrees, and any ref-less node whose children all went with\n * them. A node is a `- ` line; its subtree is the lines indented under it.\n */\nexport function snapshotWithoutRefs(text: string, refs: ReadonlySet<string>): string {\n if (refs.size === 0) return text;\n interface Line { text: string; indent: number; children: Line[]; removed: boolean }\n const root: Line = { text: \"\", indent: -1, children: [], removed: false };\n const stack: Line[] = [root];\n const lines: Line[] = [];\n for (const raw of text.split(\"\\n\")) {\n const indent = raw.length - raw.trimStart().length;\n const line: Line = { text: raw, indent, children: [], removed: false };\n while (stack.length > 1 && stack[stack.length - 1]!.indent >= indent) stack.pop();\n stack[stack.length - 1]!.children.push(line);\n stack.push(line);\n lines.push(line);\n }\n const refOf = (line: Line): string | undefined => /\\[ref=([^\\]\\s]+)\\]/.exec(line.text)?.[1];\n const remove = (line: Line): void => {\n line.removed = true;\n for (const child of line.children) remove(child);\n };\n // Post-order: a node's children are decided before the node.\n const visit = (line: Line): void => {\n const ref = refOf(line);\n if (ref !== undefined && refs.has(ref)) {\n remove(line);\n return;\n }\n const before = line.children.length;\n for (const child of line.children) visit(child);\n if (line !== root && ref === undefined && before > 0 && line.children.every((child) => child.removed))\n line.removed = true;\n };\n visit(root);\n return lines.filter((line) => !line.removed).map((line) => line.text).join(\"\\n\");\n}\n\nconst REVISION_KEY = \"__supercodeBrowserRevision\";\n\n/**\n * Keeps a document-mutation counter on the page's main world. Installed as an\n * init script (every future document) and evaluated once (the current one).\n * Self-contained: Playwright serializes it into the page.\n */\nfunction installRevisionCounter(key: string): void {\n const scope = globalThis as unknown as Record<string, unknown>;\n if (typeof scope[key] === \"number\") return;\n scope[key] = 0;\n new MutationObserver(() => { scope[key] = (scope[key] as number) + 1; })\n .observe(document, { attributes: true, childList: true, characterData: true, subtree: true });\n}\n\n/**\n * `ElementInspection`'s fields except `ref`, computed in the page.\n * Self-contained: Playwright serializes it into the page.\n */\nfunction inspectInPage({ elements, limit }: { elements: Element[]; limit: number }): Array<Omit<ElementInspection, \"ref\">> {\n const normalize = (value: string): string => value.replace(/\\s+/g, \" \").trim();\n const implied = (element: Element): string | null => {\n const tag = element.tagName.toLowerCase();\n if (tag === \"button\") return \"button\";\n if (tag === \"a\" && element.hasAttribute(\"href\")) return \"link\";\n if (/^h[1-6]$/.test(tag)) return \"heading\";\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"select\") return \"combobox\";\n if (tag === \"option\") return \"option\";\n if (tag === \"img\") return \"img\";\n if (tag === \"ul\" || tag === \"ol\") return \"list\";\n if (tag === \"li\") return \"listitem\";\n if (tag === \"nav\") return \"navigation\";\n if (tag === \"main\") return \"main\";\n if (tag === \"form\") return \"form\";\n if (tag === \"input\") {\n const type = (element.getAttribute(\"type\") ?? \"text\").toLowerCase();\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return \"button\";\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n if (type === \"range\") return \"slider\";\n return \"textbox\";\n }\n return null;\n };\n const nameOf = (element: Element): string => {\n const aria = element.getAttribute(\"aria-label\");\n if (aria?.trim()) return normalize(aria);\n const ids = element.getAttribute(\"aria-labelledby\")?.split(/\\s+/).filter(Boolean) ?? [];\n const labelled = normalize(ids.map((id) => element.ownerDocument.getElementById(id)?.textContent ?? \"\").join(\" \"));\n if (labelled) return labelled;\n if (element instanceof HTMLInputElement && element.labels?.length) {\n const label = normalize(Array.from(element.labels).map((candidate) => candidate.textContent ?? \"\").join(\" \"));\n if (label) return label;\n }\n for (const attribute of [\"alt\", \"title\", \"placeholder\"]) {\n const value = element.getAttribute(attribute);\n if (value?.trim()) return normalize(value);\n }\n return normalize(element.textContent ?? \"\");\n };\n const visible = (element: Element): boolean => {\n if (element.getAttribute(\"aria-hidden\") === \"true\") return false;\n if (!(element instanceof HTMLElement)) return true;\n if (element.hidden) return false;\n const style = getComputedStyle(element);\n return style.display !== \"none\" && style.visibility !== \"hidden\" && style.opacity !== \"0\";\n };\n return elements.slice(0, limit).map((element) => {\n const role = element.getAttribute(\"role\")?.trim() || implied(element);\n const name = nameOf(element).slice(0, 500);\n const value = element instanceof HTMLInputElement\n ? (element.type === \"password\" ? \"<redacted>\" : element.value)\n : element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement ? element.value : undefined;\n const checked = element instanceof HTMLInputElement &&\n (element.type === \"checkbox\" || element.type === \"radio\") ? element.checked : undefined;\n return {\n tag: element.tagName.toLowerCase(),\n ...(role ? { role } : {}),\n ...(name ? { name } : {}),\n ...(value !== undefined ? { value: value.slice(0, 2_000) } : {}),\n disabled: (element instanceof HTMLButtonElement || element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement) && element.disabled,\n ...(checked !== undefined ? { checked } : {}),\n visible: visible(element),\n };\n });\n}\n\nfunction scrollInPage(delta: { left: number; top: number; amount: number | null }): { x: number; y: number } {\n const amount = delta.amount ?? Math.max(240, Math.round(window.innerHeight * 0.8));\n window.scrollBy({ left: delta.left * amount, top: delta.top * amount, behavior: \"instant\" });\n return { x: window.scrollX, y: window.scrollY };\n}\n\n/** A PNG's pixel size from its IHDR chunk. */\nfunction pngSize(bytes: Uint8Array): { width: number; height: number } | null {\n const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n if (bytes.length < 24 || !signature.every((byte, index) => bytes[index] === byte)) return null;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n return { width: view.getUint32(16), height: view.getUint32(20) };\n}\n\n/** Base64 of bytes without Node's Buffer. */\nfunction base64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += 0x8000)\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n return btoa(binary);\n}\n\n/**\n * Scripts return data, not live objects: keep the wire JSON-clean. Screenshot\n * bytes become a bounded image record rather than a JSON array of numbers.\n */\nfunction serializableValue(value: unknown, syntheticEvents: boolean): unknown {\n if (value === undefined) return null;\n const replacer = (_key: string, item: unknown): unknown => {\n const bytes = item instanceof Uint8Array ? item\n : item && typeof item === \"object\" && (item as { type?: unknown }).type === \"Buffer\" &&\n Array.isArray((item as { data?: unknown }).data) ? Uint8Array.from((item as { data: number[] }).data)\n : null;\n if (!bytes) return item;\n const size = pngSize(bytes);\n const encoded = base64(bytes);\n if (!size) return encoded;\n const dataUrl = `data:image/png;base64,${encoded}`;\n if (dataUrl.length > 768 * 1024) return { error: \"Screenshot exceeds the 768 KiB image record bound.\", width: size.width, height: size.height };\n return {\n dataUrl,\n format: \"png\",\n width: size.width,\n height: size.height,\n fidelity: syntheticEvents\n ? \"Pixels rasterized by the CDP endpoint's own renderer.\"\n : \"Native Chrome pixels captured over CDP.\",\n };\n };\n try {\n return JSON.parse(JSON.stringify(value, replacer));\n } catch {\n return String(value);\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Map a Playwright failure onto the wire's error codes. */\nexport function classifyPlaywrightError(error: unknown): BrowserOperationErrorCode {\n if (error instanceof BrowserActionRefusal) return error.code;\n if (error instanceof errors.TimeoutError) return \"TIMED_OUT\";\n const message = errorMessage(error);\n if (/has been closed|Target closed|Target page, context or browser|Browser closed|browser has disconnected|Session closed|detached/i.test(message))\n return \"NOT_AVAILABLE\";\n if (/strict mode violation|resolved to 0 elements|no element matches|matched no element/i.test(message))\n return \"NOT_FOUND\";\n if (/unavailable|not supported/i.test(message)) return \"UNSUPPORTED\";\n return \"FAILED\";\n}\n\nexport class PlaywrightOperationExecutor {\n private readonly page: Page;\n private readonly options: PlaywrightOperationExecutorOptions;\n private readonly ready: Promise<void>;\n\n constructor(page: Page, options: PlaywrightOperationExecutorOptions) {\n this.page = page;\n this.options = options;\n this.ready = (async () => {\n await page.addInitScript(installRevisionCounter, REVISION_KEY);\n await page.evaluate(installRevisionCounter, REVISION_KEY).catch(() => undefined);\n })();\n }\n\n async execute(raw: unknown): Promise<BrowserOperationResult> {\n const call = parseBrowserOperationCall(raw);\n const operation = operationName(raw);\n if (!call) return this.failure(operation, \"INVALID_INPUT\", \"Invalid browser operation request.\");\n try {\n await this.ready;\n return await this.executeCall(call);\n } catch (error) {\n return this.failure(call.operation, classifyPlaywrightError(error), errorMessage(error));\n }\n }\n\n private locator(value: unknown, index?: number): Locator {\n const locator = value as BrowserLocator;\n const exact = (candidate: { exact?: boolean }) => candidate.exact !== undefined ? { exact: candidate.exact } : {};\n const page = this.page;\n const base = locator.by === \"css\" ? page.locator(locator.value)\n // Refs are the `[ref=\u2026]` marks of an AI-mode aria snapshot, resolved by\n // Playwright's built-in `aria-ref` selector engine.\n : locator.by === \"ref\" ? page.locator(`aria-ref=${locator.value}`)\n : locator.by === \"role\" ? page.getByRole(locator.role as Parameters<Page[\"getByRole\"]>[0], {\n ...(locator.name !== undefined ? { name: locator.name } : {}),\n // A role's name matches exactly unless told otherwise.\n exact: locator.exact ?? true,\n })\n : locator.by === \"text\" ? page.getByText(locator.text, exact(locator))\n : locator.by === \"label\" ? page.getByLabel(locator.text, exact(locator))\n : locator.by === \"placeholder\" ? page.getByPlaceholder(locator.text, exact(locator))\n : locator.by === \"altText\" ? page.getByAltText(locator.text, exact(locator))\n : locator.by === \"title\" ? page.getByTitle(locator.text, exact(locator))\n : page.getByTestId(locator.value);\n return index === undefined ? base : index === 0 ? base.first() : base.nth(index);\n }\n\n /**\n * Playwright's `aria-ref` engine resolves against the last AI-mode snapshot\n * the page took. Refs are stable per element, so refreshing the whole-page\n * snapshot before resolving one keeps every ref from `browser.snapshot`\n * addressable even after an element-scoped snapshot replaced the map.\n */\n private async refreshRefs(value: unknown): Promise<void> {\n if ((value as BrowserLocator | undefined)?.by === \"ref\")\n await this.page.ariaSnapshot({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS });\n }\n\n private async refOf(locator: Locator): Promise<string> {\n try {\n const nodes = await locator.ariaSnapshotJSON({ mode: \"ai\", depth: 1, timeout: ACTION_TIMEOUT_MS }) as unknown;\n const first = Array.isArray(nodes) ? nodes.find((node) => node && typeof node === \"object\") as { ref?: unknown } | undefined : undefined;\n return typeof first?.ref === \"string\" ? first.ref : \"\";\n } catch {\n return \"\";\n }\n }\n\n private async inspectAll(locator: Locator, limit: number): Promise<ElementInspection[]> {\n // Element handles, not `evaluateAll`: Playwright's `evaluateAll` resolves an\n // `aria-ref` locator in the main world, where the snapshot's refs are not\n // known, and finds nothing (measured with Playwright 1.63 on Chrome).\n const handles = (await locator.elementHandles()).slice(0, limit);\n let fields: Array<Omit<ElementInspection, \"ref\">>;\n try {\n const inspect = inspectInPage as unknown as (input: { elements: unknown[]; limit: number }) => Array<Omit<ElementInspection, \"ref\">>;\n fields = await this.page.evaluate(inspect, { elements: handles as unknown[], limit });\n } finally {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => undefined)));\n }\n const refs = await Promise.all(fields.map((_, index) => this.refOf(locator.nth(index))));\n return fields.map((field, index) => ({ ref: refs[index] ?? \"\", ...field }));\n }\n\n private async inspect(locator: Locator): Promise<ElementInspection> {\n const [inspection] = await this.inspectAll(locator.first(), 1);\n if (!inspection) throw new BrowserActionRefusal(\"NOT_FOUND\", \"The locator matched no element.\");\n return inspection;\n }\n\n /** Run a locator action; a failure on a locator that matches nothing is NOT_FOUND. */\n private async act<T>(locator: Locator, action: string, run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (!(error instanceof BrowserActionRefusal) && await locator.count().catch(() => 1) === 0)\n throw new BrowserActionRefusal(\"NOT_FOUND\", `${action} found no element for the locator.`);\n throw error;\n }\n }\n\n /** The host's policy for an action; an element that is not there is the action's own failure. */\n private async guard(action: PlaywrightLocatorAction): Promise<void> {\n if (!this.options.actionGuard || await action.locator.count().catch(() => 0) === 0) return;\n await this.options.actionGuard(action);\n }\n\n /** The aria refs of the elements `snapshotExclude` matches, and of their contents. */\n private async excludedRefs(): Promise<Set<string>> {\n const refs = new Set<string>();\n const selector = this.options.snapshotExclude;\n if (!selector) return refs;\n const matches = this.page.locator(selector);\n const count = Math.min(await matches.count().catch(() => 0), SNAPSHOT_EXCLUDE_LIMIT);\n for (let index = 0; index < count; index += 1) {\n const nodes = await matches.nth(index).ariaSnapshotJSON({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS }).catch(() => null) as unknown;\n collectRefs(nodes, refs);\n }\n return refs;\n }\n\n private async revision(): Promise<number> {\n const value = await this.page.evaluate((key) => (globalThis as unknown as Record<string, unknown>)[key], REVISION_KEY)\n .catch(() => undefined);\n return typeof value === \"number\" ? value : 0;\n }\n\n private async executeCall(call: BrowserOperationCall): Promise<BrowserOperationResult> {\n const input = call.input;\n const page = this.page;\n const expectedRevision = typeof input.expectedRevision === \"number\" ? input.expectedRevision : undefined;\n if (expectedRevision !== undefined) {\n const current = await this.revision();\n if (expectedRevision !== current)\n return this.failure(call.operation, \"STALE_PAGE\", `The page changed (expected revision ${expectedRevision}, current revision ${current}).`);\n }\n if (call.operation === \"browser.status\")\n return this.success(call.operation, {\n available: true,\n features: PLAYWRIGHT_FEATURES,\n syntheticEvents: this.options.syntheticEvents,\n implementation: PLAYWRIGHT_IMPLEMENTATION,\n endpoint: this.options.endpoint,\n });\n if (call.operation === \"browser.snapshot\") {\n await this.refreshRefs(input.locator);\n const scoped = input.locator ? this.locator(input.locator).first() : null;\n // The excluded elements' refs come first: each element-scoped snapshot\n // replaces the page's ref map, which the snapshot below then restores.\n const excluded = await this.excludedRefs();\n const text = snapshotWithoutRefs(scoped\n ? await this.act(scoped, \"ariaSnapshot\", () => scoped.ariaSnapshot({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS }))\n : await page.ariaSnapshot({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS }), excluded);\n const bounded = text.slice(0, 64_000);\n return this.success(call.operation, { text: bounded, truncated: bounded.length < text.length });\n }\n if (call.operation === \"browser.query\") {\n await this.refreshRefs(input.locator);\n const locator = this.locator(input.locator, typeof input.index === \"number\" ? input.index : undefined);\n const count = await locator.count();\n return this.success(call.operation, { count, matches: await this.inspectAll(locator, 50), truncated: count > 50 });\n }\n if (call.operation === \"browser.wait\") {\n await this.refreshRefs(input.locator);\n const requested = typeof input.timeout === \"number\" ? input.timeout : 5_000;\n const timeout = Math.min(requested, WAIT_TIMEOUT_CLAMP_MS);\n const locator = this.locator(input.locator, typeof input.index === \"number\" ? input.index : 0);\n try {\n await locator.waitFor({ state: input.state === \"attached\" ? \"attached\" : \"visible\", timeout });\n } catch (error) {\n if (error instanceof errors.TimeoutError)\n throw new BrowserActionRefusal(\"TIMED_OUT\", `waitFor timed out after ${timeout}ms` +\n (timeout < requested ? ` (the requested ${requested}ms is clamped to ${WAIT_TIMEOUT_CLAMP_MS}ms by the provider call deadline)` : \"\") + \".\");\n throw error;\n }\n return this.success(call.operation, { ready: true });\n }\n if (call.operation === \"browser.scroll\") {\n const direction = input.direction as \"up\" | \"down\" | \"left\" | \"right\";\n const position = await page.evaluate(scrollInPage, {\n left: direction === \"left\" ? -1 : direction === \"right\" ? 1 : 0,\n top: direction === \"up\" ? -1 : direction === \"down\" ? 1 : 0,\n amount: typeof input.amount === \"number\" ? input.amount : null,\n });\n return this.success(call.operation, position);\n }\n if (call.operation === \"browser.script\") return this.script(call);\n if (call.operation === \"browser.mouse\") {\n const action = input.action as \"move\" | \"down\" | \"up\" | \"click\";\n if (action === \"move\") await page.mouse.move(input.x as number, input.y as number);\n else if (action === \"click\") await page.mouse.click(input.x as number, input.y as number);\n else if (action === \"down\") await page.mouse.down();\n else await page.mouse.up();\n return this.success(call.operation, { action, ...(typeof input.x === \"number\" ? { x: input.x, y: input.y } : {}) });\n }\n if (call.operation === \"browser.wheel\") {\n const deltaX = typeof input.deltaX === \"number\" ? input.deltaX : 0;\n const deltaY = typeof input.deltaY === \"number\" ? input.deltaY : 0;\n await page.mouse.wheel(deltaX, deltaY);\n return this.success(call.operation, { deltaX, deltaY });\n }\n if (call.operation === \"browser.drag\") {\n const resolve = async (endpoint: Record<string, unknown>): Promise<{ x: number; y: number }> => {\n if (endpoint.locator === undefined) return { x: endpoint.x as number, y: endpoint.y as number };\n await this.refreshRefs(endpoint.locator);\n const locator = this.locator(endpoint.locator).first();\n const box = await locator.count() === 0 ? null : await locator.boundingBox({ timeout: ACTION_TIMEOUT_MS });\n if (!box) throw new BrowserActionRefusal(\"NOT_FOUND\", \"The drag locator matched no element.\");\n return { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n };\n for (const end of [input.from, input.to] as Array<Record<string, unknown>>)\n if (end.locator !== undefined) await this.guard({ action: \"drag\", locator: this.locator(end.locator).first() });\n const from = await resolve(input.from as Record<string, unknown>);\n const to = await resolve(input.to as Record<string, unknown>);\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n await page.mouse.move(to.x, to.y, { steps: typeof input.steps === \"number\" ? input.steps : 8 });\n await page.mouse.up();\n return this.success(call.operation, { from, to });\n }\n if (call.operation === \"browser.back\") {\n await page.goBack({ waitUntil: \"commit\", timeout: ACTION_TIMEOUT_MS });\n return this.success(call.operation, { requested: true });\n }\n if (call.operation === \"browser.forward\") {\n await page.goForward({ waitUntil: \"commit\", timeout: ACTION_TIMEOUT_MS });\n return this.success(call.operation, { requested: true });\n }\n if (call.operation === \"browser.reload\") {\n await page.reload({ waitUntil: \"commit\", timeout: ACTION_TIMEOUT_MS });\n return this.success(call.operation, { requested: true });\n }\n\n await this.refreshRefs(input.locator);\n const locator = input.locator\n ? this.locator(input.locator, typeof input.index === \"number\" ? input.index : 0)\n : null;\n const timeout = ACTION_TIMEOUT_MS;\n if (call.operation === \"browser.box\") {\n const box = await locator!.count() === 0 ? null : await locator!.boundingBox({ timeout });\n if (!box) return this.failure(call.operation, \"NOT_FOUND\", \"The locator matched no element.\");\n return this.success(call.operation, box);\n }\n if (call.operation === \"browser.press\" && !locator) {\n await this.guard({ action: \"press\", locator: page.locator(\"*:focus\").first(), value: input.key });\n await page.keyboard.press(input.key as string);\n return this.success(call.operation, { key: input.key });\n }\n const target = locator!;\n const guarded = call.operation === \"browser.select\" ? \"select\" : call.operation.slice(\"browser.\".length) as PlaywrightLocatorAction[\"action\"];\n await this.guard({ action: guarded, locator: target.first(),\n ...(call.operation === \"browser.fill\" ? { value: input.value } : call.operation === \"browser.press\" ? { value: input.key }\n : call.operation === \"browser.select\" ? { value: input.values } : {}) });\n // The inspection is read after the action; an action that detaches or\n // navigates away from its element reports the element as it was.\n const before = await this.inspect(target).catch(() => null);\n if (call.operation === \"browser.click\") await this.act(target, \"click\", () => target.click({ timeout }));\n else if (call.operation === \"browser.fill\") await this.act(target, \"fill\", () => target.fill(input.value as string, { timeout }));\n else if (call.operation === \"browser.press\") await this.act(target, \"press\", () => target.press(input.key as string, { timeout }));\n else if (call.operation === \"browser.hover\") await this.act(target, \"hover\", () => target.hover({ timeout }));\n else if (call.operation === \"browser.focus\") await this.act(target, \"focus\", () => target.focus({ timeout }));\n else if (call.operation === \"browser.check\") await this.act(target, \"check\", () => target.check({ timeout }));\n else if (call.operation === \"browser.uncheck\") await this.act(target, \"uncheck\", () => target.uncheck({ timeout }));\n else if (call.operation === \"browser.select\") {\n const values = await this.act(target, \"selectOption\", () => target.selectOption(input.values as string[], { timeout }));\n return this.success(call.operation, { values });\n }\n const after = await this.inspect(target).catch(() => null);\n const inspection = after ?? before;\n if (!inspection) throw new BrowserActionRefusal(\"NOT_FOUND\", \"The locator matched no element.\");\n return this.success(call.operation, inspection);\n }\n\n private async script(call: BrowserOperationCall): Promise<BrowserOperationResult> {\n const input = call.input;\n const source = input.source as string;\n const args = (input.args as Record<string, unknown> | undefined) ?? {};\n const requested = typeof input.timeout === \"number\" ? input.timeout : 30_000;\n const timeout = Math.min(requested, SCRIPT_TIMEOUT_CLAMP_MS);\n // Ordinary Playwright, run in this realm with the real `page`.\n const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor as\n new (...parameters: string[]) => (...values: unknown[]) => Promise<unknown>;\n if (this.options.actionGuard) await this.options.actionGuard({ action: \"script\", source, args });\n let run: (...values: unknown[]) => Promise<unknown>;\n try {\n run = new AsyncFunction(\"page\", \"args\", source);\n } catch (error) {\n return this.failure(call.operation, \"FAILED\", `The script did not parse: ${errorMessage(error)}`);\n }\n const notice = timeout < requested\n ? `The script timeout is clamped to ${SCRIPT_TIMEOUT_CLAMP_MS}ms: the harness abandons a provider call at 12 s.`\n : undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const value = await Promise.race([\n run(this.page, args),\n new Promise((_resolve, reject) => {\n timer = setTimeout(() => reject(new BrowserActionRefusal(\"FAILED\", `The script exceeded ${timeout}ms.` + (notice ? ` ${notice}` : \"\"))), timeout);\n }),\n ]);\n return this.success(call.operation, {\n value: serializableValue(value, this.options.syntheticEvents),\n ...(notice ? { notice } : {}),\n });\n } finally {\n clearTimeout(timer);\n // Listeners a script attached do not outlive it.\n this.page.removeAllListeners();\n }\n }\n\n private async target(): Promise<BrowserTarget> {\n if (this.page.isClosed()) return { url: \"\", title: \"\", revision: 0 };\n // A page mid-navigation can hold `title()` until its next document exists;\n // the target is a description, so it never outwaits the call.\n const bounded = <T>(promise: Promise<T>, fallback: T): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n promise.catch(() => fallback),\n new Promise<T>((resolve) => { timer = setTimeout(() => resolve(fallback), 1_000); }),\n ]).finally(() => clearTimeout(timer));\n };\n const [title, revision] = await Promise.all([\n bounded(this.page.title(), \"\"),\n bounded(this.revision(), 0),\n ]);\n return { url: this.page.url(), title, revision };\n }\n\n private async success(operation: BrowserOperationName, value: unknown): Promise<BrowserOperationResult> {\n return { ok: true, operation, target: await this.target(), value };\n }\n\n private async failure(operation: BrowserOperationName, code: BrowserOperationErrorCode, message: string): Promise<BrowserOperationResult> {\n return { ok: false, operation, error: { code, message }, target: await this.target() };\n }\n}\n\nfunction operationName(raw: unknown): BrowserOperationName {\n const candidate = raw && typeof raw === \"object\" && !Array.isArray(raw) ? (raw as Record<string, unknown>).operation : undefined;\n return typeof candidate === \"string\" && (BROWSER_OPERATION_NAMES as readonly string[]).includes(candidate)\n ? candidate as BrowserOperationName\n : \"browser.status\";\n}\n", "/**\n * The wire Supercode's browser providers answer: `supercode/browser-provider-v1`\n * envelopes carrying `supercode/browser-operation-v1` calls. Pure data and\n * parsers, with no runtime dependency, for the harness side, a host relaying\n * calls, and the executor alike.\n */\n\nexport const SUPERCODE_BROWSER_PROVIDER_PROTOCOL = \"supercode/browser-provider-v1\" as const;\nexport const SUPERCODE_BROWSER_OPERATION_PROTOCOL = \"supercode/browser-operation-v1\" as const;\n\nexport type BrowserLocator =\n | { by: \"css\"; value: string }\n | { by: \"ref\"; value: string }\n | { by: \"role\"; role: string; name?: string; exact?: boolean }\n | { by: \"text\"; text: string; exact?: boolean }\n | { by: \"testId\"; value: string }\n | { by: \"label\"; text: string; exact?: boolean }\n | { by: \"placeholder\"; text: string; exact?: boolean }\n | { by: \"altText\"; text: string; exact?: boolean }\n | { by: \"title\"; text: string; exact?: boolean };\n\nexport type BrowserOperationName =\n | \"browser.status\" | \"browser.snapshot\" | \"browser.query\" | \"browser.wait\"\n | \"browser.click\" | \"browser.fill\" | \"browser.press\" | \"browser.hover\"\n | \"browser.focus\" | \"browser.check\" | \"browser.uncheck\" | \"browser.select\"\n | \"browser.scroll\" | \"browser.back\" | \"browser.forward\" | \"browser.reload\"\n | \"browser.box\" | \"browser.mouse\" | \"browser.drag\" | \"browser.wheel\"\n | \"browser.script\";\n\nexport interface BrowserOperationCall {\n protocol: typeof SUPERCODE_BROWSER_OPERATION_PROTOCOL;\n operation: BrowserOperationName;\n input: Record<string, unknown>;\n}\n\nexport interface BrowserTarget {\n page?: string;\n url: string;\n title: string;\n revision: number;\n}\n\nexport type BrowserOperationErrorCode =\n | \"APPROVAL_REQUIRED\" | \"INVALID_INPUT\" | \"NOT_AVAILABLE\" | \"NOT_FOUND\"\n | \"STALE_PAGE\" | \"TIMED_OUT\" | \"UNSUPPORTED\" | \"FAILED\";\n\nexport type BrowserOperationResult =\n | { ok: true; operation: BrowserOperationName; target: BrowserTarget; value: unknown }\n | {\n ok: false;\n operation: BrowserOperationName;\n error: { code: BrowserOperationErrorCode; message: string };\n target?: BrowserTarget;\n };\n\nexport interface ElementInspection {\n ref: string;\n tag: string;\n role?: string;\n name?: string;\n value?: string;\n disabled: boolean;\n checked?: boolean;\n visible: boolean;\n}\n\n\n/** The 21 operations, in the registry's order. */\nexport const BROWSER_OPERATION_NAMES: readonly BrowserOperationName[] = Object.freeze([\n \"browser.status\", \"browser.snapshot\", \"browser.query\", \"browser.wait\",\n \"browser.click\", \"browser.fill\", \"browser.press\", \"browser.hover\",\n \"browser.focus\", \"browser.check\", \"browser.uncheck\", \"browser.select\",\n \"browser.scroll\", \"browser.back\", \"browser.forward\", \"browser.reload\",\n \"browser.box\", \"browser.mouse\", \"browser.drag\", \"browser.wheel\",\n \"browser.script\",\n]);\nconst OPERATION_NAMES = new Set<BrowserOperationName>(BROWSER_OPERATION_NAMES);\n\n/** A host's refusal of one action, carrying its wire error code. */\nexport class BrowserActionRefusal extends Error {\n constructor(readonly code: BrowserOperationErrorCode, message: string) {\n super(message);\n this.name = \"BrowserActionRefusal\";\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction exactKeys(candidate: Record<string, unknown>, allowed: readonly string[]): boolean {\n return Object.keys(candidate).every((key) => allowed.includes(key));\n}\n\nfunction parsePage(value: unknown): string | undefined | null {\n return value === undefined\n ? undefined\n : typeof value === \"string\" && value.length > 0 && value.length <= 512\n ? value\n : null;\n}\n\nexport function parseBrowserLocator(value: unknown): BrowserLocator | null {\n const candidate = record(value);\n if (!candidate || typeof candidate.by !== \"string\") return null;\n if (candidate.by === \"label\" || candidate.by === \"placeholder\" || candidate.by === \"altText\" || candidate.by === \"title\") {\n const { by, text, exact } = candidate as Record<string, unknown>;\n return typeof text === \"string\" && (exact === undefined || typeof exact === \"boolean\") &&\n exactKeys(candidate as Record<string, unknown>, [\"by\", \"text\", \"exact\"])\n ? ({ by, text, ...(exact !== undefined ? { exact } : {}) } as BrowserLocator)\n : null;\n }\n if (candidate.by === \"css\" || candidate.by === \"ref\" || candidate.by === \"testId\") {\n return exactKeys(candidate, [\"by\", \"value\"]) && typeof candidate.value === \"string\" &&\n candidate.value.length > 0 && candidate.value.length <= 2_000\n ? { by: candidate.by, value: candidate.value }\n : null;\n }\n if (candidate.by === \"role\") {\n if (!exactKeys(candidate, [\"by\", \"role\", \"name\", \"exact\"]) ||\n typeof candidate.role !== \"string\" || !candidate.role ||\n (candidate.name !== undefined && typeof candidate.name !== \"string\") ||\n (candidate.exact !== undefined && typeof candidate.exact !== \"boolean\")) return null;\n return {\n by: \"role\",\n role: candidate.role,\n ...(typeof candidate.name === \"string\" ? { name: candidate.name } : {}),\n ...(typeof candidate.exact === \"boolean\" ? { exact: candidate.exact } : {}),\n };\n }\n if (candidate.by === \"text\") {\n if (!exactKeys(candidate, [\"by\", \"text\", \"exact\"]) ||\n typeof candidate.text !== \"string\" || !candidate.text ||\n (candidate.exact !== undefined && typeof candidate.exact !== \"boolean\")) return null;\n return {\n by: \"text\",\n text: candidate.text,\n ...(typeof candidate.exact === \"boolean\" ? { exact: candidate.exact } : {}),\n };\n }\n return null;\n}\n\nfunction parseTargetInput(\n value: unknown,\n options: { locatorRequired: boolean; value?: boolean; key?: boolean; wait?: boolean; values?: boolean },\n): Record<string, unknown> | null {\n const candidate = record(value);\n if (!candidate) return null;\n const allowed = [\"page\", \"locator\", \"index\", \"expectedRevision\"];\n if (options.value) allowed.push(\"value\");\n if (options.values) allowed.push(\"values\");\n if (options.key) allowed.push(\"key\");\n if (options.wait) allowed.push(\"state\", \"timeout\");\n if (!exactKeys(candidate, allowed)) return null;\n const page = parsePage(candidate.page);\n const locator = candidate.locator === undefined ? undefined : parseBrowserLocator(candidate.locator);\n const index = candidate.index;\n const revision = candidate.expectedRevision;\n if (page === null || (options.locatorRequired && !locator) ||\n (candidate.locator !== undefined && !locator) ||\n (index !== undefined && (!Number.isInteger(index) || (index as number) < 0)) ||\n (revision !== undefined && (!Number.isInteger(revision) || (revision as number) < 0)) ||\n (options.value && typeof candidate.value !== \"string\") ||\n (options.values && (!Array.isArray(candidate.values) ||\n !candidate.values.every((item) => typeof item === \"string\"))) ||\n (options.key && (typeof candidate.key !== \"string\" || !candidate.key || candidate.key.length > 100)) ||\n (options.wait && candidate.state !== undefined &&\n candidate.state !== \"attached\" && candidate.state !== \"visible\") ||\n (options.wait && candidate.timeout !== undefined &&\n (typeof candidate.timeout !== \"number\" || candidate.timeout < 0 || candidate.timeout > 30_000))) return null;\n return {\n ...(page ? { page } : {}),\n ...(locator ? { locator } : {}),\n ...(typeof index === \"number\" ? { index } : {}),\n ...(typeof revision === \"number\" ? { expectedRevision: revision } : {}),\n ...(options.value ? { value: candidate.value } : {}),\n ...(options.values ? { values: candidate.values } : {}),\n ...(options.key ? { key: candidate.key } : {}),\n ...(options.wait && candidate.state ? { state: candidate.state } : {}),\n ...(options.wait && typeof candidate.timeout === \"number\" ? { timeout: candidate.timeout } : {}),\n };\n}\n\nfunction parseBrowserOperationInput(operation: BrowserOperationName, value: unknown): Record<string, unknown> | null {\n const candidate = record(value);\n if (!candidate) return null;\n if (operation === \"browser.status\") return exactKeys(candidate, []) ? {} : null;\n if (operation === \"browser.snapshot\") {\n const page = parsePage(candidate.page);\n const locator = candidate.locator === undefined ? undefined : parseBrowserLocator(candidate.locator);\n return exactKeys(candidate, [\"page\", \"locator\"]) && page !== null &&\n (candidate.locator === undefined || locator !== null)\n ? { ...(page ? { page } : {}), ...(locator ? { locator } : {}) }\n : null;\n }\n if (operation === \"browser.query\" || operation === \"browser.click\" ||\n operation === \"browser.hover\" || operation === \"browser.focus\" ||\n operation === \"browser.check\" || operation === \"browser.uncheck\") {\n return parseTargetInput(candidate, { locatorRequired: true });\n }\n if (operation === \"browser.wait\")\n return parseTargetInput(candidate, { locatorRequired: true, wait: true });\n if (operation === \"browser.fill\")\n return parseTargetInput(candidate, { locatorRequired: true, value: true });\n if (operation === \"browser.select\")\n return parseTargetInput(candidate, { locatorRequired: true, values: true });\n if (operation === \"browser.press\")\n return parseTargetInput(candidate, { locatorRequired: false, key: true });\n if (operation === \"browser.script\") {\n const page = parsePage(candidate.page);\n const { source, args, timeout } = candidate;\n return exactKeys(candidate, [\"page\", \"source\", \"args\", \"timeout\"]) && page !== null &&\n typeof source === \"string\" && source.length > 0 && source.length <= 100_000 &&\n (args === undefined || (typeof args === \"object\" && args !== null && !Array.isArray(args))) &&\n (timeout === undefined || (typeof timeout === \"number\" && timeout >= 0 && timeout <= 120_000))\n ? {\n ...(page ? { page } : {}),\n source,\n ...(args !== undefined ? { args } : {}),\n ...(typeof timeout === \"number\" ? { timeout } : {}),\n }\n : null;\n }\n if (operation === \"browser.box\") return parseTargetInput(candidate, { locatorRequired: true });\n if (operation === \"browser.mouse\") {\n const page = parsePage(candidate.page);\n const { action, x, y, deltaX, deltaY } = candidate;\n const point = (value: unknown): boolean => typeof value === \"number\" && Number.isFinite(value);\n const needsPoint = action === \"move\" || action === \"click\";\n return exactKeys(candidate, [\"page\", \"action\", \"x\", \"y\", \"deltaX\", \"deltaY\"]) && page !== null &&\n (action === \"move\" || action === \"down\" || action === \"up\" || action === \"click\") &&\n (!needsPoint || (point(x) && point(y))) &&\n deltaX === undefined && deltaY === undefined\n ? { ...(page ? { page } : {}), action, ...(point(x) ? { x } : {}), ...(point(y) ? { y } : {}) }\n : null;\n }\n if (operation === \"browser.wheel\") {\n const page = parsePage(candidate.page);\n const { deltaX, deltaY } = candidate;\n return exactKeys(candidate, [\"page\", \"deltaX\", \"deltaY\"]) && page !== null &&\n (deltaX === undefined || typeof deltaX === \"number\") &&\n (deltaY === undefined || typeof deltaY === \"number\")\n ? {\n ...(page ? { page } : {}),\n ...(typeof deltaX === \"number\" ? { deltaX } : {}),\n ...(typeof deltaY === \"number\" ? { deltaY } : {}),\n }\n : null;\n }\n if (operation === \"browser.drag\") {\n const page = parsePage(candidate.page);\n const { from, to, steps } = candidate;\n const endpoint = (value: unknown): boolean => {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n if (record.locator !== undefined) return parseBrowserLocator(record.locator) !== null && exactKeys(record, [\"locator\"]);\n return typeof record.x === \"number\" && typeof record.y === \"number\" && exactKeys(record, [\"x\", \"y\"]);\n };\n return exactKeys(candidate, [\"page\", \"from\", \"to\", \"steps\"]) && page !== null &&\n endpoint(from) && endpoint(to) &&\n (steps === undefined || (Number.isInteger(steps) && (steps as number) >= 1 && (steps as number) <= 100))\n ? { ...(page ? { page } : {}), from, to, ...(typeof steps === \"number\" ? { steps } : {}) }\n : null;\n }\n if (operation === \"browser.scroll\") {\n const page = parsePage(candidate.page);\n const { direction, amount, expectedRevision } = candidate;\n return exactKeys(candidate, [\"page\", \"direction\", \"amount\", \"expectedRevision\"]) && page !== null &&\n (direction === \"up\" || direction === \"down\" || direction === \"left\" || direction === \"right\") &&\n (amount === undefined || (typeof amount === \"number\" && amount >= 1 && amount <= 10_000)) &&\n (expectedRevision === undefined || (Number.isInteger(expectedRevision) && (expectedRevision as number) >= 0))\n ? {\n ...(page ? { page } : {}), direction,\n ...(typeof amount === \"number\" ? { amount } : {}),\n ...(typeof expectedRevision === \"number\" ? { expectedRevision } : {}),\n }\n : null;\n }\n return parseTargetInput(candidate, { locatorRequired: false });\n}\n\nexport function parseBrowserOperationCall(value: unknown): BrowserOperationCall | null {\n const candidate = record(value);\n if (!candidate || candidate.protocol !== SUPERCODE_BROWSER_OPERATION_PROTOCOL ||\n typeof candidate.operation !== \"string\" || !OPERATION_NAMES.has(candidate.operation as BrowserOperationName)) return null;\n const operation = candidate.operation as BrowserOperationName;\n const input = parseBrowserOperationInput(operation, candidate.input);\n return input === null ? null : { protocol: SUPERCODE_BROWSER_OPERATION_PROTOCOL, operation, input };\n}\n\nexport function parseBrowserOperationResult(value: unknown): BrowserOperationResult | null {\n const candidate = record(value);\n if (!candidate || typeof candidate.ok !== \"boolean\" ||\n typeof candidate.operation !== \"string\" || !OPERATION_NAMES.has(candidate.operation as BrowserOperationName)) return null;\n const operation = candidate.operation as BrowserOperationName;\n const targetCandidate = record(candidate.target);\n const target = targetCandidate &&\n (targetCandidate.page === undefined || typeof targetCandidate.page === \"string\") &&\n typeof targetCandidate.url === \"string\" && typeof targetCandidate.title === \"string\" &&\n Number.isInteger(targetCandidate.revision)\n ? {\n ...(typeof targetCandidate.page === \"string\" ? { page: targetCandidate.page } : {}),\n url: targetCandidate.url,\n title: targetCandidate.title,\n revision: targetCandidate.revision as number,\n }\n : null;\n if (candidate.ok) return target ? { ok: true, operation, target, value: candidate.value } : null;\n const error = record(candidate.error);\n const codes = new Set<BrowserOperationErrorCode>([\n \"APPROVAL_REQUIRED\", \"INVALID_INPUT\", \"NOT_AVAILABLE\", \"NOT_FOUND\",\n \"STALE_PAGE\", \"TIMED_OUT\", \"UNSUPPORTED\", \"FAILED\",\n ]);\n if (!error || typeof error.code !== \"string\" || !codes.has(error.code as BrowserOperationErrorCode) ||\n typeof error.message !== \"string\") return null;\n return {\n ok: false,\n operation,\n error: { code: error.code as BrowserOperationErrorCode, message: error.message },\n ...(target ? { target } : {}),\n };\n}\n", "/**\n * The provider: one Playwright connection over CDP, one page, and the\n * `supercode/browser-provider-v1` envelope around each operation call.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport { chromium, type Browser, type Page } from \"playwright-core\";\nimport {\n SUPERCODE_BROWSER_OPERATION_PROTOCOL,\n SUPERCODE_BROWSER_PROVIDER_PROTOCOL,\n type BrowserOperationName,\n type BrowserOperationResult,\n} from \"./protocol.js\";\nimport { PlaywrightOperationExecutor } from \"./executor.js\";\n\n/** Bound for one provider request (`BROWSER_PROVIDER_MAX_REQUEST_BYTES`). */\nexport const MAX_REQUEST_BYTES = 256 * 1024;\n/** Bound for one provider response (`BROWSER_PROVIDER_MAX_RESPONSE_BYTES`). */\nexport const MAX_RESPONSE_BYTES = 1024 * 1024;\n\nexport interface PlaywrightBrowserProviderOptions {\n /** CDP endpoint: `http://\u2026` (resolved through `/json/version`) or `ws://\u2026`. */\n cdpUrl: string;\n /** Hex token every request must carry. */\n token: string;\n /** True when the endpoint dispatches `isTrusted:false` input (an AlmostCDP endpoint). */\n syntheticEvents: boolean;\n}\n\n/** The provider-v1 response envelope the harness reads. */\nexport interface ProviderResponse {\n protocol: typeof SUPERCODE_BROWSER_PROVIDER_PROTOCOL;\n id: string | null;\n result: BrowserOperationResult;\n}\n\nexport interface PlaywrightBrowserProvider {\n readonly token: string;\n /** Validate one provider-v1 request and answer it with a provider-v1 response. */\n handle(request: unknown): Promise<ProviderResponse>;\n /** Disconnect from the endpoint. The browser itself is left running. */\n close(): Promise<void>;\n}\n\ninterface Connection {\n browser: Browser;\n page: Page;\n executor: PlaywrightOperationExecutor;\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : null;\n}\n\nfunction tokenMatches(expected: string, actual: unknown): boolean {\n if (typeof actual !== \"string\") return false;\n const left = Buffer.from(expected);\n const right = Buffer.from(actual);\n return left.length === right.length && timingSafeEqual(left, right);\n}\n\nfunction callOperation(call: unknown): BrowserOperationName {\n const operation = record(call)?.operation;\n return typeof operation === \"string\" && operation.startsWith(\"browser.\") ? operation as BrowserOperationName : \"browser.status\";\n}\n\nexport function createPlaywrightBrowserProvider(options: PlaywrightBrowserProviderOptions): PlaywrightBrowserProvider {\n if (!/^[0-9a-f]{32,}$/i.test(options.token))\n throw new Error(\"The provider token must be at least 32 hexadecimal characters.\");\n let connection: Connection | null = null;\n let queue: Promise<unknown> = Promise.resolve();\n\n const usable = (candidate: Connection | null): candidate is Connection =>\n candidate !== null && candidate.browser.isConnected() && !candidate.page.isClosed();\n\n const connect = async (): Promise<Connection> => {\n const previous = connection;\n connection = null;\n // The provider is attached to a browser it does not own: it changes none\n // of that browser's defaults (download policy, focus emulation, media).\n const browser = previous?.browser.isConnected() ? previous.browser : await chromium.connectOverCDP(options.cdpUrl, { noDefaults: true });\n const page = browser.contexts()[0]?.pages()[0];\n if (!page) {\n if (browser !== previous?.browser) await browser.close().catch(() => undefined);\n throw new Error(\"The browser has no open page.\");\n }\n const executor = new PlaywrightOperationExecutor(page, {\n syntheticEvents: options.syntheticEvents,\n endpoint: browser.version(),\n });\n connection = { browser, page, executor };\n return connection;\n };\n\n const failure = (operation: BrowserOperationName, code: \"INVALID_INPUT\" | \"NOT_AVAILABLE\", message: string): BrowserOperationResult =>\n ({ ok: false, operation, error: { code, message } });\n\n const run = async (call: unknown): Promise<BrowserOperationResult> => {\n let current = connection;\n if (!usable(current)) {\n // One reconnect per call; a second failure is the answer.\n try {\n current = await connect();\n } catch (error) {\n return failure(callOperation(call), \"NOT_AVAILABLE\",\n `The CDP endpoint is not available: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n return current.executor.execute(call);\n };\n\n return {\n token: options.token,\n async handle(request: unknown): Promise<ProviderResponse> {\n const envelope = record(request);\n const id = typeof envelope?.id === \"string\" && envelope.id.length > 0 && envelope.id.length <= 256 ? envelope.id : null;\n const respond = (result: BrowserOperationResult): ProviderResponse =>\n ({ protocol: SUPERCODE_BROWSER_PROVIDER_PROTOCOL, id, result });\n const call = envelope?.call;\n const operation = callOperation(call);\n if (!envelope || envelope.protocol !== SUPERCODE_BROWSER_PROVIDER_PROTOCOL || id === null ||\n record(call)?.protocol !== SUPERCODE_BROWSER_OPERATION_PROTOCOL)\n return respond(failure(operation, \"INVALID_INPUT\", \"Invalid browser provider request envelope.\"));\n if (!tokenMatches(options.token, envelope.token))\n return respond(failure(operation, \"INVALID_INPUT\", \"Invalid browser provider token.\"));\n // One page, one caller at a time: operations never interleave on it.\n const result = queue.then(() => run(call));\n queue = result.catch(() => undefined);\n return respond(await result);\n },\n async close(): Promise<void> {\n const current = connection;\n connection = null;\n // For a CDP connection `close()` closes the websocket, not the browser.\n await current?.browser.close().catch(() => undefined);\n },\n };\n}\n", "/**\n * Two framings of the same provider-v1 envelope.\n *\n * - TCP (the harness's wire, `crates/harness/src/browser.rs`): one\n * newline-terminated JSON request per connection, one JSON response, close.\n * Discovery is an owner-only record under `<providers dir>/browser/<id>.json`.\n * - HTTP: `POST /` with the request JSON as the body, the response JSON as the\n * body, for a host that can reach the provider only by HTTP.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as http from \"node:http\";\nimport * as net from \"node:net\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { SUPERCODE_BROWSER_PROVIDER_PROTOCOL } from \"./protocol.js\";\nimport { PLAYWRIGHT_IMPLEMENTATION } from \"./executor.js\";\nimport {\n MAX_REQUEST_BYTES,\n MAX_RESPONSE_BYTES,\n type PlaywrightBrowserProvider,\n type ProviderResponse,\n} from \"./provider.js\";\n\nconst HOST = \"127.0.0.1\";\n\nexport interface ServeHandle {\n framing: \"tcp\" | \"http\";\n port: number;\n /** The discovery record written for the TCP framing. */\n discoveryPath?: string;\n stop(): Promise<void>;\n}\n\n/** Supercode's providers directory, resolved as `browser_provider_directory()` resolves its parent. */\nexport function defaultProvidersDirectory(): string {\n const env = process.env;\n const root = env.SUPERCODE_HOME ? env.SUPERCODE_HOME\n : env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, \"supercode\")\n : env.HOME ? path.join(env.HOME, \".config\", \"supercode\")\n : path.join(os.tmpdir(), \"supercode\");\n return path.join(root, \"providers\");\n}\n\nfunction invalid(id: string | null, message: string): ProviderResponse {\n return {\n protocol: SUPERCODE_BROWSER_PROVIDER_PROTOCOL,\n id,\n result: { ok: false, operation: \"browser.status\", error: { code: \"INVALID_INPUT\", message } },\n };\n}\n\n/** Serialize a response inside the 1 MiB bound, replacing an oversized result with a bounded failure. */\nfunction encode(response: ProviderResponse): string {\n const text = JSON.stringify(response);\n if (Buffer.byteLength(text) <= MAX_RESPONSE_BYTES) return text;\n return JSON.stringify({\n ...response,\n result: {\n ok: false,\n operation: response.result.operation,\n error: { code: \"FAILED\", message: \"The operation result exceeds the provider's 1 MiB response bound.\" },\n },\n });\n}\n\nasync function answer(provider: PlaywrightBrowserProvider, body: string): Promise<ProviderResponse> {\n let request: unknown;\n try {\n request = JSON.parse(body);\n } catch {\n return invalid(null, \"The request is not JSON.\");\n }\n return provider.handle(request);\n}\n\nexport interface TcpServeOptions {\n port: number;\n /** Parent of `browser/`; defaults to Supercode's providers directory. */\n providersDirectory?: string;\n /** Workspace the discovery record is scoped to; defaults to the working directory. */\n workspace?: string;\n syntheticEvents: boolean;\n}\n\nexport async function serveTcp(provider: PlaywrightBrowserProvider, options: TcpServeOptions): Promise<ServeHandle> {\n const server = net.createServer((socket) => {\n const chunks: Buffer[] = [];\n let size = 0;\n let done = false;\n const finish = (response: ProviderResponse): void => {\n if (socket.destroyed) return;\n socket.end(`${encode(response)}\\n`);\n };\n socket.setTimeout(15_000, () => socket.destroy());\n socket.on(\"error\", () => socket.destroy());\n socket.on(\"data\", (chunk: Buffer) => {\n if (done) return;\n const newline = chunk.indexOf(0x0a);\n const part = newline === -1 ? chunk : chunk.subarray(0, newline);\n size += part.length + (newline === -1 ? 0 : 1);\n if (size > MAX_REQUEST_BYTES) {\n done = true;\n finish(invalid(null, \"The request exceeds 256 KiB.\"));\n return;\n }\n chunks.push(part);\n if (newline === -1) return;\n done = true;\n void answer(provider, Buffer.concat(chunks).toString(\"utf8\")).then(finish, (error: unknown) =>\n finish(invalid(null, error instanceof Error ? error.message : String(error))));\n });\n socket.on(\"end\", () => {\n if (done) return;\n done = true;\n // A request without its newline is still one request.\n void answer(provider, Buffer.concat(chunks).toString(\"utf8\")).then(finish, () => socket.destroy());\n });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, HOST, () => { server.off(\"error\", reject); resolve(); });\n });\n const port = (server.address() as net.AddressInfo).port;\n\n const directory = path.join(options.providersDirectory ?? defaultProvidersDirectory(), \"browser\");\n fs.mkdirSync(directory, { recursive: true, mode: 0o700 });\n fs.chmodSync(directory, 0o700);\n const id = `playwright.cdp.${port}`;\n const discoveryPath = path.join(directory, `${id}.json`);\n const workspace = fs.realpathSync(options.workspace ?? process.cwd());\n const discovery = {\n protocol: SUPERCODE_BROWSER_PROVIDER_PROTOCOL,\n workspace,\n host: HOST,\n port,\n token: provider.token,\n provider: {\n id,\n name: \"Playwright over CDP\",\n fidelity: {\n implementation: PLAYWRIGHT_IMPLEMENTATION,\n transport: \"cdp\",\n accessibility: \"playwright-aria-snapshot\",\n syntheticEvents: options.syntheticEvents,\n trustedInput: !options.syntheticEvents,\n script: \"node-playwright-page\",\n },\n },\n };\n const temporary = `${discoveryPath}.${randomBytes(6).toString(\"hex\")}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(discovery, null, 2)}\\n`, { mode: 0o600, flag: \"wx\" });\n fs.renameSync(temporary, discoveryPath);\n\n return {\n framing: \"tcp\",\n port,\n discoveryPath,\n async stop(): Promise<void> {\n fs.rmSync(discoveryPath, { force: true });\n await new Promise<void>((resolve) => server.close(() => resolve()));\n },\n };\n}\n\nexport interface HttpServeOptions {\n port: number;\n}\n\nexport async function serveHttp(provider: PlaywrightBrowserProvider, options: HttpServeOptions): Promise<ServeHandle> {\n const server = http.createServer((request, response) => {\n const send = (status: number, body?: string): void => {\n response.writeHead(status, body === undefined ? {} : { \"content-type\": \"application/json\" });\n response.end(body);\n };\n const pathname = (request.url ?? \"/\").split(\"?\", 1)[0];\n if (pathname !== \"/\") { request.resume(); send(404); return; }\n if (request.method !== \"POST\") { request.resume(); response.setHeader(\"allow\", \"POST\"); send(405); return; }\n const chunks: Buffer[] = [];\n let size = 0;\n let rejected = false;\n request.on(\"data\", (chunk: Buffer) => {\n if (rejected) return;\n size += chunk.length;\n if (size > MAX_REQUEST_BYTES) {\n rejected = true;\n send(413, encode(invalid(null, \"The request exceeds 256 KiB.\")));\n request.destroy();\n return;\n }\n chunks.push(chunk);\n });\n request.on(\"end\", () => {\n if (rejected) return;\n let body: unknown;\n try {\n body = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n } catch {\n send(400, encode(invalid(null, \"The request is not JSON.\")));\n return;\n }\n void provider.handle(body).then(\n (result) => send(200, encode(result)),\n (error: unknown) => send(500, encode(invalid(null, error instanceof Error ? error.message : String(error)))),\n );\n });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, HOST, () => { server.off(\"error\", reject); resolve(); });\n });\n const port = (server.address() as net.AddressInfo).port;\n return {\n framing: \"http\",\n port,\n async stop(): Promise<void> {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n },\n };\n}\n", "/**\n * `supercode-browser-playwright --cdp-url <url>\n * (--tcp <port> [--providers-dir <dir>] [--workspace <path>] | --http <port>)\n * [--token <hex>] [--synthetic-events]`\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { parseArgs } from \"node:util\";\nimport { createPlaywrightBrowserProvider } from \"./provider.js\";\nimport { serveHttp, serveTcp, type ServeHandle } from \"./serve.js\";\n\nconst USAGE = \"usage: supercode-browser-playwright --cdp-url <url> \" +\n \"(--tcp <port> [--providers-dir <dir>] [--workspace <path>] | --http <port>) \" +\n \"[--token <hex>] [--synthetic-events]\";\n\nfunction port(value: string, flag: string): number {\n const parsed = Number(value);\n if (!/^\\d+$/.test(value) || parsed > 65_535) throw new Error(`${flag} must be a port number (0 picks a free one).`);\n return parsed;\n}\n\nexport async function main(argv: readonly string[]): Promise<ServeHandle> {\n const { values } = parseArgs({\n args: [...argv],\n strict: true,\n allowPositionals: false,\n options: {\n \"cdp-url\": { type: \"string\" },\n tcp: { type: \"string\" },\n http: { type: \"string\" },\n \"providers-dir\": { type: \"string\" },\n workspace: { type: \"string\" },\n token: { type: \"string\" },\n \"synthetic-events\": { type: \"boolean\", default: false },\n },\n });\n const cdpUrl = values[\"cdp-url\"];\n if (!cdpUrl) throw new Error(`--cdp-url is required.\\n${USAGE}`);\n if ((values.tcp === undefined) === (values.http === undefined))\n throw new Error(`Exactly one of --tcp and --http is required.\\n${USAGE}`);\n if (values.http !== undefined && (values[\"providers-dir\"] !== undefined || values.workspace !== undefined))\n throw new Error(`--providers-dir and --workspace belong to the TCP framing.\\n${USAGE}`);\n if (values.http !== undefined && values.token === undefined)\n throw new Error(\"--http requires --token: the host that calls the provider passes it.\");\n const token = values.token ?? randomBytes(32).toString(\"hex\");\n const syntheticEvents = values[\"synthetic-events\"] ?? false;\n const provider = createPlaywrightBrowserProvider({ cdpUrl, token, syntheticEvents });\n const handle = values.tcp !== undefined\n ? await serveTcp(provider, {\n port: port(values.tcp, \"--tcp\"),\n syntheticEvents,\n ...(values[\"providers-dir\"] !== undefined ? { providersDirectory: values[\"providers-dir\"] } : {}),\n ...(values.workspace !== undefined ? { workspace: values.workspace } : {}),\n })\n : await serveHttp(provider, { port: port(values.http!, \"--http\") });\n process.stdout.write(`${JSON.stringify({ listening: { framing: handle.framing, port: handle.port } })}\\n`);\n let stopping = false;\n const stop = (): void => {\n if (stopping) return;\n stopping = true;\n void Promise.allSettled([handle.stop(), provider.close()]).then(() => process.exit(0));\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n process.once(\"SIGHUP\", stop);\n return handle;\n}\n"],
5
- "mappings": "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",
6
- "names": ["value", "record", "node", "locator", "timeout", "record", "result", "port", "randomBytes", "randomBytes"]
3
+ "sources": ["../src/executor.ts", "../src/guard.ts", "../src/protocol.ts", "../src/provider.ts", "../src/serve.ts", "../src/cli.ts"],
4
+ "sourcesContent": ["/**\n * Supercode's `supercode/browser-operation-v1` calls over a real Playwright\n * `Page`: every locator, action and snapshot is playwright-core's own, driven\n * over CDP. No Node API is used, so the executor also runs in a browser realm\n * with a browser build of playwright-core (`@volter/almostcdp/playwright`).\n */\n\nimport { errors, type ElementHandle, type Locator, type Page } from \"playwright-core\";\nimport { BrowserSideTargets, HostElementTarget, UnidentifiedTarget, type GuardedTarget } from \"./guard.js\";\nimport {\n BROWSER_OPERATION_NAMES,\n BrowserActionRefusal,\n parseBrowserOperationCall,\n type BrowserLocator,\n type BrowserOperationCall,\n type BrowserOperationErrorCode,\n type BrowserOperationName,\n type BrowserOperationResult,\n type BrowserTarget,\n type ElementInspection,\n} from \"./protocol.js\";\n\n/** The implementation this provider reports; the pinned playwright-core. */\nexport const PLAYWRIGHT_IMPLEMENTATION = \"playwright-core 1.63.0\";\n/** The harness abandons a provider call at 12 s; a script must end before that. */\nexport const SCRIPT_TIMEOUT_CLAMP_MS = 9_000;\n/** Actionability budget for one locator action. */\nexport const ACTION_TIMEOUT_MS = 5_000;\n/** `browser.wait` accepts 30 s on the wire; the harness deadline caps what can be honoured. */\nexport const WAIT_TIMEOUT_CLAMP_MS = 9_000;\n\n/** The Playwright features `browser.status` reports. */\nexport const PLAYWRIGHT_FEATURES: readonly string[] = Object.freeze([\n \"page.ariaSnapshot\",\n \"page.keyboard\",\n \"page.navigation.history\",\n \"locator.css\",\n \"locator.ref\",\n \"locator.role\",\n \"locator.text\",\n \"locator.testId\",\n \"locator.label\",\n \"locator.placeholder\",\n \"locator.altText\",\n \"locator.title\",\n \"locator.first\",\n \"locator.nth\",\n \"locator.count\",\n \"locator.waitFor\",\n \"locator.textContent\",\n \"locator.inputValue\",\n \"locator.getAttribute\",\n \"locator.isVisible\",\n \"locator.click\",\n \"locator.fill\",\n \"locator.press\",\n \"locator.hover\",\n \"locator.focus\",\n \"locator.check\",\n \"locator.uncheck\",\n \"locator.selectOption\",\n \"locator.boundingBox\",\n \"locator.dragTo\",\n \"page.mouse\",\n \"page.mouse.wheel\",\n \"page.on.console\",\n \"page.on.pageerror\",\n \"page.consoleMessages\",\n \"page.pageErrors\",\n \"page.screenshot.png\",\n \"page.evaluate\",\n]);\n\nexport interface PlaywrightOperationExecutorOptions {\n /** True when the endpoint dispatches `isTrusted:false` input (an AlmostCDP endpoint); false for native Chrome. */\n syntheticEvents: boolean;\n /** `browser.version()` of the connected endpoint, reported by `browser.status`. */\n endpoint: string;\n /**\n * The host's policy for one action, asked before it runs: each locator\n * action, each coordinate action (`browser.mouse`, `browser.drag`,\n * `browser.wheel`), and each `browser.script` before its source is\n * compiled. An element action's target is resolved once, described from the\n * browser side (see `GuardedTarget`), and the action then runs on that same\n * element. A target that cannot be resolved or described refuses the\n * operation without asking. Throwing a `BrowserActionRefusal` refuses the\n * operation with that code.\n */\n actionGuard?: (action: PlaywrightAction) => void | Promise<void>;\n /**\n * A CSS selector for the host's own elements: `browser.snapshot` leaves out\n * every matching element's nodes (Playwright's selector, which pierces open\n * shadow roots), and a coordinate action that lands on one is refused. The\n * page itself is not changed, so what assistive technology reads stays the\n * same.\n */\n snapshotExclude?: string;\n}\n\n/** One action an operation is about to perform. */\nexport type PlaywrightAction = PlaywrightElementAction | PlaywrightScriptAction;\n\nexport type { GuardedNode, GuardedTarget } from \"./guard.js\";\n\n/** An action that lands on an element: by locator, or at a viewport point. */\nexport interface PlaywrightElementAction {\n action: \"click\" | \"fill\" | \"press\" | \"hover\" | \"focus\" | \"check\" | \"uncheck\" | \"select\" | \"drag\"\n | \"mousedown\" | \"mouseup\" | \"wheel\";\n /** What the action lands on, described from the browser side. */\n target: GuardedTarget;\n value?: unknown;\n}\n\nexport interface PlaywrightScriptAction {\n /** `browser.script`: the author's source, run with the real `page`. */\n action: \"script\";\n source: string;\n args: Record<string, unknown>;\n}\n\n/** At most this many excluded elements are looked up per snapshot. */\nconst SNAPSHOT_EXCLUDE_LIMIT = 16;\n\n/** Every aria ref in an AI-mode JSON aria snapshot. */\nfunction collectRefs(nodes: unknown, into: Set<string>): void {\n if (Array.isArray(nodes)) {\n for (const node of nodes) collectRefs(node, into);\n return;\n }\n if (!nodes || typeof nodes !== \"object\") return;\n const node = nodes as { ref?: unknown; children?: unknown };\n if (typeof node.ref === \"string\") into.add(node.ref);\n collectRefs(node.children, into);\n}\n\n/**\n * An AI-mode aria snapshot's YAML without the nodes whose `[ref=\u2026]` is in\n * `refs`, their subtrees, and any ref-less node whose children all went with\n * them. A node is a `- ` line; its subtree is the lines indented under it.\n */\nexport function snapshotWithoutRefs(text: string, refs: ReadonlySet<string>): string {\n if (refs.size === 0) return text;\n interface Line { text: string; indent: number; children: Line[]; removed: boolean }\n const root: Line = { text: \"\", indent: -1, children: [], removed: false };\n const stack: Line[] = [root];\n const lines: Line[] = [];\n for (const raw of text.split(\"\\n\")) {\n const indent = raw.length - raw.trimStart().length;\n const line: Line = { text: raw, indent, children: [], removed: false };\n while (stack.length > 1 && stack[stack.length - 1]!.indent >= indent) stack.pop();\n stack[stack.length - 1]!.children.push(line);\n stack.push(line);\n lines.push(line);\n }\n const refOf = (line: Line): string | undefined => /\\[ref=([^\\]\\s]+)\\]/.exec(line.text)?.[1];\n const remove = (line: Line): void => {\n line.removed = true;\n for (const child of line.children) remove(child);\n };\n // Post-order: a node's children are decided before the node.\n const visit = (line: Line): void => {\n const ref = refOf(line);\n if (ref !== undefined && refs.has(ref)) {\n remove(line);\n return;\n }\n const before = line.children.length;\n for (const child of line.children) visit(child);\n if (line !== root && ref === undefined && before > 0 && line.children.every((child) => child.removed))\n line.removed = true;\n };\n visit(root);\n return lines.filter((line) => !line.removed).map((line) => line.text).join(\"\\n\");\n}\n\nconst REVISION_KEY = \"__supercodeBrowserRevision\";\n\n/**\n * Keeps a document-mutation counter on the page's main world. Installed as an\n * init script (every future document) and evaluated once (the current one).\n * Self-contained: Playwright serializes it into the page.\n */\nfunction installRevisionCounter(key: string): void {\n const scope = globalThis as unknown as Record<string, unknown>;\n if (typeof scope[key] === \"number\") return;\n scope[key] = 0;\n new MutationObserver(() => { scope[key] = (scope[key] as number) + 1; })\n .observe(document, { attributes: true, childList: true, characterData: true, subtree: true });\n}\n\n/**\n * `ElementInspection`'s fields except `ref`, computed in the page.\n * Self-contained: Playwright serializes it into the page.\n */\nfunction inspectInPage({ elements, limit }: { elements: Element[]; limit: number }): Array<Omit<ElementInspection, \"ref\">> {\n const normalize = (value: string): string => value.replace(/\\s+/g, \" \").trim();\n const implied = (element: Element): string | null => {\n const tag = element.tagName.toLowerCase();\n if (tag === \"button\") return \"button\";\n if (tag === \"a\" && element.hasAttribute(\"href\")) return \"link\";\n if (/^h[1-6]$/.test(tag)) return \"heading\";\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"select\") return \"combobox\";\n if (tag === \"option\") return \"option\";\n if (tag === \"img\") return \"img\";\n if (tag === \"ul\" || tag === \"ol\") return \"list\";\n if (tag === \"li\") return \"listitem\";\n if (tag === \"nav\") return \"navigation\";\n if (tag === \"main\") return \"main\";\n if (tag === \"form\") return \"form\";\n if (tag === \"input\") {\n const type = (element.getAttribute(\"type\") ?? \"text\").toLowerCase();\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return \"button\";\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n if (type === \"range\") return \"slider\";\n return \"textbox\";\n }\n return null;\n };\n const nameOf = (element: Element): string => {\n const aria = element.getAttribute(\"aria-label\");\n if (aria?.trim()) return normalize(aria);\n const ids = element.getAttribute(\"aria-labelledby\")?.split(/\\s+/).filter(Boolean) ?? [];\n const labelled = normalize(ids.map((id) => element.ownerDocument.getElementById(id)?.textContent ?? \"\").join(\" \"));\n if (labelled) return labelled;\n if (element instanceof HTMLInputElement && element.labels?.length) {\n const label = normalize(Array.from(element.labels).map((candidate) => candidate.textContent ?? \"\").join(\" \"));\n if (label) return label;\n }\n for (const attribute of [\"alt\", \"title\", \"placeholder\"]) {\n const value = element.getAttribute(attribute);\n if (value?.trim()) return normalize(value);\n }\n return normalize(element.textContent ?? \"\");\n };\n const visible = (element: Element): boolean => {\n if (element.getAttribute(\"aria-hidden\") === \"true\") return false;\n if (!(element instanceof HTMLElement)) return true;\n if (element.hidden) return false;\n const style = getComputedStyle(element);\n return style.display !== \"none\" && style.visibility !== \"hidden\" && style.opacity !== \"0\";\n };\n return elements.slice(0, limit).map((element) => {\n const role = element.getAttribute(\"role\")?.trim() || implied(element);\n const name = nameOf(element).slice(0, 500);\n const value = element instanceof HTMLInputElement\n ? (element.type === \"password\" ? \"<redacted>\" : element.value)\n : element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement ? element.value : undefined;\n const checked = element instanceof HTMLInputElement &&\n (element.type === \"checkbox\" || element.type === \"radio\") ? element.checked : undefined;\n return {\n tag: element.tagName.toLowerCase(),\n ...(role ? { role } : {}),\n ...(name ? { name } : {}),\n ...(value !== undefined ? { value: value.slice(0, 2_000) } : {}),\n disabled: (element instanceof HTMLButtonElement || element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement) && element.disabled,\n ...(checked !== undefined ? { checked } : {}),\n visible: visible(element),\n };\n });\n}\n\nfunction scrollInPage(delta: { left: number; top: number; amount: number | null }): { x: number; y: number } {\n const amount = delta.amount ?? Math.max(240, Math.round(window.innerHeight * 0.8));\n window.scrollBy({ left: delta.left * amount, top: delta.top * amount, behavior: \"instant\" });\n return { x: window.scrollX, y: window.scrollY };\n}\n\n/** A PNG's pixel size from its IHDR chunk. */\nfunction pngSize(bytes: Uint8Array): { width: number; height: number } | null {\n const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n if (bytes.length < 24 || !signature.every((byte, index) => bytes[index] === byte)) return null;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n return { width: view.getUint32(16), height: view.getUint32(20) };\n}\n\n/** Base64 of bytes without Node's Buffer. */\nfunction base64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += 0x8000)\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n return btoa(binary);\n}\n\n/**\n * Scripts return data, not live objects: keep the wire JSON-clean. Screenshot\n * bytes become a bounded image record rather than a JSON array of numbers.\n */\nfunction serializableValue(value: unknown, syntheticEvents: boolean): unknown {\n if (value === undefined) return null;\n const replacer = (_key: string, item: unknown): unknown => {\n const bytes = item instanceof Uint8Array ? item\n : item && typeof item === \"object\" && (item as { type?: unknown }).type === \"Buffer\" &&\n Array.isArray((item as { data?: unknown }).data) ? Uint8Array.from((item as { data: number[] }).data)\n : null;\n if (!bytes) return item;\n const size = pngSize(bytes);\n const encoded = base64(bytes);\n if (!size) return encoded;\n const dataUrl = `data:image/png;base64,${encoded}`;\n if (dataUrl.length > 768 * 1024) return { error: \"Screenshot exceeds the 768 KiB image record bound.\", width: size.width, height: size.height };\n return {\n dataUrl,\n format: \"png\",\n width: size.width,\n height: size.height,\n fidelity: syntheticEvents\n ? \"Pixels rasterized by the CDP endpoint's own renderer.\"\n : \"Native Chrome pixels captured over CDP.\",\n };\n };\n try {\n return JSON.parse(JSON.stringify(value, replacer));\n } catch {\n return String(value);\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Map a Playwright failure onto the wire's error codes. */\nexport function classifyPlaywrightError(error: unknown): BrowserOperationErrorCode {\n if (error instanceof BrowserActionRefusal) return error.code;\n if (error instanceof errors.TimeoutError) return \"TIMED_OUT\";\n const message = errorMessage(error);\n if (/has been closed|Target closed|Target page, context or browser|Browser closed|browser has disconnected|Session closed|detached/i.test(message))\n return \"NOT_AVAILABLE\";\n if (/strict mode violation|resolved to 0 elements|no element matches|matched no element/i.test(message))\n return \"NOT_FOUND\";\n if (/unavailable|not supported/i.test(message)) return \"UNSUPPORTED\";\n return \"FAILED\";\n}\n\nexport class PlaywrightOperationExecutor {\n private readonly page: Page;\n private readonly options: PlaywrightOperationExecutorOptions;\n private readonly ready: Promise<void>;\n private readonly targets: BrowserSideTargets;\n /** Where the mouse is: `page.mouse` keeps it, but does not report it. */\n private mouse = { x: 0, y: 0 };\n\n constructor(page: Page, options: PlaywrightOperationExecutorOptions) {\n this.page = page;\n this.options = options;\n this.targets = new BrowserSideTargets(page, options.snapshotExclude ?? null);\n this.ready = (async () => {\n await page.addInitScript(installRevisionCounter, REVISION_KEY);\n await page.evaluate(installRevisionCounter, REVISION_KEY).catch(() => undefined);\n })();\n }\n\n async execute(raw: unknown): Promise<BrowserOperationResult> {\n const call = parseBrowserOperationCall(raw);\n const operation = operationName(raw);\n if (!call) return this.failure(operation, \"INVALID_INPUT\", \"Invalid browser operation request.\");\n try {\n await this.ready;\n return await this.executeCall(call);\n } catch (error) {\n return this.failure(call.operation, classifyPlaywrightError(error), errorMessage(error));\n }\n }\n\n private locator(value: unknown, index?: number): Locator {\n const locator = value as BrowserLocator;\n const exact = (candidate: { exact?: boolean }) => candidate.exact !== undefined ? { exact: candidate.exact } : {};\n const page = this.page;\n const base = locator.by === \"css\" ? page.locator(locator.value)\n // Refs are the `[ref=\u2026]` marks of an AI-mode aria snapshot, resolved by\n // Playwright's built-in `aria-ref` selector engine.\n : locator.by === \"ref\" ? page.locator(`aria-ref=${locator.value}`)\n : locator.by === \"role\" ? page.getByRole(locator.role as Parameters<Page[\"getByRole\"]>[0], {\n ...(locator.name !== undefined ? { name: locator.name } : {}),\n // A role's name matches exactly unless told otherwise.\n exact: locator.exact ?? true,\n })\n : locator.by === \"text\" ? page.getByText(locator.text, exact(locator))\n : locator.by === \"label\" ? page.getByLabel(locator.text, exact(locator))\n : locator.by === \"placeholder\" ? page.getByPlaceholder(locator.text, exact(locator))\n : locator.by === \"altText\" ? page.getByAltText(locator.text, exact(locator))\n : locator.by === \"title\" ? page.getByTitle(locator.text, exact(locator))\n : page.getByTestId(locator.value);\n return index === undefined ? base : index === 0 ? base.first() : base.nth(index);\n }\n\n /**\n * Playwright's `aria-ref` engine resolves against the last AI-mode snapshot\n * the page took. Refs are stable per element, so refreshing the whole-page\n * snapshot before resolving one keeps every ref from `browser.snapshot`\n * addressable even after an element-scoped snapshot replaced the map.\n */\n private async refreshRefs(value: unknown): Promise<void> {\n if ((value as BrowserLocator | undefined)?.by === \"ref\")\n await this.page.ariaSnapshot({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS });\n }\n\n private async refOf(locator: Locator): Promise<string> {\n try {\n const nodes = await locator.ariaSnapshotJSON({ mode: \"ai\", depth: 1, timeout: ACTION_TIMEOUT_MS }) as unknown;\n const first = Array.isArray(nodes) ? nodes.find((node) => node && typeof node === \"object\") as { ref?: unknown } | undefined : undefined;\n return typeof first?.ref === \"string\" ? first.ref : \"\";\n } catch {\n return \"\";\n }\n }\n\n private async inspectAll(locator: Locator, limit: number): Promise<ElementInspection[]> {\n // Element handles, not `evaluateAll`: Playwright's `evaluateAll` resolves an\n // `aria-ref` locator in the main world, where the snapshot's refs are not\n // known, and finds nothing (measured with Playwright 1.63 on Chrome).\n const handles = (await locator.elementHandles()).slice(0, limit);\n let fields: Array<Omit<ElementInspection, \"ref\">>;\n try {\n const inspect = inspectInPage as unknown as (input: { elements: unknown[]; limit: number }) => Array<Omit<ElementInspection, \"ref\">>;\n fields = await this.page.evaluate(inspect, { elements: handles as unknown[], limit });\n } finally {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => undefined)));\n }\n const refs = await Promise.all(fields.map((_, index) => this.refOf(locator.nth(index))));\n return fields.map((field, index) => ({ ref: refs[index] ?? \"\", ...field }));\n }\n\n private async inspect(locator: Locator): Promise<ElementInspection> {\n const [inspection] = await this.inspectAll(locator.first(), 1);\n if (!inspection) throw new BrowserActionRefusal(\"NOT_FOUND\", \"The locator matched no element.\");\n return inspection;\n }\n\n /** Run a locator action; a failure on a locator that matches nothing is NOT_FOUND. */\n private async act<T>(locator: Locator, action: string, run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (!(error instanceof BrowserActionRefusal) && await locator.count().catch(() => 1) === 0)\n throw new BrowserActionRefusal(\"NOT_FOUND\", `${action} found no element for the locator.`);\n throw error;\n }\n }\n\n /**\n * Resolves the locator's element once (waiting up to the action budget),\n * asks the host's policy about it, and returns the handle the action must\n * use, so the element guarded is the element acted on. Without a policy the\n * action runs on the locator. Resolution or description failing refuses.\n */\n private async guarded(\n locator: Locator,\n action: PlaywrightElementAction[\"action\"],\n value?: unknown,\n ): Promise<ElementHandle | null> {\n const guard = this.options.actionGuard;\n if (!guard) return null;\n let handle: ElementHandle | null;\n try {\n handle = await locator.elementHandle({ timeout: ACTION_TIMEOUT_MS });\n } catch (error) {\n if (error instanceof errors.TimeoutError)\n throw new BrowserActionRefusal(\"NOT_FOUND\", `${action} found no element for the locator in ${ACTION_TIMEOUT_MS}ms.`);\n throw error;\n }\n if (!handle) throw new BrowserActionRefusal(\"NOT_FOUND\", `${action} found no element for the locator.`);\n try {\n await guard({ action, target: await this.describe(() => this.targets.ofHandle(handle!, ACTION_TIMEOUT_MS)),\n ...(value !== undefined ? { value } : {}) });\n } catch (error) {\n await handle.dispose().catch(() => undefined);\n throw error;\n }\n return handle;\n }\n\n /** Asks the host's policy about the element at a viewport point. */\n private async guardPoint(action: PlaywrightElementAction[\"action\"], x: number, y: number): Promise<void> {\n const guard = this.options.actionGuard;\n if (!guard) return;\n await guard({ action, target: await this.describe(() => this.targets.atPoint(x, y)) });\n }\n\n /** A browser-side description, or the refusal that replaces the action. */\n private async describe(run: () => Promise<GuardedTarget>): Promise<GuardedTarget> {\n try {\n return await run();\n } catch (error) {\n if (error instanceof HostElementTarget) throw new BrowserActionRefusal(\"UNSUPPORTED\", error.message);\n if (error instanceof UnidentifiedTarget)\n throw new BrowserActionRefusal(\"UNSUPPORTED\", `${error.message} The action was refused because its target could not be checked.`);\n throw new BrowserActionRefusal(\"UNSUPPORTED\",\n `The action was refused because its target could not be checked: ${errorMessage(error)}`);\n }\n }\n\n /** The aria refs of the elements `snapshotExclude` matches, and of their contents. */\n private async excludedRefs(): Promise<Set<string>> {\n const refs = new Set<string>();\n const selector = this.options.snapshotExclude;\n if (!selector) return refs;\n const matches = this.page.locator(selector);\n const count = Math.min(await matches.count().catch(() => 0), SNAPSHOT_EXCLUDE_LIMIT);\n for (let index = 0; index < count; index += 1) {\n const nodes = await matches.nth(index).ariaSnapshotJSON({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS }).catch(() => null) as unknown;\n collectRefs(nodes, refs);\n }\n return refs;\n }\n\n private async revision(): Promise<number> {\n const value = await this.page.evaluate((key) => (globalThis as unknown as Record<string, unknown>)[key], REVISION_KEY)\n .catch(() => undefined);\n return typeof value === \"number\" ? value : 0;\n }\n\n private async executeCall(call: BrowserOperationCall): Promise<BrowserOperationResult> {\n const input = call.input;\n const page = this.page;\n const expectedRevision = typeof input.expectedRevision === \"number\" ? input.expectedRevision : undefined;\n if (expectedRevision !== undefined) {\n const current = await this.revision();\n if (expectedRevision !== current)\n return this.failure(call.operation, \"STALE_PAGE\", `The page changed (expected revision ${expectedRevision}, current revision ${current}).`);\n }\n if (call.operation === \"browser.status\")\n return this.success(call.operation, {\n available: true,\n features: PLAYWRIGHT_FEATURES,\n syntheticEvents: this.options.syntheticEvents,\n implementation: PLAYWRIGHT_IMPLEMENTATION,\n endpoint: this.options.endpoint,\n });\n if (call.operation === \"browser.snapshot\") {\n await this.refreshRefs(input.locator);\n const scoped = input.locator ? this.locator(input.locator).first() : null;\n // The excluded elements' refs come first: each element-scoped snapshot\n // replaces the page's ref map, which the snapshot below then restores.\n const excluded = await this.excludedRefs();\n const text = snapshotWithoutRefs(scoped\n ? await this.act(scoped, \"ariaSnapshot\", () => scoped.ariaSnapshot({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS }))\n : await page.ariaSnapshot({ mode: \"ai\", timeout: ACTION_TIMEOUT_MS }), excluded);\n const bounded = text.slice(0, 64_000);\n return this.success(call.operation, { text: bounded, truncated: bounded.length < text.length });\n }\n if (call.operation === \"browser.query\") {\n await this.refreshRefs(input.locator);\n const locator = this.locator(input.locator, typeof input.index === \"number\" ? input.index : undefined);\n const count = await locator.count();\n return this.success(call.operation, { count, matches: await this.inspectAll(locator, 50), truncated: count > 50 });\n }\n if (call.operation === \"browser.wait\") {\n await this.refreshRefs(input.locator);\n const requested = typeof input.timeout === \"number\" ? input.timeout : 5_000;\n const timeout = Math.min(requested, WAIT_TIMEOUT_CLAMP_MS);\n const locator = this.locator(input.locator, typeof input.index === \"number\" ? input.index : 0);\n try {\n await locator.waitFor({ state: input.state === \"attached\" ? \"attached\" : \"visible\", timeout });\n } catch (error) {\n if (error instanceof errors.TimeoutError)\n throw new BrowserActionRefusal(\"TIMED_OUT\", `waitFor timed out after ${timeout}ms` +\n (timeout < requested ? ` (the requested ${requested}ms is clamped to ${WAIT_TIMEOUT_CLAMP_MS}ms by the provider call deadline)` : \"\") + \".\");\n throw error;\n }\n return this.success(call.operation, { ready: true });\n }\n if (call.operation === \"browser.scroll\") {\n const direction = input.direction as \"up\" | \"down\" | \"left\" | \"right\";\n const position = await page.evaluate(scrollInPage, {\n left: direction === \"left\" ? -1 : direction === \"right\" ? 1 : 0,\n top: direction === \"up\" ? -1 : direction === \"down\" ? 1 : 0,\n amount: typeof input.amount === \"number\" ? input.amount : null,\n });\n return this.success(call.operation, position);\n }\n if (call.operation === \"browser.script\") return this.script(call);\n if (call.operation === \"browser.mouse\") {\n const action = input.action as \"move\" | \"down\" | \"up\" | \"click\";\n const at = typeof input.x === \"number\" && typeof input.y === \"number\" ? { x: input.x, y: input.y } : this.mouse;\n if (action === \"move\") await this.guardPoint(\"hover\", at.x, at.y);\n else await this.guardPoint(action === \"click\" ? \"click\" : action === \"down\" ? \"mousedown\" : \"mouseup\", at.x, at.y);\n if (action === \"move\") await page.mouse.move(at.x, at.y);\n else if (action === \"click\") await page.mouse.click(at.x, at.y);\n else if (action === \"down\") await page.mouse.down();\n else await page.mouse.up();\n if (action === \"move\" || action === \"click\") this.mouse = { x: at.x, y: at.y };\n return this.success(call.operation, { action, ...(typeof input.x === \"number\" ? { x: input.x, y: input.y } : {}) });\n }\n if (call.operation === \"browser.wheel\") {\n const deltaX = typeof input.deltaX === \"number\" ? input.deltaX : 0;\n const deltaY = typeof input.deltaY === \"number\" ? input.deltaY : 0;\n await this.guardPoint(\"wheel\", this.mouse.x, this.mouse.y);\n await page.mouse.wheel(deltaX, deltaY);\n return this.success(call.operation, { deltaX, deltaY });\n }\n if (call.operation === \"browser.drag\") {\n // Each endpoint is resolved and guarded once; the drag uses those points.\n const resolve = async (endpoint: Record<string, unknown>): Promise<{ x: number; y: number }> => {\n if (endpoint.locator === undefined) {\n const point = { x: endpoint.x as number, y: endpoint.y as number };\n await this.guardPoint(\"drag\", point.x, point.y);\n return point;\n }\n await this.refreshRefs(endpoint.locator);\n const locator = this.locator(endpoint.locator).first();\n const handle = await this.guarded(locator, \"drag\");\n try {\n const box = handle\n ? await handle.boundingBox()\n : await locator.count() === 0 ? null : await locator.boundingBox({ timeout: ACTION_TIMEOUT_MS });\n if (!box) throw new BrowserActionRefusal(\"NOT_FOUND\", \"The drag locator matched no element.\");\n return { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n } finally {\n await handle?.dispose().catch(() => undefined);\n }\n };\n const from = await resolve(input.from as Record<string, unknown>);\n const to = await resolve(input.to as Record<string, unknown>);\n await page.mouse.move(from.x, from.y);\n await page.mouse.down();\n await page.mouse.move(to.x, to.y, { steps: typeof input.steps === \"number\" ? input.steps : 8 });\n await page.mouse.up();\n this.mouse = to;\n return this.success(call.operation, { from, to });\n }\n if (call.operation === \"browser.back\") {\n await page.goBack({ waitUntil: \"commit\", timeout: ACTION_TIMEOUT_MS });\n return this.success(call.operation, { requested: true });\n }\n if (call.operation === \"browser.forward\") {\n await page.goForward({ waitUntil: \"commit\", timeout: ACTION_TIMEOUT_MS });\n return this.success(call.operation, { requested: true });\n }\n if (call.operation === \"browser.reload\") {\n await page.reload({ waitUntil: \"commit\", timeout: ACTION_TIMEOUT_MS });\n return this.success(call.operation, { requested: true });\n }\n\n await this.refreshRefs(input.locator);\n const locator = input.locator\n ? this.locator(input.locator, typeof input.index === \"number\" ? input.index : 0)\n : null;\n const timeout = ACTION_TIMEOUT_MS;\n if (call.operation === \"browser.box\") {\n const box = await locator!.count() === 0 ? null : await locator!.boundingBox({ timeout });\n if (!box) return this.failure(call.operation, \"NOT_FOUND\", \"The locator matched no element.\");\n return this.success(call.operation, box);\n }\n if (call.operation === \"browser.press\" && !locator) {\n // The key goes to the focused element (the document body when none is).\n const focused = page.locator(\"*:focus\").first();\n const handle = await this.guarded(await focused.count() ? focused : page.locator(\"body\"), \"press\", input.key);\n try {\n await page.keyboard.press(input.key as string);\n } finally {\n await handle?.dispose().catch(() => undefined);\n }\n return this.success(call.operation, { key: input.key });\n }\n const target = locator!;\n const guardedAction = call.operation === \"browser.select\" ? \"select\" : call.operation.slice(\"browser.\".length) as PlaywrightElementAction[\"action\"];\n const handle = await this.guarded(target.first(), guardedAction,\n call.operation === \"browser.fill\" ? input.value : call.operation === \"browser.press\" ? input.key\n : call.operation === \"browser.select\" ? input.values : undefined);\n // The guarded element itself, when there is a policy; else the locator.\n const element: Pick<Locator, \"click\" | \"fill\" | \"press\" | \"hover\" | \"check\" | \"uncheck\" | \"selectOption\"> & { focus(): Promise<void> } =\n handle ?? { ...bind(target), focus: () => target.focus({ timeout }) };\n // The inspection is read after the action; an action that detaches or\n // navigates away from its element reports the element as it was.\n const before = await this.inspect(target).catch(() => null);\n try {\n if (call.operation === \"browser.click\") await this.act(target, \"click\", () => element.click({ timeout }));\n else if (call.operation === \"browser.fill\") await this.act(target, \"fill\", () => element.fill(input.value as string, { timeout }));\n else if (call.operation === \"browser.press\") await this.act(target, \"press\", () => element.press(input.key as string, { timeout }));\n else if (call.operation === \"browser.hover\") await this.act(target, \"hover\", () => element.hover({ timeout }));\n else if (call.operation === \"browser.focus\") await this.act(target, \"focus\", () => element.focus());\n else if (call.operation === \"browser.check\") await this.act(target, \"check\", () => element.check({ timeout }));\n else if (call.operation === \"browser.uncheck\") await this.act(target, \"uncheck\", () => element.uncheck({ timeout }));\n else if (call.operation === \"browser.select\") {\n const values = await this.act(target, \"selectOption\", () => element.selectOption(input.values as string[], { timeout }));\n return this.success(call.operation, { values });\n }\n } finally {\n await handle?.dispose().catch(() => undefined);\n }\n const after = await this.inspect(target).catch(() => null);\n const inspection = after ?? before;\n if (!inspection) throw new BrowserActionRefusal(\"NOT_FOUND\", \"The locator matched no element.\");\n return this.success(call.operation, inspection);\n }\n\n private async script(call: BrowserOperationCall): Promise<BrowserOperationResult> {\n const input = call.input;\n const source = input.source as string;\n const args = (input.args as Record<string, unknown> | undefined) ?? {};\n const requested = typeof input.timeout === \"number\" ? input.timeout : 30_000;\n const timeout = Math.min(requested, SCRIPT_TIMEOUT_CLAMP_MS);\n // Ordinary Playwright, run in this realm with the real `page`.\n const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor as\n new (...parameters: string[]) => (...values: unknown[]) => Promise<unknown>;\n if (this.options.actionGuard) await this.options.actionGuard({ action: \"script\", source, args });\n let run: (...values: unknown[]) => Promise<unknown>;\n try {\n run = new AsyncFunction(\"page\", \"args\", source);\n } catch (error) {\n return this.failure(call.operation, \"FAILED\", `The script did not parse: ${errorMessage(error)}`);\n }\n const notice = timeout < requested\n ? `The script timeout is clamped to ${SCRIPT_TIMEOUT_CLAMP_MS}ms: the harness abandons a provider call at 12 s.`\n : undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const value = await Promise.race([\n run(this.page, args),\n new Promise((_resolve, reject) => {\n timer = setTimeout(() => reject(new BrowserActionRefusal(\"FAILED\", `The script exceeded ${timeout}ms.` + (notice ? ` ${notice}` : \"\"))), timeout);\n }),\n ]);\n return this.success(call.operation, {\n value: serializableValue(value, this.options.syntheticEvents),\n ...(notice ? { notice } : {}),\n });\n } finally {\n clearTimeout(timer);\n // Listeners a script attached do not outlive it.\n this.page.removeAllListeners();\n }\n }\n\n private async target(): Promise<BrowserTarget> {\n if (this.page.isClosed()) return { url: \"\", title: \"\", revision: 0 };\n // A page mid-navigation can hold `title()` until its next document exists;\n // the target is a description, so it never outwaits the call.\n const bounded = <T>(promise: Promise<T>, fallback: T): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n promise.catch(() => fallback),\n new Promise<T>((resolve) => { timer = setTimeout(() => resolve(fallback), 1_000); }),\n ]).finally(() => clearTimeout(timer));\n };\n const [title, revision] = await Promise.all([\n bounded(this.page.title(), \"\"),\n bounded(this.revision(), 0),\n ]);\n return { url: this.page.url(), title, revision };\n }\n\n private async success(operation: BrowserOperationName, value: unknown): Promise<BrowserOperationResult> {\n return { ok: true, operation, target: await this.target(), value };\n }\n\n private async failure(operation: BrowserOperationName, code: BrowserOperationErrorCode, message: string): Promise<BrowserOperationResult> {\n return { ok: false, operation, error: { code, message }, target: await this.target() };\n }\n}\n\nfunction operationName(raw: unknown): BrowserOperationName {\n const candidate = raw && typeof raw === \"object\" && !Array.isArray(raw) ? (raw as Record<string, unknown>).operation : undefined;\n return typeof candidate === \"string\" && (BROWSER_OPERATION_NAMES as readonly string[]).includes(candidate)\n ? candidate as BrowserOperationName\n : \"browser.status\";\n}\n\n/** A locator's action methods, bound, so it can stand where an element handle does. */\nfunction bind(locator: Locator): Pick<Locator, \"click\" | \"fill\" | \"press\" | \"hover\" | \"check\" | \"uncheck\" | \"selectOption\"> {\n return {\n click: locator.click.bind(locator),\n fill: locator.fill.bind(locator),\n press: locator.press.bind(locator),\n hover: locator.hover.bind(locator),\n check: locator.check.bind(locator),\n uncheck: locator.uncheck.bind(locator),\n selectOption: locator.selectOption.bind(locator),\n };\n}\n", "/**\n * What an action is about to land on, described from the browser side for a\n * host's `actionGuard`: the elements are found in an isolated world the page's\n * scripts cannot reach (its DOM prototypes are the browser's own), and each is\n * described over CDP from its backend node (`DOM.describeNode`,\n * `Accessibility.getPartialAXTree`), so a page cannot change what the guard\n * reads by overriding DOM functions.\n *\n * Over AlmostCDP the CDP endpoint itself runs in the page, so there the\n * description is as trustworthy as the page's world; over a native CDP\n * endpoint (Chrome, `chrome.debugger`) it is the browser's.\n */\n\nimport type { CDPSession, ElementHandle, Page } from \"playwright-core\";\n\n/** One element (or accessibility ancestor), as the browser describes it. */\nexport interface GuardedNode {\n /** The node's backend id: stable for the node's life in its document. */\n backendNodeId: number;\n /** Lower-case tag name; empty for an accessibility-only ancestor. */\n tag: string;\n /** The node's attributes, as the DOM holds them. */\n attributes: Readonly<Record<string, string>>;\n /** Computed accessibility role and name. */\n role: string;\n name: string;\n}\n\n/** Where an action lands. */\nexport interface GuardedTarget {\n /** The page URL the target was resolved on. */\n url: string;\n /**\n * The element the action lands on. For a locator, every element whose box\n * is exactly the resolved element's (a wrapper of the same size is\n * indistinguishable from outside, so a guard sees all of them); for a\n * point, the element hit there.\n */\n nodes: readonly GuardedNode[];\n /** Accessibility ancestors of those elements, nearest first. */\n ancestors: readonly GuardedNode[];\n /** The viewport point of a coordinate action. */\n point?: { x: number; y: number };\n}\n\n/** A target that could not be identified browser-side: the action is refused. */\nexport class UnidentifiedTarget extends Error {}\n\n/** A coordinate action that lands on the host's own interface: refused. */\nexport class HostElementTarget extends Error {}\n\nconst WORLD = \"supercode-guard\";\nconst GROUP = \"supercode-guard\";\nconst MAX_NODES = 8;\nconst MAX_ANCESTORS = 6;\n\ntype Query =\n | { kind: \"box\"; box: { x: number; y: number; width: number; height: number }; host: string | null; max: number }\n | { kind: \"point\"; x: number; y: number; host: string | null };\n\n/**\n * Runs in the isolated world. Returns the matching elements, or a string:\n * `host` when a point lands on the host's own elements, else why nothing was\n * found. Self-contained: it is sent as source.\n */\nfunction findInWorld(query: Query): Element[] | string {\n const onHost = (element: Element): boolean => {\n if (!query.host) return false;\n for (let node: Element | null = element; node; ) {\n if (node.matches(query.host)) return true;\n const parent: Element | null = node.parentElement;\n node = parent ?? ((node.getRootNode() as ShadowRoot).host ?? null);\n }\n return false;\n };\n if (query.kind === \"point\") {\n let element = document.elementFromPoint(query.x, query.y);\n if (!element) return \"Nothing is at that point.\";\n if (onHost(element)) return \"host\";\n while (element.shadowRoot) {\n const inner: Element | null = element.shadowRoot.elementFromPoint(query.x, query.y);\n if (!inner || inner === element) break;\n element = inner;\n if (onHost(element)) return \"host\";\n }\n if (/^(IFRAME|FRAME|OBJECT|EMBED)$/.test(element.tagName))\n return \"The point is inside an embedded frame, which the guard cannot inspect.\";\n return [element];\n }\n const { box } = query;\n const found: Element[] = [];\n const near = (a: number, b: number): boolean => Math.abs(a - b) <= 1;\n const visit = (root: Document | ShadowRoot): void => {\n for (const element of Array.from(root.querySelectorAll(\"*\"))) {\n if (found.length >= query.max) return;\n const rect = element.getBoundingClientRect();\n if (near(rect.x, box.x) && near(rect.y, box.y) && near(rect.width, box.width) && near(rect.height, box.height))\n found.push(element);\n if (element.shadowRoot) visit(element.shadowRoot);\n }\n };\n visit(document);\n return found.length ? found : \"The element could not be found in the page's top document (it may be inside an embedded frame or a closed shadow root).\";\n}\n\ninterface AXNode {\n nodeId: string;\n ignored?: boolean;\n role?: { value?: unknown };\n name?: { value?: unknown };\n parentId?: string;\n backendDOMNodeId?: number;\n}\n\nexport class BrowserSideTargets {\n private session: Promise<CDPSession> | null = null;\n\n constructor(private readonly page: Page, private readonly host: string | null) {}\n\n /** The element a resolved handle is, scrolled into view. */\n async ofHandle(handle: ElementHandle, timeout: number): Promise<GuardedTarget> {\n await handle.scrollIntoViewIfNeeded({ timeout });\n const box = await handle.boundingBox();\n if (!box || box.width === 0 || box.height === 0)\n throw new UnidentifiedTarget(\"The element has no box on the page.\");\n return await this.resolve({ kind: \"box\", box, host: this.host, max: MAX_NODES });\n }\n\n /** The element at a viewport point. */\n async atPoint(x: number, y: number): Promise<GuardedTarget> {\n return { ...await this.resolve({ kind: \"point\", x, y, host: this.host }), point: { x, y } };\n }\n\n private cdp(): Promise<CDPSession> {\n this.session ??= this.page.context().newCDPSession(this.page).catch((error: unknown) => {\n this.session = null;\n throw error;\n });\n return this.session;\n }\n\n private async resolve(query: Query): Promise<GuardedTarget> {\n const cdp = await this.cdp();\n const tree = await cdp.send(\"Page.getFrameTree\") as { frameTree: { frame: { id: string } } };\n const world = await cdp.send(\"Page.createIsolatedWorld\", { frameId: tree.frameTree.frame.id, worldName: WORLD }) as\n { executionContextId: number };\n try {\n const evaluated = await cdp.send(\"Runtime.evaluate\", {\n expression: `(${findInWorld.toString()})(${JSON.stringify(query)})`,\n contextId: world.executionContextId,\n objectGroup: GROUP,\n returnByValue: false,\n }) as { result: { type: string; value?: unknown; objectId?: string }; exceptionDetails?: { text?: string } };\n if (evaluated.exceptionDetails)\n throw new UnidentifiedTarget(`The target could not be resolved: ${evaluated.exceptionDetails.text ?? \"exception\"}.`);\n if (evaluated.result.type === \"string\") {\n if (evaluated.result.value === \"host\") throw new HostElementTarget(\"The point is on the host's own interface, which agents cannot operate.\");\n throw new UnidentifiedTarget(String(evaluated.result.value));\n }\n if (!evaluated.result.objectId) throw new UnidentifiedTarget(\"The target could not be resolved.\");\n const properties = await cdp.send(\"Runtime.getProperties\", { objectId: evaluated.result.objectId, ownProperties: true }) as\n { result: Array<{ name: string; value?: { objectId?: string } }> };\n const objects = properties.result\n .filter((property) => /^\\d+$/.test(property.name) && property.value?.objectId)\n .map((property) => property.value!.objectId!);\n if (!objects.length) throw new UnidentifiedTarget(\"The target could not be resolved.\");\n const nodes: GuardedNode[] = [];\n const ancestors: GuardedNode[] = [];\n const seen = new Set<number>();\n for (const objectId of objects) {\n const described = await cdp.send(\"DOM.describeNode\", { objectId }) as\n { node: { backendNodeId: number; nodeName: string; attributes?: string[] } };\n const attributes: Record<string, string> = {};\n const list = described.node.attributes ?? [];\n for (let index = 0; index + 1 < list.length; index += 2) attributes[list[index]!.toLowerCase()] = list[index + 1]!;\n const ax = await this.accessibility(cdp, described.node.backendNodeId);\n nodes.push({\n backendNodeId: described.node.backendNodeId,\n tag: described.node.nodeName.toLowerCase(),\n attributes,\n role: ax.self?.role ?? \"\",\n name: ax.self?.name ?? \"\",\n });\n seen.add(described.node.backendNodeId);\n for (const ancestor of ax.ancestors) {\n if (ancestors.length >= MAX_ANCESTORS || seen.has(ancestor.backendNodeId)) continue;\n seen.add(ancestor.backendNodeId);\n ancestors.push(ancestor);\n }\n }\n return { url: this.page.url(), nodes, ancestors };\n } finally {\n await cdp.send(\"Runtime.releaseObjectGroup\", { objectGroup: GROUP }).catch(() => undefined);\n }\n }\n\n private async accessibility(cdp: CDPSession, backendNodeId: number): Promise<{ self: { role: string; name: string } | null; ancestors: GuardedNode[] }> {\n const tree = await cdp.send(\"Accessibility.getPartialAXTree\", { backendNodeId, fetchRelatives: true }) as { nodes: AXNode[] };\n const byId = new Map(tree.nodes.map((node) => [node.nodeId, node]));\n const text = (value: unknown): string => typeof value === \"string\" ? value.replace(/\\s+/g, \" \").trim() : \"\";\n const self = tree.nodes.find((node) => node.backendDOMNodeId === backendNodeId) ?? null;\n const ancestors: GuardedNode[] = [];\n for (let node = self?.parentId ? byId.get(self.parentId) : undefined; node && ancestors.length < MAX_ANCESTORS;\n node = node.parentId ? byId.get(node.parentId) : undefined) {\n if (node.ignored || typeof node.backendDOMNodeId !== \"number\") continue;\n ancestors.push({ backendNodeId: node.backendDOMNodeId, tag: \"\", attributes: {}, role: text(node.role?.value), name: text(node.name?.value) });\n }\n return { self: self ? { role: text(self.role?.value), name: text(self.name?.value) } : null, ancestors };\n }\n}\n", "/**\n * The wire Supercode's browser providers answer: `supercode/browser-provider-v1`\n * envelopes carrying `supercode/browser-operation-v1` calls. Pure data and\n * parsers, with no runtime dependency, for the harness side, a host relaying\n * calls, and the executor alike.\n */\n\nexport const SUPERCODE_BROWSER_PROVIDER_PROTOCOL = \"supercode/browser-provider-v1\" as const;\nexport const SUPERCODE_BROWSER_OPERATION_PROTOCOL = \"supercode/browser-operation-v1\" as const;\n\nexport type BrowserLocator =\n | { by: \"css\"; value: string }\n | { by: \"ref\"; value: string }\n | { by: \"role\"; role: string; name?: string; exact?: boolean }\n | { by: \"text\"; text: string; exact?: boolean }\n | { by: \"testId\"; value: string }\n | { by: \"label\"; text: string; exact?: boolean }\n | { by: \"placeholder\"; text: string; exact?: boolean }\n | { by: \"altText\"; text: string; exact?: boolean }\n | { by: \"title\"; text: string; exact?: boolean };\n\nexport type BrowserOperationName =\n | \"browser.status\" | \"browser.snapshot\" | \"browser.query\" | \"browser.wait\"\n | \"browser.click\" | \"browser.fill\" | \"browser.press\" | \"browser.hover\"\n | \"browser.focus\" | \"browser.check\" | \"browser.uncheck\" | \"browser.select\"\n | \"browser.scroll\" | \"browser.back\" | \"browser.forward\" | \"browser.reload\"\n | \"browser.box\" | \"browser.mouse\" | \"browser.drag\" | \"browser.wheel\"\n | \"browser.script\";\n\nexport interface BrowserOperationCall {\n protocol: typeof SUPERCODE_BROWSER_OPERATION_PROTOCOL;\n operation: BrowserOperationName;\n input: Record<string, unknown>;\n}\n\nexport interface BrowserTarget {\n page?: string;\n url: string;\n title: string;\n revision: number;\n}\n\nexport type BrowserOperationErrorCode =\n | \"APPROVAL_REQUIRED\" | \"INVALID_INPUT\" | \"NOT_AVAILABLE\" | \"NOT_FOUND\"\n | \"STALE_PAGE\" | \"TIMED_OUT\" | \"UNSUPPORTED\" | \"FAILED\";\n\nexport type BrowserOperationResult =\n | { ok: true; operation: BrowserOperationName; target: BrowserTarget; value: unknown }\n | {\n ok: false;\n operation: BrowserOperationName;\n error: { code: BrowserOperationErrorCode; message: string };\n target?: BrowserTarget;\n };\n\nexport interface ElementInspection {\n ref: string;\n tag: string;\n role?: string;\n name?: string;\n value?: string;\n disabled: boolean;\n checked?: boolean;\n visible: boolean;\n}\n\n\n/** The 21 operations, in the registry's order. */\nexport const BROWSER_OPERATION_NAMES: readonly BrowserOperationName[] = Object.freeze([\n \"browser.status\", \"browser.snapshot\", \"browser.query\", \"browser.wait\",\n \"browser.click\", \"browser.fill\", \"browser.press\", \"browser.hover\",\n \"browser.focus\", \"browser.check\", \"browser.uncheck\", \"browser.select\",\n \"browser.scroll\", \"browser.back\", \"browser.forward\", \"browser.reload\",\n \"browser.box\", \"browser.mouse\", \"browser.drag\", \"browser.wheel\",\n \"browser.script\",\n]);\nconst OPERATION_NAMES = new Set<BrowserOperationName>(BROWSER_OPERATION_NAMES);\n\n/** A host's refusal of one action, carrying its wire error code. */\nexport class BrowserActionRefusal extends Error {\n constructor(readonly code: BrowserOperationErrorCode, message: string) {\n super(message);\n this.name = \"BrowserActionRefusal\";\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction exactKeys(candidate: Record<string, unknown>, allowed: readonly string[]): boolean {\n return Object.keys(candidate).every((key) => allowed.includes(key));\n}\n\nfunction parsePage(value: unknown): string | undefined | null {\n return value === undefined\n ? undefined\n : typeof value === \"string\" && value.length > 0 && value.length <= 512\n ? value\n : null;\n}\n\nexport function parseBrowserLocator(value: unknown): BrowserLocator | null {\n const candidate = record(value);\n if (!candidate || typeof candidate.by !== \"string\") return null;\n if (candidate.by === \"label\" || candidate.by === \"placeholder\" || candidate.by === \"altText\" || candidate.by === \"title\") {\n const { by, text, exact } = candidate as Record<string, unknown>;\n return typeof text === \"string\" && (exact === undefined || typeof exact === \"boolean\") &&\n exactKeys(candidate as Record<string, unknown>, [\"by\", \"text\", \"exact\"])\n ? ({ by, text, ...(exact !== undefined ? { exact } : {}) } as BrowserLocator)\n : null;\n }\n if (candidate.by === \"css\" || candidate.by === \"ref\" || candidate.by === \"testId\") {\n return exactKeys(candidate, [\"by\", \"value\"]) && typeof candidate.value === \"string\" &&\n candidate.value.length > 0 && candidate.value.length <= 2_000\n ? { by: candidate.by, value: candidate.value }\n : null;\n }\n if (candidate.by === \"role\") {\n if (!exactKeys(candidate, [\"by\", \"role\", \"name\", \"exact\"]) ||\n typeof candidate.role !== \"string\" || !candidate.role ||\n (candidate.name !== undefined && typeof candidate.name !== \"string\") ||\n (candidate.exact !== undefined && typeof candidate.exact !== \"boolean\")) return null;\n return {\n by: \"role\",\n role: candidate.role,\n ...(typeof candidate.name === \"string\" ? { name: candidate.name } : {}),\n ...(typeof candidate.exact === \"boolean\" ? { exact: candidate.exact } : {}),\n };\n }\n if (candidate.by === \"text\") {\n if (!exactKeys(candidate, [\"by\", \"text\", \"exact\"]) ||\n typeof candidate.text !== \"string\" || !candidate.text ||\n (candidate.exact !== undefined && typeof candidate.exact !== \"boolean\")) return null;\n return {\n by: \"text\",\n text: candidate.text,\n ...(typeof candidate.exact === \"boolean\" ? { exact: candidate.exact } : {}),\n };\n }\n return null;\n}\n\nfunction parseTargetInput(\n value: unknown,\n options: { locatorRequired: boolean; value?: boolean; key?: boolean; wait?: boolean; values?: boolean },\n): Record<string, unknown> | null {\n const candidate = record(value);\n if (!candidate) return null;\n const allowed = [\"page\", \"locator\", \"index\", \"expectedRevision\"];\n if (options.value) allowed.push(\"value\");\n if (options.values) allowed.push(\"values\");\n if (options.key) allowed.push(\"key\");\n if (options.wait) allowed.push(\"state\", \"timeout\");\n if (!exactKeys(candidate, allowed)) return null;\n const page = parsePage(candidate.page);\n const locator = candidate.locator === undefined ? undefined : parseBrowserLocator(candidate.locator);\n const index = candidate.index;\n const revision = candidate.expectedRevision;\n if (page === null || (options.locatorRequired && !locator) ||\n (candidate.locator !== undefined && !locator) ||\n (index !== undefined && (!Number.isInteger(index) || (index as number) < 0)) ||\n (revision !== undefined && (!Number.isInteger(revision) || (revision as number) < 0)) ||\n (options.value && typeof candidate.value !== \"string\") ||\n (options.values && (!Array.isArray(candidate.values) ||\n !candidate.values.every((item) => typeof item === \"string\"))) ||\n (options.key && (typeof candidate.key !== \"string\" || !candidate.key || candidate.key.length > 100)) ||\n (options.wait && candidate.state !== undefined &&\n candidate.state !== \"attached\" && candidate.state !== \"visible\") ||\n (options.wait && candidate.timeout !== undefined &&\n (typeof candidate.timeout !== \"number\" || candidate.timeout < 0 || candidate.timeout > 30_000))) return null;\n return {\n ...(page ? { page } : {}),\n ...(locator ? { locator } : {}),\n ...(typeof index === \"number\" ? { index } : {}),\n ...(typeof revision === \"number\" ? { expectedRevision: revision } : {}),\n ...(options.value ? { value: candidate.value } : {}),\n ...(options.values ? { values: candidate.values } : {}),\n ...(options.key ? { key: candidate.key } : {}),\n ...(options.wait && candidate.state ? { state: candidate.state } : {}),\n ...(options.wait && typeof candidate.timeout === \"number\" ? { timeout: candidate.timeout } : {}),\n };\n}\n\nfunction parseBrowserOperationInput(operation: BrowserOperationName, value: unknown): Record<string, unknown> | null {\n const candidate = record(value);\n if (!candidate) return null;\n if (operation === \"browser.status\") return exactKeys(candidate, []) ? {} : null;\n if (operation === \"browser.snapshot\") {\n const page = parsePage(candidate.page);\n const locator = candidate.locator === undefined ? undefined : parseBrowserLocator(candidate.locator);\n return exactKeys(candidate, [\"page\", \"locator\"]) && page !== null &&\n (candidate.locator === undefined || locator !== null)\n ? { ...(page ? { page } : {}), ...(locator ? { locator } : {}) }\n : null;\n }\n if (operation === \"browser.query\" || operation === \"browser.click\" ||\n operation === \"browser.hover\" || operation === \"browser.focus\" ||\n operation === \"browser.check\" || operation === \"browser.uncheck\") {\n return parseTargetInput(candidate, { locatorRequired: true });\n }\n if (operation === \"browser.wait\")\n return parseTargetInput(candidate, { locatorRequired: true, wait: true });\n if (operation === \"browser.fill\")\n return parseTargetInput(candidate, { locatorRequired: true, value: true });\n if (operation === \"browser.select\")\n return parseTargetInput(candidate, { locatorRequired: true, values: true });\n if (operation === \"browser.press\")\n return parseTargetInput(candidate, { locatorRequired: false, key: true });\n if (operation === \"browser.script\") {\n const page = parsePage(candidate.page);\n const { source, args, timeout } = candidate;\n return exactKeys(candidate, [\"page\", \"source\", \"args\", \"timeout\"]) && page !== null &&\n typeof source === \"string\" && source.length > 0 && source.length <= 100_000 &&\n (args === undefined || (typeof args === \"object\" && args !== null && !Array.isArray(args))) &&\n (timeout === undefined || (typeof timeout === \"number\" && timeout >= 0 && timeout <= 120_000))\n ? {\n ...(page ? { page } : {}),\n source,\n ...(args !== undefined ? { args } : {}),\n ...(typeof timeout === \"number\" ? { timeout } : {}),\n }\n : null;\n }\n if (operation === \"browser.box\") return parseTargetInput(candidate, { locatorRequired: true });\n if (operation === \"browser.mouse\") {\n const page = parsePage(candidate.page);\n const { action, x, y, deltaX, deltaY } = candidate;\n const point = (value: unknown): boolean => typeof value === \"number\" && Number.isFinite(value);\n const needsPoint = action === \"move\" || action === \"click\";\n return exactKeys(candidate, [\"page\", \"action\", \"x\", \"y\", \"deltaX\", \"deltaY\"]) && page !== null &&\n (action === \"move\" || action === \"down\" || action === \"up\" || action === \"click\") &&\n (!needsPoint || (point(x) && point(y))) &&\n deltaX === undefined && deltaY === undefined\n ? { ...(page ? { page } : {}), action, ...(point(x) ? { x } : {}), ...(point(y) ? { y } : {}) }\n : null;\n }\n if (operation === \"browser.wheel\") {\n const page = parsePage(candidate.page);\n const { deltaX, deltaY } = candidate;\n return exactKeys(candidate, [\"page\", \"deltaX\", \"deltaY\"]) && page !== null &&\n (deltaX === undefined || typeof deltaX === \"number\") &&\n (deltaY === undefined || typeof deltaY === \"number\")\n ? {\n ...(page ? { page } : {}),\n ...(typeof deltaX === \"number\" ? { deltaX } : {}),\n ...(typeof deltaY === \"number\" ? { deltaY } : {}),\n }\n : null;\n }\n if (operation === \"browser.drag\") {\n const page = parsePage(candidate.page);\n const { from, to, steps } = candidate;\n const endpoint = (value: unknown): boolean => {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n if (record.locator !== undefined) return parseBrowserLocator(record.locator) !== null && exactKeys(record, [\"locator\"]);\n return typeof record.x === \"number\" && typeof record.y === \"number\" && exactKeys(record, [\"x\", \"y\"]);\n };\n return exactKeys(candidate, [\"page\", \"from\", \"to\", \"steps\"]) && page !== null &&\n endpoint(from) && endpoint(to) &&\n (steps === undefined || (Number.isInteger(steps) && (steps as number) >= 1 && (steps as number) <= 100))\n ? { ...(page ? { page } : {}), from, to, ...(typeof steps === \"number\" ? { steps } : {}) }\n : null;\n }\n if (operation === \"browser.scroll\") {\n const page = parsePage(candidate.page);\n const { direction, amount, expectedRevision } = candidate;\n return exactKeys(candidate, [\"page\", \"direction\", \"amount\", \"expectedRevision\"]) && page !== null &&\n (direction === \"up\" || direction === \"down\" || direction === \"left\" || direction === \"right\") &&\n (amount === undefined || (typeof amount === \"number\" && amount >= 1 && amount <= 10_000)) &&\n (expectedRevision === undefined || (Number.isInteger(expectedRevision) && (expectedRevision as number) >= 0))\n ? {\n ...(page ? { page } : {}), direction,\n ...(typeof amount === \"number\" ? { amount } : {}),\n ...(typeof expectedRevision === \"number\" ? { expectedRevision } : {}),\n }\n : null;\n }\n return parseTargetInput(candidate, { locatorRequired: false });\n}\n\nexport function parseBrowserOperationCall(value: unknown): BrowserOperationCall | null {\n const candidate = record(value);\n if (!candidate || candidate.protocol !== SUPERCODE_BROWSER_OPERATION_PROTOCOL ||\n typeof candidate.operation !== \"string\" || !OPERATION_NAMES.has(candidate.operation as BrowserOperationName)) return null;\n const operation = candidate.operation as BrowserOperationName;\n const input = parseBrowserOperationInput(operation, candidate.input);\n return input === null ? null : { protocol: SUPERCODE_BROWSER_OPERATION_PROTOCOL, operation, input };\n}\n\nexport function parseBrowserOperationResult(value: unknown): BrowserOperationResult | null {\n const candidate = record(value);\n if (!candidate || typeof candidate.ok !== \"boolean\" ||\n typeof candidate.operation !== \"string\" || !OPERATION_NAMES.has(candidate.operation as BrowserOperationName)) return null;\n const operation = candidate.operation as BrowserOperationName;\n const targetCandidate = record(candidate.target);\n const target = targetCandidate &&\n (targetCandidate.page === undefined || typeof targetCandidate.page === \"string\") &&\n typeof targetCandidate.url === \"string\" && typeof targetCandidate.title === \"string\" &&\n Number.isInteger(targetCandidate.revision)\n ? {\n ...(typeof targetCandidate.page === \"string\" ? { page: targetCandidate.page } : {}),\n url: targetCandidate.url,\n title: targetCandidate.title,\n revision: targetCandidate.revision as number,\n }\n : null;\n if (candidate.ok) return target ? { ok: true, operation, target, value: candidate.value } : null;\n const error = record(candidate.error);\n const codes = new Set<BrowserOperationErrorCode>([\n \"APPROVAL_REQUIRED\", \"INVALID_INPUT\", \"NOT_AVAILABLE\", \"NOT_FOUND\",\n \"STALE_PAGE\", \"TIMED_OUT\", \"UNSUPPORTED\", \"FAILED\",\n ]);\n if (!error || typeof error.code !== \"string\" || !codes.has(error.code as BrowserOperationErrorCode) ||\n typeof error.message !== \"string\") return null;\n return {\n ok: false,\n operation,\n error: { code: error.code as BrowserOperationErrorCode, message: error.message },\n ...(target ? { target } : {}),\n };\n}\n", "/**\n * The provider: one Playwright connection over CDP, one page, and the\n * `supercode/browser-provider-v1` envelope around each operation call.\n */\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport { chromium, type Browser, type Page } from \"playwright-core\";\nimport {\n SUPERCODE_BROWSER_OPERATION_PROTOCOL,\n SUPERCODE_BROWSER_PROVIDER_PROTOCOL,\n type BrowserOperationName,\n type BrowserOperationResult,\n} from \"./protocol.js\";\nimport { PlaywrightOperationExecutor } from \"./executor.js\";\n\n/** Bound for one provider request (`BROWSER_PROVIDER_MAX_REQUEST_BYTES`). */\nexport const MAX_REQUEST_BYTES = 256 * 1024;\n/** Bound for one provider response (`BROWSER_PROVIDER_MAX_RESPONSE_BYTES`). */\nexport const MAX_RESPONSE_BYTES = 1024 * 1024;\n\nexport interface PlaywrightBrowserProviderOptions {\n /** CDP endpoint: `http://\u2026` (resolved through `/json/version`) or `ws://\u2026`. */\n cdpUrl: string;\n /** Hex token every request must carry. */\n token: string;\n /** True when the endpoint dispatches `isTrusted:false` input (an AlmostCDP endpoint). */\n syntheticEvents: boolean;\n}\n\n/** The provider-v1 response envelope the harness reads. */\nexport interface ProviderResponse {\n protocol: typeof SUPERCODE_BROWSER_PROVIDER_PROTOCOL;\n id: string | null;\n result: BrowserOperationResult;\n}\n\nexport interface PlaywrightBrowserProvider {\n readonly token: string;\n /** Validate one provider-v1 request and answer it with a provider-v1 response. */\n handle(request: unknown): Promise<ProviderResponse>;\n /** Disconnect from the endpoint. The browser itself is left running. */\n close(): Promise<void>;\n}\n\ninterface Connection {\n browser: Browser;\n page: Page;\n executor: PlaywrightOperationExecutor;\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : null;\n}\n\nfunction tokenMatches(expected: string, actual: unknown): boolean {\n if (typeof actual !== \"string\") return false;\n const left = Buffer.from(expected);\n const right = Buffer.from(actual);\n return left.length === right.length && timingSafeEqual(left, right);\n}\n\nfunction callOperation(call: unknown): BrowserOperationName {\n const operation = record(call)?.operation;\n return typeof operation === \"string\" && operation.startsWith(\"browser.\") ? operation as BrowserOperationName : \"browser.status\";\n}\n\nexport function createPlaywrightBrowserProvider(options: PlaywrightBrowserProviderOptions): PlaywrightBrowserProvider {\n if (!/^[0-9a-f]{32,}$/i.test(options.token))\n throw new Error(\"The provider token must be at least 32 hexadecimal characters.\");\n let connection: Connection | null = null;\n let queue: Promise<unknown> = Promise.resolve();\n\n const usable = (candidate: Connection | null): candidate is Connection =>\n candidate !== null && candidate.browser.isConnected() && !candidate.page.isClosed();\n\n const connect = async (): Promise<Connection> => {\n const previous = connection;\n connection = null;\n // The provider is attached to a browser it does not own: it changes none\n // of that browser's defaults (download policy, focus emulation, media).\n const browser = previous?.browser.isConnected() ? previous.browser : await chromium.connectOverCDP(options.cdpUrl, { noDefaults: true });\n const page = browser.contexts()[0]?.pages()[0];\n if (!page) {\n if (browser !== previous?.browser) await browser.close().catch(() => undefined);\n throw new Error(\"The browser has no open page.\");\n }\n const executor = new PlaywrightOperationExecutor(page, {\n syntheticEvents: options.syntheticEvents,\n endpoint: browser.version(),\n });\n connection = { browser, page, executor };\n return connection;\n };\n\n const failure = (operation: BrowserOperationName, code: \"INVALID_INPUT\" | \"NOT_AVAILABLE\", message: string): BrowserOperationResult =>\n ({ ok: false, operation, error: { code, message } });\n\n const run = async (call: unknown): Promise<BrowserOperationResult> => {\n let current = connection;\n if (!usable(current)) {\n // One reconnect per call; a second failure is the answer.\n try {\n current = await connect();\n } catch (error) {\n return failure(callOperation(call), \"NOT_AVAILABLE\",\n `The CDP endpoint is not available: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n return current.executor.execute(call);\n };\n\n return {\n token: options.token,\n async handle(request: unknown): Promise<ProviderResponse> {\n const envelope = record(request);\n const id = typeof envelope?.id === \"string\" && envelope.id.length > 0 && envelope.id.length <= 256 ? envelope.id : null;\n const respond = (result: BrowserOperationResult): ProviderResponse =>\n ({ protocol: SUPERCODE_BROWSER_PROVIDER_PROTOCOL, id, result });\n const call = envelope?.call;\n const operation = callOperation(call);\n if (!envelope || envelope.protocol !== SUPERCODE_BROWSER_PROVIDER_PROTOCOL || id === null ||\n record(call)?.protocol !== SUPERCODE_BROWSER_OPERATION_PROTOCOL)\n return respond(failure(operation, \"INVALID_INPUT\", \"Invalid browser provider request envelope.\"));\n if (!tokenMatches(options.token, envelope.token))\n return respond(failure(operation, \"INVALID_INPUT\", \"Invalid browser provider token.\"));\n // One page, one caller at a time: operations never interleave on it.\n const result = queue.then(() => run(call));\n queue = result.catch(() => undefined);\n return respond(await result);\n },\n async close(): Promise<void> {\n const current = connection;\n connection = null;\n // For a CDP connection `close()` closes the websocket, not the browser.\n await current?.browser.close().catch(() => undefined);\n },\n };\n}\n", "/**\n * Two framings of the same provider-v1 envelope.\n *\n * - TCP (the harness's wire, `crates/harness/src/browser.rs`): one\n * newline-terminated JSON request per connection, one JSON response, close.\n * Discovery is an owner-only record under `<providers dir>/browser/<id>.json`.\n * - HTTP: `POST /` with the request JSON as the body, the response JSON as the\n * body, for a host that can reach the provider only by HTTP.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as http from \"node:http\";\nimport * as net from \"node:net\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { SUPERCODE_BROWSER_PROVIDER_PROTOCOL } from \"./protocol.js\";\nimport { PLAYWRIGHT_IMPLEMENTATION } from \"./executor.js\";\nimport {\n MAX_REQUEST_BYTES,\n MAX_RESPONSE_BYTES,\n type PlaywrightBrowserProvider,\n type ProviderResponse,\n} from \"./provider.js\";\n\nconst HOST = \"127.0.0.1\";\n\nexport interface ServeHandle {\n framing: \"tcp\" | \"http\";\n port: number;\n /** The discovery record written for the TCP framing. */\n discoveryPath?: string;\n stop(): Promise<void>;\n}\n\n/** Supercode's providers directory, resolved as `browser_provider_directory()` resolves its parent. */\nexport function defaultProvidersDirectory(): string {\n const env = process.env;\n const root = env.SUPERCODE_HOME ? env.SUPERCODE_HOME\n : env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, \"supercode\")\n : env.HOME ? path.join(env.HOME, \".config\", \"supercode\")\n : path.join(os.tmpdir(), \"supercode\");\n return path.join(root, \"providers\");\n}\n\nfunction invalid(id: string | null, message: string): ProviderResponse {\n return {\n protocol: SUPERCODE_BROWSER_PROVIDER_PROTOCOL,\n id,\n result: { ok: false, operation: \"browser.status\", error: { code: \"INVALID_INPUT\", message } },\n };\n}\n\n/** Serialize a response inside the 1 MiB bound, replacing an oversized result with a bounded failure. */\nfunction encode(response: ProviderResponse): string {\n const text = JSON.stringify(response);\n if (Buffer.byteLength(text) <= MAX_RESPONSE_BYTES) return text;\n return JSON.stringify({\n ...response,\n result: {\n ok: false,\n operation: response.result.operation,\n error: { code: \"FAILED\", message: \"The operation result exceeds the provider's 1 MiB response bound.\" },\n },\n });\n}\n\nasync function answer(provider: PlaywrightBrowserProvider, body: string): Promise<ProviderResponse> {\n let request: unknown;\n try {\n request = JSON.parse(body);\n } catch {\n return invalid(null, \"The request is not JSON.\");\n }\n return provider.handle(request);\n}\n\nexport interface TcpServeOptions {\n port: number;\n /** Parent of `browser/`; defaults to Supercode's providers directory. */\n providersDirectory?: string;\n /** Workspace the discovery record is scoped to; defaults to the working directory. */\n workspace?: string;\n syntheticEvents: boolean;\n}\n\nexport async function serveTcp(provider: PlaywrightBrowserProvider, options: TcpServeOptions): Promise<ServeHandle> {\n const server = net.createServer((socket) => {\n const chunks: Buffer[] = [];\n let size = 0;\n let done = false;\n const finish = (response: ProviderResponse): void => {\n if (socket.destroyed) return;\n socket.end(`${encode(response)}\\n`);\n };\n socket.setTimeout(15_000, () => socket.destroy());\n socket.on(\"error\", () => socket.destroy());\n socket.on(\"data\", (chunk: Buffer) => {\n if (done) return;\n const newline = chunk.indexOf(0x0a);\n const part = newline === -1 ? chunk : chunk.subarray(0, newline);\n size += part.length + (newline === -1 ? 0 : 1);\n if (size > MAX_REQUEST_BYTES) {\n done = true;\n finish(invalid(null, \"The request exceeds 256 KiB.\"));\n return;\n }\n chunks.push(part);\n if (newline === -1) return;\n done = true;\n void answer(provider, Buffer.concat(chunks).toString(\"utf8\")).then(finish, (error: unknown) =>\n finish(invalid(null, error instanceof Error ? error.message : String(error))));\n });\n socket.on(\"end\", () => {\n if (done) return;\n done = true;\n // A request without its newline is still one request.\n void answer(provider, Buffer.concat(chunks).toString(\"utf8\")).then(finish, () => socket.destroy());\n });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, HOST, () => { server.off(\"error\", reject); resolve(); });\n });\n const port = (server.address() as net.AddressInfo).port;\n\n const directory = path.join(options.providersDirectory ?? defaultProvidersDirectory(), \"browser\");\n fs.mkdirSync(directory, { recursive: true, mode: 0o700 });\n fs.chmodSync(directory, 0o700);\n const id = `playwright.cdp.${port}`;\n const discoveryPath = path.join(directory, `${id}.json`);\n const workspace = fs.realpathSync(options.workspace ?? process.cwd());\n const discovery = {\n protocol: SUPERCODE_BROWSER_PROVIDER_PROTOCOL,\n workspace,\n host: HOST,\n port,\n token: provider.token,\n provider: {\n id,\n name: \"Playwright over CDP\",\n fidelity: {\n implementation: PLAYWRIGHT_IMPLEMENTATION,\n transport: \"cdp\",\n accessibility: \"playwright-aria-snapshot\",\n syntheticEvents: options.syntheticEvents,\n trustedInput: !options.syntheticEvents,\n script: \"node-playwright-page\",\n },\n },\n };\n const temporary = `${discoveryPath}.${randomBytes(6).toString(\"hex\")}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(discovery, null, 2)}\\n`, { mode: 0o600, flag: \"wx\" });\n fs.renameSync(temporary, discoveryPath);\n\n return {\n framing: \"tcp\",\n port,\n discoveryPath,\n async stop(): Promise<void> {\n fs.rmSync(discoveryPath, { force: true });\n await new Promise<void>((resolve) => server.close(() => resolve()));\n },\n };\n}\n\nexport interface HttpServeOptions {\n port: number;\n}\n\nexport async function serveHttp(provider: PlaywrightBrowserProvider, options: HttpServeOptions): Promise<ServeHandle> {\n const server = http.createServer((request, response) => {\n const send = (status: number, body?: string): void => {\n response.writeHead(status, body === undefined ? {} : { \"content-type\": \"application/json\" });\n response.end(body);\n };\n const pathname = (request.url ?? \"/\").split(\"?\", 1)[0];\n if (pathname !== \"/\") { request.resume(); send(404); return; }\n if (request.method !== \"POST\") { request.resume(); response.setHeader(\"allow\", \"POST\"); send(405); return; }\n const chunks: Buffer[] = [];\n let size = 0;\n let rejected = false;\n request.on(\"data\", (chunk: Buffer) => {\n if (rejected) return;\n size += chunk.length;\n if (size > MAX_REQUEST_BYTES) {\n rejected = true;\n send(413, encode(invalid(null, \"The request exceeds 256 KiB.\")));\n request.destroy();\n return;\n }\n chunks.push(chunk);\n });\n request.on(\"end\", () => {\n if (rejected) return;\n let body: unknown;\n try {\n body = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n } catch {\n send(400, encode(invalid(null, \"The request is not JSON.\")));\n return;\n }\n void provider.handle(body).then(\n (result) => send(200, encode(result)),\n (error: unknown) => send(500, encode(invalid(null, error instanceof Error ? error.message : String(error)))),\n );\n });\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, HOST, () => { server.off(\"error\", reject); resolve(); });\n });\n const port = (server.address() as net.AddressInfo).port;\n return {\n framing: \"http\",\n port,\n async stop(): Promise<void> {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n },\n };\n}\n", "/**\n * `supercode-browser-playwright --cdp-url <url>\n * (--tcp <port> [--providers-dir <dir>] [--workspace <path>] | --http <port>)\n * [--token <hex>] [--synthetic-events]`\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { parseArgs } from \"node:util\";\nimport { createPlaywrightBrowserProvider } from \"./provider.js\";\nimport { serveHttp, serveTcp, type ServeHandle } from \"./serve.js\";\n\nconst USAGE = \"usage: supercode-browser-playwright --cdp-url <url> \" +\n \"(--tcp <port> [--providers-dir <dir>] [--workspace <path>] | --http <port>) \" +\n \"[--token <hex>] [--synthetic-events]\";\n\nfunction port(value: string, flag: string): number {\n const parsed = Number(value);\n if (!/^\\d+$/.test(value) || parsed > 65_535) throw new Error(`${flag} must be a port number (0 picks a free one).`);\n return parsed;\n}\n\nexport async function main(argv: readonly string[]): Promise<ServeHandle> {\n const { values } = parseArgs({\n args: [...argv],\n strict: true,\n allowPositionals: false,\n options: {\n \"cdp-url\": { type: \"string\" },\n tcp: { type: \"string\" },\n http: { type: \"string\" },\n \"providers-dir\": { type: \"string\" },\n workspace: { type: \"string\" },\n token: { type: \"string\" },\n \"synthetic-events\": { type: \"boolean\", default: false },\n },\n });\n const cdpUrl = values[\"cdp-url\"];\n if (!cdpUrl) throw new Error(`--cdp-url is required.\\n${USAGE}`);\n if ((values.tcp === undefined) === (values.http === undefined))\n throw new Error(`Exactly one of --tcp and --http is required.\\n${USAGE}`);\n if (values.http !== undefined && (values[\"providers-dir\"] !== undefined || values.workspace !== undefined))\n throw new Error(`--providers-dir and --workspace belong to the TCP framing.\\n${USAGE}`);\n if (values.http !== undefined && values.token === undefined)\n throw new Error(\"--http requires --token: the host that calls the provider passes it.\");\n const token = values.token ?? randomBytes(32).toString(\"hex\");\n const syntheticEvents = values[\"synthetic-events\"] ?? false;\n const provider = createPlaywrightBrowserProvider({ cdpUrl, token, syntheticEvents });\n const handle = values.tcp !== undefined\n ? await serveTcp(provider, {\n port: port(values.tcp, \"--tcp\"),\n syntheticEvents,\n ...(values[\"providers-dir\"] !== undefined ? { providersDirectory: values[\"providers-dir\"] } : {}),\n ...(values.workspace !== undefined ? { workspace: values.workspace } : {}),\n })\n : await serveHttp(provider, { port: port(values.http!, \"--http\") });\n process.stdout.write(`${JSON.stringify({ listening: { framing: handle.framing, port: handle.port } })}\\n`);\n let stopping = false;\n const stop = (): void => {\n if (stopping) return;\n stopping = true;\n void Promise.allSettled([handle.stop(), provider.close()]).then(() => process.exit(0));\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n process.once(\"SIGHUP\", stop);\n return handle;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["value", "record", "node", "locator", "timeout", "handle", "record", "result", "port", "randomBytes", "randomBytes"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter-ai-dev/supercode-browser-playwright",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "Supercode browser provider that is an unmodified playwright-core client over CDP, and the browser-operation wire it answers",
6
6
  "bin": {