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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -131,6 +131,13 @@ Two entry points use no Node API:
131
131
 
132
132
  A host's `actionGuard(action)` is asked before each locator action (`click`,
133
133
  `fill`, `press`, `hover`, `focus`, `check`, `uncheck`, `select`, `drag`) with
134
- the action's `Locator` and value; throwing a `BrowserActionRefusal` answers the
135
- call with its code, such as `APPROVAL_REQUIRED`. `browser.script` is not
136
- guarded: a script is trusted with the page.
134
+ the action's `Locator` and value, and before each `browser.script` with
135
+ `{action: "script", source, args}`; throwing a `BrowserActionRefusal` answers
136
+ the call with its code, such as `APPROVAL_REQUIRED`. A script's own locator
137
+ calls are the real `page`'s and are not asked again, so a host that guards
138
+ locator actions guards scripts as a whole.
139
+
140
+ A host's `snapshotExclude` is a CSS selector for its own elements in the page
141
+ (an overlay, a launcher): `browser.snapshot` leaves out the nodes of every
142
+ element it matches, found by their aria refs, and a node left empty by that.
143
+ The page is not changed, so assistive technology still reads those elements.
@@ -22,18 +22,39 @@ export interface PlaywrightOperationExecutorOptions {
22
22
  /** `browser.version()` of the connected endpoint, reported by `browser.status`. */
23
23
  endpoint: string;
24
24
  /**
25
- * The host's policy for one locator action, asked before it runs; throwing
26
- * a `BrowserActionRefusal` refuses it with that code. `browser.script` is
27
- * not guarded: a script is trusted with the page.
25
+ * The host's policy for one action, asked before it runs: each locator
26
+ * action, and each `browser.script` before its source is compiled. Throwing
27
+ * a `BrowserActionRefusal` refuses the operation with that code.
28
28
  */
29
29
  actionGuard?: (action: PlaywrightAction) => void | Promise<void>;
30
+ /**
31
+ * A CSS selector (Playwright's, which pierces open shadow roots) for the
32
+ * host's own elements: `browser.snapshot` leaves out every matching
33
+ * element's nodes, and a node left with nothing by that. The page itself is
34
+ * not changed, so what assistive technology reads stays the same.
35
+ */
36
+ snapshotExclude?: string;
30
37
  }
31
- /** One locator action an operation is about to perform. */
32
- export interface PlaywrightAction {
38
+ /** One action an operation is about to perform. */
39
+ export type PlaywrightAction = PlaywrightLocatorAction | PlaywrightScriptAction;
40
+ /** A locator action. */
41
+ export interface PlaywrightLocatorAction {
33
42
  action: "click" | "fill" | "press" | "hover" | "focus" | "check" | "uncheck" | "select" | "drag";
34
43
  locator: Locator;
35
44
  value?: unknown;
36
45
  }
46
+ export interface PlaywrightScriptAction {
47
+ /** `browser.script`: the author's source, run with the real `page`. */
48
+ action: "script";
49
+ source: string;
50
+ args: Record<string, unknown>;
51
+ }
52
+ /**
53
+ * An AI-mode aria snapshot's YAML without the nodes whose `[ref=…]` is in
54
+ * `refs`, their subtrees, and any ref-less node whose children all went with
55
+ * them. A node is a `- ` line; its subtree is the lines indented under it.
56
+ */
57
+ export declare function snapshotWithoutRefs(text: string, refs: ReadonlySet<string>): string;
37
58
  /** Map a Playwright failure onto the wire's error codes. */
38
59
  export declare function classifyPlaywrightError(error: unknown): BrowserOperationErrorCode;
39
60
  export declare class PlaywrightOperationExecutor {
@@ -57,6 +78,8 @@ export declare class PlaywrightOperationExecutor {
57
78
  private act;
58
79
  /** The host's policy for an action; an element that is not there is the action's own failure. */
59
80
  private guard;
81
+ /** The aria refs of the elements `snapshotExclude` matches, and of their contents. */
82
+ private excludedRefs;
60
83
  private revision;
61
84
  private executeCall;
62
85
  private script;
package/dist/executor.mjs CHANGED
@@ -49,6 +49,49 @@ var PLAYWRIGHT_FEATURES = Object.freeze([
49
49
  "page.screenshot.png",
50
50
  "page.evaluate"
51
51
  ]);
52
+ var SNAPSHOT_EXCLUDE_LIMIT = 16;
53
+ function collectRefs(nodes, into) {
54
+ if (Array.isArray(nodes)) {
55
+ for (const node2 of nodes) collectRefs(node2, into);
56
+ return;
57
+ }
58
+ if (!nodes || typeof nodes !== "object") return;
59
+ const node = nodes;
60
+ if (typeof node.ref === "string") into.add(node.ref);
61
+ collectRefs(node.children, into);
62
+ }
63
+ function snapshotWithoutRefs(text, refs) {
64
+ if (refs.size === 0) return text;
65
+ const root = { text: "", indent: -1, children: [], removed: false };
66
+ const stack = [root];
67
+ const lines = [];
68
+ for (const raw of text.split("\n")) {
69
+ const indent = raw.length - raw.trimStart().length;
70
+ const line = { text: raw, indent, children: [], removed: false };
71
+ while (stack.length > 1 && stack[stack.length - 1].indent >= indent) stack.pop();
72
+ stack[stack.length - 1].children.push(line);
73
+ stack.push(line);
74
+ lines.push(line);
75
+ }
76
+ const refOf = (line) => /\[ref=([^\]\s]+)\]/.exec(line.text)?.[1];
77
+ const remove = (line) => {
78
+ line.removed = true;
79
+ for (const child of line.children) remove(child);
80
+ };
81
+ const visit = (line) => {
82
+ const ref = refOf(line);
83
+ if (ref !== void 0 && refs.has(ref)) {
84
+ remove(line);
85
+ return;
86
+ }
87
+ const before = line.children.length;
88
+ for (const child of line.children) visit(child);
89
+ if (line !== root && ref === void 0 && before > 0 && line.children.every((child) => child.removed))
90
+ line.removed = true;
91
+ };
92
+ visit(root);
93
+ return lines.filter((line) => !line.removed).map((line) => line.text).join("\n");
94
+ }
52
95
  var REVISION_KEY = "__supercodeBrowserRevision";
53
96
  function installRevisionCounter(key) {
54
97
  const scope = globalThis;
@@ -263,6 +306,19 @@ var PlaywrightOperationExecutor = class {
263
306
  if (!this.options.actionGuard || await action.locator.count().catch(() => 0) === 0) return;
264
307
  await this.options.actionGuard(action);
265
308
  }
309
+ /** The aria refs of the elements `snapshotExclude` matches, and of their contents. */
310
+ async excludedRefs() {
311
+ const refs = /* @__PURE__ */ new Set();
312
+ const selector = this.options.snapshotExclude;
313
+ if (!selector) return refs;
314
+ const matches = this.page.locator(selector);
315
+ const count = Math.min(await matches.count().catch(() => 0), SNAPSHOT_EXCLUDE_LIMIT);
316
+ for (let index = 0; index < count; index += 1) {
317
+ const nodes = await matches.nth(index).ariaSnapshotJSON({ mode: "ai", timeout: ACTION_TIMEOUT_MS }).catch(() => null);
318
+ collectRefs(nodes, refs);
319
+ }
320
+ return refs;
321
+ }
266
322
  async revision() {
267
323
  const value = await this.page.evaluate((key) => globalThis[key], REVISION_KEY).catch(() => void 0);
268
324
  return typeof value === "number" ? value : 0;
@@ -287,7 +343,8 @@ var PlaywrightOperationExecutor = class {
287
343
  if (call.operation === "browser.snapshot") {
288
344
  await this.refreshRefs(input.locator);
289
345
  const scoped = input.locator ? this.locator(input.locator).first() : null;
290
- const text = scoped ? await this.act(scoped, "ariaSnapshot", () => scoped.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS })) : await page.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS });
346
+ const excluded = await this.excludedRefs();
347
+ const text = snapshotWithoutRefs(scoped ? await this.act(scoped, "ariaSnapshot", () => scoped.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS })) : await page.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS }), excluded);
291
348
  const bounded = text.slice(0, 64e3);
