@stablyai/playwright-base 2.0.16 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +126 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +136 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +136 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +136 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +126 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/runtime.ts","../src/type-predicate/is-object.ts","../src/ai/metadata.ts","../src/ai/verify-prompt.ts","../src/playwright-type-predicates.ts","../../../node_modules/.pnpm/pixelmatch@7.1.0/node_modules/pixelmatch/index.js","../src/image-compare.ts","../src/screenshot.ts","../src/expect.ts","../src/utils/truncate.ts","../src/playwright-augment/methods/agent/construct-payload.ts","../src/playwright-augment/methods/agent/scroll-helper.ts","../src/playwright-augment/methods/agent/exec-response.ts","../src/playwright-augment/methods/agent.ts","../src/ai/extract.ts","../src/playwright-augment/methods/extract.ts","../src/playwright-augment/augment.ts"],"sourcesContent":["let configuredApiKey: string | undefined = process.env.STABLY_API_KEY;\n\nexport function setApiKey(apiKey: string): void {\n configuredApiKey = apiKey;\n}\n\nexport function getApiKey(): string | undefined {\n return configuredApiKey;\n}\n\nexport function requireApiKey(): string {\n const apiKey = getApiKey();\n if (!apiKey) {\n throw new Error(\n \"Missing Stably API key. Call setApiKey(apiKey) or set the STABLY_API_KEY environment variable.\",\n );\n }\n return apiKey;\n}\n","export const isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n","declare const __PACKAGE_VERSION__: string;\n\nexport const SDK_METADATA_HEADERS = {\n \"X-Client-Name\": \"stably-playwright-sdk-js\",\n \"X-Client-Version\": __PACKAGE_VERSION__,\n};\n","import { requireApiKey } from \"../runtime\";\nimport { isObject } from \"../type-predicate/is-object\";\nimport { SDK_METADATA_HEADERS } from \"./metadata\";\n\nconst PROMPT_ASSERTION_PATH = \"internal/v2/assert\";\nconst STABLY_API_URL = process.env.STABLY_API_URL || \"https://api.stably.ai\";\nconst PROMPT_ASSERTION_ENDPOINT = new URL(\n PROMPT_ASSERTION_PATH,\n STABLY_API_URL,\n).toString();\n\ntype ParsedSuccessResponse = { success: boolean; reason?: string };\n\nconst parseSuccessResponse = (value: unknown): ParsedSuccessResponse => {\n if (!isObject(value)) {\n throw new Error(\"Verify prompt returned unexpected response shape\");\n }\n\n const { reason, success } = value;\n if (typeof success !== \"boolean\") {\n throw new Error(\"Verify prompt returned unexpected response shape\");\n }\n\n if (reason !== undefined && typeof reason !== \"string\") {\n throw new Error(\"Verify prompt returned unexpected response shape\");\n }\n\n return {\n reason,\n success,\n };\n};\n\ntype ParsedErrorResponse = { error: string };\n\nconst parseErrorResponse = (\n value: unknown,\n): ParsedErrorResponse | undefined => {\n if (!isObject(value)) {\n return undefined;\n }\n\n const { error } = value;\n return typeof error !== \"string\" ? undefined : { error };\n};\n\nexport async function verifyPrompt({\n pageMetadata,\n prompt,\n screenshot,\n}: {\n pageMetadata?: { title: string; url: string };\n prompt: string;\n screenshot: Uint8Array;\n}): Promise<{\n pass: boolean;\n reason?: string;\n}> {\n const apiKey = requireApiKey();\n\n const form = new FormData();\n\n const metadata = {\n prompt,\n ...(pageMetadata?.title ? { pageTitle: pageMetadata.title } : {}),\n ...(pageMetadata?.url ? { pageUrl: pageMetadata.url } : {}),\n };\n form.append(\"metadata\", JSON.stringify(metadata));\n\n const u8 = Uint8Array.from(screenshot);\n const blob = new Blob([u8], { type: \"image/png\" });\n form.append(\"screenshot\", blob, \"screenshot.png\");\n\n const response = await fetch(PROMPT_ASSERTION_ENDPOINT, {\n body: form,\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n },\n method: \"POST\",\n });\n\n const parsed = await response.json().catch(() => undefined as unknown);\n\n if (response.ok) {\n const { reason, success } = parseSuccessResponse(parsed);\n return {\n pass: success,\n reason,\n };\n }\n\n const err = parseErrorResponse(parsed);\n throw new Error(\n `Verify prompt failed (${response.status})${err ? `: ${err.error}` : \"\"}`,\n );\n}\n","import type { Page, Locator } from \"@playwright/test\";\n\nexport function isPage(candidate: unknown): candidate is Page {\n return (\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof (candidate as Page).screenshot === \"function\" &&\n typeof (candidate as Page).goto === \"function\"\n );\n}\n\nexport function isLocator(candidate: unknown): candidate is Locator {\n return (\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof (candidate as Locator).screenshot === \"function\" &&\n typeof (candidate as Locator).nth === \"function\"\n );\n}\n","/**\n * Compare two equally sized images, pixel by pixel.\n *\n * @param {Uint8Array | Uint8ClampedArray} img1 First image data.\n * @param {Uint8Array | Uint8ClampedArray} img2 Second image data.\n * @param {Uint8Array | Uint8ClampedArray | void} output Image data to write the diff to, if provided.\n * @param {number} width Input images width.\n * @param {number} height Input images height.\n *\n * @param {Object} [options]\n * @param {number} [options.threshold=0.1] Matching threshold (0 to 1); smaller is more sensitive.\n * @param {boolean} [options.includeAA=false] Whether to skip anti-aliasing detection.\n * @param {number} [options.alpha=0.1] Opacity of original image in diff output.\n * @param {[number, number, number]} [options.aaColor=[255, 255, 0]] Color of anti-aliased pixels in diff output.\n * @param {[number, number, number]} [options.diffColor=[255, 0, 0]] Color of different pixels in diff output.\n * @param {[number, number, number]} [options.diffColorAlt=options.diffColor] Whether to detect dark on light differences between img1 and img2 and set an alternative color to differentiate between the two.\n * @param {boolean} [options.diffMask=false] Draw the diff over a transparent background (a mask).\n *\n * @return {number} The number of mismatched pixels.\n */\nexport default function pixelmatch(img1, img2, output, width, height, options = {}) {\n const {\n threshold = 0.1,\n alpha = 0.1,\n aaColor = [255, 255, 0],\n diffColor = [255, 0, 0],\n includeAA, diffColorAlt, diffMask\n } = options;\n\n if (!isPixelData(img1) || !isPixelData(img2) || (output && !isPixelData(output)))\n throw new Error('Image data: Uint8Array, Uint8ClampedArray or Buffer expected.');\n\n if (img1.length !== img2.length || (output && output.length !== img1.length))\n throw new Error('Image sizes do not match.');\n\n if (img1.length !== width * height * 4) throw new Error('Image data size does not match width/height.');\n\n // check if images are identical\n const len = width * height;\n const a32 = new Uint32Array(img1.buffer, img1.byteOffset, len);\n const b32 = new Uint32Array(img2.buffer, img2.byteOffset, len);\n let identical = true;\n\n for (let i = 0; i < len; i++) {\n if (a32[i] !== b32[i]) { identical = false; break; }\n }\n if (identical) { // fast path if identical\n if (output && !diffMask) {\n for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, alpha, output);\n }\n return 0;\n }\n\n // maximum acceptable square distance between two colors;\n // 35215 is the maximum possible value for the YIQ difference metric\n const maxDelta = 35215 * threshold * threshold;\n const [aaR, aaG, aaB] = aaColor;\n const [diffR, diffG, diffB] = diffColor;\n const [altR, altG, altB] = diffColorAlt || diffColor;\n let diff = 0;\n\n // compare each pixel of one image against the other one\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n\n const i = y * width + x;\n const pos = i * 4;\n\n // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker\n const delta = a32[i] === b32[i] ? 0 : colorDelta(img1, img2, pos, pos, false);\n\n // the color difference is above the threshold\n if (Math.abs(delta) > maxDelta) {\n // check it's a real rendering difference or just anti-aliasing\n const isAA = antialiased(img1, x, y, width, height, a32, b32) || antialiased(img2, x, y, width, height, b32, a32);\n if (!includeAA && isAA) {\n // one of the pixels is anti-aliasing; draw as yellow and do not count as difference\n // note that we do not include such pixels in a mask\n if (output && !diffMask) drawPixel(output, pos, aaR, aaG, aaB);\n\n } else {\n // found substantial difference not caused by anti-aliasing; draw it as such\n if (output) {\n if (delta < 0) {\n drawPixel(output, pos, altR, altG, altB);\n } else {\n drawPixel(output, pos, diffR, diffG, diffB);\n }\n }\n diff++;\n }\n\n } else if (output && !diffMask) {\n // pixels are similar; draw background as grayscale image blended with white\n drawGrayPixel(img1, pos, alpha, output);\n }\n }\n }\n\n // return the number of different pixels\n return diff;\n}\n\n/** @param {Uint8Array | Uint8ClampedArray} arr */\nfunction isPixelData(arr) {\n // work around instanceof Uint8Array not working properly in some Jest environments\n return ArrayBuffer.isView(arr) && arr.BYTES_PER_ELEMENT === 1;\n}\n\n/**\n * Check if a pixel is likely a part of anti-aliasing;\n * based on \"Anti-aliased Pixel and Intensity Slope Detector\" paper by V. Vysniauskas, 2009\n * @param {Uint8Array | Uint8ClampedArray} img\n * @param {number} x1\n * @param {number} y1\n * @param {number} width\n * @param {number} height\n * @param {Uint32Array} a32\n * @param {Uint32Array} b32\n */\nfunction antialiased(img, x1, y1, width, height, a32, b32) {\n const x0 = Math.max(x1 - 1, 0);\n const y0 = Math.max(y1 - 1, 0);\n const x2 = Math.min(x1 + 1, width - 1);\n const y2 = Math.min(y1 + 1, height - 1);\n const pos = y1 * width + x1;\n let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;\n let min = 0;\n let max = 0;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n\n // go through 8 adjacent pixels\n for (let x = x0; x <= x2; x++) {\n for (let y = y0; y <= y2; y++) {\n if (x === x1 && y === y1) continue;\n\n // brightness delta between the center pixel and adjacent one\n const delta = colorDelta(img, img, pos * 4, (y * width + x) * 4, true);\n\n // count the number of equal, darker and brighter adjacent pixels\n if (delta === 0) {\n zeroes++;\n // if found more than 2 equal siblings, it's definitely not anti-aliasing\n if (zeroes > 2) return false;\n\n // remember the darkest pixel\n } else if (delta < min) {\n min = delta;\n minX = x;\n minY = y;\n\n // remember the brightest pixel\n } else if (delta > max) {\n max = delta;\n maxX = x;\n maxY = y;\n }\n }\n }\n\n // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing\n if (min === 0 || max === 0) return false;\n\n // if either the darkest or the brightest pixel has 3+ equal siblings in both images\n // (definitely not anti-aliased), this pixel is anti-aliased\n return (hasManySiblings(a32, minX, minY, width, height) && hasManySiblings(b32, minX, minY, width, height)) ||\n (hasManySiblings(a32, maxX, maxY, width, height) && hasManySiblings(b32, maxX, maxY, width, height));\n}\n\n/**\n * Check if a pixel has 3+ adjacent pixels of the same color.\n * @param {Uint32Array} img\n * @param {number} x1\n * @param {number} y1\n * @param {number} width\n * @param {number} height\n */\nfunction hasManySiblings(img, x1, y1, width, height) {\n const x0 = Math.max(x1 - 1, 0);\n const y0 = Math.max(y1 - 1, 0);\n const x2 = Math.min(x1 + 1, width - 1);\n const y2 = Math.min(y1 + 1, height - 1);\n const val = img[y1 * width + x1];\n let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;\n\n // go through 8 adjacent pixels\n for (let x = x0; x <= x2; x++) {\n for (let y = y0; y <= y2; y++) {\n if (x === x1 && y === y1) continue;\n zeroes += +(val === img[y * width + x]);\n if (zeroes > 2) return true;\n }\n }\n return false;\n}\n\n/**\n * Calculate color difference according to the paper \"Measuring perceived color difference\n * using YIQ NTSC transmission color space in mobile applications\" by Y. Kotsarenko and F. Ramos\n * @param {Uint8Array | Uint8ClampedArray} img1\n * @param {Uint8Array | Uint8ClampedArray} img2\n * @param {number} k\n * @param {number} m\n * @param {boolean} yOnly\n */\nfunction colorDelta(img1, img2, k, m, yOnly) {\n const r1 = img1[k];\n const g1 = img1[k + 1];\n const b1 = img1[k + 2];\n const a1 = img1[k + 3];\n const r2 = img2[m];\n const g2 = img2[m + 1];\n const b2 = img2[m + 2];\n const a2 = img2[m + 3];\n\n let dr = r1 - r2;\n let dg = g1 - g2;\n let db = b1 - b2;\n const da = a1 - a2;\n\n if (!dr && !dg && !db && !da) return 0;\n\n if (a1 < 255 || a2 < 255) { // blend pixels with background\n const rb = 48 + 159 * (k % 2);\n const gb = 48 + 159 * ((k / 1.618033988749895 | 0) % 2);\n const bb = 48 + 159 * ((k / 2.618033988749895 | 0) % 2);\n dr = (r1 * a1 - r2 * a2 - rb * da) / 255;\n dg = (g1 * a1 - g2 * a2 - gb * da) / 255;\n db = (b1 * a1 - b2 * a2 - bb * da) / 255;\n }\n\n const y = dr * 0.29889531 + dg * 0.58662247 + db * 0.11448223;\n\n if (yOnly) return y; // brightness difference only\n\n const i = dr * 0.59597799 - dg * 0.27417610 - db * 0.32180189;\n const q = dr * 0.21147017 - dg * 0.52261711 + db * 0.31114694;\n\n const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;\n\n // encode whether the pixel lightens or darkens in the sign\n return y > 0 ? -delta : delta;\n}\n\n/**\n * @param {Uint8Array | Uint8ClampedArray} output\n * @param {number} pos\n * @param {number} r\n * @param {number} g\n * @param {number} b\n */\nfunction drawPixel(output, pos, r, g, b) {\n output[pos + 0] = r;\n output[pos + 1] = g;\n output[pos + 2] = b;\n output[pos + 3] = 255;\n}\n\n/**\n * @param {Uint8Array | Uint8ClampedArray} img\n * @param {number} i\n * @param {number} alpha\n * @param {Uint8Array | Uint8ClampedArray} output\n */\nfunction drawGrayPixel(img, i, alpha, output) {\n const val = 255 + (img[i] * 0.29889531 + img[i + 1] * 0.58662247 + img[i + 2] * 0.11448223 - 255) * alpha * img[i + 3] / 255;\n drawPixel(output, i, val, val, val);\n}\n","// Note: pixelmatch seems to be pure ESM so mark it as noExternal in tsup config\nimport * as jpeg from \"jpeg-js\";\nimport pixelmatch from \"pixelmatch\";\nimport { PNG } from \"pngjs\";\n\nconst isPng = (buffer: Buffer): boolean => {\n return (\n buffer.length >= 8 &&\n buffer[0] === 0x89 &&\n buffer[1] === 0x50 &&\n buffer[2] === 0x4e &&\n buffer[3] === 0x47 &&\n buffer[4] === 0x0d &&\n buffer[5] === 0x0a &&\n buffer[6] === 0x1a &&\n buffer[7] === 0x0a\n );\n};\n\nconst isJpeg = (buffer: Buffer): boolean => {\n return buffer.length >= 2 && buffer[0] === 0xff && buffer[1] === 0xd8;\n};\n\nconst decodeImage = (\n buffer: Buffer,\n): { data: Uint8Array; width: number; height: number } => {\n if (isPng(buffer)) {\n const png = PNG.sync.read(buffer);\n return { data: png.data, height: png.height, width: png.width };\n }\n if (isJpeg(buffer)) {\n const img = jpeg.decode(buffer, { maxMemoryUsageInMB: 1024 });\n return { data: img.data, height: img.height, width: img.width };\n }\n // Default to PNG decode; if it fails upstream, treat as different sizes\n const png = PNG.sync.read(buffer);\n return { data: png.data, height: png.height, width: png.width };\n};\n\nexport const imagesAreSimilar = ({\n image1,\n image2,\n threshold,\n}: {\n image1: Buffer;\n image2: Buffer;\n threshold: number;\n}): boolean => {\n const decodedImage1 = decodeImage(image1);\n const decodedImage2 = decodeImage(image2);\n if (\n decodedImage1.width !== decodedImage2.width ||\n decodedImage1.height !== decodedImage2.height\n ) {\n return false;\n }\n const diffRgbaData = new Uint8Array(\n decodedImage1.width * decodedImage1.height * 4,\n );\n const numDiffPixels = pixelmatch(\n decodedImage1.data,\n decodedImage2.data,\n diffRgbaData,\n decodedImage1.width,\n decodedImage1.height,\n { threshold },\n );\n\n return numDiffPixels === 0;\n};\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport type { ScreenshotPromptOptions } from \"./index\";\n\nimport { imagesAreSimilar } from \"./image-compare\";\nimport { isPage } from \"./playwright-type-predicates\";\n\nexport async function takeStableScreenshot(\n target: Page | Locator,\n options?: ScreenshotPromptOptions,\n): Promise<Buffer> {\n const page = isPage(target) ? target : target.page();\n\n // Use a small budget for stabilization within the overall assertion timeout.\n // We allocate up to 25% of the total timeout (bounded between 300ms and 2000ms).\n const totalTimeout =\n (options as { timeout?: number } | undefined)?.timeout ?? 5000;\n // Budget is 25% of the total timeout\n const stabilizationBudgetMs = Math.floor(totalTimeout * 0.25);\n const stabilityBudgetMs = Math.min(\n 2000,\n Math.max(300, stabilizationBudgetMs),\n );\n const deadline = Date.now() + stabilityBudgetMs;\n\n let actual: Buffer | undefined;\n let previous: Buffer | undefined;\n const pollIntervals = [0, 100, 250, 500];\n let isFirstIteration = true;\n\n // Retry screenshot up to 3 times\n // Otherwise sometimes the screenshot following a redirect may fail\n const safeScreenshot = async (): Promise<Buffer> => {\n for (let i = 0; i < 3; i++) {\n try {\n return await target.screenshot(options);\n } catch {\n await page.waitForTimeout(250);\n continue;\n }\n }\n return await target.screenshot(options);\n };\n\n while (true) {\n if (Date.now() >= deadline) {\n break;\n }\n const delay = pollIntervals.length ? pollIntervals.shift()! : 1000;\n if (delay) {\n await page.waitForTimeout(delay);\n }\n previous = actual;\n actual = await safeScreenshot();\n if (\n !isFirstIteration &&\n actual &&\n previous &&\n imagesAreSimilar({\n image1: previous,\n image2: actual,\n threshold: options?.threshold ?? 0.02,\n })\n ) {\n return actual;\n }\n isFirstIteration = false;\n }\n return actual ?? (await safeScreenshot());\n}\n","import type { Locator, MatcherReturnType, Page } from \"@playwright/test\";\nimport { test } from \"@playwright/test\";\n\nimport type { ScreenshotPromptOptions } from \"./index\";\n\nimport { verifyPrompt } from \"./ai/verify-prompt\";\nimport { isLocator, isPage } from \"./playwright-type-predicates\";\nimport { takeStableScreenshot } from \"./screenshot\";\n\ntype VerifyTargetType = \"page\" | \"locator\";\n\ntype MatcherContext = {\n isNot: boolean;\n message?: () => string;\n};\n\nconst MAX_ATTACHMENT_NAME_LENGTH = 80;\n\nfunction createFailureMessage({\n condition,\n didPass,\n isNot,\n reason,\n targetType,\n}: {\n targetType: VerifyTargetType;\n condition: string;\n didPass: boolean;\n isNot: boolean;\n reason?: string;\n}): string {\n const expectation = isNot ? \"not to satisfy\" : \"to satisfy\";\n const result = didPass ? \"it did\" : \"it did not\";\n\n let message = `Expected ${targetType} ${expectation} ${JSON.stringify(condition)}, but ${result}.`;\n if (reason) {\n message += `\\n\\nReason: ${reason}`;\n }\n\n return message;\n}\n\nexport const stablyPlaywrightMatchers = {\n async toMatchScreenshotPrompt(\n this: MatcherContext,\n received: Page | Locator,\n condition: string,\n options?: ScreenshotPromptOptions,\n ): Promise<MatcherReturnType> {\n const target = isPage(received)\n ? received\n : isLocator(received)\n ? received\n : undefined;\n if (!target) {\n // Should never happen\n throw new Error(\n \"toMatchScreenshotPrompt only supports Playwright Page and Locator instances.\",\n );\n }\n const targetType: VerifyTargetType = isPage(target) ? \"page\" : \"locator\";\n\n // Wait for two consecutive identical screenshots before sending to AI\n const screenshot = await takeStableScreenshot(target, options);\n\n const verifyResult = await verifyPrompt({\n pageMetadata: isPage(target)\n ? { title: await target.title(), url: target.url() }\n : undefined,\n prompt: condition,\n screenshot,\n });\n\n const testInfo = test.info();\n const sanitizedName =\n condition\n .trim()\n .toLowerCase()\n .replace(/[^\\w]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, MAX_ATTACHMENT_NAME_LENGTH) || \"toMatchScreenshotPrompt\";\n\n testInfo.attachments.push(\n {\n body: Buffer.from(\n JSON.stringify(\n {\n pass: verifyResult.pass,\n prompt: condition,\n reasoning: verifyResult.reason,\n },\n null,\n 2,\n ),\n \"utf-8\",\n ),\n contentType: \"application/json\",\n name: `${sanitizedName}-reasoning`,\n },\n {\n body: screenshot,\n // Use binary type to avoid inline previews in the report\n // Ensures the screenshot is paired with the reasoning attachment instead of being rendered in a separate section.\n contentType: \"application/octet-stream\",\n name: `${sanitizedName}-screenshot.png`,\n },\n );\n\n return {\n message: () =>\n createFailureMessage({\n condition,\n didPass: verifyResult.pass,\n isNot: this.isNot,\n reason: verifyResult.reason,\n targetType,\n }),\n name: \"toMatchScreenshotPrompt\",\n pass: verifyResult.pass,\n };\n },\n} as const;\n","export const truncate = (inp: string, length: number): string =>\n inp.length <= length || inp.length <= 3\n ? inp\n : `${inp.slice(0, length - 3)}...`;\n","import type { Page } from \"@playwright/test\";\nimport type { Model } from \"./models\";\n\nexport function constructAgentPayload({\n activePage,\n additionalContext,\n isError,\n message,\n model,\n screenshot,\n sessionId,\n tabManager,\n}: {\n sessionId: string;\n model?: Model;\n message: string;\n isError?: boolean;\n screenshot: Buffer;\n tabManager: Map<Page, string>;\n activePage: Page;\n additionalContext?: Record<string, unknown>;\n}): FormData {\n const form = new FormData();\n const viewportSize = activePage.viewportSize();\n\n const tabs = Array.from(tabManager.entries()).map(([page, alias]) => ({\n alias,\n url: page.url(),\n }));\n\n const activePageAlias = tabManager.get(activePage);\n\n const metadata: Record<string, unknown> = {\n allPages: tabs,\n message,\n sessionId,\n };\n\n if (model) {\n metadata.model = model;\n }\n if (isError) {\n metadata.isError = isError;\n }\n if (additionalContext) {\n metadata.additionalContext = additionalContext;\n }\n if (viewportSize) {\n metadata.pageDimensions = viewportSize;\n }\n if (activePageAlias) {\n metadata.activePageAlias = activePageAlias;\n }\n\n const metadataBlob = new Blob([JSON.stringify(metadata)], {\n type: \"application/json\",\n });\n form.append(\"metadata\", metadataBlob, \"metadata.json\");\n\n const screenshotBytes = Uint8Array.from(screenshot);\n const screenshotBlob = new Blob([screenshotBytes], { type: \"image/png\" });\n form.append(\"screenshot\", screenshotBlob, \"screenshot.png\");\n\n return form;\n}\n","import type { Page } from \"@playwright/test\";\n\ntype ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\n/**\n * Attempts to scroll by finding the scrollable ancestor of the element at the given position.\n * Falls back to mouse.wheel() if no scrollable container is found.\n */\nexport async function scrollAtPosition({\n amount,\n direction,\n page,\n x,\n y,\n}: {\n amount: number;\n direction: ScrollDirection;\n page: Page;\n x: number;\n y: number;\n}): Promise<void> {\n const deltaX =\n direction === \"left\" ? -amount : direction === \"right\" ? amount : 0;\n const deltaY =\n direction === \"up\" ? -amount : direction === \"down\" ? amount : 0;\n // First try to scroll the element at the position directly (for scrollable containers)\n // Uses findAndScrollAncestor pattern - walks up DOM to find scrollable container\n const scrolled = await page.evaluate(\n ({ posX, posY, scrollDeltaX, scrollDeltaY }) => {\n const element = document.elementFromPoint(posX, posY);\n if (!element) {\n return false;\n }\n\n // Walk up the DOM tree to find a scrollable container\n let scrollableEl: Element | null = element;\n while (scrollableEl && scrollableEl !== document.documentElement) {\n const { overflowX, overflowY } = window.getComputedStyle(scrollableEl);\n const isScrollableX =\n scrollableEl.scrollWidth > scrollableEl.clientWidth &&\n (overflowX === \"auto\" || overflowX === \"scroll\");\n const isScrollableY =\n scrollableEl.scrollHeight > scrollableEl.clientHeight &&\n (overflowY === \"auto\" || overflowY === \"scroll\");\n if (isScrollableX || isScrollableY) {\n scrollableEl.scrollBy(scrollDeltaX, scrollDeltaY);\n return true;\n }\n scrollableEl = scrollableEl.parentElement;\n }\n return false;\n },\n { posX: x, posY: y, scrollDeltaX: deltaX, scrollDeltaY: deltaY },\n );\n\n if (!scrolled) {\n // Fall back to mouse.wheel() for page-level scrolling\n // Note: mouse.wheel() dispatches a wheel event at the mouse position, but the browser\n // decides how to handle it. It may not scroll if the element under the cursor isn't\n // scrollable, or may scroll a different container than expected.\n await page.mouse.move(x, y);\n await page.mouse.wheel(deltaX, deltaY);\n }\n}\n","import type { BrowserContext, Page } from \"@playwright/test\";\n\nimport { takeStableScreenshot } from \"../../../screenshot\";\nimport { scrollAtPosition } from \"./scroll-helper\";\nimport type { AgentResponse } from \"./tool-responses\";\n\nexport type AgentActionResult = {\n message: string;\n isError?: boolean;\n shouldTerminate?: boolean;\n};\n\ntype PageWithSnapshot = Page & {\n _snapshotForAI: () => string;\n};\n\nconst DEFAULT_AGENT_WAIT_MS = 3000;\n\nexport async function execResponse({\n activePage: initialActivePage,\n agentResponse,\n browserContext,\n tabManager,\n}: {\n activePage: Page;\n agentResponse: AgentResponse;\n browserContext: BrowserContext;\n tabManager: Map<Page, string>;\n}): Promise<{\n activePage: Page;\n finalSuccess?: boolean;\n failureReason?: string;\n result: AgentActionResult;\n}> {\n let activePage = initialActivePage;\n try {\n switch (agentResponse.action) {\n case \"key\": {\n const { text } = agentResponse;\n if (text) {\n await activePage.keyboard.press(text);\n return { activePage, result: { message: `pressed \"${text}\"` } };\n }\n return { activePage, result: { message: \"pressed key\" } };\n }\n case \"type\": {\n const { text } = agentResponse;\n await activePage.keyboard.type(text);\n return { activePage, result: { message: `typed \"${text}\"` } };\n }\n case \"mouse_move\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.move(x, y);\n return { activePage, result: { message: `mouse moved completed` } };\n }\n case \"left_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.click(x, y);\n return { activePage, result: { message: `left click completed` } };\n }\n case \"right_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.click(x, y, { button: \"right\" });\n return { activePage, result: { message: `right click completed` } };\n }\n case \"double_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.dblclick(x, y);\n return { activePage, result: { message: `double click completed` } };\n }\n case \"triple_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.click(x, y, { clickCount: 3 });\n return { activePage, result: { message: `triple click completed` } };\n }\n case \"left_click_drag\": {\n const [startX, startY] = agentResponse.start_coordinate;\n const [endX, endY] = agentResponse.coordinate;\n await activePage.mouse.move(startX, startY);\n await activePage.mouse.down();\n await activePage.mouse.move(endX, endY);\n await activePage.mouse.up();\n return { activePage, result: { message: `drag completed` } };\n }\n case \"screenshot\": {\n await takeStableScreenshot(activePage);\n return { activePage, result: { message: \"captured screenshot\" } };\n }\n case \"wait\": {\n const waitMs = agentResponse.milliseconds ?? DEFAULT_AGENT_WAIT_MS;\n await activePage.waitForTimeout(waitMs);\n return { activePage, result: { message: `waited ${waitMs}ms` } };\n }\n case \"navigate_to_url\": {\n await activePage.goto(agentResponse.url);\n return {\n activePage,\n result: { message: `navigated to \"${agentResponse.url}\"` },\n };\n }\n case \"new_tab_url\": {\n const newPage = await browserContext.newPage();\n await newPage.goto(agentResponse.url);\n await newPage.waitForLoadState(\"domcontentloaded\");\n activePage = newPage;\n return { activePage, result: { message: \"opened new tab\" } };\n }\n case \"switch_tab\": {\n const entry = Array.from(tabManager.entries()).find(\n ([, alias]) => alias === agentResponse.tab_alias,\n );\n const page = entry?.[0];\n if (!page) {\n throw new Error(\n `Tab with alias ${agentResponse.tab_alias} not found`,\n );\n }\n await page.bringToFront();\n activePage = page;\n return {\n activePage,\n result: { message: `switched to \"${agentResponse.tab_alias}\"` },\n };\n }\n case \"scroll\": {\n const [x, y] = agentResponse.coordinate;\n await scrollAtPosition({\n amount: agentResponse.scroll_amount,\n direction: agentResponse.scroll_direction,\n page: activePage,\n x,\n y,\n });\n\n return {\n activePage,\n result: { message: `scrolled ${agentResponse.scroll_direction}` },\n };\n }\n case \"navigate_back\": {\n const res = await activePage.goBack();\n if (!res) {\n throw new Error(\"navigate_back failed: no history entry\");\n }\n return { activePage, result: { message: \"navigated back\" } };\n }\n case \"aria_snapshot\": {\n const ariaSnapshot = await (\n activePage as PageWithSnapshot\n )._snapshotForAI();\n return {\n activePage,\n result: { message: `ARIA Snapshot:\\n${ariaSnapshot}` },\n };\n }\n case \"terminate_test\": {\n const { reason, success } = agentResponse;\n return {\n activePage,\n failureReason: success ? undefined : reason,\n finalSuccess: success,\n result: { message: reason, shouldTerminate: true },\n };\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { activePage, result: { isError: true, message } };\n }\n}\n","import type { BrowserContext, Page } from \"@playwright/test\";\n\nimport { test } from \"@playwright/test\";\nimport pRetry from \"p-retry\";\n\nimport type { AgentResponse } from \"./agent/tool-responses\";\n\nimport { SDK_METADATA_HEADERS } from \"../../ai/metadata\";\nimport { requireApiKey } from \"../../runtime\";\nimport { takeStableScreenshot } from \"../../screenshot\";\nimport { truncate } from \"../../utils/truncate\";\nimport { constructAgentPayload } from \"./agent/construct-payload\";\nimport type { AgentActionResult } from \"./agent/exec-response\";\nimport { execResponse } from \"./agent/exec-response\";\nimport type { Model } from \"./agent/models\";\n\n/**\n * Options for configuring agent behavior during execution.\n */\ntype AgentActOptions = {\n /**\n * The page the agent will operate on.\n */\n page: Page;\n /**\n * Maximum number of thinking cycles the agent can perform.\n * Each cycle includes observing the page, planning, and executing one or more actions.\n * @default 30\n */\n maxCycles?: number;\n /**\n * AI model to use for agent reasoning.\n * Different models may have different capabilities and performance characteristics.\n */\n model?: Model;\n};\n\nconst AGENT_PATH = \"internal/v3/agent\";\n\nconst STABLY_API_URL = process.env.STABLY_API_URL || \"https://api.stably.ai\";\nconst AGENT_ENDPOINT = new URL(AGENT_PATH, STABLY_API_URL).toString();\n\n/**\n * AI agent for automating browser interactions using natural language.\n *\n * The Agent can perform complex browser actions by interpreting natural language instructions.\n * It observes the page state, makes decisions, and executes actions autonomously.\n *\n * Agents are created via {@link BrowserContext.newAgent} or {@link Browser.newAgent}.\n *\n * @example\n * ```typescript\n * const agent = context.newAgent();\n * await agent.act('Fill out the login form and submit', { page });\n * ```\n */\nexport class Agent {\n constructor(readonly browserContext: BrowserContext) {}\n\n /**\n * Instructs the agent to perform actions on the page using natural language.\n *\n * The agent will analyze the page, plan actions, and execute them autonomously.\n * It can perform multiple actions such as clicking, typing, navigating, and verifying\n * page state based on the provided instruction.\n *\n * @param prompt - Natural language instruction describing what the agent should do\n * @param options - Configuration for the agent's behavior including the page to operate on\n * @returns Promise that resolves when the agent successfully completes the task\n * @throws {Error} Throws an error if the agent fails to complete the task. The error message includes the AI's reasoning for the failure.\n *\n * @example\n * ```typescript\n * // Simple action\n * await agent.act('Click the login button', { page });\n *\n * // Complex multi-step action\n * await agent.act('Navigate to settings, enable notifications, and save changes', { page });\n *\n * // With custom options\n * await agent.act('Complete the checkout process', {\n * page,\n * maxCycles: 20,\n * model: 'gpt-4'\n * });\n *\n * // Handling failures with try-catch\n * try {\n * await agent.act('Complete the task', { page });\n * console.log('Agent completed the task successfully');\n * } catch (error) {\n * console.error('Agent failed:', error.message);\n * }\n * ```\n */\n async act(prompt: string, options: AgentActOptions): Promise<void> {\n const apiKey = requireApiKey();\n\n const maxCycles = options.maxCycles ?? 30;\n\n const tabManager = new Map<Page, string>();\n this.browserContext.pages().forEach((page, index) => {\n tabManager.set(page, `page${index + 1}`);\n });\n\n let activePage = options.page;\n let agentMessage: AgentActionResult = {\n isError: false,\n message: prompt,\n shouldTerminate: false,\n };\n let finalSuccess: boolean | undefined;\n let failureReason: string | undefined;\n let newPageOpenedMsg: string | undefined;\n\n const sessionId = crypto.randomUUID();\n\n const onNewPage = async (page: Page) => {\n await page.waitForLoadState(\"domcontentloaded\");\n if (!tabManager.has(page)) {\n const alias = `page${tabManager.size + 1}`;\n tabManager.set(page, alias);\n }\n await page.bringToFront();\n activePage = page;\n\n const alias = tabManager.get(page)!;\n newPageOpenedMsg = `opened new tab ${alias} (${page.url()})`;\n };\n\n this.browserContext.on(\"page\", onNewPage);\n\n return await test.step(`[Agent] ${prompt}`, async () => {\n try {\n for (let i = 0; i < maxCycles; i++) {\n if (agentMessage.shouldTerminate) {\n break;\n }\n\n const agentResponses =\n await test.step(`[Thinking ${i + 1}]`, async (stepInfo) => {\n const screenshot = await takeStableScreenshot(activePage);\n\n const response = await pRetry(\n () =>\n fetch(AGENT_ENDPOINT, {\n body: constructAgentPayload({\n activePage,\n additionalContext: newPageOpenedMsg\n ? { newPageMessage: newPageOpenedMsg }\n : undefined,\n isError: agentMessage.isError,\n message: agentMessage.message,\n model: options.model,\n screenshot,\n sessionId,\n tabManager,\n }),\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n },\n method: \"POST\",\n }),\n {\n // Exponential backoff with jitter: ~2-4s, ~4-8s, ~8-16s\n minTimeout: 2000,\n randomize: true,\n retries: 3,\n },\n );\n\n // Clear any new page opened context after each agent call\n newPageOpenedMsg = undefined;\n const responseJson = (await response.json()) as AgentResponse[];\n\n if (!response.ok) {\n throw new Error(\n `Agent call failed: ${JSON.stringify(responseJson)}`,\n );\n }\n\n // Extract and collect reasoning content from the responses\n const reasoningTexts = responseJson\n .map((r) => r.content?.trim())\n .filter((content) => content !== undefined);\n\n const reasoningText = reasoningTexts.join(\"\\n\\n\");\n\n // Only attach if there's actual reasoning content\n if (reasoningText) {\n const truncatedReasoningText = truncate(reasoningText, 120);\n\n await stepInfo.attach(\n `[Thinking ${i + 1}] ${truncatedReasoningText}`,\n {\n body: reasoningText,\n contentType: \"text/plain\",\n },\n );\n }\n\n return responseJson;\n });\n\n let combinedMessages: string[] = [];\n let aggregatedIsError = false;\n let aggregatedShouldTerminate = false;\n\n for (const agentResponse of agentResponses) {\n const {\n activePage: newActivePage,\n failureReason: maybeFailureReason,\n finalSuccess: maybeFinal,\n result,\n } = await execResponse({\n activePage,\n agentResponse,\n browserContext: this.browserContext,\n tabManager,\n });\n activePage = newActivePage;\n combinedMessages.push(result.message);\n finalSuccess = maybeFinal ?? finalSuccess;\n failureReason = maybeFailureReason ?? failureReason;\n if (result.isError) {\n aggregatedIsError = true;\n }\n if (result.shouldTerminate) {\n aggregatedShouldTerminate = true;\n break;\n }\n }\n\n agentMessage = {\n isError: aggregatedIsError,\n message: combinedMessages.join(\"\\n\"),\n shouldTerminate: aggregatedShouldTerminate,\n };\n }\n } finally {\n this.browserContext.off(\"page\", onNewPage);\n }\n\n const success = finalSuccess ?? false;\n if (!success) {\n throw new Error(failureReason ?? \"Agent failed to complete the task\");\n }\n });\n }\n}\n\nexport const createNewAgent = (browserContext: BrowserContext): Agent =>\n new Agent(browserContext);\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport { test } from \"@playwright/test\";\nimport type * as z4 from \"zod/v4/core\";\n\nimport { requireApiKey } from \"../runtime\";\nimport { isObject } from \"../type-predicate/is-object\";\nimport { SDK_METADATA_HEADERS } from \"./metadata\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype ZodV4 = typeof import(\"zod/v4/core\");\n\nexport type ExtractSchema = {\n safeParseAsync(\n data: unknown,\n params?: z4.ParseContext<z4.$ZodIssue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<z4.util.SafeParseResult<z4.output<any>>>;\n} & z4.$ZodType;\n\nexport type SchemaOutput<T extends ExtractSchema> = z4.output<T>;\n\ntype ExtractIssue = z4.$ZodIssue;\n\nconst EXTRACT_PATH = \"internal/v2/extract\";\nconst STABLY_API_URL = process.env.STABLY_API_URL || \"https://api.stably.ai\";\nconst EXTRACT_ENDPOINT = new URL(EXTRACT_PATH, STABLY_API_URL).toString();\n\nconst zodV4: ZodV4 | undefined = (() => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n return require(\"zod/v4/core\") as ZodV4;\n } catch {\n return undefined;\n }\n})();\n\ntype ExtractionSuccess = { success: true; value: unknown };\ntype ExtractionFailure = { success: false; error: string };\ntype ExtractionResponse = ExtractionSuccess | ExtractionFailure;\n\ntype ErrorResponse = { error: string };\n\nconst isExtractionResponse = (value: unknown): value is ExtractionResponse => {\n if (!isObject(value)) {\n return false;\n }\n\n if (value.success === true) {\n return \"value\" in value;\n }\n\n return value.success === false && typeof value.error === \"string\";\n};\n\nconst isErrorResponse = (value: unknown): value is ErrorResponse => {\n return isObject(value) && typeof value.error === \"string\";\n};\n\nclass ExtractValidationError extends Error {\n constructor(\n message: string,\n readonly issues: readonly ExtractIssue[],\n ) {\n super(message);\n this.name = \"ExtractValidationError\";\n }\n}\n\nasync function validateWithSchema<T extends ExtractSchema>(\n schema: T,\n value: unknown,\n): Promise<SchemaOutput<T>> {\n const result = await schema.safeParseAsync(value);\n if (!result.success) {\n throw new ExtractValidationError(\n \"AI is unable to return the data in the desired format\",\n result.error.issues,\n );\n }\n\n return result.data;\n}\n\ntype BaseExtractArgs = {\n prompt: string;\n pageOrLocator: Page | Locator;\n};\n\ntype ExtractArgsWithSchema<T extends ExtractSchema> = BaseExtractArgs & {\n schema: T;\n};\n\nexport async function extract(args: BaseExtractArgs): Promise<string>;\nexport async function extract<T extends ExtractSchema>(\n args: ExtractArgsWithSchema<T>,\n): Promise<SchemaOutput<T>>;\nexport async function extract<T extends ExtractSchema>({\n pageOrLocator,\n prompt,\n schema,\n}: BaseExtractArgs & { schema?: T }): Promise<string | SchemaOutput<T>> {\n if (schema && !zodV4) {\n throw new Error(\n \"Schema support requires installing zod@4. Please add it to enable schemas.\",\n );\n }\n\n const jsonSchema =\n schema && zodV4\n ? zodV4?.toJSONSchema(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n schema as unknown as Parameters<ZodV4[\"toJSONSchema\"]>[0],\n )\n : undefined;\n\n return await test.step(`[Extract] ${prompt}`, async (stepInfo) => {\n const apiKey = requireApiKey();\n\n const form = new FormData();\n form.append(\"prompt\", prompt);\n if (jsonSchema) {\n form.append(\"jsonSchema\", JSON.stringify(jsonSchema));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pngBuffer = await (pageOrLocator as any).screenshot({ type: \"png\" }); // Buffer\n const u8 = Uint8Array.from(pngBuffer); // strips Buffer type → plain Uint8Array\n const blob = new Blob([u8], { type: \"image/png\" });\n form.append(\"image\", blob, \"screenshot.png\");\n\n const response = await fetch(EXTRACT_ENDPOINT, {\n body: form,\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n },\n method: \"POST\",\n });\n\n const raw = await response.json().catch(() => undefined as unknown);\n\n if (response.ok) {\n if (!isExtractionResponse(raw)) {\n throw new Error(\"Extract returned unexpected response shape\");\n }\n\n if (!raw.success) {\n await stepInfo.attach(\"[Extract] error\", {\n body: raw.error,\n contentType: \"text/plain\",\n });\n throw new Error(`Extract failed: ${raw.error}`);\n }\n\n const { value } = raw;\n const body =\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n await stepInfo.attach(\"[Extract] result\", {\n body,\n contentType: \"text/plain\",\n });\n\n return schema\n ? await validateWithSchema(schema, value)\n : typeof value === \"string\"\n ? value\n : JSON.stringify(value);\n }\n\n throw new Error(isErrorResponse(raw) ? raw.error : \"Extract failed\");\n });\n}\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport {\n type ExtractSchema,\n type SchemaOutput,\n extract,\n} from \"../../ai/extract\";\n\ntype ExtractOptions<T extends ExtractSchema> = {\n schema: T;\n};\n\ntype ExtractMethod = {\n (prompt: string): Promise<string>;\n <T extends ExtractSchema>(\n prompt: string,\n options: ExtractOptions<T>,\n ): Promise<SchemaOutput<T>>;\n};\n\ntype LocatorExtract = ExtractMethod;\ntype PageExtract = ExtractMethod;\n\ntype ExtractSubject = Locator | Page;\n\nfunction createExtract(pageOrLocator: ExtractSubject): ExtractMethod {\n const impl = (async (\n prompt: string,\n options?: ExtractOptions<ExtractSchema>,\n ) => {\n if (options?.schema) {\n return extract({\n pageOrLocator,\n prompt,\n schema: options.schema,\n });\n }\n\n return extract({ pageOrLocator, prompt });\n }) as ExtractMethod;\n\n return impl;\n}\n\nexport const createLocatorExtract = (locator: Locator): LocatorExtract =>\n createExtract(locator);\n\nexport const createPageExtract = (page: Page): PageExtract =>\n createExtract(page);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-type-assertion */\nimport type {\n Browser,\n BrowserContext,\n BrowserType,\n Locator,\n Page,\n} from \"@playwright/test\";\n\nimport { createNewAgent } from \"./methods/agent\";\nimport { createLocatorExtract, createPageExtract } from \"./methods/extract\";\n\nconst LOCATOR_PATCHED = Symbol.for(\"stably.playwright.locatorPatched\");\nconst PAGE_PATCHED = Symbol.for(\"stably.playwright.pagePatched\");\nconst CONTEXT_PATCHED = Symbol.for(\"stably.playwright.contextPatched\");\nconst BROWSER_PATCHED = Symbol.for(\"stably.playwright.browserPatched\");\nconst BROWSER_TYPE_PATCHED = Symbol.for(\"stably.playwright.browserTypePatched\");\n\nfunction defineHiddenProperty<T, K extends PropertyKey>(\n target: T,\n key: K,\n value: unknown,\n): void {\n Object.defineProperty(target as unknown as object, key, {\n configurable: true,\n enumerable: false,\n value,\n writable: true,\n });\n}\n\nexport function augmentLocator<T extends Locator>(locator: T): T {\n if (\n (locator as unknown as { [LOCATOR_PATCHED]?: boolean })[LOCATOR_PATCHED]\n ) {\n return locator;\n }\n\n defineHiddenProperty(locator, \"extract\", createLocatorExtract(locator));\n\n defineHiddenProperty(locator, LOCATOR_PATCHED, true);\n\n return locator;\n}\n\nexport function augmentPage<T extends Page>(page: T): T {\n if ((page as unknown as { [PAGE_PATCHED]?: boolean })[PAGE_PATCHED]) {\n return page;\n }\n\n const originalLocator = (page as any).locator.bind(page);\n (page as any).locator = ((...args: any[]) => {\n const locator = originalLocator(...args);\n return augmentLocator(locator);\n }) as any;\n\n defineHiddenProperty(page, \"extract\", createPageExtract(page));\n defineHiddenProperty(page, PAGE_PATCHED, true);\n\n return page;\n}\n\nexport function augmentBrowserContext<T extends BrowserContext>(context: T): T {\n if (\n (context as unknown as { [CONTEXT_PATCHED]?: boolean })[CONTEXT_PATCHED]\n ) {\n return context;\n }\n\n const originalNewPage = (context as any).newPage.bind(context);\n (context as any).newPage = (async (...args: any[]) => {\n const page = await originalNewPage(...args);\n return augmentPage(page);\n }) as any;\n\n const originalPages = (context as any).pages?.bind(context);\n if (originalPages) {\n (context as any).pages = (() =>\n originalPages().map((page: Page) => augmentPage(page))) as any;\n }\n\n if (!(context as unknown as { newAgent?: unknown }).newAgent) {\n defineHiddenProperty(context, \"newAgent\", () => {\n return createNewAgent(context);\n });\n }\n\n defineHiddenProperty(context, CONTEXT_PATCHED, true);\n\n return context;\n}\n\nexport function augmentBrowser<T extends Browser>(browser: T): T {\n if (\n (browser as unknown as { [BROWSER_PATCHED]?: boolean })[BROWSER_PATCHED]\n ) {\n return browser;\n }\n\n const originalNewContext = (browser as any).newContext.bind(browser);\n (browser as any).newContext = (async (...args: any[]) => {\n const context = await originalNewContext(...args);\n return augmentBrowserContext(context);\n }) as any;\n\n const originalNewPage = (browser as any).newPage.bind(browser);\n (browser as any).newPage = (async (...args: any[]) => {\n const page = await originalNewPage(...args);\n return augmentPage(page);\n }) as any;\n\n const originalContexts = (browser as any).contexts.bind(browser);\n (browser as any).contexts = (() =>\n originalContexts().map((context: BrowserContext) =>\n augmentBrowserContext(context),\n )) as any;\n\n if (!(browser as unknown as { newAgent?: unknown }).newAgent) {\n defineHiddenProperty(browser, \"newAgent\", () => {\n // Get the first context, or it will be created when the agent tries to access browserContext\n const contexts = browser.contexts();\n const context = contexts.length > 0 ? contexts[0] : browser.contexts()[0];\n return createNewAgent(context);\n });\n }\n\n defineHiddenProperty(browser, BROWSER_PATCHED, true);\n\n return browser;\n}\n\nexport function augmentBrowserType<TBrowser extends Browser>(\n browserType: BrowserType<TBrowser>,\n): BrowserType<TBrowser> {\n if (\n (browserType as unknown as { [BROWSER_TYPE_PATCHED]?: boolean })[\n BROWSER_TYPE_PATCHED\n ]\n ) {\n return browserType;\n }\n\n const originalLaunch = (browserType as any).launch.bind(browserType);\n (browserType as any).launch = (async (\n ...args: Parameters<BrowserType<TBrowser>[\"launch\"]>\n ) => {\n const browser = await originalLaunch(...args);\n return augmentBrowser(browser) as TBrowser;\n }) as unknown as BrowserType<TBrowser>[\"launch\"];\n\n const originalConnect = (browserType as any).connect?.bind(browserType);\n if (originalConnect) {\n (browserType as any).connect = (async (\n ...args: Parameters<NonNullable<BrowserType<TBrowser>[\"connect\"]>>\n ) => {\n const browser = await originalConnect(...args);\n return augmentBrowser(browser) as TBrowser;\n }) as unknown as NonNullable<BrowserType<TBrowser>[\"connect\"]>;\n }\n\n const originalConnectOverCDP = (browserType as any).connectOverCDP?.bind(\n browserType,\n );\n if (originalConnectOverCDP) {\n (browserType as any).connectOverCDP = (async (\n ...args: Parameters<NonNullable<BrowserType<TBrowser>[\"connectOverCDP\"]>>\n ) => {\n const browser = await originalConnectOverCDP(...args);\n return augmentBrowser(browser) as TBrowser;\n }) as unknown as NonNullable<BrowserType<TBrowser>[\"connectOverCDP\"]>;\n }\n\n const originalLaunchPersistentContext = (\n browserType as any\n ).launchPersistentContext?.bind(browserType);\n if (originalLaunchPersistentContext) {\n (browserType as any).launchPersistentContext = (async (\n ...args: Parameters<\n NonNullable<BrowserType<TBrowser>[\"launchPersistentContext\"]>\n >\n ) => {\n const context = await originalLaunchPersistentContext(...args);\n return augmentBrowserContext(context) as BrowserContext;\n }) as unknown as NonNullable<\n BrowserType<TBrowser>[\"launchPersistentContext\"]\n >;\n }\n\n defineHiddenProperty(browserType, BROWSER_TYPE_PATCHED, true);\n\n return browserType;\n}\n"],"names":["STABLY_API_URL","png","PNG","jpeg","test","alias"],"mappings":"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","x_google_ignoreList":[5]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/runtime.ts","../src/type-predicate/is-object.ts","../src/ai/metadata.ts","../src/ai/verify-prompt.ts","../src/playwright-type-predicates.ts","../../../node_modules/.pnpm/pixelmatch@7.1.0/node_modules/pixelmatch/index.js","../src/image-compare.ts","../src/screenshot.ts","../src/expect.ts","../src/utils/truncate.ts","../src/playwright-augment/methods/agent/construct-payload.ts","../src/playwright-augment/methods/agent/scroll-helper.ts","../src/playwright-augment/methods/agent/exec-response.ts","../src/playwright-augment/methods/agent.ts","../src/ai/extract.ts","../src/playwright-augment/methods/extract.ts","../src/ai/get-locators-by-ai.ts","../src/playwright-augment/methods/get-locators-by-ai.ts","../src/playwright-augment/augment.ts"],"sourcesContent":["let configuredApiKey: string | undefined = process.env.STABLY_API_KEY;\n\nexport function setApiKey(apiKey: string): void {\n configuredApiKey = apiKey;\n}\n\nexport function getApiKey(): string | undefined {\n return configuredApiKey;\n}\n\nexport function requireApiKey(): string {\n const apiKey = getApiKey();\n if (!apiKey) {\n throw new Error(\n \"Missing Stably API key. Call setApiKey(apiKey) or set the STABLY_API_KEY environment variable.\",\n );\n }\n return apiKey;\n}\n","export const isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n","declare const __PACKAGE_VERSION__: string;\n\nexport const SDK_METADATA_HEADERS = {\n \"X-Client-Name\": \"stably-playwright-sdk-js\",\n \"X-Client-Version\": __PACKAGE_VERSION__,\n};\n","import { requireApiKey } from \"../runtime\";\nimport { isObject } from \"../type-predicate/is-object\";\nimport { SDK_METADATA_HEADERS } from \"./metadata\";\nimport type { AIModel } from \"./models\";\n\nconst PROMPT_ASSERTION_PATH = \"internal/v2/assert\";\nconst STABLY_API_URL = process.env.STABLY_API_URL || \"https://api.stably.ai\";\nconst PROMPT_ASSERTION_ENDPOINT = new URL(\n PROMPT_ASSERTION_PATH,\n STABLY_API_URL,\n).toString();\n\ntype ParsedSuccessResponse = { success: boolean; reason?: string };\n\nconst parseSuccessResponse = (value: unknown): ParsedSuccessResponse => {\n if (!isObject(value)) {\n throw new Error(\"Verify prompt returned unexpected response shape\");\n }\n\n const { reason, success } = value;\n if (typeof success !== \"boolean\") {\n throw new Error(\"Verify prompt returned unexpected response shape\");\n }\n\n if (reason !== undefined && typeof reason !== \"string\") {\n throw new Error(\"Verify prompt returned unexpected response shape\");\n }\n\n return {\n reason,\n success,\n };\n};\n\ntype ParsedErrorResponse = { error: string };\n\nconst parseErrorResponse = (\n value: unknown,\n): ParsedErrorResponse | undefined => {\n if (!isObject(value)) {\n return undefined;\n }\n\n const { error } = value;\n return typeof error !== \"string\" ? undefined : { error };\n};\n\nexport async function verifyPrompt({\n model,\n pageMetadata,\n prompt,\n screenshot,\n}: {\n model?: AIModel;\n pageMetadata?: { title: string; url: string };\n prompt: string;\n screenshot: Uint8Array;\n}): Promise<{\n pass: boolean;\n reason?: string;\n}> {\n const apiKey = requireApiKey();\n\n const form = new FormData();\n\n const metadata: Record<string, unknown> = {\n prompt,\n ...(pageMetadata?.title ? { pageTitle: pageMetadata.title } : {}),\n ...(pageMetadata?.url ? { pageUrl: pageMetadata.url } : {}),\n };\n\n if (model) {\n metadata.model = model;\n }\n\n form.append(\"metadata\", JSON.stringify(metadata));\n\n const u8 = Uint8Array.from(screenshot);\n const blob = new Blob([u8], { type: \"image/png\" });\n form.append(\"screenshot\", blob, \"screenshot.png\");\n\n const response = await fetch(PROMPT_ASSERTION_ENDPOINT, {\n body: form,\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n },\n method: \"POST\",\n });\n\n const parsed = await response.json().catch(() => undefined as unknown);\n\n if (response.ok) {\n const { reason, success } = parseSuccessResponse(parsed);\n return {\n pass: success,\n reason,\n };\n }\n\n const err = parseErrorResponse(parsed);\n throw new Error(\n `Verify prompt failed (${response.status})${err ? `: ${err.error}` : \"\"}`,\n );\n}\n","import type { Page, Locator } from \"@playwright/test\";\n\nexport function isPage(candidate: unknown): candidate is Page {\n return (\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof (candidate as Page).screenshot === \"function\" &&\n typeof (candidate as Page).goto === \"function\"\n );\n}\n\nexport function isLocator(candidate: unknown): candidate is Locator {\n return (\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof (candidate as Locator).screenshot === \"function\" &&\n typeof (candidate as Locator).nth === \"function\"\n );\n}\n","/**\n * Compare two equally sized images, pixel by pixel.\n *\n * @param {Uint8Array | Uint8ClampedArray} img1 First image data.\n * @param {Uint8Array | Uint8ClampedArray} img2 Second image data.\n * @param {Uint8Array | Uint8ClampedArray | void} output Image data to write the diff to, if provided.\n * @param {number} width Input images width.\n * @param {number} height Input images height.\n *\n * @param {Object} [options]\n * @param {number} [options.threshold=0.1] Matching threshold (0 to 1); smaller is more sensitive.\n * @param {boolean} [options.includeAA=false] Whether to skip anti-aliasing detection.\n * @param {number} [options.alpha=0.1] Opacity of original image in diff output.\n * @param {[number, number, number]} [options.aaColor=[255, 255, 0]] Color of anti-aliased pixels in diff output.\n * @param {[number, number, number]} [options.diffColor=[255, 0, 0]] Color of different pixels in diff output.\n * @param {[number, number, number]} [options.diffColorAlt=options.diffColor] Whether to detect dark on light differences between img1 and img2 and set an alternative color to differentiate between the two.\n * @param {boolean} [options.diffMask=false] Draw the diff over a transparent background (a mask).\n *\n * @return {number} The number of mismatched pixels.\n */\nexport default function pixelmatch(img1, img2, output, width, height, options = {}) {\n const {\n threshold = 0.1,\n alpha = 0.1,\n aaColor = [255, 255, 0],\n diffColor = [255, 0, 0],\n includeAA, diffColorAlt, diffMask\n } = options;\n\n if (!isPixelData(img1) || !isPixelData(img2) || (output && !isPixelData(output)))\n throw new Error('Image data: Uint8Array, Uint8ClampedArray or Buffer expected.');\n\n if (img1.length !== img2.length || (output && output.length !== img1.length))\n throw new Error('Image sizes do not match.');\n\n if (img1.length !== width * height * 4) throw new Error('Image data size does not match width/height.');\n\n // check if images are identical\n const len = width * height;\n const a32 = new Uint32Array(img1.buffer, img1.byteOffset, len);\n const b32 = new Uint32Array(img2.buffer, img2.byteOffset, len);\n let identical = true;\n\n for (let i = 0; i < len; i++) {\n if (a32[i] !== b32[i]) { identical = false; break; }\n }\n if (identical) { // fast path if identical\n if (output && !diffMask) {\n for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, alpha, output);\n }\n return 0;\n }\n\n // maximum acceptable square distance between two colors;\n // 35215 is the maximum possible value for the YIQ difference metric\n const maxDelta = 35215 * threshold * threshold;\n const [aaR, aaG, aaB] = aaColor;\n const [diffR, diffG, diffB] = diffColor;\n const [altR, altG, altB] = diffColorAlt || diffColor;\n let diff = 0;\n\n // compare each pixel of one image against the other one\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n\n const i = y * width + x;\n const pos = i * 4;\n\n // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker\n const delta = a32[i] === b32[i] ? 0 : colorDelta(img1, img2, pos, pos, false);\n\n // the color difference is above the threshold\n if (Math.abs(delta) > maxDelta) {\n // check it's a real rendering difference or just anti-aliasing\n const isAA = antialiased(img1, x, y, width, height, a32, b32) || antialiased(img2, x, y, width, height, b32, a32);\n if (!includeAA && isAA) {\n // one of the pixels is anti-aliasing; draw as yellow and do not count as difference\n // note that we do not include such pixels in a mask\n if (output && !diffMask) drawPixel(output, pos, aaR, aaG, aaB);\n\n } else {\n // found substantial difference not caused by anti-aliasing; draw it as such\n if (output) {\n if (delta < 0) {\n drawPixel(output, pos, altR, altG, altB);\n } else {\n drawPixel(output, pos, diffR, diffG, diffB);\n }\n }\n diff++;\n }\n\n } else if (output && !diffMask) {\n // pixels are similar; draw background as grayscale image blended with white\n drawGrayPixel(img1, pos, alpha, output);\n }\n }\n }\n\n // return the number of different pixels\n return diff;\n}\n\n/** @param {Uint8Array | Uint8ClampedArray} arr */\nfunction isPixelData(arr) {\n // work around instanceof Uint8Array not working properly in some Jest environments\n return ArrayBuffer.isView(arr) && arr.BYTES_PER_ELEMENT === 1;\n}\n\n/**\n * Check if a pixel is likely a part of anti-aliasing;\n * based on \"Anti-aliased Pixel and Intensity Slope Detector\" paper by V. Vysniauskas, 2009\n * @param {Uint8Array | Uint8ClampedArray} img\n * @param {number} x1\n * @param {number} y1\n * @param {number} width\n * @param {number} height\n * @param {Uint32Array} a32\n * @param {Uint32Array} b32\n */\nfunction antialiased(img, x1, y1, width, height, a32, b32) {\n const x0 = Math.max(x1 - 1, 0);\n const y0 = Math.max(y1 - 1, 0);\n const x2 = Math.min(x1 + 1, width - 1);\n const y2 = Math.min(y1 + 1, height - 1);\n const pos = y1 * width + x1;\n let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;\n let min = 0;\n let max = 0;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n\n // go through 8 adjacent pixels\n for (let x = x0; x <= x2; x++) {\n for (let y = y0; y <= y2; y++) {\n if (x === x1 && y === y1) continue;\n\n // brightness delta between the center pixel and adjacent one\n const delta = colorDelta(img, img, pos * 4, (y * width + x) * 4, true);\n\n // count the number of equal, darker and brighter adjacent pixels\n if (delta === 0) {\n zeroes++;\n // if found more than 2 equal siblings, it's definitely not anti-aliasing\n if (zeroes > 2) return false;\n\n // remember the darkest pixel\n } else if (delta < min) {\n min = delta;\n minX = x;\n minY = y;\n\n // remember the brightest pixel\n } else if (delta > max) {\n max = delta;\n maxX = x;\n maxY = y;\n }\n }\n }\n\n // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing\n if (min === 0 || max === 0) return false;\n\n // if either the darkest or the brightest pixel has 3+ equal siblings in both images\n // (definitely not anti-aliased), this pixel is anti-aliased\n return (hasManySiblings(a32, minX, minY, width, height) && hasManySiblings(b32, minX, minY, width, height)) ||\n (hasManySiblings(a32, maxX, maxY, width, height) && hasManySiblings(b32, maxX, maxY, width, height));\n}\n\n/**\n * Check if a pixel has 3+ adjacent pixels of the same color.\n * @param {Uint32Array} img\n * @param {number} x1\n * @param {number} y1\n * @param {number} width\n * @param {number} height\n */\nfunction hasManySiblings(img, x1, y1, width, height) {\n const x0 = Math.max(x1 - 1, 0);\n const y0 = Math.max(y1 - 1, 0);\n const x2 = Math.min(x1 + 1, width - 1);\n const y2 = Math.min(y1 + 1, height - 1);\n const val = img[y1 * width + x1];\n let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;\n\n // go through 8 adjacent pixels\n for (let x = x0; x <= x2; x++) {\n for (let y = y0; y <= y2; y++) {\n if (x === x1 && y === y1) continue;\n zeroes += +(val === img[y * width + x]);\n if (zeroes > 2) return true;\n }\n }\n return false;\n}\n\n/**\n * Calculate color difference according to the paper \"Measuring perceived color difference\n * using YIQ NTSC transmission color space in mobile applications\" by Y. Kotsarenko and F. Ramos\n * @param {Uint8Array | Uint8ClampedArray} img1\n * @param {Uint8Array | Uint8ClampedArray} img2\n * @param {number} k\n * @param {number} m\n * @param {boolean} yOnly\n */\nfunction colorDelta(img1, img2, k, m, yOnly) {\n const r1 = img1[k];\n const g1 = img1[k + 1];\n const b1 = img1[k + 2];\n const a1 = img1[k + 3];\n const r2 = img2[m];\n const g2 = img2[m + 1];\n const b2 = img2[m + 2];\n const a2 = img2[m + 3];\n\n let dr = r1 - r2;\n let dg = g1 - g2;\n let db = b1 - b2;\n const da = a1 - a2;\n\n if (!dr && !dg && !db && !da) return 0;\n\n if (a1 < 255 || a2 < 255) { // blend pixels with background\n const rb = 48 + 159 * (k % 2);\n const gb = 48 + 159 * ((k / 1.618033988749895 | 0) % 2);\n const bb = 48 + 159 * ((k / 2.618033988749895 | 0) % 2);\n dr = (r1 * a1 - r2 * a2 - rb * da) / 255;\n dg = (g1 * a1 - g2 * a2 - gb * da) / 255;\n db = (b1 * a1 - b2 * a2 - bb * da) / 255;\n }\n\n const y = dr * 0.29889531 + dg * 0.58662247 + db * 0.11448223;\n\n if (yOnly) return y; // brightness difference only\n\n const i = dr * 0.59597799 - dg * 0.27417610 - db * 0.32180189;\n const q = dr * 0.21147017 - dg * 0.52261711 + db * 0.31114694;\n\n const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;\n\n // encode whether the pixel lightens or darkens in the sign\n return y > 0 ? -delta : delta;\n}\n\n/**\n * @param {Uint8Array | Uint8ClampedArray} output\n * @param {number} pos\n * @param {number} r\n * @param {number} g\n * @param {number} b\n */\nfunction drawPixel(output, pos, r, g, b) {\n output[pos + 0] = r;\n output[pos + 1] = g;\n output[pos + 2] = b;\n output[pos + 3] = 255;\n}\n\n/**\n * @param {Uint8Array | Uint8ClampedArray} img\n * @param {number} i\n * @param {number} alpha\n * @param {Uint8Array | Uint8ClampedArray} output\n */\nfunction drawGrayPixel(img, i, alpha, output) {\n const val = 255 + (img[i] * 0.29889531 + img[i + 1] * 0.58662247 + img[i + 2] * 0.11448223 - 255) * alpha * img[i + 3] / 255;\n drawPixel(output, i, val, val, val);\n}\n","// Note: pixelmatch seems to be pure ESM so mark it as noExternal in tsup config\nimport * as jpeg from \"jpeg-js\";\nimport pixelmatch from \"pixelmatch\";\nimport { PNG } from \"pngjs\";\n\nconst isPng = (buffer: Buffer): boolean => {\n return (\n buffer.length >= 8 &&\n buffer[0] === 0x89 &&\n buffer[1] === 0x50 &&\n buffer[2] === 0x4e &&\n buffer[3] === 0x47 &&\n buffer[4] === 0x0d &&\n buffer[5] === 0x0a &&\n buffer[6] === 0x1a &&\n buffer[7] === 0x0a\n );\n};\n\nconst isJpeg = (buffer: Buffer): boolean => {\n return buffer.length >= 2 && buffer[0] === 0xff && buffer[1] === 0xd8;\n};\n\nconst decodeImage = (\n buffer: Buffer,\n): { data: Uint8Array; width: number; height: number } => {\n if (isPng(buffer)) {\n const png = PNG.sync.read(buffer);\n return { data: png.data, height: png.height, width: png.width };\n }\n if (isJpeg(buffer)) {\n const img = jpeg.decode(buffer, { maxMemoryUsageInMB: 1024 });\n return { data: img.data, height: img.height, width: img.width };\n }\n // Default to PNG decode; if it fails upstream, treat as different sizes\n const png = PNG.sync.read(buffer);\n return { data: png.data, height: png.height, width: png.width };\n};\n\nexport const imagesAreSimilar = ({\n image1,\n image2,\n threshold,\n}: {\n image1: Buffer;\n image2: Buffer;\n threshold: number;\n}): boolean => {\n const decodedImage1 = decodeImage(image1);\n const decodedImage2 = decodeImage(image2);\n if (\n decodedImage1.width !== decodedImage2.width ||\n decodedImage1.height !== decodedImage2.height\n ) {\n return false;\n }\n const diffRgbaData = new Uint8Array(\n decodedImage1.width * decodedImage1.height * 4,\n );\n const numDiffPixels = pixelmatch(\n decodedImage1.data,\n decodedImage2.data,\n diffRgbaData,\n decodedImage1.width,\n decodedImage1.height,\n { threshold },\n );\n\n return numDiffPixels === 0;\n};\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport type { ScreenshotPromptOptions } from \"./index\";\n\nimport { imagesAreSimilar } from \"./image-compare\";\nimport { isPage } from \"./playwright-type-predicates\";\n\nexport async function takeStableScreenshot(\n target: Page | Locator,\n options?: ScreenshotPromptOptions,\n): Promise<Buffer> {\n const page = isPage(target) ? target : target.page();\n\n // Use a small budget for stabilization within the overall assertion timeout.\n // We allocate up to 25% of the total timeout (bounded between 300ms and 2000ms).\n const totalTimeout =\n (options as { timeout?: number } | undefined)?.timeout ?? 5000;\n // Budget is 25% of the total timeout\n const stabilizationBudgetMs = Math.floor(totalTimeout * 0.25);\n const stabilityBudgetMs = Math.min(\n 2000,\n Math.max(300, stabilizationBudgetMs),\n );\n const deadline = Date.now() + stabilityBudgetMs;\n\n let actual: Buffer | undefined;\n let previous: Buffer | undefined;\n const pollIntervals = [0, 100, 250, 500];\n let isFirstIteration = true;\n\n // Retry screenshot up to 3 times\n // Otherwise sometimes the screenshot following a redirect may fail\n const safeScreenshot = async (): Promise<Buffer> => {\n for (let i = 0; i < 3; i++) {\n try {\n return await target.screenshot(options);\n } catch {\n await page.waitForTimeout(250);\n continue;\n }\n }\n return await target.screenshot(options);\n };\n\n while (true) {\n if (Date.now() >= deadline) {\n break;\n }\n const delay = pollIntervals.length ? pollIntervals.shift()! : 1000;\n if (delay) {\n await page.waitForTimeout(delay);\n }\n previous = actual;\n actual = await safeScreenshot();\n if (\n !isFirstIteration &&\n actual &&\n previous &&\n imagesAreSimilar({\n image1: previous,\n image2: actual,\n threshold: options?.threshold ?? 0.02,\n })\n ) {\n return actual;\n }\n isFirstIteration = false;\n }\n return actual ?? (await safeScreenshot());\n}\n","import type { Locator, MatcherReturnType, Page } from \"@playwright/test\";\nimport { test } from \"@playwright/test\";\n\nimport type { ScreenshotPromptOptions } from \"./index\";\n\nimport { verifyPrompt } from \"./ai/verify-prompt\";\nimport { isLocator, isPage } from \"./playwright-type-predicates\";\nimport { takeStableScreenshot } from \"./screenshot\";\n\ntype VerifyTargetType = \"page\" | \"locator\";\n\ntype MatcherContext = {\n isNot: boolean;\n message?: () => string;\n};\n\nconst MAX_ATTACHMENT_NAME_LENGTH = 80;\n\nfunction createFailureMessage({\n condition,\n didPass,\n isNot,\n reason,\n targetType,\n}: {\n targetType: VerifyTargetType;\n condition: string;\n didPass: boolean;\n isNot: boolean;\n reason?: string;\n}): string {\n const expectation = isNot ? \"not to satisfy\" : \"to satisfy\";\n const result = didPass ? \"it did\" : \"it did not\";\n\n let message = `Expected ${targetType} ${expectation} ${JSON.stringify(condition)}, but ${result}.`;\n if (reason) {\n message += `\\n\\nReason: ${reason}`;\n }\n\n return message;\n}\n\nexport const stablyPlaywrightMatchers = {\n /**\n * Asserts that the page or locator satisfies a natural language condition using AI vision.\n *\n * Takes a screenshot of the target and uses AI to verify whether the specified condition is met.\n * The AI analyzes the visual content and provides reasoning for its determination.\n *\n * @param condition - A natural language description of what should be true about the page/locator\n * @param options - Optional screenshot options (e.g., fullPage, timeout)\n *\n * @example\n * ```typescript\n * // Assert page content\n * await expect(page).aiAssert('The login form is visible with email and password fields');\n *\n * // Assert locator content\n * await expect(page.locator('.header')).aiAssert('The navigation menu contains a logout button');\n * ```\n */\n async aiAssert(\n this: MatcherContext,\n received: Page | Locator,\n condition: string,\n options?: ScreenshotPromptOptions,\n ): Promise<MatcherReturnType> {\n const target = isPage(received)\n ? received\n : isLocator(received)\n ? received\n : undefined;\n if (!target) {\n // Should never happen\n throw new Error(\n \"aiAssert only supports Playwright Page and Locator instances.\",\n );\n }\n const targetType: VerifyTargetType = isPage(target) ? \"page\" : \"locator\";\n\n // Wait for two consecutive identical screenshots before sending to AI\n const screenshot = await takeStableScreenshot(target, options);\n\n const verifyResult = await verifyPrompt({\n model: options?.model,\n pageMetadata: isPage(target)\n ? { title: await target.title(), url: target.url() }\n : undefined,\n prompt: condition,\n screenshot,\n });\n\n const testInfo = test.info();\n const sanitizedName =\n condition\n .trim()\n .toLowerCase()\n .replace(/[^\\w]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, MAX_ATTACHMENT_NAME_LENGTH) || \"aiAssert\";\n\n testInfo.attachments.push(\n {\n body: Buffer.from(\n JSON.stringify(\n {\n pass: verifyResult.pass,\n prompt: condition,\n reasoning: verifyResult.reason,\n },\n null,\n 2,\n ),\n \"utf-8\",\n ),\n contentType: \"application/json\",\n name: `${sanitizedName}-reasoning`,\n },\n {\n body: screenshot,\n // Use binary type to avoid inline previews in the report\n // Ensures the screenshot is paired with the reasoning attachment instead of being rendered in a separate section.\n contentType: \"application/octet-stream\",\n name: `${sanitizedName}-screenshot.png`,\n },\n );\n\n return {\n message: () =>\n createFailureMessage({\n condition,\n didPass: verifyResult.pass,\n isNot: this.isNot,\n reason: verifyResult.reason,\n targetType,\n }),\n name: \"aiAssert\",\n pass: verifyResult.pass,\n };\n },\n\n /**\n * @deprecated Use `aiAssert` instead. This method will be removed in a future version.\n */\n async toMatchScreenshotPrompt(\n this: MatcherContext,\n received: Page | Locator,\n condition: string,\n options?: ScreenshotPromptOptions,\n ): Promise<MatcherReturnType> {\n return stablyPlaywrightMatchers.aiAssert.call(\n this,\n received,\n condition,\n options,\n );\n },\n} as const;\n","export const truncate = (inp: string, length: number): string =>\n inp.length <= length || inp.length <= 3\n ? inp\n : `${inp.slice(0, length - 3)}...`;\n","import type { Page } from \"@playwright/test\";\nimport type { Model } from \"./models\";\n\nexport function constructAgentPayload({\n activePage,\n additionalContext,\n isError,\n message,\n model,\n screenshot,\n sessionId,\n tabManager,\n}: {\n sessionId: string;\n model?: Model;\n message: string;\n isError?: boolean;\n screenshot: Buffer;\n tabManager: Map<Page, string>;\n activePage: Page;\n additionalContext?: Record<string, unknown>;\n}): FormData {\n const form = new FormData();\n const viewportSize = activePage.viewportSize();\n\n const tabs = Array.from(tabManager.entries()).map(([page, alias]) => ({\n alias,\n url: page.url(),\n }));\n\n const activePageAlias = tabManager.get(activePage);\n\n const metadata: Record<string, unknown> = {\n allPages: tabs,\n message,\n sessionId,\n };\n\n if (model) {\n metadata.model = model;\n }\n if (isError) {\n metadata.isError = isError;\n }\n if (additionalContext) {\n metadata.additionalContext = additionalContext;\n }\n if (viewportSize) {\n metadata.pageDimensions = viewportSize;\n }\n if (activePageAlias) {\n metadata.activePageAlias = activePageAlias;\n }\n\n const metadataBlob = new Blob([JSON.stringify(metadata)], {\n type: \"application/json\",\n });\n form.append(\"metadata\", metadataBlob, \"metadata.json\");\n\n const screenshotBytes = Uint8Array.from(screenshot);\n const screenshotBlob = new Blob([screenshotBytes], { type: \"image/png\" });\n form.append(\"screenshot\", screenshotBlob, \"screenshot.png\");\n\n return form;\n}\n","import type { Page } from \"@playwright/test\";\n\ntype ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\";\n\n/**\n * Attempts to scroll by finding the scrollable ancestor of the element at the given position.\n * Falls back to mouse.wheel() if no scrollable container is found.\n */\nexport async function scrollAtPosition({\n amount,\n direction,\n page,\n x,\n y,\n}: {\n amount: number;\n direction: ScrollDirection;\n page: Page;\n x: number;\n y: number;\n}): Promise<void> {\n const deltaX =\n direction === \"left\" ? -amount : direction === \"right\" ? amount : 0;\n const deltaY =\n direction === \"up\" ? -amount : direction === \"down\" ? amount : 0;\n // First try to scroll the element at the position directly (for scrollable containers)\n // Uses findAndScrollAncestor pattern - walks up DOM to find scrollable container\n const scrolled = await page.evaluate(\n ({ posX, posY, scrollDeltaX, scrollDeltaY }) => {\n const element = document.elementFromPoint(posX, posY);\n if (!element) {\n return false;\n }\n\n // Walk up the DOM tree to find a scrollable container\n let scrollableEl: Element | null = element;\n while (scrollableEl && scrollableEl !== document.documentElement) {\n const { overflowX, overflowY } = window.getComputedStyle(scrollableEl);\n const isScrollableX =\n scrollableEl.scrollWidth > scrollableEl.clientWidth &&\n (overflowX === \"auto\" || overflowX === \"scroll\");\n const isScrollableY =\n scrollableEl.scrollHeight > scrollableEl.clientHeight &&\n (overflowY === \"auto\" || overflowY === \"scroll\");\n if (isScrollableX || isScrollableY) {\n scrollableEl.scrollBy(scrollDeltaX, scrollDeltaY);\n return true;\n }\n scrollableEl = scrollableEl.parentElement;\n }\n return false;\n },\n { posX: x, posY: y, scrollDeltaX: deltaX, scrollDeltaY: deltaY },\n );\n\n if (!scrolled) {\n // Fall back to mouse.wheel() for page-level scrolling\n // Note: mouse.wheel() dispatches a wheel event at the mouse position, but the browser\n // decides how to handle it. It may not scroll if the element under the cursor isn't\n // scrollable, or may scroll a different container than expected.\n await page.mouse.move(x, y);\n await page.mouse.wheel(deltaX, deltaY);\n }\n}\n","import type { BrowserContext, Page } from \"@playwright/test\";\n\nimport { takeStableScreenshot } from \"../../../screenshot\";\nimport { scrollAtPosition } from \"./scroll-helper\";\nimport type { AgentResponse } from \"./tool-responses\";\n\nexport type AgentActionResult = {\n message: string;\n isError?: boolean;\n shouldTerminate?: boolean;\n};\n\ntype PageWithSnapshot = Page & {\n _snapshotForAI: () => string;\n};\n\nconst DEFAULT_AGENT_WAIT_MS = 3000;\n\nexport async function execResponse({\n activePage: initialActivePage,\n agentResponse,\n browserContext,\n tabManager,\n}: {\n activePage: Page;\n agentResponse: AgentResponse;\n browserContext: BrowserContext;\n tabManager: Map<Page, string>;\n}): Promise<{\n activePage: Page;\n finalSuccess?: boolean;\n failureReason?: string;\n result: AgentActionResult;\n}> {\n let activePage = initialActivePage;\n try {\n switch (agentResponse.action) {\n case \"key\": {\n const { text } = agentResponse;\n if (text) {\n await activePage.keyboard.press(text);\n return { activePage, result: { message: `pressed \"${text}\"` } };\n }\n return { activePage, result: { message: \"pressed key\" } };\n }\n case \"type\": {\n const { text } = agentResponse;\n await activePage.keyboard.type(text);\n return { activePage, result: { message: `typed \"${text}\"` } };\n }\n case \"mouse_move\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.move(x, y);\n return { activePage, result: { message: `mouse moved completed` } };\n }\n case \"left_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.click(x, y);\n return { activePage, result: { message: `left click completed` } };\n }\n case \"right_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.click(x, y, { button: \"right\" });\n return { activePage, result: { message: `right click completed` } };\n }\n case \"double_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.dblclick(x, y);\n return { activePage, result: { message: `double click completed` } };\n }\n case \"triple_click\": {\n const [x, y] = agentResponse.coordinate;\n await activePage.mouse.click(x, y, { clickCount: 3 });\n return { activePage, result: { message: `triple click completed` } };\n }\n case \"left_click_drag\": {\n const [startX, startY] = agentResponse.start_coordinate;\n const [endX, endY] = agentResponse.coordinate;\n await activePage.mouse.move(startX, startY);\n await activePage.mouse.down();\n await activePage.mouse.move(endX, endY);\n await activePage.mouse.up();\n return { activePage, result: { message: `drag completed` } };\n }\n case \"screenshot\": {\n await takeStableScreenshot(activePage);\n return { activePage, result: { message: \"captured screenshot\" } };\n }\n case \"wait\": {\n const waitMs = agentResponse.milliseconds ?? DEFAULT_AGENT_WAIT_MS;\n await activePage.waitForTimeout(waitMs);\n return { activePage, result: { message: `waited ${waitMs}ms` } };\n }\n case \"navigate_to_url\": {\n await activePage.goto(agentResponse.url);\n return {\n activePage,\n result: { message: `navigated to \"${agentResponse.url}\"` },\n };\n }\n case \"new_tab_url\": {\n const newPage = await browserContext.newPage();\n await newPage.goto(agentResponse.url);\n await newPage.waitForLoadState(\"domcontentloaded\");\n activePage = newPage;\n return { activePage, result: { message: \"opened new tab\" } };\n }\n case \"switch_tab\": {\n const entry = Array.from(tabManager.entries()).find(\n ([, alias]) => alias === agentResponse.tab_alias,\n );\n const page = entry?.[0];\n if (!page) {\n throw new Error(\n `Tab with alias ${agentResponse.tab_alias} not found`,\n );\n }\n await page.bringToFront();\n activePage = page;\n return {\n activePage,\n result: { message: `switched to \"${agentResponse.tab_alias}\"` },\n };\n }\n case \"scroll\": {\n const [x, y] = agentResponse.coordinate;\n await scrollAtPosition({\n amount: agentResponse.scroll_amount,\n direction: agentResponse.scroll_direction,\n page: activePage,\n x,\n y,\n });\n\n return {\n activePage,\n result: { message: `scrolled ${agentResponse.scroll_direction}` },\n };\n }\n case \"navigate_back\": {\n const res = await activePage.goBack();\n if (!res) {\n throw new Error(\"navigate_back failed: no history entry\");\n }\n return { activePage, result: { message: \"navigated back\" } };\n }\n case \"aria_snapshot\": {\n const ariaSnapshot = await (\n activePage as PageWithSnapshot\n )._snapshotForAI();\n return {\n activePage,\n result: { message: `ARIA Snapshot:\\n${ariaSnapshot}` },\n };\n }\n case \"terminate_test\": {\n const { reason, success } = agentResponse;\n return {\n activePage,\n failureReason: success ? undefined : reason,\n finalSuccess: success,\n result: { message: reason, shouldTerminate: true },\n };\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { activePage, result: { isError: true, message } };\n }\n}\n","import type { BrowserContext, Page } from \"@playwright/test\";\n\nimport { test } from \"@playwright/test\";\nimport pRetry from \"p-retry\";\n\nimport type { AgentResponse } from \"./agent/tool-responses\";\n\nimport { SDK_METADATA_HEADERS } from \"../../ai/metadata\";\nimport { requireApiKey } from \"../../runtime\";\nimport { takeStableScreenshot } from \"../../screenshot\";\nimport { truncate } from \"../../utils/truncate\";\nimport { constructAgentPayload } from \"./agent/construct-payload\";\nimport type { AgentActionResult } from \"./agent/exec-response\";\nimport { execResponse } from \"./agent/exec-response\";\nimport type { Model } from \"./agent/models\";\n\n/**\n * Options for configuring agent behavior during execution.\n */\ntype AgentActOptions = {\n /**\n * The page the agent will operate on.\n */\n page: Page;\n /**\n * Maximum number of thinking cycles the agent can perform.\n * Each cycle includes observing the page, planning, and executing one or more actions.\n * @default 30\n */\n maxCycles?: number;\n /**\n * AI model to use for agent reasoning.\n * Different models may have different capabilities and performance characteristics.\n */\n model?: Model;\n};\n\nconst AGENT_PATH = \"internal/v3/agent\";\n\nconst STABLY_API_URL = process.env.STABLY_API_URL || \"https://api.stably.ai\";\nconst AGENT_ENDPOINT = new URL(AGENT_PATH, STABLY_API_URL).toString();\n\n/**\n * AI agent for automating browser interactions using natural language.\n *\n * The Agent can perform complex browser actions by interpreting natural language instructions.\n * It observes the page state, makes decisions, and executes actions autonomously.\n *\n * Agents are created via {@link BrowserContext.newAgent} or {@link Browser.newAgent}.\n *\n * @example\n * ```typescript\n * const agent = context.newAgent();\n * await agent.act('Fill out the login form and submit', { page });\n * ```\n */\nexport class Agent {\n constructor(readonly browserContext: BrowserContext) {}\n\n /**\n * Instructs the agent to perform actions on the page using natural language.\n *\n * The agent will analyze the page, plan actions, and execute them autonomously.\n * It can perform multiple actions such as clicking, typing, navigating, and verifying\n * page state based on the provided instruction.\n *\n * @param prompt - Natural language instruction describing what the agent should do\n * @param options - Configuration for the agent's behavior including the page to operate on\n * @returns Promise that resolves when the agent successfully completes the task\n * @throws {Error} Throws an error if the agent fails to complete the task. The error message includes the AI's reasoning for the failure.\n *\n * @example\n * ```typescript\n * // Simple action\n * await agent.act('Click the login button', { page });\n *\n * // Complex multi-step action\n * await agent.act('Navigate to settings, enable notifications, and save changes', { page });\n *\n * // With custom options\n * await agent.act('Complete the checkout process', {\n * page,\n * maxCycles: 20,\n * model: 'gpt-4'\n * });\n *\n * // Handling failures with try-catch\n * try {\n * await agent.act('Complete the task', { page });\n * console.log('Agent completed the task successfully');\n * } catch (error) {\n * console.error('Agent failed:', error.message);\n * }\n * ```\n */\n async act(prompt: string, options: AgentActOptions): Promise<void> {\n const apiKey = requireApiKey();\n\n const maxCycles = options.maxCycles ?? 30;\n\n const tabManager = new Map<Page, string>();\n this.browserContext.pages().forEach((page, index) => {\n tabManager.set(page, `page${index + 1}`);\n });\n\n let activePage = options.page;\n let agentMessage: AgentActionResult = {\n isError: false,\n message: prompt,\n shouldTerminate: false,\n };\n let finalSuccess: boolean | undefined;\n let failureReason: string | undefined;\n let newPageOpenedMsg: string | undefined;\n\n const sessionId = crypto.randomUUID();\n\n const onNewPage = async (page: Page) => {\n await page.waitForLoadState(\"domcontentloaded\");\n if (!tabManager.has(page)) {\n const alias = `page${tabManager.size + 1}`;\n tabManager.set(page, alias);\n }\n await page.bringToFront();\n activePage = page;\n\n const alias = tabManager.get(page)!;\n newPageOpenedMsg = `opened new tab ${alias} (${page.url()})`;\n };\n\n this.browserContext.on(\"page\", onNewPage);\n\n return await test.step(`[Agent] ${prompt}`, async () => {\n try {\n for (let i = 0; i < maxCycles; i++) {\n if (agentMessage.shouldTerminate) {\n break;\n }\n\n const agentResponses =\n await test.step(`[Thinking ${i + 1}]`, async (stepInfo) => {\n const screenshot = await takeStableScreenshot(activePage);\n\n const response = await pRetry(\n () =>\n fetch(AGENT_ENDPOINT, {\n body: constructAgentPayload({\n activePage,\n additionalContext: newPageOpenedMsg\n ? { newPageMessage: newPageOpenedMsg }\n : undefined,\n isError: agentMessage.isError,\n message: agentMessage.message,\n model: options.model,\n screenshot,\n sessionId,\n tabManager,\n }),\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n },\n method: \"POST\",\n }),\n {\n // Exponential backoff with jitter: ~2-4s, ~4-8s, ~8-16s\n minTimeout: 2000,\n randomize: true,\n retries: 3,\n },\n );\n\n // Clear any new page opened context after each agent call\n newPageOpenedMsg = undefined;\n const responseJson = (await response.json()) as AgentResponse[];\n\n if (!response.ok) {\n throw new Error(\n `Agent call failed: ${JSON.stringify(responseJson)}`,\n );\n }\n\n // Extract and collect reasoning content from the responses\n const reasoningTexts = responseJson\n .map((r) => r.content?.trim())\n .filter((content) => content !== undefined);\n\n const reasoningText = reasoningTexts.join(\"\\n\\n\");\n\n // Only attach if there's actual reasoning content\n if (reasoningText) {\n const truncatedReasoningText = truncate(reasoningText, 120);\n\n await stepInfo.attach(\n `[Thinking ${i + 1}] ${truncatedReasoningText}`,\n {\n body: reasoningText,\n contentType: \"text/plain\",\n },\n );\n }\n\n return responseJson;\n });\n\n let combinedMessages: string[] = [];\n let aggregatedIsError = false;\n let aggregatedShouldTerminate = false;\n\n for (const agentResponse of agentResponses) {\n const {\n activePage: newActivePage,\n failureReason: maybeFailureReason,\n finalSuccess: maybeFinal,\n result,\n } = await execResponse({\n activePage,\n agentResponse,\n browserContext: this.browserContext,\n tabManager,\n });\n activePage = newActivePage;\n combinedMessages.push(result.message);\n finalSuccess = maybeFinal ?? finalSuccess;\n failureReason = maybeFailureReason ?? failureReason;\n if (result.isError) {\n aggregatedIsError = true;\n }\n if (result.shouldTerminate) {\n aggregatedShouldTerminate = true;\n break;\n }\n }\n\n agentMessage = {\n isError: aggregatedIsError,\n message: combinedMessages.join(\"\\n\"),\n shouldTerminate: aggregatedShouldTerminate,\n };\n }\n } finally {\n this.browserContext.off(\"page\", onNewPage);\n }\n\n const success = finalSuccess ?? false;\n if (!success) {\n throw new Error(failureReason ?? \"Agent failed to complete the task\");\n }\n });\n }\n}\n\nexport const createNewAgent = (browserContext: BrowserContext): Agent =>\n new Agent(browserContext);\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport { test } from \"@playwright/test\";\nimport type * as z4 from \"zod/v4/core\";\n\nimport { requireApiKey } from \"../runtime\";\nimport { isObject } from \"../type-predicate/is-object\";\nimport { SDK_METADATA_HEADERS } from \"./metadata\";\nimport type { AIModel } from \"./models\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype ZodV4 = typeof import(\"zod/v4/core\");\n\nexport type ExtractSchema = {\n safeParseAsync(\n data: unknown,\n params?: z4.ParseContext<z4.$ZodIssue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<z4.util.SafeParseResult<z4.output<any>>>;\n} & z4.$ZodType;\n\nexport type SchemaOutput<T extends ExtractSchema> = z4.output<T>;\n\ntype ExtractIssue = z4.$ZodIssue;\n\nconst EXTRACT_PATH = \"internal/v2/extract\";\nconst STABLY_API_URL = process.env.STABLY_API_URL || \"https://api.stably.ai\";\nconst EXTRACT_ENDPOINT = new URL(EXTRACT_PATH, STABLY_API_URL).toString();\n\nconst zodV4: ZodV4 | undefined = (() => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n return require(\"zod/v4/core\") as ZodV4;\n } catch {\n return undefined;\n }\n})();\n\ntype ExtractionSuccess = { success: true; value: unknown };\ntype ExtractionFailure = { success: false; error: string };\ntype ExtractionResponse = ExtractionSuccess | ExtractionFailure;\n\ntype ErrorResponse = { error: string };\n\nconst isExtractionResponse = (value: unknown): value is ExtractionResponse => {\n if (!isObject(value)) {\n return false;\n }\n\n if (value.success === true) {\n return \"value\" in value;\n }\n\n return value.success === false && typeof value.error === \"string\";\n};\n\nconst isErrorResponse = (value: unknown): value is ErrorResponse => {\n return isObject(value) && typeof value.error === \"string\";\n};\n\nclass ExtractValidationError extends Error {\n constructor(\n message: string,\n readonly issues: readonly ExtractIssue[],\n ) {\n super(message);\n this.name = \"ExtractValidationError\";\n }\n}\n\nasync function validateWithSchema<T extends ExtractSchema>(\n schema: T,\n value: unknown,\n): Promise<SchemaOutput<T>> {\n const result = await schema.safeParseAsync(value);\n if (!result.success) {\n throw new ExtractValidationError(\n \"AI is unable to return the data in the desired format\",\n result.error.issues,\n );\n }\n\n return result.data;\n}\n\ntype BaseExtractArgs = {\n prompt: string;\n pageOrLocator: Page | Locator;\n model?: AIModel;\n};\n\ntype ExtractArgsWithSchema<T extends ExtractSchema> = BaseExtractArgs & {\n schema: T;\n};\n\nexport async function extract(args: BaseExtractArgs): Promise<string>;\nexport async function extract<T extends ExtractSchema>(\n args: ExtractArgsWithSchema<T>,\n): Promise<SchemaOutput<T>>;\nexport async function extract<T extends ExtractSchema>({\n model,\n pageOrLocator,\n prompt,\n schema,\n}: BaseExtractArgs & { schema?: T }): Promise<string | SchemaOutput<T>> {\n if (schema && !zodV4) {\n throw new Error(\n \"Schema support requires installing zod@4. Please add it to enable schemas.\",\n );\n }\n\n const jsonSchema =\n schema && zodV4\n ? zodV4?.toJSONSchema(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion\n schema as unknown as Parameters<ZodV4[\"toJSONSchema\"]>[0],\n )\n : undefined;\n\n return await test.step(`[Extract] ${prompt}`, async (stepInfo) => {\n const apiKey = requireApiKey();\n\n const form = new FormData();\n form.append(\"prompt\", prompt);\n if (jsonSchema) {\n form.append(\"jsonSchema\", JSON.stringify(jsonSchema));\n }\n if (model) {\n form.append(\"model\", model);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pngBuffer = await (pageOrLocator as any).screenshot({ type: \"png\" }); // Buffer\n const u8 = Uint8Array.from(pngBuffer); // strips Buffer type → plain Uint8Array\n const blob = new Blob([u8], { type: \"image/png\" });\n form.append(\"image\", blob, \"screenshot.png\");\n\n const response = await fetch(EXTRACT_ENDPOINT, {\n body: form,\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n },\n method: \"POST\",\n });\n\n const raw = await response.json().catch(() => undefined as unknown);\n\n if (response.ok) {\n if (!isExtractionResponse(raw)) {\n throw new Error(\"Extract returned unexpected response shape\");\n }\n\n if (!raw.success) {\n await stepInfo.attach(\"[Extract] error\", {\n body: raw.error,\n contentType: \"text/plain\",\n });\n throw new Error(`Extract failed: ${raw.error}`);\n }\n\n const { value } = raw;\n const body =\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n await stepInfo.attach(\"[Extract] result\", {\n body,\n contentType: \"text/plain\",\n });\n\n return schema\n ? await validateWithSchema(schema, value)\n : typeof value === \"string\"\n ? value\n : JSON.stringify(value);\n }\n\n throw new Error(isErrorResponse(raw) ? raw.error : \"Extract failed\");\n });\n}\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport {\n type ExtractSchema,\n type SchemaOutput,\n extract,\n} from \"../../ai/extract\";\nimport type { AIModel } from \"../../ai/models\";\n\ntype ExtractOptions<T extends ExtractSchema> = {\n schema?: T;\n model?: AIModel;\n};\n\ntype ExtractMethod = {\n (prompt: string): Promise<string>;\n (prompt: string, options: { model?: AIModel }): Promise<string>;\n <T extends ExtractSchema>(\n prompt: string,\n options: ExtractOptions<T> & { schema: T },\n ): Promise<SchemaOutput<T>>;\n};\n\ntype LocatorExtract = ExtractMethod;\ntype PageExtract = ExtractMethod;\n\ntype ExtractSubject = Locator | Page;\n\nfunction createExtract(pageOrLocator: ExtractSubject): ExtractMethod {\n const impl = (async (\n prompt: string,\n options?: ExtractOptions<ExtractSchema>,\n ) => {\n if (options?.schema) {\n return extract({\n model: options.model,\n pageOrLocator,\n prompt,\n schema: options.schema,\n });\n }\n\n return extract({ model: options?.model, pageOrLocator, prompt });\n }) as ExtractMethod;\n\n return impl;\n}\n\nexport const createLocatorExtract = (locator: Locator): LocatorExtract =>\n createExtract(locator);\n\nexport const createPageExtract = (page: Page): PageExtract =>\n createExtract(page);\n","import type { Locator, Page } from \"@playwright/test\";\n\nimport { test } from \"@playwright/test\";\n\nimport { requireApiKey } from \"../runtime\";\nimport { isObject } from \"../type-predicate/is-object\";\nimport { SDK_METADATA_HEADERS } from \"./metadata\";\nimport type { AIModel } from \"./models\";\n\nconst GET_LOCATOR_PATH = \"internal/v3/get-aria-refs\";\n\n/** Selector that matches no elements, used when AI returns empty refs */\nconst EMPTY_LOCATOR_SELECTOR = \"__stably_empty_locator__\";\n\nfunction getEndpoint(): string {\n const baseUrl = process.env.STABLY_API_URL || \"https://api.stably.ai\";\n return new URL(GET_LOCATOR_PATH, baseUrl).toString();\n}\n\nexport type GetLocatorsByAIResult = {\n locator: Locator;\n count: number;\n reason: string;\n};\n\nexport type GetLocatorsByAIOptions = {\n /**\n * AI model to use for element location.\n */\n model?: AIModel;\n};\n\ntype APIResponse = {\n refs: string[];\n reason: string;\n};\n\ntype ErrorResponse = { error: string };\n\nconst isAPIResponse = (value: unknown): value is APIResponse => {\n if (!isObject(value)) {\n return false;\n }\n\n return (\n Array.isArray(value.refs) &&\n value.refs.every((ref) => typeof ref === \"string\") &&\n typeof value.reason === \"string\"\n );\n};\n\nconst isErrorResponse = (value: unknown): value is ErrorResponse => {\n return isObject(value) && typeof value.error === \"string\";\n};\n\n/**\n * Uses AI to find elements matching a natural language prompt.\n *\n * Analyzes the page's aria snapshot and returns Playwright Locators\n * for elements matching the description.\n *\n * @param page - The Playwright Page to search within\n * @param prompt - Natural language description of elements to find\n * @param options - Optional configuration including model selection\n * @returns Object containing locator, count of matches, and AI reason\n * @throws Error if API call fails or Playwright version is below v1.54.1\n */\nexport async function getLocatorsByAI(\n page: Page,\n prompt: string,\n options?: GetLocatorsByAIOptions,\n): Promise<GetLocatorsByAIResult> {\n return await test.step(`[GetLocatorByAI] ${prompt}`, async (stepInfo) => {\n const apiKey = requireApiKey();\n\n // 1. Get aria snapshot with refs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pageWithSnapshot = page as any;\n if (typeof pageWithSnapshot._snapshotForAI !== \"function\") {\n throw new Error(\n \"getLocatorsByAI requires Playwright v1.54.1 or higher. \" +\n \"Please upgrade your Playwright version.\",\n );\n }\n const snapshotResult = await pageWithSnapshot._snapshotForAI();\n // Handle both old (string) and new (object with `full` property) return types\n const ariaSnapshot =\n typeof snapshotResult === \"string\" ? snapshotResult : snapshotResult.full;\n\n // 2. Call API\n const response = await (async () => {\n try {\n return await fetch(getEndpoint(), {\n body: JSON.stringify({\n ariaSnapshot,\n prompt,\n ...(options?.model && { model: options.model }),\n }),\n headers: {\n ...SDK_METADATA_HEADERS,\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n } catch (error) {\n throw new Error(\n `getLocatorsByAI failed to connect to Stably API: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n })();\n\n const raw = await response.json().catch(() => undefined as unknown);\n\n if (!response.ok) {\n const err = isErrorResponse(raw) ? raw.error : \"Unknown error\";\n throw new Error(`getLocatorsByAI failed (${response.status}): ${err}`);\n }\n\n if (!isAPIResponse(raw)) {\n throw new Error(\"getLocatorsByAI returned unexpected response shape\");\n }\n\n // 3. Attach reason to test report\n await stepInfo.attach(\"[GetLocatorByAI] reason\", {\n body: raw.reason,\n contentType: \"text/plain\",\n });\n\n // 4. Build locator from refs\n const locator: Locator =\n raw.refs.length === 0\n ? // Empty locator that matches nothing\n page.locator(EMPTY_LOCATOR_SELECTOR)\n : // Combine refs using .or()\n raw.refs\n .map((ref) => page.locator(`aria-ref=${ref}`))\n .reduce((acc, loc) => acc.or(loc));\n\n return {\n count: raw.refs.length,\n locator,\n reason: raw.reason,\n };\n });\n}\n","import type { Page } from \"@playwright/test\";\n\nimport {\n type GetLocatorsByAIOptions,\n type GetLocatorsByAIResult,\n getLocatorsByAI,\n} from \"../../ai/get-locators-by-ai\";\n\ntype GetLocatorByAIMethod = (\n prompt: string,\n options?: GetLocatorsByAIOptions,\n) => Promise<GetLocatorsByAIResult>;\n\nexport const createPageGetLocatorByAI = (page: Page): GetLocatorByAIMethod => {\n return (prompt: string, options?: GetLocatorsByAIOptions) =>\n getLocatorsByAI(page, prompt, options);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-type-assertion */\nimport type {\n Browser,\n BrowserContext,\n BrowserType,\n Locator,\n Page,\n} from \"@playwright/test\";\n\nimport { createNewAgent } from \"./methods/agent\";\nimport { createLocatorExtract, createPageExtract } from \"./methods/extract\";\nimport { createPageGetLocatorByAI } from \"./methods/get-locators-by-ai\";\n\nconst LOCATOR_PATCHED = Symbol.for(\"stably.playwright.locatorPatched\");\nconst PAGE_PATCHED = Symbol.for(\"stably.playwright.pagePatched\");\nconst CONTEXT_PATCHED = Symbol.for(\"stably.playwright.contextPatched\");\nconst BROWSER_PATCHED = Symbol.for(\"stably.playwright.browserPatched\");\nconst BROWSER_TYPE_PATCHED = Symbol.for(\"stably.playwright.browserTypePatched\");\n\nfunction defineHiddenProperty<T, K extends PropertyKey>(\n target: T,\n key: K,\n value: unknown,\n): void {\n Object.defineProperty(target as unknown as object, key, {\n configurable: true,\n enumerable: false,\n value,\n writable: true,\n });\n}\n\nexport function augmentLocator<T extends Locator>(locator: T): T {\n if (\n (locator as unknown as { [LOCATOR_PATCHED]?: boolean })[LOCATOR_PATCHED]\n ) {\n return locator;\n }\n\n defineHiddenProperty(locator, \"extract\", createLocatorExtract(locator));\n\n defineHiddenProperty(locator, LOCATOR_PATCHED, true);\n\n return locator;\n}\n\nexport function augmentPage<T extends Page>(page: T): T {\n if ((page as unknown as { [PAGE_PATCHED]?: boolean })[PAGE_PATCHED]) {\n return page;\n }\n\n const originalLocator = (page as any).locator.bind(page);\n (page as any).locator = ((...args: any[]) => {\n const locator = originalLocator(...args);\n return augmentLocator(locator);\n }) as any;\n\n defineHiddenProperty(page, \"extract\", createPageExtract(page));\n defineHiddenProperty(page, \"getLocatorsByAI\", createPageGetLocatorByAI(page));\n defineHiddenProperty(page, PAGE_PATCHED, true);\n\n return page;\n}\n\nexport function augmentBrowserContext<T extends BrowserContext>(context: T): T {\n if (\n (context as unknown as { [CONTEXT_PATCHED]?: boolean })[CONTEXT_PATCHED]\n ) {\n return context;\n }\n\n const originalNewPage = (context as any).newPage.bind(context);\n (context as any).newPage = (async (...args: any[]) => {\n const page = await originalNewPage(...args);\n return augmentPage(page);\n }) as any;\n\n const originalPages = (context as any).pages?.bind(context);\n if (originalPages) {\n (context as any).pages = (() =>\n originalPages().map((page: Page) => augmentPage(page))) as any;\n }\n\n if (!(context as unknown as { newAgent?: unknown }).newAgent) {\n defineHiddenProperty(context, \"newAgent\", () => {\n return createNewAgent(context);\n });\n }\n\n defineHiddenProperty(context, CONTEXT_PATCHED, true);\n\n return context;\n}\n\nexport function augmentBrowser<T extends Browser>(browser: T): T {\n if (\n (browser as unknown as { [BROWSER_PATCHED]?: boolean })[BROWSER_PATCHED]\n ) {\n return browser;\n }\n\n const originalNewContext = (browser as any).newContext.bind(browser);\n (browser as any).newContext = (async (...args: any[]) => {\n const context = await originalNewContext(...args);\n return augmentBrowserContext(context);\n }) as any;\n\n const originalNewPage = (browser as any).newPage.bind(browser);\n (browser as any).newPage = (async (...args: any[]) => {\n const page = await originalNewPage(...args);\n return augmentPage(page);\n }) as any;\n\n const originalContexts = (browser as any).contexts.bind(browser);\n (browser as any).contexts = (() =>\n originalContexts().map((context: BrowserContext) =>\n augmentBrowserContext(context),\n )) as any;\n\n if (!(browser as unknown as { newAgent?: unknown }).newAgent) {\n defineHiddenProperty(browser, \"newAgent\", () => {\n // Get the first context, or it will be created when the agent tries to access browserContext\n const contexts = browser.contexts();\n const context = contexts.length > 0 ? contexts[0] : browser.contexts()[0];\n return createNewAgent(context);\n });\n }\n\n defineHiddenProperty(browser, BROWSER_PATCHED, true);\n\n return browser;\n}\n\nexport function augmentBrowserType<TBrowser extends Browser>(\n browserType: BrowserType<TBrowser>,\n): BrowserType<TBrowser> {\n if (\n (browserType as unknown as { [BROWSER_TYPE_PATCHED]?: boolean })[\n BROWSER_TYPE_PATCHED\n ]\n ) {\n return browserType;\n }\n\n const originalLaunch = (browserType as any).launch.bind(browserType);\n (browserType as any).launch = (async (\n ...args: Parameters<BrowserType<TBrowser>[\"launch\"]>\n ) => {\n const browser = await originalLaunch(...args);\n return augmentBrowser(browser) as TBrowser;\n }) as unknown as BrowserType<TBrowser>[\"launch\"];\n\n const originalConnect = (browserType as any).connect?.bind(browserType);\n if (originalConnect) {\n (browserType as any).connect = (async (\n ...args: Parameters<NonNullable<BrowserType<TBrowser>[\"connect\"]>>\n ) => {\n const browser = await originalConnect(...args);\n return augmentBrowser(browser) as TBrowser;\n }) as unknown as NonNullable<BrowserType<TBrowser>[\"connect\"]>;\n }\n\n const originalConnectOverCDP = (browserType as any).connectOverCDP?.bind(\n browserType,\n );\n if (originalConnectOverCDP) {\n (browserType as any).connectOverCDP = (async (\n ...args: Parameters<NonNullable<BrowserType<TBrowser>[\"connectOverCDP\"]>>\n ) => {\n const browser = await originalConnectOverCDP(...args);\n return augmentBrowser(browser) as TBrowser;\n }) as unknown as NonNullable<BrowserType<TBrowser>[\"connectOverCDP\"]>;\n }\n\n const originalLaunchPersistentContext = (\n browserType as any\n ).launchPersistentContext?.bind(browserType);\n if (originalLaunchPersistentContext) {\n (browserType as any).launchPersistentContext = (async (\n ...args: Parameters<\n NonNullable<BrowserType<TBrowser>[\"launchPersistentContext\"]>\n >\n ) => {\n const context = await originalLaunchPersistentContext(...args);\n return augmentBrowserContext(context) as BrowserContext;\n }) as unknown as NonNullable<\n BrowserType<TBrowser>[\"launchPersistentContext\"]\n >;\n }\n\n defineHiddenProperty(browserType, BROWSER_TYPE_PATCHED, true);\n\n return browserType;\n}\n"],"names":["STABLY_API_URL","png","PNG","jpeg","test","alias","isErrorResponse"],"mappings":"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","x_google_ignoreList":[5]}
|