292
349
  return this.success(call.operation, { text: bounded, truncated: bounded.length < text.length });
293
350
  }
@@ -411,6 +468,7 @@ var PlaywrightOperationExecutor = class {
411
468
  const timeout = Math.min(requested, SCRIPT_TIMEOUT_CLAMP_MS);
412
469
  const AsyncFunction = Object.getPrototypeOf(async function() {
413
470
  }).constructor;
471
+ if (this.options.actionGuard) await this.options.actionGuard({ action: "script", source, args });
414
472
  let run;
415
473
  try {
416
474
  run = new AsyncFunction("page", "args", source);
@@ -470,6 +528,7 @@ export {
470
528
  PlaywrightOperationExecutor,
471
529
  SCRIPT_TIMEOUT_CLAMP_MS,
472
530
  WAIT_TIMEOUT_CLAMP_MS,
473
- classifyPlaywrightError
531
+ classifyPlaywrightError,
532
+ snapshotWithoutRefs
474
533
  };
475
534
  //# sourceMappingURL=executor.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/executor.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 locator action, asked before it runs; throwing\n * a `BrowserActionRefusal` refuses it with that code. `browser.script` is\n * not guarded: a script is trusted with the page.\n */\n actionGuard?: (action: PlaywrightAction) => void | Promise<void>;\n}\n\n/** One locator action an operation is about to perform. */\nexport interface PlaywrightAction {\n action: \"click\" | \"fill\" | \"press\" | \"hover\" | \"focus\" | \"check\" | \"uncheck\" | \"select\" | \"drag\";\n locator: Locator;\n value?: unknown;\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: PlaywrightAction): Promise<void> {\n if (!this.options.actionGuard || await action.locator.count().catch(() => 0) === 0) return;\n await this.options.actionGuard(action);\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 const text = 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 });\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 PlaywrightAction[\"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 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"],
5
- "mappings": "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",
6
- "names": ["locator", "timeout"]
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"],
5
+ "mappings": ";AAOA,SAAS,cAAuC;AAChD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AAGA,IAAM,4BAA4B;AAElC,IAAM,0BAA0B;AAEhC,IAAM,oBAAoB;AAE1B,IAAM,wBAAwB;AAG9B,IAAM,sBAAyC,OAAO,OAAO;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAwCD,IAAM,yBAAyB;AAG/B,SAAS,YAAY,OAAgB,MAAyB;AAC5D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAWA,SAAQ,MAAO,aAAYA,OAAM,IAAI;AAChD;AAAA,EACF;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,QAAQ,SAAU,MAAK,IAAI,KAAK,GAAG;AACnD,cAAY,KAAK,UAAU,IAAI;AACjC;AAOO,SAAS,oBAAoB,MAAc,MAAmC;AACnF,MAAI,KAAK,SAAS,EAAG,QAAO;AAE5B,QAAM,OAAa,EAAE,MAAM,IAAI,QAAQ,IAAI,UAAU,CAAC,GAAG,SAAS,MAAM;AACxE,QAAM,QAAgB,CAAC,IAAI;AAC3B,QAAM,QAAgB,CAAC;AACvB,aAAW,OAAO,KAAK,MAAM,IAAI,GAAG;AAClC,UAAM,SAAS,IAAI,SAAS,IAAI,UAAU,EAAE;AAC5C,UAAM,OAAa,EAAE,MAAM,KAAK,QAAQ,UAAU,CAAC,GAAG,SAAS,MAAM;AACrE,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAG,UAAU,OAAQ,OAAM,IAAI;AAChF,UAAM,MAAM,SAAS,CAAC,EAAG,SAAS,KAAK,IAAI;AAC3C,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,QAAM,QAAQ,CAAC,SAAmC,qBAAqB,KAAK,KAAK,IAAI,IAAI,CAAC;AAC1F,QAAM,SAAS,CAAC,SAAqB;AACnC,SAAK,UAAU;AACf,eAAW,SAAS,KAAK,SAAU,QAAO,KAAK;AAAA,EACjD;AAEA,QAAM,QAAQ,CAAC,SAAqB;AAClC,UAAM,MAAM,MAAM,IAAI;AACtB,QAAI,QAAQ,UAAa,KAAK,IAAI,GAAG,GAAG;AACtC,aAAO,IAAI;AACX;AAAA,IACF;AACA,UAAM,SAAS,KAAK,SAAS;AAC7B,eAAW,SAAS,KAAK,SAAU,OAAM,KAAK;AAC9C,QAAI,SAAS,QAAQ,QAAQ,UAAa,SAAS,KAAK,KAAK,SAAS,MAAM,CAAC,UAAU,MAAM,OAAO;AAClG,WAAK,UAAU;AAAA,EACnB;AACA,QAAM,IAAI;AACV,SAAO,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI;AACjF;AAEA,IAAM,eAAe;AAOrB,SAAS,uBAAuB,KAAmB;AACjD,QAAM,QAAQ;AACd,MAAI,OAAO,MAAM,GAAG,MAAM,SAAU;AACpC,QAAM,GAAG,IAAI;AACb,MAAI,iBAAiB,MAAM;AAAE,UAAM,GAAG,IAAK,MAAM,GAAG,IAAe;AAAA,EAAG,CAAC,EACpE,QAAQ,UAAU,EAAE,YAAY,MAAM,WAAW,MAAM,eAAe,MAAM,SAAS,KAAK,CAAC;AAChG;AAMA,SAAS,cAAc,EAAE,UAAU,MAAM,GAAkF;AACzH,QAAM,YAAY,CAAC,UAA0B,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC7E,QAAM,UAAU,CAAC,YAAoC;AACnD,UAAM,MAAM,QAAQ,QAAQ,YAAY;AACxC,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,OAAO,QAAQ,aAAa,MAAM,EAAG,QAAO;AACxD,QAAI,WAAW,KAAK,GAAG,EAAG,QAAO;AACjC,QAAI,QAAQ,WAAY,QAAO;AAC/B,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,MAAO,QAAO;AAC1B,QAAI,QAAQ,QAAQ,QAAQ,KAAM,QAAO;AACzC,QAAI,QAAQ,KAAM,QAAO;AACzB,QAAI,QAAQ,MAAO,QAAO;AAC1B,QAAI,QAAQ,OAAQ,QAAO;AAC3B,QAAI,QAAQ,OAAQ,QAAO;AAC3B,QAAI,QAAQ,SAAS;AACnB,YAAM,QAAQ,QAAQ,aAAa,MAAM,KAAK,QAAQ,YAAY;AAClE,UAAI,SAAS,YAAY,SAAS,YAAY,SAAS,QAAS,QAAO;AACvE,UAAI,SAAS,WAAY,QAAO;AAChC,UAAI,SAAS,QAAS,QAAO;AAC7B,UAAI,SAAS,QAAS,QAAO;AAC7B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,YAA6B;AAC3C,UAAM,OAAO,QAAQ,aAAa,YAAY;AAC9C,QAAI,MAAM,KAAK,EAAG,QAAO,UAAU,IAAI;AACvC,UAAM,MAAM,QAAQ,aAAa,iBAAiB,GAAG,MAAM,KAAK,EAAE,OAAO,OAAO,KAAK,CAAC;AACtF,UAAM,WAAW,UAAU,IAAI,IAAI,CAAC,OAAO,QAAQ,cAAc,eAAe,EAAE,GAAG,eAAe,EAAE,EAAE,KAAK,GAAG,CAAC;AACjH,QAAI,SAAU,QAAO;AACrB,QAAI,mBAAmB,oBAAoB,QAAQ,QAAQ,QAAQ;AACjE,YAAM,QAAQ,UAAU,MAAM,KAAK,QAAQ,MAAM,EAAE,IAAI,CAAC,cAAc,UAAU,eAAe,EAAE,EAAE,KAAK,GAAG,CAAC;AAC5G,UAAI,MAAO,QAAO;AAAA,IACpB;AACA,eAAW,aAAa,CAAC,OAAO,SAAS,aAAa,GAAG;AACvD,YAAM,QAAQ,QAAQ,aAAa,SAAS;AAC5C,UAAI,OAAO,KAAK,EAAG,QAAO,UAAU,KAAK;AAAA,IAC3C;AACA,WAAO,UAAU,QAAQ,eAAe,EAAE;AAAA,EAC5C;AACA,QAAM,UAAU,CAAC,YAA8B;AAC7C,QAAI,QAAQ,aAAa,aAAa,MAAM,OAAQ,QAAO;AAC3D,QAAI,EAAE,mBAAmB,aAAc,QAAO;AAC9C,QAAI,QAAQ,OAAQ,QAAO;AAC3B,UAAM,QAAQ,iBAAiB,OAAO;AACtC,WAAO,MAAM,YAAY,UAAU,MAAM,eAAe,YAAY,MAAM,YAAY;AAAA,EACxF;AACA,SAAO,SAAS,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,YAAY;AAC/C,UAAM,OAAO,QAAQ,aAAa,MAAM,GAAG,KAAK,KAAK,QAAQ,OAAO;AACpE,UAAM,OAAO,OAAO,OAAO,EAAE,MAAM,GAAG,GAAG;AACzC,UAAM,QAAQ,mBAAmB,mBAC5B,QAAQ,SAAS,aAAa,eAAe,QAAQ,QACtD,mBAAmB,uBAAuB,mBAAmB,oBAAoB,QAAQ,QAAQ;AACrG,UAAM,UAAU,mBAAmB,qBAChC,QAAQ,SAAS,cAAc,QAAQ,SAAS,WAAW,QAAQ,UAAU;AAChF,WAAO;AAAA,MACL,KAAK,QAAQ,QAAQ,YAAY;AAAA,MACjC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAI,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,GAAG,GAAK,EAAE,IAAI,CAAC;AAAA,MAC9D,WAAW,mBAAmB,qBAAqB,mBAAmB,oBACpE,mBAAmB,sBAAsB,QAAQ;AAAA,MACnD,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,SAAS,QAAQ,OAAO;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,OAAuF;AAC3G,QAAM,SAAS,MAAM,UAAU,KAAK,IAAI,KAAK,KAAK,MAAM,OAAO,cAAc,GAAG,CAAC;AACjF,SAAO,SAAS,EAAE,MAAM,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,QAAQ,UAAU,UAAU,CAAC;AAC3F,SAAO,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAChD;AAGA,SAAS,QAAQ,OAA6D;AAC5E,QAAM,YAAY,CAAC,KAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAI;AACjE,MAAI,MAAM,SAAS,MAAM,CAAC,UAAU,MAAM,CAAC,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI,EAAG,QAAO;AAC1F,QAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,SAAO,EAAE,OAAO,KAAK,UAAU,EAAE,GAAG,QAAQ,KAAK,UAAU,EAAE,EAAE;AACjE;AAGA,SAAS,OAAO,OAA2B;AACzC,MAAI,SAAS;AACb,WAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU;AACpD,cAAU,OAAO,aAAa,GAAG,MAAM,SAAS,QAAQ,SAAS,KAAM,CAAC;AAC1E,SAAO,KAAK,MAAM;AACpB;AAMA,SAAS,kBAAkB,OAAgB,iBAAmC;AAC5E,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,WAAW,CAAC,MAAc,SAA2B;AACzD,UAAM,QAAQ,gBAAgB,aAAa,OACvC,QAAQ,OAAO,SAAS,YAAa,KAA4B,SAAS,YAC1E,MAAM,QAAS,KAA4B,IAAI,IAAI,WAAW,KAAM,KAA4B,IAAI,IACpG;AACJ,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,UAAU,yBAAyB,OAAO;AAChD,QAAI,QAAQ,SAAS,MAAM,KAAM,QAAO,EAAE,OAAO,sDAAsD,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAC9I,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,UAAU,kBACN,0DACA;AAAA,IACN;AAAA,EACF;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,OAAO,QAAQ,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,aAAa,OAAwB;AAC5C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAGO,SAAS,wBAAwB,OAA2C;AACjF,MAAI,iBAAiB,qBAAsB,QAAO,MAAM;AACxD,MAAI,iBAAiB,OAAO,aAAc,QAAO;AACjD,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,iIAAiI,KAAK,OAAO;AAC/I,WAAO;AACT,MAAI,sFAAsF,KAAK,OAAO;AACpG,WAAO;AACT,MAAI,6BAA6B,KAAK,OAAO,EAAG,QAAO;AACvD,SAAO;AACT;AAEO,IAAM,8BAAN,MAAkC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,MAAY,SAA6C;AACnE,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS,YAAY;AACxB,YAAM,KAAK,cAAc,wBAAwB,YAAY;AAC7D,YAAM,KAAK,SAAS,wBAAwB,YAAY,EAAE,MAAM,MAAM,MAAS;AAAA,IACjF,GAAG;AAAA,EACL;AAAA,EAEA,MAAM,QAAQ,KAA+C;AAC3D,UAAM,OAAO,0BAA0B,GAAG;AAC1C,UAAM,YAAY,cAAc,GAAG;AACnC,QAAI,CAAC,KAAM,QAAO,KAAK,QAAQ,WAAW,iBAAiB,oCAAoC;AAC/F,QAAI;AACF,YAAM,KAAK;AACX,aAAO,MAAM,KAAK,YAAY,IAAI;AAAA,IACpC,SAAS,OAAO;AACd,aAAO,KAAK,QAAQ,KAAK,WAAW,wBAAwB,KAAK,GAAG,aAAa,KAAK,CAAC;AAAA,IACzF;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAgB,OAAyB;AACvD,UAAM,UAAU;AAChB,UAAM,QAAQ,CAAC,cAAmC,UAAU,UAAU,SAAY,EAAE,OAAO,UAAU,MAAM,IAAI,CAAC;AAChH,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,QAAQ,OAAO,QAAQ,KAAK,QAAQ,QAAQ,KAAK,IAG1D,QAAQ,OAAO,QAAQ,KAAK,QAAQ,YAAY,QAAQ,KAAK,EAAE,IAC/D,QAAQ,OAAO,SAAS,KAAK,UAAU,QAAQ,MAA0C;AAAA,MACvF,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,MAE3D,OAAO,QAAQ,SAAS;AAAA,IAC1B,CAAC,IACD,QAAQ,OAAO,SAAS,KAAK,UAAU,QAAQ,MAAM,MAAM,OAAO,CAAC,IACnE,QAAQ,OAAO,UAAU,KAAK,WAAW,QAAQ,MAAM,MAAM,OAAO,CAAC,IACrE,QAAQ,OAAO,gBAAgB,KAAK,iBAAiB,QAAQ,MAAM,MAAM,OAAO,CAAC,IACjF,QAAQ,OAAO,YAAY,KAAK,aAAa,QAAQ,MAAM,MAAM,OAAO,CAAC,IACzE,QAAQ,OAAO,UAAU,KAAK,WAAW,QAAQ,MAAM,MAAM,OAAO,CAAC,IACrE,KAAK,YAAY,QAAQ,KAAK;AAClC,WAAO,UAAU,SAAY,OAAO,UAAU,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,YAAY,OAA+B;AACvD,QAAK,OAAsC,OAAO;AAChD,YAAM,KAAK,KAAK,aAAa,EAAE,MAAM,MAAM,SAAS,kBAAkB,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAc,MAAM,SAAmC;AACrD,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,iBAAiB,EAAE,MAAM,MAAM,OAAO,GAAG,SAAS,kBAAkB,CAAC;AACjG,YAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,CAAC,SAAS,QAAQ,OAAO,SAAS,QAAQ,IAAqC;AAC/H,aAAO,OAAO,OAAO,QAAQ,WAAW,MAAM,MAAM;AAAA,IACtD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,SAAkB,OAA6C;AAItF,UAAM,WAAW,MAAM,QAAQ,eAAe,GAAG,MAAM,GAAG,KAAK;AAC/D,QAAI;AACJ,QAAI;AACF,YAAM,UAAU;AAChB,eAAS,MAAM,KAAK,KAAK,SAAS,SAAS,EAAE,UAAU,SAAsB,MAAM,CAAC;AAAA,IACtF,UAAE;AACA,YAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,QAAQ,EAAE,MAAM,MAAM,MAAS,CAAC,CAAC;AAAA,IACpF;AACA,UAAM,OAAO,MAAM,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,UAAU,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC;AACvF,WAAO,OAAO,IAAI,CAAC,OAAO,WAAW,EAAE,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,EAAE;AAAA,EAC5E;AAAA,EAEA,MAAc,QAAQ,SAA8C;AAClE,UAAM,CAAC,UAAU,IAAI,MAAM,KAAK,WAAW,QAAQ,MAAM,GAAG,CAAC;AAC7D,QAAI,CAAC,WAAY,OAAM,IAAI,qBAAqB,aAAa,iCAAiC;AAC9F,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,IAAO,SAAkB,QAAgB,KAAmC;AACxF,QAAI;AACF,aAAO,MAAM,IAAI;AAAA,IACnB,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,yBAAyB,MAAM,QAAQ,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM;AACvF,cAAM,IAAI,qBAAqB,aAAa,GAAG,MAAM,oCAAoC;AAC3F,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,MAAM,QAAgD;AAClE,QAAI,CAAC,KAAK,QAAQ,eAAe,MAAM,OAAO,QAAQ,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,EAAG;AACpF,UAAM,KAAK,QAAQ,YAAY,MAAM;AAAA,EACvC;AAAA;AAAA,EAGA,MAAc,eAAqC;AACjD,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,WAAW,KAAK,QAAQ;AAC9B,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,UAAU,KAAK,KAAK,QAAQ,QAAQ;AAC1C,UAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,MAAM,EAAE,MAAM,MAAM,CAAC,GAAG,sBAAsB;AACnF,aAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,YAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,SAAS,kBAAkB,CAAC,EAAE,MAAM,MAAM,IAAI;AACpH,kBAAY,OAAO,IAAI;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WAA4B;AACxC,UAAM,QAAQ,MAAM,KAAK,KAAK,SAAS,CAAC,QAAS,WAAkD,GAAG,GAAG,YAAY,EAClH,MAAM,MAAM,MAAS;AACxB,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC7C;AAAA,EAEA,MAAc,YAAY,MAA6D;AACrF,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,mBAAmB,OAAO,MAAM,qBAAqB,WAAW,MAAM,mBAAmB;AAC/F,QAAI,qBAAqB,QAAW;AAClC,YAAM,UAAU,MAAM,KAAK,SAAS;AACpC,UAAI,qBAAqB;AACvB,eAAO,KAAK,QAAQ,KAAK,WAAW,cAAc,uCAAuC,gBAAgB,sBAAsB,OAAO,IAAI;AAAA,IAC9I;AACA,QAAI,KAAK,cAAc;AACrB,aAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,QAClC,WAAW;AAAA,QACX,UAAU;AAAA,QACV,iBAAiB,KAAK,QAAQ;AAAA,QAC9B,gBAAgB;AAAA,QAChB,UAAU,KAAK,QAAQ;AAAA,MACzB,CAAC;AACH,QAAI,KAAK,cAAc,oBAAoB;AACzC,YAAM,KAAK,YAAY,MAAM,OAAO;AACpC,YAAM,SAAS,MAAM,UAAU,KAAK,QAAQ,MAAM,OAAO,EAAE,MAAM,IAAI;AAGrE,YAAM,WAAW,MAAM,KAAK,aAAa;AACzC,YAAM,OAAO,oBAAoB,SAC7B,MAAM,KAAK,IAAI,QAAQ,gBAAgB,MAAM,OAAO,aAAa,EAAE,MAAM,MAAM,SAAS,kBAAkB,CAAC,CAAC,IAC5G,MAAM,KAAK,aAAa,EAAE,MAAM,MAAM,SAAS,kBAAkB,CAAC,GAAG,QAAQ;AACjF,YAAM,UAAU,KAAK,MAAM,GAAG,IAAM;AACpC,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,MAAM,SAAS,WAAW,QAAQ,SAAS,KAAK,OAAO,CAAC;AAAA,IAChG;AACA,QAAI,KAAK,cAAc,iBAAiB;AACtC,YAAM,KAAK,YAAY,MAAM,OAAO;AACpC,YAAMC,WAAU,KAAK,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,MAAS;AACrG,YAAM,QAAQ,MAAMA,SAAQ,MAAM;AAClC,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,OAAO,SAAS,MAAM,KAAK,WAAWA,UAAS,EAAE,GAAG,WAAW,QAAQ,GAAG,CAAC;AAAA,IACnH;AACA,QAAI,KAAK,cAAc,gBAAgB;AACrC,YAAM,KAAK,YAAY,MAAM,OAAO;AACpC,YAAM,YAAY,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AACtE,YAAMC,WAAU,KAAK,IAAI,WAAW,qBAAqB;AACzD,YAAMD,WAAU,KAAK,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,CAAC;AAC7F,UAAI;AACF,cAAMA,SAAQ,QAAQ,EAAE,OAAO,MAAM,UAAU,aAAa,aAAa,WAAW,SAAAC,SAAQ,CAAC;AAAA,MAC/F,SAAS,OAAO;AACd,YAAI,iBAAiB,OAAO;AAC1B,gBAAM,IAAI,qBAAqB,aAAa,2BAA2BA,QAAO,QAC3EA,WAAU,YAAY,mBAAmB,SAAS,oBAAoB,qBAAqB,sCAAsC,MAAM,GAAG;AAC/I,cAAM;AAAA,MACR;AACA,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,IACrD;AACA,QAAI,KAAK,cAAc,kBAAkB;AACvC,YAAM,YAAY,MAAM;AACxB,YAAM,WAAW,MAAM,KAAK,SAAS,cAAc;AAAA,QACjD,MAAM,cAAc,SAAS,KAAK,cAAc,UAAU,IAAI;AAAA,QAC9D,KAAK,cAAc,OAAO,KAAK,cAAc,SAAS,IAAI;AAAA,QAC1D,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,MAC5D,CAAC;AACD,aAAO,KAAK,QAAQ,KAAK,WAAW,QAAQ;AAAA,IAC9C;AACA,QAAI,KAAK,cAAc,iBAAkB,QAAO,KAAK,OAAO,IAAI;AAChE,QAAI,KAAK,cAAc,iBAAiB;AACtC,YAAM,SAAS,MAAM;AACrB,UAAI,WAAW,OAAQ,OAAM,KAAK,MAAM,KAAK,MAAM,GAAa,MAAM,CAAW;AAAA,eACxE,WAAW,QAAS,OAAM,KAAK,MAAM,MAAM,MAAM,GAAa,MAAM,CAAW;AAAA,eAC/E,WAAW,OAAQ,OAAM,KAAK,MAAM,KAAK;AAAA,UAC7C,OAAM,KAAK,MAAM,GAAG;AACzB,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,QAAQ,GAAI,OAAO,MAAM,MAAM,WAAW,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE,IAAI,CAAC,EAAG,CAAC;AAAA,IACpH;AACA,QAAI,KAAK,cAAc,iBAAiB;AACtC,YAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACjE,YAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACjE,YAAM,KAAK,MAAM,MAAM,QAAQ,MAAM;AACrC,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,QAAQ,OAAO,CAAC;AAAA,IACxD;AACA,QAAI,KAAK,cAAc,gBAAgB;AACrC,YAAM,UAAU,OAAO,aAAyE;AAC9F,YAAI,SAAS,YAAY,OAAW,QAAO,EAAE,GAAG,SAAS,GAAa,GAAG,SAAS,EAAY;AAC9F,cAAM,KAAK,YAAY,SAAS,OAAO;AACvC,cAAMD,WAAU,KAAK,QAAQ,SAAS,OAAO,EAAE,MAAM;AACrD,cAAM,MAAM,MAAMA,SAAQ,MAAM,MAAM,IAAI,OAAO,MAAMA,SAAQ,YAAY,EAAE,SAAS,kBAAkB,CAAC;AACzG,YAAI,CAAC,IAAK,OAAM,IAAI,qBAAqB,aAAa,sCAAsC;AAC5F,eAAO,EAAE,GAAG,IAAI,IAAI,IAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,SAAS,EAAE;AAAA,MAC/D;AACA,iBAAW,OAAO,CAAC,MAAM,MAAM,MAAM,EAAE;AACrC,YAAI,IAAI,YAAY,OAAW,OAAM,KAAK,MAAM,EAAE,QAAQ,QAAQ,SAAS,KAAK,QAAQ,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;AAChH,YAAM,OAAO,MAAM,QAAQ,MAAM,IAA+B;AAChE,YAAM,KAAK,MAAM,QAAQ,MAAM,EAA6B;AAC5D,YAAM,KAAK,MAAM,KAAK,KAAK,GAAG,KAAK,CAAC;AACpC,YAAM,KAAK,MAAM,KAAK;AACtB,YAAM,KAAK,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,EAAE,CAAC;AAC9F,YAAM,KAAK,MAAM,GAAG;AACpB,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,MAAM,GAAG,CAAC;AAAA,IAClD;AACA,QAAI,KAAK,cAAc,gBAAgB;AACrC,YAAM,KAAK,OAAO,EAAE,WAAW,UAAU,SAAS,kBAAkB,CAAC;AACrE,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IACzD;AACA,QAAI,KAAK,cAAc,mBAAmB;AACxC,YAAM,KAAK,UAAU,EAAE,WAAW,UAAU,SAAS,kBAAkB,CAAC;AACxE,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IACzD;AACA,QAAI,KAAK,cAAc,kBAAkB;AACvC,YAAM,KAAK,OAAO,EAAE,WAAW,UAAU,SAAS,kBAAkB,CAAC;AACrE,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IACzD;AAEA,UAAM,KAAK,YAAY,MAAM,OAAO;AACpC,UAAM,UAAU,MAAM,UAClB,KAAK,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,CAAC,IAC7E;AACJ,UAAM,UAAU;AAChB,QAAI,KAAK,cAAc,eAAe;AACpC,YAAM,MAAM,MAAM,QAAS,MAAM,MAAM,IAAI,OAAO,MAAM,QAAS,YAAY,EAAE,QAAQ,CAAC;AACxF,UAAI,CAAC,IAAK,QAAO,KAAK,QAAQ,KAAK,WAAW,aAAa,iCAAiC;AAC5F,aAAO,KAAK,QAAQ,KAAK,WAAW,GAAG;AAAA,IACzC;AACA,QAAI,KAAK,cAAc,mBAAmB,CAAC,SAAS;AAClD,YAAM,KAAK,MAAM,EAAE,QAAQ,SAAS,SAAS,KAAK,QAAQ,SAAS,EAAE,MAAM,GAAG,OAAO,MAAM,IAAI,CAAC;AAChG,YAAM,KAAK,SAAS,MAAM,MAAM,GAAa;AAC7C,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD;AACA,UAAM,SAAS;AACf,UAAM,UAAU,KAAK,cAAc,mBAAmB,WAAW,KAAK,UAAU,MAAM,WAAW,MAAM;AACvG,UAAM,KAAK,MAAM;AAAA,MAAE,QAAQ;AAAA,MAAS,SAAS,OAAO,MAAM;AAAA,MACxD,GAAI,KAAK,cAAc,iBAAiB,EAAE,OAAO,MAAM,MAAM,IAAI,KAAK,cAAc,kBAAkB,EAAE,OAAO,MAAM,IAAI,IACrH,KAAK,cAAc,mBAAmB,EAAE,OAAO,MAAM,OAAO,IAAI,CAAC;AAAA,IAAG,CAAC;AAG3E,UAAM,SAAS,MAAM,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,IAAI;AAC1D,QAAI,KAAK,cAAc,gBAAiB,OAAM,KAAK,IAAI,QAAQ,SAAS,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,aAC9F,KAAK,cAAc,eAAgB,OAAM,KAAK,IAAI,QAAQ,QAAQ,MAAM,OAAO,KAAK,MAAM,OAAiB,EAAE,QAAQ,CAAC,CAAC;AAAA,aACvH,KAAK,cAAc,gBAAiB,OAAM,KAAK,IAAI,QAAQ,SAAS,MAAM,OAAO,MAAM,MAAM,KAAe,EAAE,QAAQ,CAAC,CAAC;AAAA,aACxH,KAAK,cAAc,gBAAiB,OAAM,KAAK,IAAI,QAAQ,SAAS,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,aACnG,KAAK,cAAc,gBAAiB,OAAM,KAAK,IAAI,QAAQ,SAAS,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,aACnG,KAAK,cAAc,gBAAiB,OAAM,KAAK,IAAI,QAAQ,SAAS,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,aACnG,KAAK,cAAc,kBAAmB,OAAM,KAAK,IAAI,QAAQ,WAAW,MAAM,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,aACzG,KAAK,cAAc,kBAAkB;AAC5C,YAAM,SAAS,MAAM,KAAK,IAAI,QAAQ,gBAAgB,MAAM,OAAO,aAAa,MAAM,QAAoB,EAAE,QAAQ,CAAC,CAAC;AACtH,aAAO,KAAK,QAAQ,KAAK,WAAW,EAAE,OAAO,CAAC;AAAA,IAChD;AACA,UAAM,QAAQ,MAAM,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,IAAI;AACzD,UAAM,aAAa,SAAS;AAC5B,QAAI,CAAC,WAAY,OAAM,IAAI,qBAAqB,aAAa,iCAAiC;AAC9F,WAAO,KAAK,QAAQ,KAAK,WAAW,UAAU;AAAA,EAChD;AAAA,EAEA,MAAc,OAAO,MAA6D;AAChF,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAS,MAAM;AACrB,UAAM,OAAQ,MAAM,QAAgD,CAAC;AACrE,UAAM,YAAY,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AACtE,UAAM,UAAU,KAAK,IAAI,WAAW,uBAAuB;AAE3D,UAAM,gBAAgB,OAAO,eAAe,iBAAkB;AAAA,IAAC,CAAC,EAAE;AAElE,QAAI,KAAK,QAAQ,YAAa,OAAM,KAAK,QAAQ,YAAY,EAAE,QAAQ,UAAU,QAAQ,KAAK,CAAC;AAC/F,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,cAAc,QAAQ,QAAQ,MAAM;AAAA,IAChD,SAAS,OAAO;AACd,aAAO,KAAK,QAAQ,KAAK,WAAW,UAAU,6BAA6B,aAAa,KAAK,CAAC,EAAE;AAAA,IAClG;AACA,UAAM,SAAS,UAAU,YACrB,oCAAoC,uBAAuB,sDAC3D;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,QAC/B,IAAI,KAAK,MAAM,IAAI;AAAA,QACnB,IAAI,QAAQ,CAAC,UAAU,WAAW;AAChC,kBAAQ,WAAW,MAAM,OAAO,IAAI,qBAAqB,UAAU,uBAAuB,OAAO,SAAS,SAAS,IAAI,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO;AAAA,QAClJ,CAAC;AAAA,MACH,CAAC;AACD,aAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,QAClC,OAAO,kBAAkB,OAAO,KAAK,QAAQ,eAAe;AAAA,QAC5D,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC7B,CAAC;AAAA,IACH,UAAE;AACA,mBAAa,KAAK;AAElB,WAAK,KAAK,mBAAmB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,SAAiC;AAC7C,QAAI,KAAK,KAAK,SAAS,EAAG,QAAO,EAAE,KAAK,IAAI,OAAO,IAAI,UAAU,EAAE;AAGnE,UAAM,UAAU,CAAI,SAAqB,aAA4B;AACnE,UAAI;AACJ,aAAO,QAAQ,KAAK;AAAA,QAClB,QAAQ,MAAM,MAAM,QAAQ;AAAA,QAC5B,IAAI,QAAW,CAAC,YAAY;AAAE,kBAAQ,WAAW,MAAM,QAAQ,QAAQ,GAAG,GAAK;AAAA,QAAG,CAAC;AAAA,MACrF,CAAC,EAAE,QAAQ,MAAM,aAAa,KAAK,CAAC;AAAA,IACtC;AACA,UAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1C,QAAQ,KAAK,KAAK,MAAM,GAAG,EAAE;AAAA,MAC7B,QAAQ,KAAK,SAAS,GAAG,CAAC;AAAA,IAC5B,CAAC;AACD,WAAO,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG,OAAO,SAAS;AAAA,EACjD;AAAA,EAEA,MAAc,QAAQ,WAAiC,OAAiD;AACtG,WAAO,EAAE,IAAI,MAAM,WAAW,QAAQ,MAAM,KAAK,OAAO,GAAG,MAAM;AAAA,EACnE;AAAA,EAEA,MAAc,QAAQ,WAAiC,MAAiC,SAAkD;AACxI,WAAO,EAAE,IAAI,OAAO,WAAW,OAAO,EAAE,MAAM,QAAQ,GAAG,QAAQ,MAAM,KAAK,OAAO,EAAE;AAAA,EACvF;AACF;AAEA,SAAS,cAAc,KAAoC;AACzD,QAAM,YAAY,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,IAAK,IAAgC,YAAY;AACvH,SAAO,OAAO,cAAc,YAAa,wBAA8C,SAAS,SAAS,IACrG,YACA;AACN;",
6
+ "names": ["node", "locator", "timeout"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { ACTION_TIMEOUT_MS, PLAYWRIGHT_FEATURES, PLAYWRIGHT_IMPLEMENTATION, PlaywrightOperationExecutor, SCRIPT_TIMEOUT_CLAMP_MS, WAIT_TIMEOUT_CLAMP_MS, classifyPlaywrightError, type PlaywrightAction, type PlaywrightOperationExecutorOptions, } from "./executor.js";
1
+ export { ACTION_TIMEOUT_MS, PLAYWRIGHT_FEATURES, PLAYWRIGHT_IMPLEMENTATION, PlaywrightOperationExecutor, SCRIPT_TIMEOUT_CLAMP_MS, WAIT_TIMEOUT_CLAMP_MS, classifyPlaywrightError, snapshotWithoutRefs, type PlaywrightAction, type PlaywrightLocatorAction, type PlaywrightScriptAction, type PlaywrightOperationExecutorOptions, } from "./executor.js";
2
2
  export * from "./protocol.js";
3
3
  export { MAX_REQUEST_BYTES, MAX_RESPONSE_BYTES, createPlaywrightBrowserProvider, type PlaywrightBrowserProvider, type PlaywrightBrowserProviderOptions, type ProviderResponse, } from "./provider.js";
4
4
  export { defaultProvidersDirectory, serveHttp, serveTcp, type HttpServeOptions, type ServeHandle, type TcpServeOptions, } from "./serve.js";
package/dist/index.mjs CHANGED
@@ -253,6 +253,49 @@ var PLAYWRIGHT_FEATURES = Object.freeze([
253
253
  "page.screenshot.png",
254
254
  "page.evaluate"
255
255
  ]);
256
+ var SNAPSHOT_EXCLUDE_LIMIT = 16;
257
+ function collectRefs(nodes, into) {
258
+ if (Array.isArray(nodes)) {
259
+ for (const node2 of nodes) collectRefs(node2, into);
260
+ return;
261
+ }
262
+ if (!nodes || typeof nodes !== "object") return;
263
+ const node = nodes;
264
+ if (typeof node.ref === "string") into.add(node.ref);
265
+ collectRefs(node.children, into);
266
+ }
267
+ function snapshotWithoutRefs(text, refs) {
268
+ if (refs.size === 0) return text;
269
+ const root = { text: "", indent: -1, children: [], removed: false };
270
+ const stack = [root];
271
+ const lines = [];
272
+ for (const raw of text.split("\n")) {
273
+ const indent = raw.length - raw.trimStart().length;
274
+ const line = { text: raw, indent, children: [], removed: false };
275
+ while (stack.length > 1 && stack[stack.length - 1].indent >= indent) stack.pop();
276
+ stack[stack.length - 1].children.push(line);
277
+ stack.push(line);
278
+ lines.push(line);
279
+ }
280
+ const refOf = (line) => /\[ref=([^\]\s]+)\]/.exec(line.text)?.[1];
281
+ const remove = (line) => {
282
+ line.removed = true;
283
+ for (const child of line.children) remove(child);
284
+ };
285
+ const visit = (line) => {
286
+ const ref = refOf(line);
287
+ if (ref !== void 0 && refs.has(ref)) {
288
+ remove(line);
289
+ return;
290
+ }
291
+ const before = line.children.length;
292
+ for (const child of line.children) visit(child);
293
+ if (line !== root && ref === void 0 && before > 0 && line.children.every((child) => child.removed))
294
+ line.removed = true;
295
+ };
296
+ visit(root);
297
+ return lines.filter((line) => !line.removed).map((line) => line.text).join("\n");
298
+ }
256
299
  var REVISION_KEY = "__supercodeBrowserRevision";
257
300
  function installRevisionCounter(key) {
258
301
  const scope = globalThis;
@@ -467,6 +510,19 @@ var PlaywrightOperationExecutor = class {
467
510
  if (!this.options.actionGuard || await action.locator.count().catch(() => 0) === 0) return;
468
511
  await this.options.actionGuard(action);
469
512
  }
513
+ /** The aria refs of the elements `snapshotExclude` matches, and of their contents. */
514
+ async excludedRefs() {
515
+ const refs = /* @__PURE__ */ new Set();
516
+ const selector = this.options.snapshotExclude;
517
+ if (!selector) return refs;
518
+ const matches = this.page.locator(selector);
519
+ const count = Math.min(await matches.count().catch(() => 0), SNAPSHOT_EXCLUDE_LIMIT);
520
+ for (let index = 0; index < count; index += 1) {
521
+ const nodes = await matches.nth(index).ariaSnapshotJSON({ mode: "ai", timeout: ACTION_TIMEOUT_MS }).catch(() => null);
522
+ collectRefs(nodes, refs);
523
+ }
524
+ return refs;
525
+ }
470
526
  async revision() {
471
527
  const value = await this.page.evaluate((key) => globalThis[key], REVISION_KEY).catch(() => void 0);
472
528
  return typeof value === "number" ? value : 0;
@@ -491,7 +547,8 @@ var PlaywrightOperationExecutor = class {
491
547
  if (call.operation === "browser.snapshot") {
492
548
  await this.refreshRefs(input.locator);
493
549
  const scoped = input.locator ? this.locator(input.locator).first() : null;
494
- const text = scoped ? await this.act(scoped, "ariaSnapshot", () => scoped.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS })) : await page.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS });
550
+ const excluded = await this.excludedRefs();
551
+ const text = snapshotWithoutRefs(scoped ? await this.act(scoped, "ariaSnapshot", () => scoped.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS })) : await page.ariaSnapshot({ mode: "ai", timeout: ACTION_TIMEOUT_MS }), excluded);
495
552
  const bounded = text.slice(0, 64e3);
496
553
  return this.success(call.operation, { text: bounded, truncated: bounded.length < text.length });
497
554
  }
@@ -615,6 +672,7 @@ var PlaywrightOperationExecutor = class {
615
672
  const timeout = Math.min(requested, SCRIPT_TIMEOUT_CLAMP_MS);
616
673
  const AsyncFunction = Object.getPrototypeOf(async function() {
617
674
  }).constructor;
675
+ if (this.options.actionGuard) await this.options.actionGuard({ action: "script", source, args });
618
676
  let run;
619
677
  try {
620
678
  run = new AsyncFunction("page", "args", source);
@@ -1011,6 +1069,7 @@ export {
1011
1069
  parseBrowserOperationCall,
1012
1070
  parseBrowserOperationResult,
1013
1071
  serveHttp,
1014
- serveTcp
1072
+ serveTcp,
1073
+ snapshotWithoutRefs
1015
1074
  };
1016
1075
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 locator action, asked before it runs; throwing\n * a `BrowserActionRefusal` refuses it with that code. `browser.script` is\n * not guarded: a script is trusted with the page.\n */\n actionGuard?: (action: PlaywrightAction) => void | Promise<void>;\n}\n\n/** One locator action an operation is about to perform. */\nexport interface PlaywrightAction {\n action: \"click\" | \"fill\" | \"press\" | \"hover\" | \"focus\" | \"check\" | \"uncheck\" | \"select\" | \"drag\";\n locator: Locator;\n value?: unknown;\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: PlaywrightAction): Promise<void> {\n if (!this.options.actionGuard || await action.locator.count().catch(() => 0) === 0) return;\n await this.options.actionGuard(action);\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 const text = 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 });\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 PlaywrightAction[\"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 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", "locator", "timeout", "record", "result", "port", "randomBytes", "randomBytes"]
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"]
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.0",
3
+ "version": "0.1.1",
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": {