@agent-scope/render 1.20.4 → 1.20.6

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser-pool.ts","../src/contexts.ts","../src/errors.ts","../src/fonts.ts","../src/matrix.ts","../src/providers.ts","../src/styles.ts","../src/satori.ts","../src/sprite-sheet.ts","../src/stress.ts"],"names":["React"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BrowserPool — Playwright-based browser pool for complex component rendering.\n *\n * ## Design\n *\n * The pool manages N browser instances, each owning M page contexts. Pages are\n * pre-loaded ONCE with a skeleton HTML that includes:\n * - A full React provider tree\n * - CSS / font links\n * - A component registry\n *\n * Components are swapped in via `window.__renderComponent(name, props)` — no\n * page navigation between renders. This \"inject-don't-navigate\" pattern keeps\n * pages warm and avoids expensive browser startup on every render.\n *\n * ## Concurrency\n *\n * `acquire()` checks out a free `PageSlot`. When all slots are busy, callers\n * queue and are resumed FIFO once a slot becomes available.\n * `release(slot)` returns a slot to the pool and wakes the next waiter.\n *\n * ## Shutdown\n *\n * `close()` drains all in-flight renders (waits for in-use slots) then closes\n * every browser gracefully.\n */\n\nimport type { Browser, Page } from \"playwright\";\nimport { chromium } from \"playwright\";\nimport type {\n BrowserPoolConfig,\n DOMNode,\n PageSlot,\n PoolSizeConfig,\n RenderOptions,\n RenderResult,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Chrome flags for headless CI\n// ---------------------------------------------------------------------------\n\nconst CHROMIUM_ARGS: string[] = [\n \"--headless=new\",\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--no-sandbox\",\n \"--no-zygote\",\n \"--disable-extensions\",\n \"--disable-background-networking\",\n \"--disable-sync\",\n \"--hide-scrollbars\",\n \"--mute-audio\",\n \"--font-render-hinting=none\",\n];\n\n// ---------------------------------------------------------------------------\n// Pool preset sizes\n// ---------------------------------------------------------------------------\n\nconst PRESET_SIZES: Record<string, PoolSizeConfig> = {\n local: { browsers: 1, pagesPerBrowser: 5 },\n \"ci-standard\": { browsers: 3, pagesPerBrowser: 15 },\n \"ci-large\": { browsers: 6, pagesPerBrowser: 20 },\n};\n\n// ---------------------------------------------------------------------------\n// Skeleton HTML injected into each page\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the skeleton HTML string that pre-loads the provider/registry\n * scaffolding for a warm page context.\n *\n * In production this would bundle the real component registry; for\n * the render engine we keep it minimal and let the caller supply the\n * actual component via `window.__renderComponent`.\n */\nfunction buildSkeletonHtml(viewportWidth: number, _viewportHeight: number): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=${viewportWidth}, initial-scale=1.0\" />\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n body { margin: 0; padding: 0; font-family: system-ui, sans-serif; }\n #scope-root { display: inline-block; }\n </style>\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n <script>\n // Component registry — populated lazily by inject calls\n window.__componentRegistry = {};\n\n // Render state\n window.__renderReady = false;\n window.__renderError = null;\n\n /**\n * Swap in a component by name.\n * @param {string} name - component name key in __componentRegistry\n * @param {object} props - serialised props object\n */\n window.__renderComponent = function(name, props) {\n window.__renderReady = false;\n window.__renderError = null;\n\n var root = document.getElementById(\"scope-root\");\n if (!root) {\n window.__renderError = \"scope-root element not found\";\n window.__renderReady = true;\n return;\n }\n\n var factory = window.__componentRegistry[name];\n if (!factory) {\n // Fallback: render a placeholder div so screenshots still work\n root.innerHTML = \"<div data-placeholder=\\\\\"\" + name + \"\\\\\" style=\\\\\"padding:8px;border:1px dashed #ccc\\\\\">\" + name + \"</div>\";\n window.__renderReady = true;\n return;\n }\n\n try {\n factory(root, props || {});\n } catch (err) {\n window.__renderError = err instanceof Error ? err.message : String(err);\n root.innerHTML = \"<div data-render-error style=\\\\\"color:red\\\\\">\" + window.__renderError + \"</div>\";\n window.__renderReady = true;\n }\n };\n\n /**\n * Register a component factory.\n * @param {string} name\n * @param {function(HTMLElement, object): void} factory\n */\n window.__registerComponent = function(name, factory) {\n window.__componentRegistry[name] = factory;\n };\n\n // Signal that the skeleton is ready (not a component render yet)\n window.__skeletonReady = true;\n </script>\n</body>\n</html>`;\n}\n\n// ---------------------------------------------------------------------------\n// DOM extraction helper\n// ---------------------------------------------------------------------------\n\n/** Recursively walks the live DOM inside the page and returns a DOMNode tree. */\nasync function extractDomTree(\n page: Page,\n selector: string,\n): Promise<{ tree: DOMNode; elementCount: number }> {\n const result = await page.evaluate((sel: string) => {\n let count = 0;\n\n function walk(node: Element | ChildNode): {\n tag: string;\n attrs: Record<string, string>;\n text?: string;\n children: ReturnType<typeof walk>[];\n } {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent?.trim();\n return { tag: \"#text\", attrs: {}, text: text ?? \"\", children: [] };\n }\n\n const el = node as Element;\n count++;\n const attrs: Record<string, string> = {};\n for (const attr of Array.from(el.attributes)) {\n attrs[attr.name] = attr.value;\n }\n const children = Array.from(el.childNodes)\n .filter(\n (n) =>\n n.nodeType === Node.ELEMENT_NODE ||\n (n.nodeType === Node.TEXT_NODE && (n.textContent?.trim() ?? \"\").length > 0),\n )\n .map(walk);\n return { tag: el.tagName.toLowerCase(), attrs, children };\n }\n\n const root = document.querySelector(sel);\n if (!root) {\n return { tree: { tag: \"div\", attrs: {}, children: [] }, elementCount: 0 };\n }\n const tree = walk(root);\n return { tree, elementCount: count };\n }, selector);\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool\n// ---------------------------------------------------------------------------\n\n/**\n * Manages a pool of Playwright browser instances and page contexts for\n * rendering complex React components.\n */\nexport class BrowserPool {\n private readonly config: Required<BrowserPoolConfig>;\n private readonly sizeConfig: PoolSizeConfig;\n\n private browsers: Browser[] = [];\n private slots: PageSlot[] = [];\n private waiters: Array<(slot: PageSlot) => void> = [];\n private closed = false;\n private initialized = false;\n\n constructor(config: BrowserPoolConfig = {}) {\n const viewportWidth = config.viewportWidth ?? 1440;\n const viewportHeight = config.viewportHeight ?? 900;\n const acquireTimeoutMs = config.acquireTimeoutMs ?? 30_000;\n const deviceScaleFactor = config.deviceScaleFactor ?? 2;\n const preset = config.preset ?? \"local\";\n\n this.config = {\n preset,\n size: config.size ?? { browsers: 1, pagesPerBrowser: 5 },\n viewportWidth,\n viewportHeight,\n deviceScaleFactor,\n acquireTimeoutMs,\n };\n\n // Resolve effective size: explicit size > preset > default\n if (config.size) {\n this.sizeConfig = config.size;\n } else {\n this.sizeConfig = PRESET_SIZES[preset] ??\n PRESET_SIZES.local ?? { browsers: 1, pagesPerBrowser: 5 };\n }\n }\n\n // -------------------------------------------------------------------------\n // Initialisation\n // -------------------------------------------------------------------------\n\n /**\n * Launch all browser instances and pre-load every page with the skeleton HTML.\n * Must be called before `render()`.\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n this.initialized = true;\n\n const { browsers: browserCount, pagesPerBrowser } = this.sizeConfig;\n const skeleton = buildSkeletonHtml(this.config.viewportWidth, this.config.viewportHeight);\n\n for (let b = 0; b < browserCount; b++) {\n const browser = await chromium.launch({ args: CHROMIUM_ARGS });\n this.browsers.push(browser);\n\n for (let p = 0; p < pagesPerBrowser; p++) {\n const page = await browser.newPage({\n viewport: { width: this.config.viewportWidth, height: this.config.viewportHeight },\n deviceScaleFactor: this.config.deviceScaleFactor,\n });\n\n // Pre-load skeleton — this is the ONLY navigation this page ever does\n await page.setContent(skeleton, { waitUntil: \"load\" });\n\n const index = this.slots.length;\n this.slots.push({ page, inUse: false, index });\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Slot management\n // -------------------------------------------------------------------------\n\n /**\n * Acquire a free page slot. Blocks until one is available or\n * `acquireTimeoutMs` is exceeded.\n */\n async acquire(): Promise<PageSlot> {\n if (this.closed) throw new Error(\"BrowserPool is closed\");\n\n const free = this.slots.find((s) => !s.inUse);\n if (free) {\n free.inUse = true;\n return free;\n }\n\n // All slots busy — enqueue a waiter\n return new Promise<PageSlot>((resolve, reject) => {\n const timer = setTimeout(() => {\n const idx = this.waiters.indexOf(wakeUp);\n if (idx !== -1) this.waiters.splice(idx, 1);\n reject(\n new Error(`BrowserPool.acquire() timed out after ${this.config.acquireTimeoutMs}ms`),\n );\n }, this.config.acquireTimeoutMs);\n\n const wakeUp = (slot: PageSlot) => {\n clearTimeout(timer);\n resolve(slot);\n };\n this.waiters.push(wakeUp);\n });\n }\n\n /**\n * Return a page slot to the pool. Wakes the next queued waiter, if any.\n */\n release(slot: PageSlot): void {\n if (!slot.inUse) return; // already released\n slot.inUse = false;\n\n const next = this.waiters.shift();\n if (next) {\n slot.inUse = true;\n next(slot);\n }\n }\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n /**\n * Render a component by name with the given props and return a `RenderResult`.\n *\n * The inject-don't-navigate pattern is used:\n * 1. Acquire a warm page slot.\n * 2. Call `window.__renderComponent(name, props)` — no navigation.\n * 3. Wait for `window.__renderReady`.\n * 4. Clip screenshot to the component bounding box.\n * 5. Optionally capture DOM, styles, console output, and a11y info.\n * 6. Release the slot.\n */\n async render(\n componentName: string,\n props: Record<string, unknown> = {},\n options: RenderOptions = {},\n ): Promise<RenderResult> {\n if (!this.initialized) {\n throw new Error(\"BrowserPool.init() must be called before render()\");\n }\n if (this.closed) {\n throw new Error(\"BrowserPool is closed\");\n }\n\n const captureStyles = options.captureStyles ?? true;\n const captureConsole = options.captureConsole ?? false;\n const captureDom = options.captureDom ?? false;\n const captureA11y = options.captureA11y ?? false;\n const timeoutMs = options.timeoutMs ?? 10_000;\n\n const consoleErrors: string[] = [];\n const consoleWarnings: string[] = [];\n const consoleLogs: string[] = [];\n\n const slot = await this.acquire();\n const { page } = slot;\n\n // Attach console listener if requested\n const consoleHandler = captureConsole\n ? (msg: import(\"playwright\").ConsoleMessage) => {\n const text = msg.text();\n if (msg.type() === \"error\") consoleErrors.push(text);\n else if (msg.type() === \"warning\") consoleWarnings.push(text);\n else consoleLogs.push(text);\n }\n : null;\n\n if (consoleHandler) page.on(\"console\", consoleHandler);\n\n const startTime = Date.now();\n\n try {\n // Inject the component — NO page navigation\n await page.evaluate(\n ({ name, componentProps }: { name: string; componentProps: Record<string, unknown> }) => {\n (\n window as Window & {\n __renderComponent?: (n: string, p: Record<string, unknown>) => void;\n }\n ).__renderComponent?.(name, componentProps);\n },\n { name: componentName, componentProps: props },\n );\n\n // Wait for render to complete\n await page.waitForFunction(\n () => {\n return (window as Window & { __renderReady?: boolean }).__renderReady === true;\n },\n { timeout: timeoutMs },\n );\n\n // Check for render error\n const renderError = await page.evaluate(() => {\n return (window as Window & { __renderError?: string | null }).__renderError ?? null;\n });\n\n if (renderError) {\n throw new Error(`Component render error: ${renderError}`);\n }\n\n const renderTimeMs = Date.now() - startTime;\n\n // ----- Bounding box + clipped screenshot -----\n const rootLocator = page.locator(\"[data-reactscope-root]\");\n const boundingBox = await rootLocator.boundingBox();\n\n if (!boundingBox || boundingBox.width === 0 || boundingBox.height === 0) {\n throw new Error(`Component \"${componentName}\" rendered with zero bounding box`);\n }\n\n // Screenshot clipped to the component bounding box ONLY\n const screenshot = await page.screenshot({\n clip: {\n x: boundingBox.x,\n y: boundingBox.y,\n width: boundingBox.width,\n height: boundingBox.height,\n },\n type: \"png\",\n });\n\n // ----- Computed styles -----\n const computedStyles: Record<string, Record<string, string>> = {};\n if (captureStyles) {\n const styles = await page.evaluate((sel: string) => {\n const el = document.querySelector(sel);\n if (!el) return {} as Record<string, string>;\n const computed = window.getComputedStyle(el);\n const snapshot: Record<string, string> = {};\n // Capture a useful subset of computed properties\n const PROPS = [\n \"display\",\n \"flexDirection\",\n \"flexWrap\",\n \"alignItems\",\n \"justifyContent\",\n \"gridTemplateColumns\",\n \"gridTemplateRows\",\n \"position\",\n \"width\",\n \"height\",\n \"margin\",\n \"padding\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"fontWeight\",\n \"lineHeight\",\n \"borderRadius\",\n \"boxShadow\",\n \"opacity\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"overflow\",\n ];\n for (const prop of PROPS) {\n snapshot[prop] = computed.getPropertyValue(prop);\n }\n return snapshot;\n }, \"[data-reactscope-root] > *\");\n\n computedStyles[\"[data-reactscope-root] > *\"] = styles;\n }\n\n // ----- DOM extraction -----\n let dom: RenderResult[\"dom\"] | undefined;\n if (captureDom) {\n const { tree, elementCount } = await extractDomTree(page, \"[data-reactscope-root]\");\n dom = {\n tree,\n elementCount,\n boundingBox: {\n x: boundingBox.x,\n y: boundingBox.y,\n width: boundingBox.width,\n height: boundingBox.height,\n },\n };\n }\n\n // ----- Accessibility snapshot -----\n let accessibility: RenderResult[\"accessibility\"] | undefined;\n if (captureA11y) {\n const violations: string[] = [];\n\n // Use ARIA snapshot via evaluate (page.accessibility removed in Playwright 1.49+)\n const a11yInfo = await page.evaluate((sel: string) => {\n const el = document.querySelector(sel);\n if (!el) return { role: \"generic\", name: \"\" };\n return {\n role: el.getAttribute(\"role\") ?? el.tagName.toLowerCase() ?? \"generic\",\n name:\n el.getAttribute(\"aria-label\") ??\n el.getAttribute(\"aria-labelledby\") ??\n el.textContent?.trim().slice(0, 100) ??\n \"\",\n };\n }, \"[data-reactscope-root]\");\n\n // Basic violation: check for images without alt text\n const imgViolations = await page.evaluate((sel: string) => {\n const container = document.querySelector(sel);\n if (!container) return [] as string[];\n const imgs = container.querySelectorAll(\"img\");\n const issues: string[] = [];\n imgs.forEach((img) => {\n if (!img.alt) issues.push(\"Image missing accessible name\");\n });\n return issues;\n }, \"[data-reactscope-root]\");\n\n violations.push(...imgViolations);\n\n accessibility = {\n role: a11yInfo.role,\n name: a11yInfo.name,\n violations,\n };\n }\n\n // ----- Console output -----\n const consoleOutput: RenderResult[\"console\"] | undefined = captureConsole\n ? { errors: [...consoleErrors], warnings: [...consoleWarnings], logs: [...consoleLogs] }\n : undefined;\n\n return {\n screenshot,\n width: boundingBox.width,\n height: boundingBox.height,\n renderTimeMs,\n computedStyles,\n dom,\n console: consoleOutput,\n accessibility,\n };\n } finally {\n if (consoleHandler) page.off(\"console\", consoleHandler);\n this.release(slot);\n }\n }\n\n // -------------------------------------------------------------------------\n // Shutdown\n // -------------------------------------------------------------------------\n\n /**\n * Gracefully shut down the pool.\n *\n * Waits for all in-use slots to be released, then closes every browser.\n * Subsequent `acquire()` or `render()` calls will throw.\n */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n // Drain in-flight renders: wait for all in-use slots to become free\n const drainPromises = this.slots\n .filter((s) => s.inUse)\n .map(\n (s) =>\n new Promise<void>((resolve) => {\n const poll = setInterval(() => {\n if (!s.inUse) {\n clearInterval(poll);\n resolve();\n }\n }, 50);\n }),\n );\n\n await Promise.all(drainPromises);\n\n // Clear remaining waiters (they will error on next acquire attempt as pool is closed)\n this.waiters = [];\n\n // Close all browsers\n await Promise.all(this.browsers.map((b) => b.close()));\n this.browsers = [];\n this.slots = [];\n }\n\n // -------------------------------------------------------------------------\n // Introspection helpers\n // -------------------------------------------------------------------------\n\n /** Total number of page slots in the pool. */\n get totalSlots(): number {\n return this.slots.length;\n }\n\n /** Number of currently available (free) slots. */\n get freeSlots(): number {\n return this.slots.filter((s) => !s.inUse).length;\n }\n\n /** Number of currently in-use slots. */\n get activeSlots(): number {\n return this.slots.filter((s) => s.inUse).length;\n }\n\n /** Number of callers waiting for a free slot. */\n get queueDepth(): number {\n return this.waiters.length;\n }\n\n /** Whether the pool has been initialised. */\n get isInitialized(): boolean {\n return this.initialized;\n }\n\n /** Whether the pool is closed. */\n get isClosed(): boolean {\n return this.closed;\n }\n}\n","/**\n * Composition Contexts — built-in context types for use as RenderMatrix axes.\n *\n * Each context describes a layout environment in which a component is rendered.\n * Pass an array of `CompositionContext` values as a matrix axis to test how a\n * component behaves across different parent layout contexts.\n */\n\n// ---------------------------------------------------------------------------\n// Context identifier type\n// ---------------------------------------------------------------------------\n\n/**\n * All built-in composition context identifiers.\n *\n * | ID | Description |\n * |-----------------|------------------------------------------------------------|\n * | centered | Component centered inside the viewport |\n * | flex-row | Component inside a flex row with sibling placeholders |\n * | flex-col | Component inside a flex column |\n * | grid | Component inside a CSS grid cell |\n * | sidebar | Narrow sidebar layout (240 px wide) |\n * | scroll | Component inside a scrollable container |\n * | full-width | Component stretches to full viewport width |\n * | constrained | Component inside a max-width centered container |\n * | rtl | Right-to-left text direction (dir=\"rtl\") |\n * | nested-flex | Deeply nested flex containers (3 levels) |\n */\nexport type CompositionContextId =\n | \"centered\"\n | \"flex-row\"\n | \"flex-col\"\n | \"grid\"\n | \"sidebar\"\n | \"scroll\"\n | \"full-width\"\n | \"constrained\"\n | \"rtl\"\n | \"nested-flex\";\n\n// ---------------------------------------------------------------------------\n// Context descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * Describes a composition context: its ID, human-readable label,\n * and the CSS properties to apply to the parent wrapper element.\n */\nexport interface CompositionContext {\n /** Stable identifier used as an axis value in RenderMatrix. */\n id: CompositionContextId;\n /** Short human-readable label (used as axis label in sprite sheets). */\n label: string;\n /** CSS properties applied to the wrapping container. */\n containerStyle: Record<string, string>;\n /** Optional HTML attributes applied to the wrapping container. */\n containerAttrs?: Record<string, string>;\n /** Human-readable description of what this context tests. */\n description: string;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in context definitions\n// ---------------------------------------------------------------------------\n\n/**\n * All ten built-in composition contexts.\n */\nexport const COMPOSITION_CONTEXTS: Record<CompositionContextId, CompositionContext> = {\n centered: {\n id: \"centered\",\n label: \"Centered\",\n description: \"Component centered both horizontally and vertically inside the viewport.\",\n containerStyle: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n height: \"100%\",\n },\n },\n\n \"flex-row\": {\n id: \"flex-row\",\n label: \"Flex Row\",\n description: \"Component placed inside a flex row with placeholder siblings on either side.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n width: \"100%\",\n },\n },\n\n \"flex-col\": {\n id: \"flex-col\",\n label: \"Flex Col\",\n description: \"Component placed inside a flex column with placeholder siblings.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n width: \"100%\",\n },\n },\n\n grid: {\n id: \"grid\",\n label: \"Grid\",\n description: \"Component placed inside a CSS grid cell (3-column auto-fill).\",\n containerStyle: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"8px\",\n width: \"100%\",\n },\n },\n\n sidebar: {\n id: \"sidebar\",\n label: \"Sidebar\",\n description: \"Narrow 240 px sidebar layout — tests constrained-width rendering.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"column\",\n width: \"240px\",\n minHeight: \"100%\",\n padding: \"8px\",\n overflow: \"hidden\",\n },\n },\n\n scroll: {\n id: \"scroll\",\n label: \"Scroll\",\n description: \"Component inside a vertically scrollable container with fixed height.\",\n containerStyle: {\n display: \"block\",\n overflowY: \"auto\",\n height: \"300px\",\n width: \"100%\",\n },\n },\n\n \"full-width\": {\n id: \"full-width\",\n label: \"Full Width\",\n description: \"Component stretched to full viewport width with no padding.\",\n containerStyle: {\n display: \"block\",\n width: \"100%\",\n },\n },\n\n constrained: {\n id: \"constrained\",\n label: \"Constrained\",\n description: \"Component inside a centered max-width container (1024 px).\",\n containerStyle: {\n display: \"block\",\n maxWidth: \"1024px\",\n width: \"100%\",\n marginLeft: \"auto\",\n marginRight: \"auto\",\n padding: \"0 16px\",\n },\n },\n\n rtl: {\n id: \"rtl\",\n label: \"RTL\",\n description: \"Right-to-left text direction — tests bidi layout behaviour.\",\n containerStyle: {\n direction: \"rtl\",\n display: \"flex\",\n flexDirection: \"row\",\n width: \"100%\",\n },\n containerAttrs: {\n dir: \"rtl\",\n lang: \"ar\",\n },\n },\n\n \"nested-flex\": {\n id: \"nested-flex\",\n label: \"Nested Flex\",\n description: \"Component inside three levels of nested flex containers.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"row\",\n width: \"100%\",\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Convenience selectors\n// ---------------------------------------------------------------------------\n\n/** All ten built-in contexts as an ordered array. */\nexport const ALL_CONTEXTS: CompositionContext[] = Object.values(COMPOSITION_CONTEXTS);\n\n/** All context IDs. */\nexport const ALL_CONTEXT_IDS: CompositionContextId[] = Object.keys(\n COMPOSITION_CONTEXTS,\n) as CompositionContextId[];\n\n/**\n * Retrieve a context descriptor by ID.\n *\n * @throws if the ID is not recognised.\n */\nexport function getContext(id: CompositionContextId): CompositionContext {\n const ctx = COMPOSITION_CONTEXTS[id];\n if (!ctx) throw new Error(`Unknown composition context: \"${id}\"`);\n return ctx;\n}\n\n/**\n * Retrieve multiple contexts by ID.\n */\nexport function getContexts(ids: CompositionContextId[]): CompositionContext[] {\n return ids.map((id) => getContext(id));\n}\n\n/**\n * Returns a `MatrixAxis`-compatible object for use directly in `RenderMatrix`.\n *\n * ```ts\n * const matrix = new RenderMatrix(renderer, [\n * contextAxis([\"centered\", \"flex-row\", \"rtl\"]),\n * { name: \"variant\", values: [\"primary\", \"secondary\"] },\n * ]);\n * ```\n */\nexport function contextAxis(ids: CompositionContextId[] = ALL_CONTEXT_IDS): {\n name: string;\n values: CompositionContext[];\n} {\n return {\n name: \"context\",\n values: ids.map((id) => getContext(id)),\n };\n}\n","/**\n * @agent-scope/render — Structured error handling for crashed renders.\n *\n * When a component crashes during render, this module captures rich\n * diagnostic context instead of letting the error propagate and crash\n * the entire batch.\n *\n * Usage:\n * import { safeRender, RenderError } from \"@agent-scope/render\";\n *\n * const outcome = await safeRender(() => renderer.renderCell(props), {\n * props,\n * sourceLocation: { file: \"Button.tsx\", line: 12, column: 0 },\n * });\n *\n * if (outcome.crashed) {\n * console.error(outcome.error.message);\n * console.error(\"Hints:\", outcome.error.heuristicFlags);\n * } else {\n * console.log(\"Screenshot size:\", outcome.result.screenshot.length);\n * }\n */\n\nimport type { RenderResult } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Heuristic flags\n// ---------------------------------------------------------------------------\n\n/**\n * Automated diagnosis hints emitted when a render crashes.\n *\n * Each flag is a short SCREAMING_SNAKE_CASE identifier that encodes a\n * likely root cause. Callers can use these to surface actionable messages\n * to the user without needing to parse raw error messages.\n */\nexport type HeuristicFlag =\n | \"MISSING_PROVIDER\"\n | \"UNDEFINED_PROP\"\n | \"TYPE_MISMATCH\"\n | \"NETWORK_REQUIRED\"\n | \"ASYNC_NOT_SUSPENDED\"\n | \"HOOK_CALL_VIOLATION\"\n | \"ELEMENT_TYPE_INVALID\"\n | \"HYDRATION_MISMATCH\"\n | \"CIRCULAR_DEPENDENCY\"\n | \"MISSING_BROWSER_BINARY\"\n | \"MISSING_PROJECT_DEPENDENCY\"\n | \"UNKNOWN_ERROR\";\n\n// ---------------------------------------------------------------------------\n// Source location\n// ---------------------------------------------------------------------------\n\n/**\n * The file/line/column origin of a component as recorded in the manifest.\n */\nexport interface SourceLocation {\n file: string;\n line: number;\n column: number;\n}\n\n// ---------------------------------------------------------------------------\n// RenderError\n// ---------------------------------------------------------------------------\n\n/**\n * All structured fields carried by a `RenderError`.\n * Consumers can access these directly on the error instance.\n */\nexport interface RenderErrorFields {\n /** The React component stack trace (if available). */\n componentStack: string;\n /** Source location from the manifest. */\n sourceLocation: SourceLocation;\n /** The prop values that were passed to the component when it crashed. */\n propsAtCrash: Record<string, unknown>;\n /** The error message (also available via `error.message`). */\n errorMessage: string;\n /** The error class name (e.g. \"TypeError\", \"ReferenceError\"). */\n errorType: string;\n /** Automated diagnosis hints. */\n heuristicFlags: HeuristicFlag[];\n}\n\n/**\n * Error thrown (or captured) when a component crashes during render.\n *\n * Extends the native `Error` class so it can be used with standard\n * `instanceof` checks and `catch` clauses, while also carrying rich\n * structured diagnostics.\n */\nexport class RenderError extends Error implements RenderErrorFields {\n readonly componentStack: string;\n readonly sourceLocation: SourceLocation;\n readonly propsAtCrash: Record<string, unknown>;\n readonly errorMessage: string;\n readonly errorType: string;\n readonly heuristicFlags: HeuristicFlag[];\n\n constructor(fields: RenderErrorFields) {\n super(fields.errorMessage);\n this.name = \"RenderError\";\n this.componentStack = fields.componentStack;\n this.sourceLocation = fields.sourceLocation;\n this.propsAtCrash = fields.propsAtCrash;\n this.errorMessage = fields.errorMessage;\n this.errorType = fields.errorType;\n this.heuristicFlags = fields.heuristicFlags;\n }\n\n /**\n * Construct a `RenderError` from an arbitrary caught value.\n *\n * Extracts `componentStack` from React error boundaries when present,\n * and runs heuristic analysis on the error message.\n */\n static from(\n caught: unknown,\n context: {\n props?: Record<string, unknown>;\n sourceLocation?: SourceLocation;\n } = {},\n ): RenderError {\n const err = caught instanceof Error ? caught : new Error(String(caught));\n\n const errorMessage = err.message;\n const errorType = err.constructor.name !== \"Error\" ? err.constructor.name : \"Error\";\n\n // Extract component stack if present (React error boundary style)\n const componentStack =\n (err as Error & { componentStack?: string }).componentStack ?? err.stack ?? \"\";\n\n const sourceLocation = context.sourceLocation ?? {\n file: \"<unknown>\",\n line: 0,\n column: 0,\n };\n\n const propsAtCrash = context.props ?? {};\n\n const heuristicFlags = detectHeuristicFlags(errorMessage, componentStack);\n\n return new RenderError({\n componentStack,\n sourceLocation,\n propsAtCrash,\n errorMessage,\n errorType,\n heuristicFlags,\n });\n }\n\n /** Serialise to a plain object (useful for JSON output). */\n toJSON(): RenderErrorFields & { name: string } {\n return {\n name: this.name,\n componentStack: this.componentStack,\n sourceLocation: this.sourceLocation,\n propsAtCrash: this.propsAtCrash,\n errorMessage: this.errorMessage,\n errorType: this.errorType,\n heuristicFlags: this.heuristicFlags,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flag detection\n// ---------------------------------------------------------------------------\n\n/**\n * Analyse an error message and component stack to produce a list of\n * `HeuristicFlag` values that hint at likely root causes.\n *\n * Exported so that callers can run the analysis independently (e.g. in\n * tests or custom error reporters).\n */\nexport function detectHeuristicFlags(\n errorMessage: string,\n componentStack: string,\n): HeuristicFlag[] {\n const flags = new Set<HeuristicFlag>();\n const msg = errorMessage.toLowerCase();\n const stack = componentStack.toLowerCase();\n const combined = `${msg} ${stack}`;\n\n // Context / Provider issues\n if (\n combined.includes(\"must be used within\") ||\n combined.includes(\"no provider\") ||\n (combined.includes(\"provider\") && combined.includes(\"context\")) ||\n (combined.includes(\"context\") && combined.includes(\"undefined\")) ||\n (combined.includes(\"provider\") && combined.includes(\"undefined\"))\n ) {\n flags.add(\"MISSING_PROVIDER\");\n }\n\n // Undefined prop access\n if (\n combined.includes(\"cannot read propert\") ||\n combined.includes(\"undefined is not an object\") ||\n (combined.includes(\"undefined\") && (combined.includes(\"prop\") || combined.includes(\"null\")))\n ) {\n flags.add(\"UNDEFINED_PROP\");\n }\n\n // Type errors\n if (\n msg.includes(\"typeerror\") ||\n combined.includes(\"is not a function\") ||\n combined.includes(\"is not iterable\") ||\n combined.includes(\"cannot set propert\")\n ) {\n flags.add(\"TYPE_MISMATCH\");\n }\n\n // Network dependency\n if (\n combined.includes(\"fetch\") ||\n combined.includes(\"network\") ||\n combined.includes(\"http\") ||\n combined.includes(\"xhr\")\n ) {\n flags.add(\"NETWORK_REQUIRED\");\n }\n\n // Suspense without boundary\n if (combined.includes(\"suspend\") || combined.includes(\"promise\")) {\n flags.add(\"ASYNC_NOT_SUSPENDED\");\n }\n\n // React hook violations\n if (\n combined.includes(\"invalid hook call\") ||\n combined.includes(\"hooks can only be called\") ||\n combined.includes(\"rendered more hooks\") ||\n combined.includes(\"rendered fewer hooks\")\n ) {\n flags.add(\"HOOK_CALL_VIOLATION\");\n }\n\n // Invalid element type\n if (\n combined.includes(\"element type is invalid\") ||\n combined.includes(\"react.createelement\") ||\n (combined.includes(\"expected a string\") && combined.includes(\"class/function\"))\n ) {\n flags.add(\"ELEMENT_TYPE_INVALID\");\n }\n\n // Hydration mismatch\n if (\n combined.includes(\"hydrat\") ||\n combined.includes(\"did not match\") ||\n combined.includes(\"server rendered html\")\n ) {\n flags.add(\"HYDRATION_MISMATCH\");\n }\n\n // Missing browser runtime\n if (\n combined.includes(\"executable doesn't exist\") ||\n combined.includes(\"browserType.launch\") ||\n combined.includes(\"could not find chromium\") ||\n combined.includes(\"please run the following command to download new browsers\")\n ) {\n flags.add(\"MISSING_BROWSER_BINARY\");\n }\n\n // Missing target-project dependencies\n if (\n combined.includes(\"could not resolve\") ||\n combined.includes(\"cannot find module\") ||\n combined.includes(\"module not found\")\n ) {\n flags.add(\"MISSING_PROJECT_DEPENDENCY\");\n }\n\n // Circular dependency / module issues\n if (\n combined.includes(\"circular\") ||\n combined.includes(\"maximum call stack\") ||\n combined.includes(\"stack overflow\")\n ) {\n flags.add(\"CIRCULAR_DEPENDENCY\");\n }\n\n // Fallback\n if (flags.size === 0) {\n flags.add(\"UNKNOWN_ERROR\");\n }\n\n return Array.from(flags);\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union result types\n// ---------------------------------------------------------------------------\n\n/**\n * A successful render outcome.\n */\nexport interface SuccessRenderResult {\n crashed: false;\n result: RenderResult;\n}\n\n/**\n * A crashed render outcome. The `error` carries full diagnostic context.\n */\nexport interface CrashedRenderResult {\n crashed: true;\n error: RenderError;\n renderTimeMs: number;\n}\n\n/**\n * The result of a `safeRender()` call: either success or a structured\n * crash record.\n */\nexport type RenderOutcome = SuccessRenderResult | CrashedRenderResult;\n\n// ---------------------------------------------------------------------------\n// safeRender\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps a render function so that any thrown error is captured as a\n * structured `CrashedRenderResult` instead of propagating.\n *\n * @param renderFn — async function that produces a `RenderResult`.\n * @param context — optional metadata to attach to any crash record.\n */\nexport async function safeRender(\n renderFn: () => Promise<RenderResult>,\n context: {\n props?: Record<string, unknown>;\n sourceLocation?: SourceLocation;\n } = {},\n): Promise<RenderOutcome> {\n const start = performance.now();\n try {\n const result = await renderFn();\n return { crashed: false, result };\n } catch (err: unknown) {\n const renderTimeMs = performance.now() - start;\n const renderError = RenderError.from(err, context);\n return { crashed: true, error: renderError, renderTimeMs };\n }\n}\n","/**\n * Font loading and caching for SatoriRenderer.\n *\n * Satori requires font data as ArrayBuffer and uses opentype.js internally,\n * which supports TTF/OTF/WOFF but NOT WOFF2.\n *\n * This module:\n * - Loads a font from disk once and caches it in-process.\n * - Returns Satori-compatible FontEntry arrays.\n * - Falls back to the bundled Inter woff font (@fontsource/inter) when no\n * explicit path is provided.\n */\n\nimport { existsSync, readdirSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FontEntry } from \"./types.js\";\n\n/** In-process cache: resolvedPath → loaded FontEntry array. */\nconst fontCache = new Map<string, FontEntry[]>();\n\n/** Sentinel for \"no font available\". */\nconst NO_FONT_SENTINEL = \"__none__\";\n\n/** Default font family name. */\nconst DEFAULT_FAMILY = \"Inter\";\n\n/**\n * Resolve the bundled Inter woff font shipped with @fontsource/inter.\n * Satori's internal opentype.js does NOT support woff2 — use the .woff file.\n */\nfunction resolveBundledFontPath(): string | null {\n const fontFile = join(\"@fontsource\", \"inter\", \"files\", \"inter-latin-400-normal.woff\");\n\n // Standard node_modules locations\n const roots = [\n join(\"node_modules\"),\n join(__dirname, \"..\", \"node_modules\"),\n join(__dirname, \"..\", \"..\", \"node_modules\"),\n join(__dirname, \"..\", \"..\", \"..\", \"node_modules\"),\n ];\n\n for (const root of roots) {\n const candidate = join(root, fontFile);\n if (existsSync(candidate)) return candidate;\n }\n\n // Bun stores packages under node_modules/.bun/@fontsource+inter@x.y.z/...\n const bunCacheRoot = join(\"node_modules\", \".bun\");\n if (existsSync(bunCacheRoot)) {\n try {\n const entries = readdirSync(bunCacheRoot) as string[];\n for (const entry of entries) {\n if (entry.startsWith(\"@fontsource+inter@\")) {\n const candidate = join(bunCacheRoot, entry, \"node_modules\", fontFile);\n if (existsSync(candidate)) return candidate;\n }\n }\n } catch {\n // Ignore readdir errors\n }\n }\n\n return null;\n}\n\n/**\n * Load font data from the given path and return Satori-compatible entries.\n * Results are cached by resolved path for the process lifetime.\n *\n * @param fontPath - Path to a TTF/OTF/WOFF font file (NOT woff2 — opentype.js\n * doesn't support woff2). Pass `undefined` to use the bundled\n * Inter woff font, or empty array if unavailable.\n * @param fontFamily - Family name to advertise. Defaults to \"Inter\".\n */\nexport async function loadFont(\n fontPath: string | undefined,\n fontFamily: string = DEFAULT_FAMILY,\n): Promise<FontEntry[]> {\n const resolvedPath = fontPath ?? resolveBundledFontPath() ?? NO_FONT_SENTINEL;\n\n const cached = fontCache.get(resolvedPath);\n if (cached !== undefined) return cached;\n\n if (resolvedPath === NO_FONT_SENTINEL) {\n const empty: FontEntry[] = [];\n fontCache.set(NO_FONT_SENTINEL, empty);\n return empty;\n }\n\n try {\n const buffer = await readFile(resolvedPath);\n const arrayBuffer = buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n ) as ArrayBuffer;\n\n const entries: FontEntry[] = [\n { name: fontFamily, data: arrayBuffer, weight: 400, style: \"normal\" },\n { name: fontFamily, data: arrayBuffer, weight: 700, style: \"normal\" },\n ];\n\n fontCache.set(resolvedPath, entries);\n return entries;\n } catch {\n // Font file missing or unreadable — record empty to avoid repeated attempts\n const empty: FontEntry[] = [];\n fontCache.set(resolvedPath, empty);\n return empty;\n }\n}\n\n/**\n * Clear the font cache. Useful in tests to ensure isolation.\n */\nexport function clearFontCache(): void {\n fontCache.clear();\n}\n\n/**\n * Returns the number of distinct font paths currently cached.\n */\nexport function fontCacheSize(): number {\n return fontCache.size;\n}\n","/**\n * RenderMatrix — Cartesian product renderer for React component prop axes.\n *\n * Generates all combinations of axis values, renders each cell via either\n * SatoriRenderer (simple components) or BrowserPool (complex components),\n * and returns a structured grid of RenderResult objects with aggregate stats.\n */\n\nimport type { ComplexityClass } from \"@agent-scope/manifest\";\nimport type { RenderResult } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Axis types\n// ---------------------------------------------------------------------------\n\n/**\n * A single axis in the render matrix.\n * Each axis defines a dimension of the Cartesian product.\n */\nexport interface MatrixAxis<T = unknown> {\n /** Human-readable name for this axis (displayed as row/col label). */\n name: string;\n /** The values along this axis. */\n values: T[];\n}\n\n// ---------------------------------------------------------------------------\n// MatrixRenderer interface\n// ---------------------------------------------------------------------------\n\n/**\n * Unified renderer interface that both SatoriRenderer and BrowserPool\n * adapters implement. Consumers supply a `MatrixRenderer` to `RenderMatrix`.\n */\nexport interface MatrixRenderer {\n /**\n * Render a single cell given the merged props for that cell.\n *\n * @param props - The combined prop snapshot for this matrix cell.\n * Keys are axis names; values are the axis value for this cell.\n * @param complexityClass - Routing hint (passed through from the descriptor).\n * @returns Resolved RenderResult.\n */\n renderCell(\n props: Record<string, unknown>,\n complexityClass: ComplexityClass,\n ): Promise<RenderResult>;\n}\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\n/**\n * A single cell in the rendered matrix grid.\n */\nexport interface MatrixCell {\n /** The axis values that produced this cell (axis name → value). */\n props: Record<string, unknown>;\n /** The render result for this cell. */\n result: RenderResult;\n /** Flat index in the row-major grid. */\n index: number;\n /** Per-axis indices (parallel to axes array). */\n axisIndices: number[];\n}\n\n/**\n * Aggregate statistics over all cells in the matrix.\n */\nexport interface MatrixStats {\n /** Total number of cells rendered. */\n totalCells: number;\n /** Sum of all cell renderTimeMs values. */\n totalRenderTimeMs: number;\n /** Average renderTimeMs across all cells. */\n avgRenderTimeMs: number;\n /** Fastest individual cell render time. */\n minRenderTimeMs: number;\n /** Slowest individual cell render time. */\n maxRenderTimeMs: number;\n /** Total wall-clock time for the whole matrix render (ms). */\n wallClockTimeMs: number;\n}\n\n/**\n * The full result of a matrix render.\n */\nexport interface MatrixResult {\n /** Flat list of all rendered cells (row-major order). */\n cells: MatrixCell[];\n /** The axes used to generate this matrix. */\n axes: MatrixAxis[];\n /**\n * 2-D axis label grid: `axisLabels[axisIndex][valueIndex]` → label string.\n * For multi-value objects, we use JSON.stringify as a fallback label.\n */\n axisLabels: string[][];\n /** Aggregate render statistics. */\n stats: MatrixStats;\n /** Number of rows in the conceptual grid (last axis cardinality). */\n rows: number;\n /** Number of columns in the conceptual grid (second-to-last axis cardinality, or 1). */\n cols: number;\n}\n\n// ---------------------------------------------------------------------------\n// Cartesian product utility\n// ---------------------------------------------------------------------------\n\n/**\n * Generates the Cartesian product of an array of arrays.\n *\n * cartesianProduct([[1,2],[3,4]]) → [[1,3],[1,4],[2,3],[2,4]]\n */\nexport function cartesianProduct<T>(axes: T[][]): T[][] {\n if (axes.length === 0) return [[]];\n const result: T[][] = [];\n\n function recurse(axisIndex: number, current: T[]): void {\n if (axisIndex === axes.length) {\n result.push([...current]);\n return;\n }\n const axis = axes[axisIndex];\n if (!axis) return;\n for (const value of axis) {\n current.push(value);\n recurse(axisIndex + 1, current);\n current.pop();\n }\n }\n\n recurse(0, []);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Label helper\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable label for an axis value.\n * Primitives are stringified directly; objects/arrays use JSON.stringify.\n */\nexport function labelForValue(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) return \"NaN\";\n if (!Number.isFinite(value)) return value > 0 ? \"+Infinity\" : \"-Infinity\";\n return String(value);\n }\n if (typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n}\n\n// ---------------------------------------------------------------------------\n// RenderMatrix\n// ---------------------------------------------------------------------------\n\n/**\n * Generates and renders a Cartesian product of prop axis values.\n *\n * Usage:\n * ```ts\n * const matrix = new RenderMatrix(renderer, [\n * { name: \"variant\", values: [\"primary\", \"secondary\"] },\n * { name: \"size\", values: [\"sm\", \"md\", \"lg\"] },\n * ], { complexityClass: \"simple\" });\n *\n * const result = await matrix.render();\n * // result.cells has 6 entries (2×3)\n * ```\n */\nexport class RenderMatrix {\n private readonly renderer: MatrixRenderer;\n private readonly axes: MatrixAxis[];\n private readonly complexityClass: ComplexityClass;\n /** Maximum number of cells to render in parallel. @default 8 */\n private readonly concurrency: number;\n\n constructor(\n renderer: MatrixRenderer,\n axes: MatrixAxis[],\n options: {\n complexityClass?: ComplexityClass;\n /** Max parallel renders. Default 8. */\n concurrency?: number;\n } = {},\n ) {\n if (axes.length === 0) {\n throw new Error(\"RenderMatrix requires at least one axis\");\n }\n for (const axis of axes) {\n if (axis.values.length === 0) {\n throw new Error(`Axis \"${axis.name}\" must have at least one value`);\n }\n }\n this.renderer = renderer;\n this.axes = axes;\n this.complexityClass = options.complexityClass ?? \"simple\";\n this.concurrency = options.concurrency ?? 8;\n }\n\n // ---------------------------------------------------------------------------\n // Grid dimensions\n // ---------------------------------------------------------------------------\n\n /** Total number of cells (product of all axis cardinalities). */\n get cellCount(): number {\n return this.axes.reduce((acc, axis) => acc * axis.values.length, 1);\n }\n\n /** Axis labels indexed [axisIndex][valueIndex]. */\n get axisLabels(): string[][] {\n return this.axes.map((axis) => axis.values.map((v) => labelForValue(v)));\n }\n\n // ---------------------------------------------------------------------------\n // Main render\n // ---------------------------------------------------------------------------\n\n /**\n * Render all cells of the matrix.\n *\n * Cells are dispatched with bounded parallelism (up to `concurrency` at once)\n * and returned in row-major order (first axis iterates slowest).\n */\n async render(): Promise<MatrixResult> {\n const wallStart = performance.now();\n\n // Build all combinations\n const axisValueArrays = this.axes.map((a) => a.values);\n const combinations = cartesianProduct(axisValueArrays);\n\n const cells: MatrixCell[] = new Array(combinations.length) as MatrixCell[];\n\n // Render with bounded concurrency\n await this._renderWithConcurrency(combinations, cells);\n\n const wallEnd = performance.now();\n\n // Aggregate stats\n const stats = this._computeStats(cells, wallEnd - wallStart);\n\n // Grid dimensions: treat the matrix as 2-D for sprite sheet purposes\n // rows = last axis cardinality, cols = product of remaining axes\n const lastAxis = this.axes[this.axes.length - 1];\n const rows = lastAxis !== undefined ? lastAxis.values.length : 1;\n const cols = this.cellCount / rows;\n\n return {\n cells,\n axes: this.axes,\n axisLabels: this.axisLabels,\n stats,\n rows,\n cols,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async _renderWithConcurrency(\n combinations: unknown[][],\n cells: MatrixCell[],\n ): Promise<void> {\n let nextIndex = 0;\n\n const worker = async (): Promise<void> => {\n while (nextIndex < combinations.length) {\n const i = nextIndex++;\n const combo = combinations[i];\n if (!combo) continue;\n\n // Build props object: axisName → value\n const props: Record<string, unknown> = {};\n for (let axisIdx = 0; axisIdx < this.axes.length; axisIdx++) {\n const axis = this.axes[axisIdx];\n if (axis) {\n props[axis.name] = combo[axisIdx];\n }\n }\n\n // Compute per-axis indices\n const axisIndices: number[] = [];\n for (let axisIdx = 0; axisIdx < this.axes.length; axisIdx++) {\n const axis = this.axes[axisIdx];\n const val = combo[axisIdx];\n axisIndices.push(axis ? axis.values.indexOf(val as never) : -1);\n }\n\n const result = await this.renderer.renderCell(props, this.complexityClass);\n cells[i] = { props, result, index: i, axisIndices };\n }\n };\n\n // Spawn up to `concurrency` workers\n const workerCount = Math.min(this.concurrency, combinations.length);\n const workers: Promise<void>[] = [];\n for (let w = 0; w < workerCount; w++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n }\n\n private _computeStats(cells: MatrixCell[], wallClockTimeMs: number): MatrixStats {\n const totalCells = cells.length;\n if (totalCells === 0) {\n return {\n totalCells: 0,\n totalRenderTimeMs: 0,\n avgRenderTimeMs: 0,\n minRenderTimeMs: 0,\n maxRenderTimeMs: 0,\n wallClockTimeMs,\n };\n }\n\n let total = 0;\n let min = Infinity;\n let max = -Infinity;\n\n for (const cell of cells) {\n const t = cell.result.renderTimeMs;\n total += t;\n if (t < min) min = t;\n if (t > max) max = t;\n }\n\n return {\n totalCells,\n totalRenderTimeMs: total,\n avgRenderTimeMs: total / totalCells,\n minRenderTimeMs: min === Infinity ? 0 : min,\n maxRenderTimeMs: max === -Infinity ? 0 : max,\n wallClockTimeMs,\n };\n }\n}\n","/**\n * Mock provider helpers for SatoriRenderer.\n *\n * Satori renders pure React element trees to SVG — it does NOT execute hooks\n * or context providers at runtime. The functions here produce wrapper JSX\n * elements that supply minimal mock context values so that components that\n * read context don't throw during the shallow JSX-to-SVG pass.\n *\n * Because Satori only cares about the *rendered JSX shape* (not hook side\n * effects), we can safely supply stub contexts.\n */\n\nimport React from \"react\";\n\n/** Generic mock context value that satisfies most consumers. */\nconst MOCK_CONTEXT_VALUE = Object.freeze({});\n\n/**\n * Known context names → factory functions that return a React element\n * wrapping `children` with an appropriate Provider.\n *\n * Extend this map as more contexts are discovered in the codebase.\n */\nconst KNOWN_PROVIDERS: Record<\n string,\n (children: React.ReactNode, theme?: string, locale?: string) => React.ReactElement\n> = {\n ThemeContext: (children, theme = \"light\") =>\n React.createElement(\n React.createContext<{ theme: string }>({ theme }).Provider,\n { value: { theme } },\n children,\n ),\n LocaleContext: (children, _theme, locale = \"en-US\") =>\n React.createElement(\n React.createContext<{ locale: string }>({ locale }).Provider,\n { value: { locale } },\n children,\n ),\n};\n\n/**\n * Wrap a React element with mock providers for each requested context name.\n *\n * Unknown context names get a generic empty-object provider created on the\n * fly (safe, avoids crashes for components that only call `useContext` to\n * check if a value is defined).\n */\nexport function wrapWithProviders(\n element: React.ReactElement,\n requiredContexts: string[],\n options: { theme?: string; locale?: string } = {},\n): React.ReactElement {\n if (requiredContexts.length === 0) return element;\n\n // Apply providers from innermost to outermost (first in list = outermost)\n return [...requiredContexts].reverse().reduce((child, ctxName) => {\n const factory = KNOWN_PROVIDERS[ctxName];\n if (factory) {\n return factory(child, options.theme, options.locale);\n }\n // Unknown context — create a generic provider with an empty object value\n const GenericCtx = React.createContext<Record<string, unknown>>(MOCK_CONTEXT_VALUE);\n return React.createElement(GenericCtx.Provider, { value: MOCK_CONTEXT_VALUE }, child);\n }, element as React.ReactNode) as React.ReactElement;\n}\n","/**\n * Inline-style extraction utilities for SatoriRenderer.\n *\n * Satori accepts React elements with inline `style` props. This module walks\n * a React element tree and extracts those styles into the ComputedStyles map\n * that is returned as part of RenderResult.\n */\n\nimport React from \"react\";\n\n/**\n * Walk a React element tree and collect all inline `style` objects.\n *\n * The key in the returned map is a dot-delimited path describing the element's\n * position in the tree, e.g. \"root\", \"root.0\", \"root.0.1\".\n *\n * Only elements with a non-empty `style` prop are included.\n */\nexport function extractInlineStyles(\n element: React.ReactNode,\n path: string = \"root\",\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n\n if (!React.isValidElement(element)) return result;\n\n // Collect this element's own style\n const props = element.props as Record<string, unknown>;\n if (props.style && typeof props.style === \"object\" && props.style !== null) {\n const style = props.style as Record<string, unknown>;\n const stringified: Record<string, string> = {};\n for (const [k, v] of Object.entries(style)) {\n if (v !== undefined && v !== null) {\n stringified[k] = String(v);\n }\n }\n if (Object.keys(stringified).length > 0) {\n result[path] = stringified;\n }\n }\n\n // Recurse into children\n const children = props.children;\n if (children === undefined || children === null) return result;\n\n const childArray = Array.isArray(children) ? children : [children];\n childArray.forEach((child: React.ReactNode, idx: number) => {\n const childPath = `${path}.${idx}`;\n const childStyles = extractInlineStyles(child, childPath);\n Object.assign(result, childStyles);\n });\n\n return result;\n}\n","/**\n * SatoriRenderer — pure Node.js render path for simple (flexbox-only) components.\n *\n * Pipeline:\n * React element → Satori SVG → @resvg/resvg-js PNG\n *\n * Only handles components with `complexityClass: \"simple\"` as classified by\n * @agent-scope/manifest. Complex components (CSS grid, absolute positioning,\n * animations) must be rendered via the Browser Pool path.\n *\n * Target performance: ~8 ms per render at 375×812 (mobile viewport).\n */\n\nimport type { ComponentDescriptor } from \"@agent-scope/manifest\";\nimport { Resvg } from \"@resvg/resvg-js\";\nimport React from \"react\";\nimport satori from \"satori\";\nimport { loadFont } from \"./fonts.js\";\nimport { wrapWithProviders } from \"./providers.js\";\nimport { extractInlineStyles } from \"./styles.js\";\nimport type {\n CaptureOptions,\n ContainerOptions,\n ContainerType,\n RendererConfig,\n RenderResult,\n SatoriRenderOptions,\n ViewportOptions,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VIEWPORT: ViewportOptions = { width: 375, height: 812 };\n\nconst DEFAULT_CONTAINER: ContainerOptions = {\n type: \"centered\",\n padding: 16,\n background: \"#ffffff\",\n};\n\nconst DEFAULT_CAPTURE: CaptureOptions = {\n screenshot: true,\n styles: true,\n timing: true,\n};\n\n// ---------------------------------------------------------------------------\n// Container builders\n// ---------------------------------------------------------------------------\n\n/**\n * Build a container wrapper element in a style understood by Satori.\n * Satori supports a subset of CSS — primarily flexbox + box model.\n */\nfunction buildContainerStyle(\n viewport: ViewportOptions,\n container: ContainerOptions,\n): React.CSSProperties {\n const base: React.CSSProperties = {\n width: viewport.width,\n height: viewport.height,\n padding: container.padding,\n backgroundColor: container.background ?? \"#ffffff\",\n display: \"flex\",\n overflow: \"hidden\",\n };\n\n const typeStyles: Record<ContainerType, React.CSSProperties> = {\n centered: {\n alignItems: \"center\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n },\n \"flex-row\": {\n alignItems: \"flex-start\",\n justifyContent: \"flex-start\",\n flexDirection: \"row\",\n },\n \"flex-col\": {\n alignItems: \"flex-start\",\n justifyContent: \"flex-start\",\n flexDirection: \"column\",\n },\n none: {},\n };\n\n return { ...base, ...(typeStyles[container.type] ?? {}) };\n}\n\n// ---------------------------------------------------------------------------\n// SatoriRenderer\n// ---------------------------------------------------------------------------\n\n/**\n * Satori-based renderer for simple (flexbox-only) React components.\n *\n * Usage:\n * ```ts\n * const renderer = new SatoriRenderer();\n * const result = await renderer.render(\n * <Button variant=\"primary\">Click me</Button>,\n * { viewport: { width: 375, height: 200 } },\n * );\n * ```\n */\nexport class SatoriRenderer {\n private readonly config: Required<RendererConfig>;\n private fontsPromise: Promise<import(\"./types.js\").FontEntry[]> | null = null;\n\n constructor(config: RendererConfig = {}) {\n this.config = {\n fontPath: config.fontPath ?? \"\",\n fontFamily: config.fontFamily ?? \"Inter\",\n defaultViewport: config.defaultViewport ?? DEFAULT_VIEWPORT,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Font loading (lazy, cached)\n // ---------------------------------------------------------------------------\n\n /**\n * Pre-load and cache the configured font. Calling this before `render()`\n * ensures the first render isn't slowed by font I/O.\n */\n async preloadFont(): Promise<void> {\n await this._getFonts();\n }\n\n private _getFonts(): Promise<import(\"./types.js\").FontEntry[]> {\n if (!this.fontsPromise) {\n const fontPath = this.config.fontPath || undefined;\n this.fontsPromise = loadFont(fontPath, this.config.fontFamily);\n }\n return this.fontsPromise;\n }\n\n // ---------------------------------------------------------------------------\n // Core render\n // ---------------------------------------------------------------------------\n\n /**\n * Render a React element tree to PNG via Satori (SVG) → resvg-js (PNG).\n *\n * @param element - The React element to render (pre-built, not a component class).\n * @param options - Viewport, container, capture, and environment overrides.\n * @param descriptor - Optional ComponentDescriptor for provider wrapping.\n * When provided, `requiredContexts` are used to inject\n * mock providers around the element.\n */\n async render(\n element: React.ReactElement,\n options: SatoriRenderOptions = {},\n descriptor?: Pick<ComponentDescriptor, \"requiredContexts\">,\n ): Promise<RenderResult> {\n const startMs = performance.now();\n\n // Resolve options\n const viewport: ViewportOptions = {\n ...this.config.defaultViewport,\n ...options.environment?.viewport,\n ...options.viewport,\n };\n\n const container: ContainerOptions = {\n ...DEFAULT_CONTAINER,\n ...options.container,\n };\n\n const capture: CaptureOptions = {\n ...DEFAULT_CAPTURE,\n ...options.capture,\n };\n\n // Wrap with mock providers if descriptor provided\n const requiredContexts = descriptor?.requiredContexts ?? [];\n const wrappedElement = wrapWithProviders(element, requiredContexts, {\n theme: options.environment?.theme,\n locale: options.environment?.locale,\n });\n\n // Extract computed styles before rendering (from the element tree)\n const computedStyles = capture.styles ? extractInlineStyles(wrappedElement) : {};\n\n // Build the top-level container element Satori will render\n const containerStyle = buildContainerStyle(viewport, container);\n const rootElement = React.createElement(\"div\", { style: containerStyle }, wrappedElement);\n\n // Load fonts\n const fonts = await this._getFonts();\n\n // Satori: React element → SVG string\n const svg = await satori(rootElement, {\n width: viewport.width,\n height: viewport.height,\n fonts: fonts.map((f) => ({\n name: f.name,\n data: f.data,\n weight: f.weight,\n style: f.style,\n })),\n });\n\n // resvg-js: SVG string → PNG Buffer\n let screenshot = Buffer.alloc(0);\n if (capture.screenshot) {\n const resvg = new Resvg(svg, {\n fitTo: { mode: \"width\", value: viewport.width },\n });\n const rendered = resvg.render();\n screenshot = Buffer.from(rendered.asPng());\n }\n\n const renderTimeMs = capture.timing ? performance.now() - startMs : 0;\n\n return {\n screenshot,\n width: viewport.width,\n height: viewport.height,\n renderTimeMs,\n computedStyles,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Convenience: render with explicit viewport\n // ---------------------------------------------------------------------------\n\n /**\n * Render at a specific viewport size. Shorthand for `render(el, { viewport })`.\n */\n async renderAt(\n element: React.ReactElement,\n width: number,\n height: number,\n descriptor?: Pick<ComponentDescriptor, \"requiredContexts\">,\n ): Promise<RenderResult> {\n return this.render(element, { viewport: { width, height } }, descriptor);\n }\n}\n","/**\n * SpriteSheetGenerator — composites a MatrixResult into a single PNG sprite sheet.\n *\n * Layout:\n * - Rows correspond to the last matrix axis values.\n * - Columns correspond to all remaining axis combinations.\n * - Axis labels are rendered on the top (column labels) and left (row labels) edges.\n * - Cell borders and padding separate each cell visually.\n *\n * Returns:\n * - A single PNG Buffer containing the full composite image.\n * - A `CellCoordinateMap` for programmatic access to individual cell positions.\n */\n\nimport sharp from \"sharp\";\nimport type { MatrixResult } from \"./matrix.js\";\n\n// ---------------------------------------------------------------------------\n// Coordinate map\n// ---------------------------------------------------------------------------\n\n/**\n * The pixel bounding box of a single cell within the sprite sheet.\n */\nexport interface CellBounds {\n /** Left edge in pixels (from sprite sheet origin). */\n x: number;\n /** Top edge in pixels (from sprite sheet origin). */\n y: number;\n /** Cell width in pixels (content only, excluding padding). */\n width: number;\n /** Cell height in pixels (content only, excluding padding). */\n height: number;\n}\n\n/**\n * Maps each cell's flat index to its pixel position in the sprite sheet.\n * Access via `coordinates[cellIndex]`.\n */\nexport type CellCoordinateMap = CellBounds[];\n\n// ---------------------------------------------------------------------------\n// Result\n// ---------------------------------------------------------------------------\n\n/**\n * The output of `SpriteSheetGenerator.generate()`.\n */\nexport interface SpriteSheetResult {\n /** Full composite PNG as a Buffer. */\n png: Buffer;\n /** Per-cell bounding boxes within the composite image. */\n coordinates: CellCoordinateMap;\n /** Total sprite sheet width in pixels. */\n width: number;\n /** Total sprite sheet height in pixels. */\n height: number;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/**\n * Configuration for `SpriteSheetGenerator`.\n */\nexport interface SpriteSheetOptions {\n /** Padding in pixels around each cell. @default 8 */\n cellPadding?: number;\n /** Border thickness in pixels between cells. @default 1 */\n borderWidth?: number;\n /** Background colour as a CSS hex string. @default \"#f5f5f5\" */\n background?: string;\n /** Border colour as a CSS hex string. @default \"#cccccc\" */\n borderColor?: string;\n /** Height in pixels reserved for column axis labels at the top. @default 32 */\n labelHeight?: number;\n /** Width in pixels reserved for row axis labels on the left. @default 80 */\n labelWidth?: number;\n /** DPI for axis label text rendering. @default 72 */\n labelDpi?: number;\n /** Label text colour (hex). @default \"#333333\" */\n labelColor?: string;\n /** Label area background colour (hex). @default \"#e8e8e8\" */\n labelBackground?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal resolved options\n// ---------------------------------------------------------------------------\n\ninterface ResolvedOptions {\n cellPadding: number;\n borderWidth: number;\n background: string;\n borderColor: string;\n labelHeight: number;\n labelWidth: number;\n labelDpi: number;\n labelBackground: string;\n}\n\nfunction resolveOptions(opts: SpriteSheetOptions): ResolvedOptions {\n return {\n cellPadding: opts.cellPadding ?? 8,\n borderWidth: opts.borderWidth ?? 1,\n background: opts.background ?? \"#f5f5f5\",\n borderColor: opts.borderColor ?? \"#cccccc\",\n labelHeight: opts.labelHeight ?? 32,\n labelWidth: opts.labelWidth ?? 80,\n labelDpi: opts.labelDpi ?? 72,\n labelBackground: opts.labelBackground ?? \"#e8e8e8\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Colour parsing helper\n// ---------------------------------------------------------------------------\n\n/** Parse a CSS hex colour string into { r, g, b } components. */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number; alpha: number } {\n const cleaned = hex.replace(/^#/, \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n return {\n r: Number.isNaN(r) ? 0 : r,\n g: Number.isNaN(g) ? 0 : g,\n b: Number.isNaN(b) ? 0 : b,\n alpha: 1,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: draw a solid-colour rectangle as a PNG buffer\n// ---------------------------------------------------------------------------\n\nasync function makeRect(width: number, height: number, color: string): Promise<Buffer> {\n const bg = hexToRgb(color);\n return sharp({\n create: { width: Math.max(1, width), height: Math.max(1, height), channels: 4, background: bg },\n })\n .png()\n .toBuffer();\n}\n\n// ---------------------------------------------------------------------------\n// Internal: render a text label as a PNG buffer\n// ---------------------------------------------------------------------------\n\nasync function makeLabelPng(\n text: string,\n width: number,\n height: number,\n dpi: number,\n bgColor: string,\n): Promise<Buffer> {\n const w = Math.max(1, width);\n const h = Math.max(1, height);\n const bg = await makeRect(w, h, bgColor);\n\n // Truncate label to reasonable length before rendering\n const maxChars = Math.max(1, Math.floor(w / 7));\n const displayText = text.length > maxChars ? `${text.slice(0, maxChars - 1)}…` : text;\n\n let textBuf: Buffer | null = null;\n try {\n textBuf = await sharp({\n text: {\n text: displayText,\n font: \"Sans\",\n width: w - 4,\n height: h - 4,\n dpi,\n rgba: true,\n align: \"centre\" as const,\n },\n })\n .png()\n .toBuffer();\n } catch {\n return bg;\n }\n\n const textMeta = await sharp(textBuf).metadata();\n const textW = textMeta.width ?? 0;\n const textH = textMeta.height ?? 0;\n const left = Math.max(0, Math.floor((w - textW) / 2));\n const top = Math.max(0, Math.floor((h - textH) / 2));\n\n return sharp(bg)\n .composite([{ input: textBuf, top, left, blend: \"over\" }])\n .png()\n .toBuffer();\n}\n\n// ---------------------------------------------------------------------------\n// SpriteSheetGenerator\n// ---------------------------------------------------------------------------\n\n/**\n * Composites a `MatrixResult` into a single PNG sprite sheet.\n *\n * Usage:\n * ```ts\n * const gen = new SpriteSheetGenerator({ cellPadding: 12 });\n * const { png, coordinates } = await gen.generate(matrixResult);\n * ```\n */\nexport class SpriteSheetGenerator {\n private readonly opts: ResolvedOptions;\n\n constructor(options: SpriteSheetOptions = {}) {\n this.opts = resolveOptions(options);\n }\n\n // ---------------------------------------------------------------------------\n // Public: generate\n // ---------------------------------------------------------------------------\n\n /**\n * Generate a sprite sheet from a `MatrixResult`.\n *\n * Grid layout:\n * - Rows = last axis cardinality\n * - Cols = product of all other axis cardinalities (or 1 if single axis)\n *\n * @param matrixResult - The result of `RenderMatrix.render()`.\n */\n async generate(matrixResult: MatrixResult): Promise<SpriteSheetResult> {\n const { cells, rows, cols, axisLabels } = matrixResult;\n\n if (cells.length === 0) {\n throw new Error(\"Cannot generate sprite sheet from empty MatrixResult\");\n }\n\n const opts = this.opts;\n\n // Determine cell dimensions from the first cell's render result\n const firstCell = cells[0];\n if (!firstCell) {\n throw new Error(\"Cannot generate sprite sheet from empty MatrixResult\");\n }\n const cellContentWidth = firstCell.result.width;\n const cellContentHeight = firstCell.result.height;\n\n // Slot dimensions (content + padding on all sides + border)\n const slotWidth = cellContentWidth + opts.cellPadding * 2 + opts.borderWidth;\n const slotHeight = cellContentHeight + opts.cellPadding * 2 + opts.borderWidth;\n\n // Full sprite sheet dimensions\n const gridWidth = cols * slotWidth + opts.borderWidth;\n const gridHeight = rows * slotHeight + opts.borderWidth;\n const totalWidth = opts.labelWidth + gridWidth;\n const totalHeight = opts.labelHeight + gridHeight;\n\n // ---------------------------------------------------------------------------\n // Build composite operations list\n // ---------------------------------------------------------------------------\n const compositeOps: sharp.OverlayOptions[] = [];\n\n // ---------------------------------------------------------------------------\n // Label area backgrounds\n // ---------------------------------------------------------------------------\n const topLabelBg = await makeRect(totalWidth, opts.labelHeight, opts.labelBackground);\n compositeOps.push({ input: topLabelBg, top: 0, left: 0 });\n\n const leftLabelBg = await makeRect(opts.labelWidth, totalHeight, opts.labelBackground);\n compositeOps.push({ input: leftLabelBg, top: 0, left: 0 });\n\n // ---------------------------------------------------------------------------\n // Border lines\n // ---------------------------------------------------------------------------\n for (let c = 0; c <= cols; c++) {\n const x = opts.labelWidth + c * slotWidth;\n const borderLine = await makeRect(opts.borderWidth, gridHeight, opts.borderColor);\n compositeOps.push({ input: borderLine, top: opts.labelHeight, left: x });\n }\n\n for (let r = 0; r <= rows; r++) {\n const y = opts.labelHeight + r * slotHeight;\n const borderLine = await makeRect(gridWidth, opts.borderWidth, opts.borderColor);\n compositeOps.push({ input: borderLine, top: y, left: opts.labelWidth });\n }\n\n // Separator between label areas and grid\n const vSep = await makeRect(opts.borderWidth, totalHeight, opts.borderColor);\n compositeOps.push({\n input: vSep,\n top: 0,\n left: Math.max(0, opts.labelWidth - opts.borderWidth),\n });\n const hSep = await makeRect(totalWidth, opts.borderWidth, opts.borderColor);\n compositeOps.push({\n input: hSep,\n top: Math.max(0, opts.labelHeight - opts.borderWidth),\n left: 0,\n });\n\n // ---------------------------------------------------------------------------\n // Column labels (top edge)\n // ---------------------------------------------------------------------------\n const axisCount = matrixResult.axes.length;\n const colLabels: string[] = [];\n\n for (let c = 0; c < cols; c++) {\n if (axisCount === 1) {\n colLabels.push(axisLabels[0]?.[c] ?? String(c));\n } else {\n const cellAtCol = cells[c * rows];\n if (cellAtCol) {\n const parts: string[] = [];\n for (let ai = 0; ai < axisCount - 1; ai++) {\n const axis = matrixResult.axes[ai];\n if (axis) {\n parts.push(`${axis.name}=${axisLabels[ai]?.[cellAtCol.axisIndices[ai] ?? 0] ?? \"?\"}`);\n }\n }\n colLabels.push(parts.join(\", \"));\n } else {\n colLabels.push(String(c));\n }\n }\n }\n\n for (let c = 0; c < cols; c++) {\n const labelBuf = await makeLabelPng(\n colLabels[c] ?? String(c),\n slotWidth,\n opts.labelHeight,\n opts.labelDpi,\n opts.labelBackground,\n );\n compositeOps.push({\n input: labelBuf,\n top: 0,\n left: opts.labelWidth + c * slotWidth,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Row labels (left edge)\n // ---------------------------------------------------------------------------\n const lastAxisLabels = axisLabels[matrixResult.axes.length - 1] ?? [];\n for (let r = 0; r < rows; r++) {\n const labelBuf = await makeLabelPng(\n lastAxisLabels[r] ?? String(r),\n opts.labelWidth,\n slotHeight,\n opts.labelDpi,\n opts.labelBackground,\n );\n compositeOps.push({\n input: labelBuf,\n top: opts.labelHeight + r * slotHeight,\n left: 0,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Cell screenshots\n // ---------------------------------------------------------------------------\n const coordinateMap: CellCoordinateMap = new Array(cells.length) as CellCoordinateMap;\n\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (!cell) continue;\n\n const col = Math.floor(i / rows);\n const row = i % rows;\n\n const slotLeft = opts.labelWidth + col * slotWidth + opts.borderWidth;\n const slotTop = opts.labelHeight + row * slotHeight + opts.borderWidth;\n const contentLeft = slotLeft + opts.cellPadding;\n const contentTop = slotTop + opts.cellPadding;\n\n coordinateMap[i] = {\n x: contentLeft,\n y: contentTop,\n width: cellContentWidth,\n height: cellContentHeight,\n };\n\n if (cell.result.screenshot.length > 0) {\n let cellPng: Buffer;\n try {\n cellPng = await sharp(cell.result.screenshot)\n .resize(cellContentWidth, cellContentHeight, { fit: \"fill\" })\n .png()\n .toBuffer();\n } catch {\n cellPng = await makeRect(cellContentWidth, cellContentHeight, \"#ffffff\");\n }\n\n compositeOps.push({\n input: cellPng,\n top: contentTop,\n left: contentLeft,\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Create base canvas and composite everything\n // ---------------------------------------------------------------------------\n const bg = hexToRgb(opts.background);\n const png = await sharp({\n create: {\n width: totalWidth,\n height: totalHeight,\n channels: 4,\n background: bg,\n },\n })\n .composite(compositeOps)\n .png()\n .toBuffer();\n\n return {\n png,\n coordinates: coordinateMap,\n width: totalWidth,\n height: totalHeight,\n };\n }\n}\n","/**\n * Content Stress Presets — edge-case prop values for use as RenderMatrix axes.\n *\n * Each preset category provides an array of values (of a specific type) that\n * exercise boundary and edge-case conditions: empty input, overflow text,\n * bidirectional text, numeric extremes, empty/huge lists, broken image URLs, etc.\n *\n * Usage:\n * ```ts\n * import { stressAxis } from \"@agent-scope/render\";\n *\n * const matrix = new RenderMatrix(renderer, [\n * stressAxis(\"text.short\"),\n * { name: \"disabled\", values: [false, true] },\n * ]);\n * ```\n */\n\n// ---------------------------------------------------------------------------\n// Category identifier type\n// ---------------------------------------------------------------------------\n\n/**\n * All built-in stress preset categories.\n *\n * | ID | Description |\n * |-----------------|----------------------------------------------------------|\n * | text.short | Empty string, single char, short word |\n * | text.long | 200+ character strings, repeated words, lorem ipsum |\n * | text.unicode | CJK ideographs, diacritics, emoji, zero-width chars |\n * | text.rtl | Arabic and Hebrew strings |\n * | number.edge | 0, -1, NaN, Infinity, -Infinity, 999999, MAX_SAFE_INT |\n * | list.count | Lists with 0, 1, 3, 10, 100, 1000 items |\n * | image.states | null URL, broken URL, 1×1 data URI, very large image URL |\n */\nexport type StressCategoryId =\n | \"text.short\"\n | \"text.long\"\n | \"text.unicode\"\n | \"text.rtl\"\n | \"number.edge\"\n | \"list.count\"\n | \"image.states\";\n\n// ---------------------------------------------------------------------------\n// Preset descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * A named set of stress values for a specific data category.\n */\nexport interface StressPreset<T = unknown> {\n /** Stable category identifier. */\n id: StressCategoryId;\n /** Short human-readable label (used as axis name). */\n label: string;\n /** Human-readable description of what this preset exercises. */\n description: string;\n /** The stress values. */\n values: T[];\n /** Labels parallel to `values` for display in sprite sheets. */\n valueLabels: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Preset definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Short text values: empty string, whitespace-only, single char, typical word.\n */\nconst SHORT_TEXT_VALUES = [\"\", \" \", \"A\", \"OK\", \"Hello\", \"Submit\", \"Cancel\"];\nconst SHORT_TEXT_LABELS = [\n \"empty\",\n \"space\",\n \"single-char\",\n \"2-char\",\n \"5-char\",\n \"6-char\",\n \"6-char-2\",\n];\n\n/**\n * Long text values: 50, 100, 200, 500 character strings + hyphenation stress.\n */\nconst LONG_TEXT_VALUES = [\n \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.\",\n \"The quick brown fox jumps over the lazy dog. \".repeat(3).trimEnd(),\n \"A very long label that contains many words and will likely overflow any container that does not handle text overflow properly in some manner or another.\",\n \"supercalifragilisticexpialidocious-pneumonoultramicroscopicsilicovolcanoconiosis-antidisestablishmentarianism\",\n \"Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n];\nconst LONG_TEXT_LABELS = [\"80-chars\", \"3x-sentence\", \"200-chars\", \"long-words\", \"100-a-chars\"];\n\n/**\n * Unicode stress: CJK, diacritics, emoji, zero-width joiners, right-to-left marks.\n */\nconst UNICODE_TEXT_VALUES = [\n \"日本語テキスト\",\n \"中文内容\",\n \"한국어 텍스트\",\n \"Héllo Wörld — café naïve résumé\",\n \"Ñoño señor\",\n \"👋 Hello 🌍\",\n \"🏳️‍🌈 🎉 💡 🚀 ✅\",\n \"a\\u200Bb\\u200Bc\", // Zero-width space\n \"\\u202Eflipped text\\u202C\", // Right-to-left override\n];\nconst UNICODE_TEXT_LABELS = [\n \"japanese\",\n \"chinese\",\n \"korean\",\n \"diacritics\",\n \"tilde-n\",\n \"emoji-basic\",\n \"emoji-complex\",\n \"zero-width\",\n \"rtl-override\",\n];\n\n/**\n * RTL text values: Arabic and Hebrew.\n */\nconst RTL_TEXT_VALUES = [\n \"مرحبا بالعالم\", // Arabic: Hello World\n \"النص العربي الطويل جداً الذي يمتد عبر أسطر متعددة\", // Arabic long\n \"שלום עולם\", // Hebrew: Hello World\n \"זהו טקסט עברי ארוך שמתפרס על פני כמה שורות\", // Hebrew long\n \"مرحباً \\u200F hello\", // Arabic mixed with LTR\n];\nconst RTL_TEXT_LABELS = [\n \"arabic-short\",\n \"arabic-long\",\n \"hebrew-short\",\n \"hebrew-long\",\n \"arabic-mixed\",\n];\n\n/**\n * Numeric edge cases.\n */\nconst NUMBER_EDGE_VALUES: number[] = [\n 0,\n -0,\n 1,\n -1,\n NaN,\n Infinity,\n -Infinity,\n 999_999,\n Number.MAX_SAFE_INTEGER,\n Number.MIN_SAFE_INTEGER,\n Number.EPSILON,\n];\nconst NUMBER_EDGE_LABELS = [\n \"zero\",\n \"neg-zero\",\n \"one\",\n \"neg-one\",\n \"NaN\",\n \"+Infinity\",\n \"-Infinity\",\n \"999999\",\n \"MAX_SAFE_INT\",\n \"MIN_SAFE_INT\",\n \"EPSILON\",\n];\n\n/**\n * List count presets: produce arrays of increasing lengths.\n * Values are arrays; the consumer is responsible for rendering them.\n */\nfunction makeList(count: number): string[] {\n if (count === 0) return [];\n return Array.from({ length: count }, (_, i) => `Item ${i + 1}`);\n}\n\nconst LIST_COUNT_VALUES: string[][] = [\n makeList(0),\n makeList(1),\n makeList(3),\n makeList(10),\n makeList(100),\n makeList(1000),\n];\nconst LIST_COUNT_LABELS = [\n \"empty-list\",\n \"1-item\",\n \"3-items\",\n \"10-items\",\n \"100-items\",\n \"1000-items\",\n];\n\n/**\n * Image states: null / missing / broken / tiny / normal / huge.\n */\ntype ImageState = string | null;\n\nconst IMAGE_STATE_VALUES: ImageState[] = [\n null,\n \"\",\n \"https://broken.invalid/image.png\",\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==\", // 1×1 transparent PNG\n \"https://picsum.photos/200/200\",\n \"https://picsum.photos/4000/4000\",\n];\nconst IMAGE_STATE_LABELS = [\n \"null\",\n \"empty-string\",\n \"broken-url\",\n \"1x1-data-uri\",\n \"200x200\",\n \"4000x4000\",\n];\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst STRESS_PRESETS: Record<StressCategoryId, StressPreset> = {\n \"text.short\": {\n id: \"text.short\",\n label: \"Short Text\",\n description: \"Empty, whitespace-only, single-char, and short-word string values.\",\n values: SHORT_TEXT_VALUES,\n valueLabels: SHORT_TEXT_LABELS,\n },\n \"text.long\": {\n id: \"text.long\",\n label: \"Long Text\",\n description: \"200+ character strings designed to overflow containers.\",\n values: LONG_TEXT_VALUES,\n valueLabels: LONG_TEXT_LABELS,\n },\n \"text.unicode\": {\n id: \"text.unicode\",\n label: \"Unicode Text\",\n description: \"CJK ideographs, diacritics, emoji, and zero-width characters.\",\n values: UNICODE_TEXT_VALUES,\n valueLabels: UNICODE_TEXT_LABELS,\n },\n \"text.rtl\": {\n id: \"text.rtl\",\n label: \"RTL Text\",\n description: \"Arabic and Hebrew strings for bidi text rendering.\",\n values: RTL_TEXT_VALUES,\n valueLabels: RTL_TEXT_LABELS,\n },\n \"number.edge\": {\n id: \"number.edge\",\n label: \"Edge Numbers\",\n description: \"0, -1, NaN, ±Infinity, MAX_SAFE_INTEGER, and other numeric extremes.\",\n values: NUMBER_EDGE_VALUES,\n valueLabels: NUMBER_EDGE_LABELS,\n },\n \"list.count\": {\n id: \"list.count\",\n label: \"List Count\",\n description: \"Arrays of 0, 1, 3, 10, 100, and 1000 items.\",\n values: LIST_COUNT_VALUES,\n valueLabels: LIST_COUNT_LABELS,\n },\n \"image.states\": {\n id: \"image.states\",\n label: \"Image States\",\n description: \"null, empty string, broken URL, 1×1 data URI, and large image URLs.\",\n values: IMAGE_STATE_VALUES,\n valueLabels: IMAGE_STATE_LABELS,\n },\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Retrieve a stress preset by category ID.\n *\n * @throws if the ID is not recognised.\n */\nexport function getStressPreset(id: StressCategoryId): StressPreset {\n const preset = STRESS_PRESETS[id];\n if (!preset) throw new Error(`Unknown stress preset category: \"${id}\"`);\n return preset;\n}\n\n/**\n * Retrieve multiple stress presets.\n */\nexport function getStressPresets(ids: StressCategoryId[]): StressPreset[] {\n return ids.map((id) => getStressPreset(id));\n}\n\n/** All built-in stress presets as an ordered array. */\nexport const ALL_STRESS_PRESETS: StressPreset[] = Object.values(STRESS_PRESETS);\n\n/** All stress category IDs. */\nexport const ALL_STRESS_IDS: StressCategoryId[] = Object.keys(STRESS_PRESETS) as StressCategoryId[];\n\n/**\n * Returns a `MatrixAxis`-compatible object for direct use in `RenderMatrix`.\n *\n * ```ts\n * const matrix = new RenderMatrix(renderer, [\n * stressAxis(\"text.short\"),\n * { name: \"disabled\", values: [false, true] },\n * ]);\n * ```\n */\nexport function stressAxis(id: StressCategoryId): { name: string; values: unknown[] } {\n const preset = getStressPreset(id);\n return {\n name: preset.label,\n values: preset.values,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/browser-pool.ts","../src/contexts.ts","../src/errors.ts","../src/fonts.ts","../src/matrix.ts","../src/providers.ts","../src/styles.ts","../src/satori.ts","../src/sprite-sheet.ts","../src/stress.ts"],"names":["React"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BrowserPool — Playwright-based browser pool for complex component rendering.\n *\n * ## Design\n *\n * The pool manages N browser instances, each owning M page contexts. Pages are\n * pre-loaded ONCE with a skeleton HTML that includes:\n * - A full React provider tree\n * - CSS / font links\n * - A component registry\n *\n * Components are swapped in via `window.__renderComponent(name, props)` — no\n * page navigation between renders. This \"inject-don't-navigate\" pattern keeps\n * pages warm and avoids expensive browser startup on every render.\n *\n * ## Concurrency\n *\n * `acquire()` checks out a free `PageSlot`. When all slots are busy, callers\n * queue and are resumed FIFO once a slot becomes available.\n * `release(slot)` returns a slot to the pool and wakes the next waiter.\n *\n * ## Shutdown\n *\n * `close()` drains all in-flight renders (waits for in-use slots) then closes\n * every browser gracefully.\n */\n\nimport type { Browser, Page } from \"playwright\";\nimport { chromium } from \"playwright\";\nimport type {\n BrowserPoolConfig,\n DOMNode,\n PageSlot,\n PoolSizeConfig,\n RenderOptions,\n RenderResult,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Chrome flags for headless CI\n// ---------------------------------------------------------------------------\n\nconst CHROMIUM_ARGS: string[] = [\n \"--headless=new\",\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--no-sandbox\",\n \"--no-zygote\",\n \"--disable-extensions\",\n \"--disable-background-networking\",\n \"--disable-sync\",\n \"--hide-scrollbars\",\n \"--mute-audio\",\n \"--font-render-hinting=none\",\n];\n\n// ---------------------------------------------------------------------------\n// Pool preset sizes\n// ---------------------------------------------------------------------------\n\nconst PRESET_SIZES: Record<string, PoolSizeConfig> = {\n local: { browsers: 1, pagesPerBrowser: 5 },\n \"ci-standard\": { browsers: 3, pagesPerBrowser: 15 },\n \"ci-large\": { browsers: 6, pagesPerBrowser: 20 },\n};\n\n// ---------------------------------------------------------------------------\n// Skeleton HTML injected into each page\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the skeleton HTML string that pre-loads the provider/registry\n * scaffolding for a warm page context.\n *\n * In production this would bundle the real component registry; for\n * the render engine we keep it minimal and let the caller supply the\n * actual component via `window.__renderComponent`.\n */\nfunction buildSkeletonHtml(viewportWidth: number, _viewportHeight: number): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=${viewportWidth}, initial-scale=1.0\" />\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n body { margin: 0; padding: 0; font-family: system-ui, sans-serif; }\n #scope-root { display: inline-block; }\n </style>\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n <script>\n // Component registry — populated lazily by inject calls\n window.__componentRegistry = {};\n\n // Render state\n window.__renderReady = false;\n window.__renderError = null;\n\n /**\n * Swap in a component by name.\n * @param {string} name - component name key in __componentRegistry\n * @param {object} props - serialised props object\n */\n window.__renderComponent = function(name, props) {\n window.__renderReady = false;\n window.__renderError = null;\n\n var root = document.getElementById(\"scope-root\");\n if (!root) {\n window.__renderError = \"scope-root element not found\";\n window.__renderReady = true;\n return;\n }\n\n var factory = window.__componentRegistry[name];\n if (!factory) {\n // Fallback: render a placeholder div so screenshots still work\n root.innerHTML = \"<div data-placeholder=\\\\\"\" + name + \"\\\\\" style=\\\\\"padding:8px;border:1px dashed #ccc\\\\\">\" + name + \"</div>\";\n window.__renderReady = true;\n return;\n }\n\n try {\n factory(root, props || {});\n } catch (err) {\n window.__renderError = err instanceof Error ? err.message : String(err);\n root.innerHTML = \"<div data-render-error style=\\\\\"color:red\\\\\">\" + window.__renderError + \"</div>\";\n window.__renderReady = true;\n }\n };\n\n /**\n * Register a component factory.\n * @param {string} name\n * @param {function(HTMLElement, object): void} factory\n */\n window.__registerComponent = function(name, factory) {\n window.__componentRegistry[name] = factory;\n };\n\n // Signal that the skeleton is ready (not a component render yet)\n window.__skeletonReady = true;\n </script>\n</body>\n</html>`;\n}\n\n// ---------------------------------------------------------------------------\n// DOM extraction helper\n// ---------------------------------------------------------------------------\n\n/** Recursively walks the live DOM inside the page and returns a DOMNode tree. */\nasync function extractDomTree(\n page: Page,\n selector: string,\n): Promise<{ tree: DOMNode; elementCount: number }> {\n const result = await page.evaluate((sel: string) => {\n let count = 0;\n\n function walk(node: Element | ChildNode): {\n tag: string;\n attrs: Record<string, string>;\n text?: string;\n children: ReturnType<typeof walk>[];\n } {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent?.trim();\n return { tag: \"#text\", attrs: {}, text: text ?? \"\", children: [] };\n }\n\n const el = node as Element;\n count++;\n const attrs: Record<string, string> = {};\n for (const attr of Array.from(el.attributes)) {\n attrs[attr.name] = attr.value;\n }\n const children = Array.from(el.childNodes)\n .filter(\n (n) =>\n n.nodeType === Node.ELEMENT_NODE ||\n (n.nodeType === Node.TEXT_NODE && (n.textContent?.trim() ?? \"\").length > 0),\n )\n .map(walk);\n return { tag: el.tagName.toLowerCase(), attrs, children };\n }\n\n const root = document.querySelector(sel);\n if (!root) {\n return { tree: { tag: \"div\", attrs: {}, children: [] }, elementCount: 0 };\n }\n const tree = walk(root);\n return { tree, elementCount: count };\n }, selector);\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool\n// ---------------------------------------------------------------------------\n\n/**\n * Manages a pool of Playwright browser instances and page contexts for\n * rendering complex React components.\n */\nexport class BrowserPool {\n private readonly config: Required<BrowserPoolConfig>;\n private readonly sizeConfig: PoolSizeConfig;\n\n private browsers: Browser[] = [];\n private slots: PageSlot[] = [];\n private waiters: Array<(slot: PageSlot) => void> = [];\n private closed = false;\n private initialized = false;\n\n constructor(config: BrowserPoolConfig = {}) {\n const viewportWidth = config.viewportWidth ?? 1440;\n const viewportHeight = config.viewportHeight ?? 900;\n const acquireTimeoutMs = config.acquireTimeoutMs ?? 30_000;\n const deviceScaleFactor = config.deviceScaleFactor ?? 2;\n const preset = config.preset ?? \"local\";\n\n this.config = {\n preset,\n size: config.size ?? { browsers: 1, pagesPerBrowser: 5 },\n viewportWidth,\n viewportHeight,\n deviceScaleFactor,\n acquireTimeoutMs,\n };\n\n // Resolve effective size: explicit size > preset > default\n if (config.size) {\n this.sizeConfig = config.size;\n } else {\n this.sizeConfig = PRESET_SIZES[preset] ??\n PRESET_SIZES.local ?? { browsers: 1, pagesPerBrowser: 5 };\n }\n }\n\n // -------------------------------------------------------------------------\n // Initialisation\n // -------------------------------------------------------------------------\n\n /**\n * Launch all browser instances and pre-load every page with the skeleton HTML.\n * Must be called before `render()`.\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n this.initialized = true;\n\n const { browsers: browserCount, pagesPerBrowser } = this.sizeConfig;\n const skeleton = buildSkeletonHtml(this.config.viewportWidth, this.config.viewportHeight);\n\n for (let b = 0; b < browserCount; b++) {\n const browser = await chromium.launch({ args: CHROMIUM_ARGS });\n this.browsers.push(browser);\n\n for (let p = 0; p < pagesPerBrowser; p++) {\n const page = await browser.newPage({\n viewport: { width: this.config.viewportWidth, height: this.config.viewportHeight },\n deviceScaleFactor: this.config.deviceScaleFactor,\n });\n\n // Pre-load skeleton — this is the ONLY navigation this page ever does\n await page.setContent(skeleton, { waitUntil: \"load\" });\n\n const index = this.slots.length;\n this.slots.push({ page, inUse: false, index });\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Slot management\n // -------------------------------------------------------------------------\n\n /**\n * Acquire a free page slot. Blocks until one is available or\n * `acquireTimeoutMs` is exceeded.\n */\n async acquire(): Promise<PageSlot> {\n if (this.closed) throw new Error(\"BrowserPool is closed\");\n\n const free = this.slots.find((s) => !s.inUse);\n if (free) {\n free.inUse = true;\n return free;\n }\n\n // All slots busy — enqueue a waiter\n return new Promise<PageSlot>((resolve, reject) => {\n const timer = setTimeout(() => {\n const idx = this.waiters.indexOf(wakeUp);\n if (idx !== -1) this.waiters.splice(idx, 1);\n reject(\n new Error(`BrowserPool.acquire() timed out after ${this.config.acquireTimeoutMs}ms`),\n );\n }, this.config.acquireTimeoutMs);\n\n const wakeUp = (slot: PageSlot) => {\n clearTimeout(timer);\n resolve(slot);\n };\n this.waiters.push(wakeUp);\n });\n }\n\n /**\n * Return a page slot to the pool. Wakes the next queued waiter, if any.\n */\n release(slot: PageSlot): void {\n if (!slot.inUse) return; // already released\n slot.inUse = false;\n\n const next = this.waiters.shift();\n if (next) {\n slot.inUse = true;\n next(slot);\n }\n }\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n /**\n * Render a component by name with the given props and return a `RenderResult`.\n *\n * The inject-don't-navigate pattern is used:\n * 1. Acquire a warm page slot.\n * 2. Call `window.__renderComponent(name, props)` — no navigation.\n * 3. Wait for `window.__renderReady`.\n * 4. Clip screenshot to the component bounding box.\n * 5. Optionally capture DOM, styles, console output, and a11y info.\n * 6. Release the slot.\n */\n async render(\n componentName: string,\n props: Record<string, unknown> = {},\n options: RenderOptions = {},\n ): Promise<RenderResult> {\n if (!this.initialized) {\n throw new Error(\"BrowserPool.init() must be called before render()\");\n }\n if (this.closed) {\n throw new Error(\"BrowserPool is closed\");\n }\n\n const captureStyles = options.captureStyles ?? true;\n const captureConsole = options.captureConsole ?? false;\n const captureDom = options.captureDom ?? false;\n const captureA11y = options.captureA11y ?? false;\n const timeoutMs = options.timeoutMs ?? 10_000;\n\n const consoleErrors: string[] = [];\n const consoleWarnings: string[] = [];\n const consoleLogs: string[] = [];\n\n const slot = await this.acquire();\n const { page } = slot;\n\n // Attach console listener if requested\n const consoleHandler = captureConsole\n ? (msg: import(\"playwright\").ConsoleMessage) => {\n const text = msg.text();\n if (msg.type() === \"error\") consoleErrors.push(text);\n else if (msg.type() === \"warning\") consoleWarnings.push(text);\n else consoleLogs.push(text);\n }\n : null;\n\n if (consoleHandler) page.on(\"console\", consoleHandler);\n\n const startTime = Date.now();\n\n try {\n // Inject the component — NO page navigation\n await page.evaluate(\n ({ name, componentProps }: { name: string; componentProps: Record<string, unknown> }) => {\n (\n window as Window & {\n __renderComponent?: (n: string, p: Record<string, unknown>) => void;\n }\n ).__renderComponent?.(name, componentProps);\n },\n { name: componentName, componentProps: props },\n );\n\n // Wait for render to complete\n await page.waitForFunction(\n () => {\n return (window as Window & { __renderReady?: boolean }).__renderReady === true;\n },\n { timeout: timeoutMs },\n );\n\n // Check for render error\n const renderError = await page.evaluate(() => {\n return (window as Window & { __renderError?: string | null }).__renderError ?? null;\n });\n\n if (renderError) {\n throw new Error(`Component render error: ${renderError}`);\n }\n\n const renderTimeMs = Date.now() - startTime;\n\n // ----- Bounding box + clipped screenshot -----\n const rootLocator = page.locator(\"[data-reactscope-root]\");\n const boundingBox = await rootLocator.boundingBox();\n\n if (!boundingBox || boundingBox.width === 0 || boundingBox.height === 0) {\n throw new Error(`Component \"${componentName}\" rendered with zero bounding box`);\n }\n\n // Screenshot clipped to the component bounding box ONLY\n const screenshot = await page.screenshot({\n clip: {\n x: boundingBox.x,\n y: boundingBox.y,\n width: boundingBox.width,\n height: boundingBox.height,\n },\n type: \"png\",\n });\n\n // ----- Computed styles -----\n const computedStyles: Record<string, Record<string, string>> = {};\n if (captureStyles) {\n const styles = await page.evaluate((sel: string) => {\n const el = document.querySelector(sel);\n if (!el) return {} as Record<string, string>;\n const computed = window.getComputedStyle(el);\n const snapshot: Record<string, string> = {};\n // Capture a useful subset of computed properties\n const PROPS = [\n \"display\",\n \"flexDirection\",\n \"flexWrap\",\n \"alignItems\",\n \"justifyContent\",\n \"gridTemplateColumns\",\n \"gridTemplateRows\",\n \"position\",\n \"width\",\n \"height\",\n \"margin\",\n \"padding\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"fontWeight\",\n \"lineHeight\",\n \"borderRadius\",\n \"boxShadow\",\n \"opacity\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"overflow\",\n ];\n for (const prop of PROPS) {\n snapshot[prop] = computed.getPropertyValue(prop);\n }\n return snapshot;\n }, \"[data-reactscope-root] > *\");\n\n computedStyles[\"[data-reactscope-root] > *\"] = styles;\n }\n\n // ----- DOM extraction -----\n let dom: RenderResult[\"dom\"] | undefined;\n if (captureDom) {\n const { tree, elementCount } = await extractDomTree(page, \"[data-reactscope-root]\");\n dom = {\n tree,\n elementCount,\n boundingBox: {\n x: boundingBox.x,\n y: boundingBox.y,\n width: boundingBox.width,\n height: boundingBox.height,\n },\n };\n }\n\n // ----- Accessibility snapshot -----\n let accessibility: RenderResult[\"accessibility\"] | undefined;\n if (captureA11y) {\n const violations: string[] = [];\n\n // Use ARIA snapshot via evaluate (page.accessibility removed in Playwright 1.49+)\n const a11yInfo = await page.evaluate((sel: string) => {\n const el = document.querySelector(sel);\n if (!el) return { role: \"generic\", name: \"\" };\n return {\n role: el.getAttribute(\"role\") ?? el.tagName.toLowerCase() ?? \"generic\",\n name:\n el.getAttribute(\"aria-label\") ??\n el.getAttribute(\"aria-labelledby\") ??\n el.textContent?.trim().slice(0, 100) ??\n \"\",\n };\n }, \"[data-reactscope-root]\");\n\n // Basic violation: check for images without alt text\n const imgViolations = await page.evaluate((sel: string) => {\n const container = document.querySelector(sel);\n if (!container) return [] as string[];\n const imgs = container.querySelectorAll(\"img\");\n const issues: string[] = [];\n imgs.forEach((img) => {\n if (!img.alt) issues.push(\"Image missing accessible name\");\n });\n return issues;\n }, \"[data-reactscope-root]\");\n\n violations.push(...imgViolations);\n\n accessibility = {\n role: a11yInfo.role,\n name: a11yInfo.name,\n violations,\n };\n }\n\n // ----- Console output -----\n const consoleOutput: RenderResult[\"console\"] | undefined = captureConsole\n ? { errors: [...consoleErrors], warnings: [...consoleWarnings], logs: [...consoleLogs] }\n : undefined;\n\n return {\n screenshot,\n width: boundingBox.width,\n height: boundingBox.height,\n renderTimeMs,\n computedStyles,\n dom,\n console: consoleOutput,\n accessibility,\n };\n } finally {\n if (consoleHandler) page.off(\"console\", consoleHandler);\n this.release(slot);\n }\n }\n\n // -------------------------------------------------------------------------\n // Shutdown\n // -------------------------------------------------------------------------\n\n /**\n * Gracefully shut down the pool.\n *\n * Waits for all in-use slots to be released, then closes every browser.\n * Subsequent `acquire()` or `render()` calls will throw.\n */\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n // Drain in-flight renders: wait for all in-use slots to become free\n const drainPromises = this.slots\n .filter((s) => s.inUse)\n .map(\n (s) =>\n new Promise<void>((resolve) => {\n const poll = setInterval(() => {\n if (!s.inUse) {\n clearInterval(poll);\n resolve();\n }\n }, 50);\n }),\n );\n\n await Promise.all(drainPromises);\n\n // Clear remaining waiters (they will error on next acquire attempt as pool is closed)\n this.waiters = [];\n\n // Close all browsers\n await Promise.all(this.browsers.map((b) => b.close()));\n this.browsers = [];\n this.slots = [];\n }\n\n // -------------------------------------------------------------------------\n // Introspection helpers\n // -------------------------------------------------------------------------\n\n /** Total number of page slots in the pool. */\n get totalSlots(): number {\n return this.slots.length;\n }\n\n /** Number of currently available (free) slots. */\n get freeSlots(): number {\n return this.slots.filter((s) => !s.inUse).length;\n }\n\n /** Number of currently in-use slots. */\n get activeSlots(): number {\n return this.slots.filter((s) => s.inUse).length;\n }\n\n /** Number of callers waiting for a free slot. */\n get queueDepth(): number {\n return this.waiters.length;\n }\n\n /** Whether the pool has been initialised. */\n get isInitialized(): boolean {\n return this.initialized;\n }\n\n /** Whether the pool is closed. */\n get isClosed(): boolean {\n return this.closed;\n }\n}\n","/**\n * Composition Contexts — built-in context types for use as RenderMatrix axes.\n *\n * Each context describes a layout environment in which a component is rendered.\n * Pass an array of `CompositionContext` values as a matrix axis to test how a\n * component behaves across different parent layout contexts.\n */\n\n// ---------------------------------------------------------------------------\n// Context identifier type\n// ---------------------------------------------------------------------------\n\n/**\n * All built-in composition context identifiers.\n *\n * | ID | Description |\n * |-----------------|------------------------------------------------------------|\n * | centered | Component centered inside the viewport |\n * | flex-row | Component inside a flex row with sibling placeholders |\n * | flex-col | Component inside a flex column |\n * | grid | Component inside a CSS grid cell |\n * | sidebar | Narrow sidebar layout (240 px wide) |\n * | scroll | Component inside a scrollable container |\n * | full-width | Component stretches to full viewport width |\n * | constrained | Component inside a max-width centered container |\n * | rtl | Right-to-left text direction (dir=\"rtl\") |\n * | nested-flex | Deeply nested flex containers (3 levels) |\n */\nexport type CompositionContextId =\n | \"centered\"\n | \"flex-row\"\n | \"flex-col\"\n | \"grid\"\n | \"sidebar\"\n | \"scroll\"\n | \"full-width\"\n | \"constrained\"\n | \"rtl\"\n | \"nested-flex\";\n\n// ---------------------------------------------------------------------------\n// Context descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * Describes a composition context: its ID, human-readable label,\n * and the CSS properties to apply to the parent wrapper element.\n */\nexport interface CompositionContext {\n /** Stable identifier used as an axis value in RenderMatrix. */\n id: CompositionContextId;\n /** Short human-readable label (used as axis label in sprite sheets). */\n label: string;\n /** CSS properties applied to the wrapping container. */\n containerStyle: Record<string, string>;\n /** Optional HTML attributes applied to the wrapping container. */\n containerAttrs?: Record<string, string>;\n /** Human-readable description of what this context tests. */\n description: string;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in context definitions\n// ---------------------------------------------------------------------------\n\n/**\n * All ten built-in composition contexts.\n */\nexport const COMPOSITION_CONTEXTS: Record<CompositionContextId, CompositionContext> = {\n centered: {\n id: \"centered\",\n label: \"Centered\",\n description: \"Component centered both horizontally and vertically inside the viewport.\",\n containerStyle: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n height: \"100%\",\n },\n },\n\n \"flex-row\": {\n id: \"flex-row\",\n label: \"Flex Row\",\n description: \"Component placed inside a flex row with placeholder siblings on either side.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n width: \"100%\",\n },\n },\n\n \"flex-col\": {\n id: \"flex-col\",\n label: \"Flex Col\",\n description: \"Component placed inside a flex column with placeholder siblings.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"8px\",\n width: \"100%\",\n },\n },\n\n grid: {\n id: \"grid\",\n label: \"Grid\",\n description: \"Component placed inside a CSS grid cell (3-column auto-fill).\",\n containerStyle: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"8px\",\n width: \"100%\",\n },\n },\n\n sidebar: {\n id: \"sidebar\",\n label: \"Sidebar\",\n description: \"Narrow 240 px sidebar layout — tests constrained-width rendering.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"column\",\n width: \"240px\",\n minHeight: \"100%\",\n padding: \"8px\",\n overflow: \"hidden\",\n },\n },\n\n scroll: {\n id: \"scroll\",\n label: \"Scroll\",\n description: \"Component inside a vertically scrollable container with fixed height.\",\n containerStyle: {\n display: \"block\",\n overflowY: \"auto\",\n height: \"300px\",\n width: \"100%\",\n },\n },\n\n \"full-width\": {\n id: \"full-width\",\n label: \"Full Width\",\n description: \"Component stretched to full viewport width with no padding.\",\n containerStyle: {\n display: \"block\",\n width: \"100%\",\n },\n },\n\n constrained: {\n id: \"constrained\",\n label: \"Constrained\",\n description: \"Component inside a centered max-width container (1024 px).\",\n containerStyle: {\n display: \"block\",\n maxWidth: \"1024px\",\n width: \"100%\",\n marginLeft: \"auto\",\n marginRight: \"auto\",\n padding: \"0 16px\",\n },\n },\n\n rtl: {\n id: \"rtl\",\n label: \"RTL\",\n description: \"Right-to-left text direction — tests bidi layout behaviour.\",\n containerStyle: {\n direction: \"rtl\",\n display: \"flex\",\n flexDirection: \"row\",\n width: \"100%\",\n },\n containerAttrs: {\n dir: \"rtl\",\n lang: \"ar\",\n },\n },\n\n \"nested-flex\": {\n id: \"nested-flex\",\n label: \"Nested Flex\",\n description: \"Component inside three levels of nested flex containers.\",\n containerStyle: {\n display: \"flex\",\n flexDirection: \"row\",\n width: \"100%\",\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Convenience selectors\n// ---------------------------------------------------------------------------\n\n/** All ten built-in contexts as an ordered array. */\nexport const ALL_CONTEXTS: CompositionContext[] = Object.values(COMPOSITION_CONTEXTS);\n\n/** All context IDs. */\nexport const ALL_CONTEXT_IDS: CompositionContextId[] = Object.keys(\n COMPOSITION_CONTEXTS,\n) as CompositionContextId[];\n\n/**\n * Retrieve a context descriptor by ID.\n *\n * @throws if the ID is not recognised.\n */\nexport function getContext(id: CompositionContextId): CompositionContext {\n const ctx = COMPOSITION_CONTEXTS[id];\n if (!ctx) throw new Error(`Unknown composition context: \"${id}\"`);\n return ctx;\n}\n\n/**\n * Retrieve multiple contexts by ID.\n */\nexport function getContexts(ids: CompositionContextId[]): CompositionContext[] {\n return ids.map((id) => getContext(id));\n}\n\n/**\n * Returns a `MatrixAxis`-compatible object for use directly in `RenderMatrix`.\n *\n * ```ts\n * const matrix = new RenderMatrix(renderer, [\n * contextAxis([\"centered\", \"flex-row\", \"rtl\"]),\n * { name: \"variant\", values: [\"primary\", \"secondary\"] },\n * ]);\n * ```\n */\nexport function contextAxis(ids: CompositionContextId[] = ALL_CONTEXT_IDS): {\n name: string;\n values: CompositionContext[];\n} {\n return {\n name: \"context\",\n values: ids.map((id) => getContext(id)),\n };\n}\n","/**\n * @agent-scope/render — Structured error handling for crashed renders.\n *\n * When a component crashes during render, this module captures rich\n * diagnostic context instead of letting the error propagate and crash\n * the entire batch.\n *\n * Usage:\n * import { safeRender, RenderError } from \"@agent-scope/render\";\n *\n * const outcome = await safeRender(() => renderer.renderCell(props), {\n * props,\n * sourceLocation: { file: \"Button.tsx\", line: 12, column: 0 },\n * });\n *\n * if (outcome.crashed) {\n * console.error(outcome.error.message);\n * console.error(\"Hints:\", outcome.error.heuristicFlags);\n * } else {\n * console.log(\"Screenshot size:\", outcome.result.screenshot.length);\n * }\n */\n\nimport type { RenderResult } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Heuristic flags\n// ---------------------------------------------------------------------------\n\n/**\n * Automated diagnosis hints emitted when a render crashes.\n *\n * Each flag is a short SCREAMING_SNAKE_CASE identifier that encodes a\n * likely root cause. Callers can use these to surface actionable messages\n * to the user without needing to parse raw error messages.\n */\nexport type HeuristicFlag =\n | \"MISSING_PROVIDER\"\n | \"UNDEFINED_PROP\"\n | \"TYPE_MISMATCH\"\n | \"NETWORK_REQUIRED\"\n | \"ASYNC_NOT_SUSPENDED\"\n | \"HOOK_CALL_VIOLATION\"\n | \"ELEMENT_TYPE_INVALID\"\n | \"HYDRATION_MISMATCH\"\n | \"CIRCULAR_DEPENDENCY\"\n | \"MISSING_BROWSER_BINARY\"\n | \"MISSING_PROJECT_DEPENDENCY\"\n | \"UNKNOWN_ERROR\";\n\n// ---------------------------------------------------------------------------\n// Source location\n// ---------------------------------------------------------------------------\n\n/**\n * The file/line/column origin of a component as recorded in the manifest.\n */\nexport interface SourceLocation {\n file: string;\n line: number;\n column: number;\n}\n\n// ---------------------------------------------------------------------------\n// RenderError\n// ---------------------------------------------------------------------------\n\n/**\n * All structured fields carried by a `RenderError`.\n * Consumers can access these directly on the error instance.\n */\nexport interface RenderErrorFields {\n /** The React component stack trace (if available). */\n componentStack: string;\n /** Source location from the manifest. */\n sourceLocation: SourceLocation;\n /** The prop values that were passed to the component when it crashed. */\n propsAtCrash: Record<string, unknown>;\n /** The error message (also available via `error.message`). */\n errorMessage: string;\n /** The error class name (e.g. \"TypeError\", \"ReferenceError\"). */\n errorType: string;\n /** Automated diagnosis hints. */\n heuristicFlags: HeuristicFlag[];\n}\n\n/**\n * Error thrown (or captured) when a component crashes during render.\n *\n * Extends the native `Error` class so it can be used with standard\n * `instanceof` checks and `catch` clauses, while also carrying rich\n * structured diagnostics.\n */\nexport class RenderError extends Error implements RenderErrorFields {\n readonly componentStack: string;\n readonly sourceLocation: SourceLocation;\n readonly propsAtCrash: Record<string, unknown>;\n readonly errorMessage: string;\n readonly errorType: string;\n readonly heuristicFlags: HeuristicFlag[];\n\n constructor(fields: RenderErrorFields) {\n super(fields.errorMessage);\n this.name = \"RenderError\";\n this.componentStack = fields.componentStack;\n this.sourceLocation = fields.sourceLocation;\n this.propsAtCrash = fields.propsAtCrash;\n this.errorMessage = fields.errorMessage;\n this.errorType = fields.errorType;\n this.heuristicFlags = fields.heuristicFlags;\n }\n\n /**\n * Construct a `RenderError` from an arbitrary caught value.\n *\n * Extracts `componentStack` from React error boundaries when present,\n * and runs heuristic analysis on the error message.\n */\n static from(\n caught: unknown,\n context: {\n props?: Record<string, unknown>;\n sourceLocation?: SourceLocation;\n } = {},\n ): RenderError {\n const err = caught instanceof Error ? caught : new Error(String(caught));\n\n const errorMessage = err.message;\n const errorType = err.constructor.name !== \"Error\" ? err.constructor.name : \"Error\";\n\n // Extract component stack if present (React error boundary style)\n const componentStack =\n (err as Error & { componentStack?: string }).componentStack ?? err.stack ?? \"\";\n\n const sourceLocation = context.sourceLocation ?? {\n file: \"<unknown>\",\n line: 0,\n column: 0,\n };\n\n const propsAtCrash = context.props ?? {};\n\n const heuristicFlags = detectHeuristicFlags(errorMessage, componentStack);\n\n return new RenderError({\n componentStack,\n sourceLocation,\n propsAtCrash,\n errorMessage,\n errorType,\n heuristicFlags,\n });\n }\n\n /** Serialise to a plain object (useful for JSON output). */\n toJSON(): RenderErrorFields & { name: string } {\n return {\n name: this.name,\n componentStack: this.componentStack,\n sourceLocation: this.sourceLocation,\n propsAtCrash: this.propsAtCrash,\n errorMessage: this.errorMessage,\n errorType: this.errorType,\n heuristicFlags: this.heuristicFlags,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flag detection\n// ---------------------------------------------------------------------------\n\n/**\n * Analyse an error message and component stack to produce a list of\n * `HeuristicFlag` values that hint at likely root causes.\n *\n * Exported so that callers can run the analysis independently (e.g. in\n * tests or custom error reporters).\n */\nexport function detectHeuristicFlags(\n errorMessage: string,\n componentStack: string,\n): HeuristicFlag[] {\n const flags = new Set<HeuristicFlag>();\n const msg = errorMessage.toLowerCase();\n const stack = componentStack.toLowerCase();\n const combined = `${msg} ${stack}`;\n\n // Context / Provider issues\n if (\n combined.includes(\"must be used within\") ||\n combined.includes(\"no provider\") ||\n (combined.includes(\"provider\") && combined.includes(\"context\")) ||\n (combined.includes(\"context\") && combined.includes(\"undefined\")) ||\n (combined.includes(\"provider\") && combined.includes(\"undefined\"))\n ) {\n flags.add(\"MISSING_PROVIDER\");\n }\n\n // Undefined prop access\n if (\n combined.includes(\"cannot read propert\") ||\n combined.includes(\"undefined is not an object\") ||\n (combined.includes(\"undefined\") && (combined.includes(\"prop\") || combined.includes(\"null\")))\n ) {\n flags.add(\"UNDEFINED_PROP\");\n }\n\n // Type errors\n if (\n msg.includes(\"typeerror\") ||\n combined.includes(\"is not a function\") ||\n combined.includes(\"is not iterable\") ||\n combined.includes(\"cannot set propert\")\n ) {\n flags.add(\"TYPE_MISMATCH\");\n }\n\n // Network dependency\n if (\n combined.includes(\"fetch\") ||\n combined.includes(\"network\") ||\n combined.includes(\"http\") ||\n combined.includes(\"xhr\")\n ) {\n flags.add(\"NETWORK_REQUIRED\");\n }\n\n // Suspense without boundary\n if (combined.includes(\"suspend\") || combined.includes(\"promise\")) {\n flags.add(\"ASYNC_NOT_SUSPENDED\");\n }\n\n // React hook violations\n if (\n combined.includes(\"invalid hook call\") ||\n combined.includes(\"hooks can only be called\") ||\n combined.includes(\"rendered more hooks\") ||\n combined.includes(\"rendered fewer hooks\")\n ) {\n flags.add(\"HOOK_CALL_VIOLATION\");\n }\n\n // Invalid element type\n if (\n combined.includes(\"element type is invalid\") ||\n combined.includes(\"react.createelement\") ||\n (combined.includes(\"expected a string\") && combined.includes(\"class/function\"))\n ) {\n flags.add(\"ELEMENT_TYPE_INVALID\");\n }\n\n // Hydration mismatch\n if (\n combined.includes(\"hydrat\") ||\n combined.includes(\"did not match\") ||\n combined.includes(\"server rendered html\")\n ) {\n flags.add(\"HYDRATION_MISMATCH\");\n }\n\n // Missing browser runtime\n if (\n combined.includes(\"executable doesn't exist\") ||\n combined.includes(\"browserType.launch\") ||\n combined.includes(\"could not find chromium\") ||\n combined.includes(\"please run the following command to download new browsers\")\n ) {\n flags.add(\"MISSING_BROWSER_BINARY\");\n }\n\n // Missing target-project dependencies\n if (\n combined.includes(\"could not resolve\") ||\n combined.includes(\"cannot find module\") ||\n combined.includes(\"module not found\")\n ) {\n flags.add(\"MISSING_PROJECT_DEPENDENCY\");\n }\n\n // Circular dependency / module issues\n if (\n combined.includes(\"circular\") ||\n combined.includes(\"maximum call stack\") ||\n combined.includes(\"stack overflow\")\n ) {\n flags.add(\"CIRCULAR_DEPENDENCY\");\n }\n\n // Fallback\n if (flags.size === 0) {\n flags.add(\"UNKNOWN_ERROR\");\n }\n\n return Array.from(flags);\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union result types\n// ---------------------------------------------------------------------------\n\n/**\n * A successful render outcome.\n */\nexport interface SuccessRenderResult {\n crashed: false;\n result: RenderResult;\n}\n\n/**\n * A crashed render outcome. The `error` carries full diagnostic context.\n */\nexport interface CrashedRenderResult {\n crashed: true;\n error: RenderError;\n renderTimeMs: number;\n}\n\n/**\n * The result of a `safeRender()` call: either success or a structured\n * crash record.\n */\nexport type RenderOutcome = SuccessRenderResult | CrashedRenderResult;\n\n// ---------------------------------------------------------------------------\n// safeRender\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps a render function so that any thrown error is captured as a\n * structured `CrashedRenderResult` instead of propagating.\n *\n * @param renderFn — async function that produces a `RenderResult`.\n * @param context — optional metadata to attach to any crash record.\n */\nexport async function safeRender(\n renderFn: () => Promise<RenderResult>,\n context: {\n props?: Record<string, unknown>;\n sourceLocation?: SourceLocation;\n } = {},\n): Promise<RenderOutcome> {\n const start = performance.now();\n try {\n const result = await renderFn();\n return { crashed: false, result };\n } catch (err: unknown) {\n const renderTimeMs = performance.now() - start;\n const renderError = RenderError.from(err, context);\n return { crashed: true, error: renderError, renderTimeMs };\n }\n}\n","/**\n * Font loading and caching for SatoriRenderer.\n *\n * Satori requires font data as ArrayBuffer and uses opentype.js internally,\n * which supports TTF/OTF/WOFF but NOT WOFF2.\n *\n * This module:\n * - Loads a font from disk once and caches it in-process.\n * - Returns Satori-compatible FontEntry arrays.\n * - Falls back to the bundled Inter woff font (@fontsource/inter) when no\n * explicit path is provided.\n */\n\nimport { existsSync, readdirSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { FontEntry } from \"./types.js\";\n\n/** In-process cache: resolvedPath → loaded FontEntry array. */\nconst fontCache = new Map<string, FontEntry[]>();\n\n/** Sentinel for \"no font available\". */\nconst NO_FONT_SENTINEL = \"__none__\";\n\n/** Default font family name. */\nconst DEFAULT_FAMILY = \"Inter\";\n\n/**\n * Resolve the bundled Inter woff font shipped with @fontsource/inter.\n * Satori's internal opentype.js does NOT support woff2 — use the .woff file.\n */\nfunction resolveBundledFontPath(): string | null {\n const fontFile = join(\"@fontsource\", \"inter\", \"files\", \"inter-latin-400-normal.woff\");\n\n // Standard node_modules locations\n const roots = [\n join(\"node_modules\"),\n join(__dirname, \"..\", \"node_modules\"),\n join(__dirname, \"..\", \"..\", \"node_modules\"),\n join(__dirname, \"..\", \"..\", \"..\", \"node_modules\"),\n ];\n\n for (const root of roots) {\n const candidate = join(root, fontFile);\n if (existsSync(candidate)) return candidate;\n }\n\n // Bun stores packages under node_modules/.bun/@fontsource+inter@x.y.z/...\n const bunCacheRoot = join(\"node_modules\", \".bun\");\n if (existsSync(bunCacheRoot)) {\n try {\n const entries = readdirSync(bunCacheRoot) as string[];\n for (const entry of entries) {\n if (entry.startsWith(\"@fontsource+inter@\")) {\n const candidate = join(bunCacheRoot, entry, \"node_modules\", fontFile);\n if (existsSync(candidate)) return candidate;\n }\n }\n } catch {\n // Ignore readdir errors\n }\n }\n\n return null;\n}\n\n/**\n * Load font data from the given path and return Satori-compatible entries.\n * Results are cached by resolved path for the process lifetime.\n *\n * @param fontPath - Path to a TTF/OTF/WOFF font file (NOT woff2 — opentype.js\n * doesn't support woff2). Pass `undefined` to use the bundled\n * Inter woff font, or empty array if unavailable.\n * @param fontFamily - Family name to advertise. Defaults to \"Inter\".\n */\nexport async function loadFont(\n fontPath: string | undefined,\n fontFamily: string = DEFAULT_FAMILY,\n): Promise<FontEntry[]> {\n const resolvedPath = fontPath ?? resolveBundledFontPath() ?? NO_FONT_SENTINEL;\n\n const cached = fontCache.get(resolvedPath);\n if (cached !== undefined) return cached;\n\n if (resolvedPath === NO_FONT_SENTINEL) {\n const empty: FontEntry[] = [];\n fontCache.set(NO_FONT_SENTINEL, empty);\n return empty;\n }\n\n try {\n const buffer = await readFile(resolvedPath);\n const arrayBuffer = buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n ) as ArrayBuffer;\n\n const entries: FontEntry[] = [\n { name: fontFamily, data: arrayBuffer, weight: 400, style: \"normal\" },\n { name: fontFamily, data: arrayBuffer, weight: 700, style: \"normal\" },\n ];\n\n fontCache.set(resolvedPath, entries);\n return entries;\n } catch {\n // Font file missing or unreadable — record empty to avoid repeated attempts\n const empty: FontEntry[] = [];\n fontCache.set(resolvedPath, empty);\n return empty;\n }\n}\n\n/**\n * Clear the font cache. Useful in tests to ensure isolation.\n */\nexport function clearFontCache(): void {\n fontCache.clear();\n}\n\n/**\n * Returns the number of distinct font paths currently cached.\n */\nexport function fontCacheSize(): number {\n return fontCache.size;\n}\n","/**\n * RenderMatrix — Cartesian product renderer for React component prop axes.\n *\n * Generates all combinations of axis values, renders each cell via either\n * SatoriRenderer (simple components) or BrowserPool (complex components),\n * and returns a structured grid of RenderResult objects with aggregate stats.\n */\n\nimport type { ComplexityClass } from \"@agent-scope/manifest\";\nimport type { RenderResult } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Axis types\n// ---------------------------------------------------------------------------\n\n/**\n * A single axis in the render matrix.\n * Each axis defines a dimension of the Cartesian product.\n */\nexport interface MatrixAxis<T = unknown> {\n /** Human-readable name for this axis (displayed as row/col label). */\n name: string;\n /** The values along this axis. */\n values: T[];\n}\n\n// ---------------------------------------------------------------------------\n// MatrixRenderer interface\n// ---------------------------------------------------------------------------\n\n/**\n * Unified renderer interface that both SatoriRenderer and BrowserPool\n * adapters implement. Consumers supply a `MatrixRenderer` to `RenderMatrix`.\n */\nexport interface MatrixRenderer {\n /**\n * Render a single cell given the merged props for this matrix cell.\n *\n * @param props - The combined prop snapshot for this matrix cell.\n * Keys are axis names; values are the axis value for this cell.\n * @param complexityClass - Routing hint (passed through from the descriptor).\n * @param renderMode - Requested render backend. `browser` forces the real DOM\n * Playwright path even when the descriptor is classified\n * as simple; this prevents Satori-style placeholder output\n * for rich components such as datepickers.\n * @returns Resolved RenderResult.\n */\n renderCell(\n props: Record<string, unknown>,\n complexityClass: ComplexityClass,\n renderMode?: RenderMode,\n ): Promise<RenderResult>;\n}\n\n/** Render backend requested by CLI/config callers. */\nexport type RenderMode = \"auto\" | \"browser\";\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\n/**\n * A single cell in the rendered matrix grid.\n */\nexport interface MatrixCell {\n /** The axis values that produced this cell (axis name → value). */\n props: Record<string, unknown>;\n /** The render result for this cell. */\n result: RenderResult;\n /** Flat index in the row-major grid. */\n index: number;\n /** Per-axis indices (parallel to axes array). */\n axisIndices: number[];\n}\n\n/**\n * Aggregate statistics over all cells in the matrix.\n */\nexport interface MatrixStats {\n /** Total number of cells rendered. */\n totalCells: number;\n /** Sum of all cell renderTimeMs values. */\n totalRenderTimeMs: number;\n /** Average renderTimeMs across all cells. */\n avgRenderTimeMs: number;\n /** Fastest individual cell render time. */\n minRenderTimeMs: number;\n /** Slowest individual cell render time. */\n maxRenderTimeMs: number;\n /** Total wall-clock time for the whole matrix render (ms). */\n wallClockTimeMs: number;\n}\n\n/**\n * The full result of a matrix render.\n */\nexport interface MatrixResult {\n /** Flat list of all rendered cells (row-major order). */\n cells: MatrixCell[];\n /** The axes used to generate this matrix. */\n axes: MatrixAxis[];\n /**\n * 2-D axis label grid: `axisLabels[axisIndex][valueIndex]` → label string.\n * For multi-value objects, we use JSON.stringify as a fallback label.\n */\n axisLabels: string[][];\n /** Aggregate render statistics. */\n stats: MatrixStats;\n /** Number of rows in the conceptual grid (last axis cardinality). */\n rows: number;\n /** Number of columns in the conceptual grid (second-to-last axis cardinality, or 1). */\n cols: number;\n}\n\n// ---------------------------------------------------------------------------\n// Cartesian product utility\n// ---------------------------------------------------------------------------\n\n/**\n * Generates the Cartesian product of an array of arrays.\n *\n * cartesianProduct([[1,2],[3,4]]) → [[1,3],[1,4],[2,3],[2,4]]\n */\nexport function cartesianProduct<T>(axes: T[][]): T[][] {\n if (axes.length === 0) return [[]];\n const result: T[][] = [];\n\n function recurse(axisIndex: number, current: T[]): void {\n if (axisIndex === axes.length) {\n result.push([...current]);\n return;\n }\n const axis = axes[axisIndex];\n if (!axis) return;\n for (const value of axis) {\n current.push(value);\n recurse(axisIndex + 1, current);\n current.pop();\n }\n }\n\n recurse(0, []);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Label helper\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable label for an axis value.\n * Primitives are stringified directly; objects/arrays use JSON.stringify.\n */\nexport function labelForValue(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) return \"NaN\";\n if (!Number.isFinite(value)) return value > 0 ? \"+Infinity\" : \"-Infinity\";\n return String(value);\n }\n if (typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n}\n\n// ---------------------------------------------------------------------------\n// RenderMatrix\n// ---------------------------------------------------------------------------\n\n/**\n * Generates and renders a Cartesian product of prop axis values.\n *\n * Usage:\n * ```ts\n * const matrix = new RenderMatrix(renderer, [\n * { name: \"variant\", values: [\"primary\", \"secondary\"] },\n * { name: \"size\", values: [\"sm\", \"md\", \"lg\"] },\n * ], { complexityClass: \"simple\" });\n *\n * const result = await matrix.render();\n * // result.cells has 6 entries (2×3)\n * ```\n */\nexport class RenderMatrix {\n private readonly renderer: MatrixRenderer;\n private readonly axes: MatrixAxis[];\n private readonly complexityClass: ComplexityClass;\n private readonly renderMode: RenderMode;\n /** Maximum number of cells to render in parallel. @default 8 */\n private readonly concurrency: number;\n\n constructor(\n renderer: MatrixRenderer,\n axes: MatrixAxis[],\n options: {\n complexityClass?: ComplexityClass;\n /** Max parallel renders. Default 8. */\n concurrency?: number;\n /** Force a render backend for every matrix cell. Default: auto. */\n renderMode?: RenderMode;\n } = {},\n ) {\n if (axes.length === 0) {\n throw new Error(\"RenderMatrix requires at least one axis\");\n }\n for (const axis of axes) {\n if (axis.values.length === 0) {\n throw new Error(`Axis \"${axis.name}\" must have at least one value`);\n }\n }\n this.renderer = renderer;\n this.axes = axes;\n this.complexityClass = options.complexityClass ?? \"simple\";\n this.renderMode = options.renderMode ?? \"auto\";\n this.concurrency = options.concurrency ?? 8;\n }\n\n // ---------------------------------------------------------------------------\n // Grid dimensions\n // ---------------------------------------------------------------------------\n\n /** Total number of cells (product of all axis cardinalities). */\n get cellCount(): number {\n return this.axes.reduce((acc, axis) => acc * axis.values.length, 1);\n }\n\n /** Axis labels indexed [axisIndex][valueIndex]. */\n get axisLabels(): string[][] {\n return this.axes.map((axis) => axis.values.map((v) => labelForValue(v)));\n }\n\n // ---------------------------------------------------------------------------\n // Main render\n // ---------------------------------------------------------------------------\n\n /**\n * Render all cells of the matrix.\n *\n * Cells are dispatched with bounded parallelism (up to `concurrency` at once)\n * and returned in row-major order (first axis iterates slowest).\n */\n async render(): Promise<MatrixResult> {\n const wallStart = performance.now();\n\n // Build all combinations\n const axisValueArrays = this.axes.map((a) => a.values);\n const combinations = cartesianProduct(axisValueArrays);\n\n const cells: MatrixCell[] = new Array(combinations.length) as MatrixCell[];\n\n // Render with bounded concurrency\n await this._renderWithConcurrency(combinations, cells);\n\n const wallEnd = performance.now();\n\n // Aggregate stats\n const stats = this._computeStats(cells, wallEnd - wallStart);\n\n // Grid dimensions: treat the matrix as 2-D for sprite sheet purposes\n // rows = last axis cardinality, cols = product of remaining axes\n const lastAxis = this.axes[this.axes.length - 1];\n const rows = lastAxis !== undefined ? lastAxis.values.length : 1;\n const cols = this.cellCount / rows;\n\n return {\n cells,\n axes: this.axes,\n axisLabels: this.axisLabels,\n stats,\n rows,\n cols,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async _renderWithConcurrency(\n combinations: unknown[][],\n cells: MatrixCell[],\n ): Promise<void> {\n let nextIndex = 0;\n\n const worker = async (): Promise<void> => {\n while (nextIndex < combinations.length) {\n const i = nextIndex++;\n const combo = combinations[i];\n if (!combo) continue;\n\n // Build props object: axisName → value\n const props: Record<string, unknown> = {};\n for (let axisIdx = 0; axisIdx < this.axes.length; axisIdx++) {\n const axis = this.axes[axisIdx];\n if (axis) {\n props[axis.name] = combo[axisIdx];\n }\n }\n\n // Compute per-axis indices\n const axisIndices: number[] = [];\n for (let axisIdx = 0; axisIdx < this.axes.length; axisIdx++) {\n const axis = this.axes[axisIdx];\n const val = combo[axisIdx];\n axisIndices.push(axis ? axis.values.indexOf(val as never) : -1);\n }\n\n const result = await this.renderer.renderCell(props, this.complexityClass, this.renderMode);\n cells[i] = { props, result, index: i, axisIndices };\n }\n };\n\n // Spawn up to `concurrency` workers\n const workerCount = Math.min(this.concurrency, combinations.length);\n const workers: Promise<void>[] = [];\n for (let w = 0; w < workerCount; w++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n }\n\n private _computeStats(cells: MatrixCell[], wallClockTimeMs: number): MatrixStats {\n const totalCells = cells.length;\n if (totalCells === 0) {\n return {\n totalCells: 0,\n totalRenderTimeMs: 0,\n avgRenderTimeMs: 0,\n minRenderTimeMs: 0,\n maxRenderTimeMs: 0,\n wallClockTimeMs,\n };\n }\n\n let total = 0;\n let min = Infinity;\n let max = -Infinity;\n\n for (const cell of cells) {\n const t = cell.result.renderTimeMs;\n total += t;\n if (t < min) min = t;\n if (t > max) max = t;\n }\n\n return {\n totalCells,\n totalRenderTimeMs: total,\n avgRenderTimeMs: total / totalCells,\n minRenderTimeMs: min === Infinity ? 0 : min,\n maxRenderTimeMs: max === -Infinity ? 0 : max,\n wallClockTimeMs,\n };\n }\n}\n","/**\n * Mock provider helpers for SatoriRenderer.\n *\n * Satori renders pure React element trees to SVG — it does NOT execute hooks\n * or context providers at runtime. The functions here produce wrapper JSX\n * elements that supply minimal mock context values so that components that\n * read context don't throw during the shallow JSX-to-SVG pass.\n *\n * Because Satori only cares about the *rendered JSX shape* (not hook side\n * effects), we can safely supply stub contexts.\n */\n\nimport React from \"react\";\n\n/** Generic mock context value that satisfies most consumers. */\nconst MOCK_CONTEXT_VALUE = Object.freeze({});\n\n/**\n * Known context names → factory functions that return a React element\n * wrapping `children` with an appropriate Provider.\n *\n * Extend this map as more contexts are discovered in the codebase.\n */\nconst KNOWN_PROVIDERS: Record<\n string,\n (children: React.ReactNode, theme?: string, locale?: string) => React.ReactElement\n> = {\n ThemeContext: (children, theme = \"light\") =>\n React.createElement(\n React.createContext<{ theme: string }>({ theme }).Provider,\n { value: { theme } },\n children,\n ),\n LocaleContext: (children, _theme, locale = \"en-US\") =>\n React.createElement(\n React.createContext<{ locale: string }>({ locale }).Provider,\n { value: { locale } },\n children,\n ),\n};\n\n/**\n * Wrap a React element with mock providers for each requested context name.\n *\n * Unknown context names get a generic empty-object provider created on the\n * fly (safe, avoids crashes for components that only call `useContext` to\n * check if a value is defined).\n */\nexport function wrapWithProviders(\n element: React.ReactElement,\n requiredContexts: string[],\n options: { theme?: string; locale?: string } = {},\n): React.ReactElement {\n if (requiredContexts.length === 0) return element;\n\n // Apply providers from innermost to outermost (first in list = outermost)\n return [...requiredContexts].reverse().reduce((child, ctxName) => {\n const factory = KNOWN_PROVIDERS[ctxName];\n if (factory) {\n return factory(child, options.theme, options.locale);\n }\n // Unknown context — create a generic provider with an empty object value\n const GenericCtx = React.createContext<Record<string, unknown>>(MOCK_CONTEXT_VALUE);\n return React.createElement(GenericCtx.Provider, { value: MOCK_CONTEXT_VALUE }, child);\n }, element as React.ReactNode) as React.ReactElement;\n}\n","/**\n * Inline-style extraction utilities for SatoriRenderer.\n *\n * Satori accepts React elements with inline `style` props. This module walks\n * a React element tree and extracts those styles into the ComputedStyles map\n * that is returned as part of RenderResult.\n */\n\nimport React from \"react\";\n\n/**\n * Walk a React element tree and collect all inline `style` objects.\n *\n * The key in the returned map is a dot-delimited path describing the element's\n * position in the tree, e.g. \"root\", \"root.0\", \"root.0.1\".\n *\n * Only elements with a non-empty `style` prop are included.\n */\nexport function extractInlineStyles(\n element: React.ReactNode,\n path: string = \"root\",\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n\n if (!React.isValidElement(element)) return result;\n\n // Collect this element's own style\n const props = element.props as Record<string, unknown>;\n if (props.style && typeof props.style === \"object\" && props.style !== null) {\n const style = props.style as Record<string, unknown>;\n const stringified: Record<string, string> = {};\n for (const [k, v] of Object.entries(style)) {\n if (v !== undefined && v !== null) {\n stringified[k] = String(v);\n }\n }\n if (Object.keys(stringified).length > 0) {\n result[path] = stringified;\n }\n }\n\n // Recurse into children\n const children = props.children;\n if (children === undefined || children === null) return result;\n\n const childArray = Array.isArray(children) ? children : [children];\n childArray.forEach((child: React.ReactNode, idx: number) => {\n const childPath = `${path}.${idx}`;\n const childStyles = extractInlineStyles(child, childPath);\n Object.assign(result, childStyles);\n });\n\n return result;\n}\n","/**\n * SatoriRenderer — pure Node.js render path for simple (flexbox-only) components.\n *\n * Pipeline:\n * React element → Satori SVG → @resvg/resvg-js PNG\n *\n * Only handles components with `complexityClass: \"simple\"` as classified by\n * @agent-scope/manifest. Complex components (CSS grid, absolute positioning,\n * animations) must be rendered via the Browser Pool path.\n *\n * Target performance: ~8 ms per render at 375×812 (mobile viewport).\n */\n\nimport type { ComponentDescriptor } from \"@agent-scope/manifest\";\nimport { Resvg } from \"@resvg/resvg-js\";\nimport React from \"react\";\nimport satori from \"satori\";\nimport { loadFont } from \"./fonts.js\";\nimport { wrapWithProviders } from \"./providers.js\";\nimport { extractInlineStyles } from \"./styles.js\";\nimport type {\n CaptureOptions,\n ContainerOptions,\n ContainerType,\n RendererConfig,\n RenderResult,\n SatoriRenderOptions,\n ViewportOptions,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VIEWPORT: ViewportOptions = { width: 375, height: 812 };\n\nconst DEFAULT_CONTAINER: ContainerOptions = {\n type: \"centered\",\n padding: 16,\n background: \"#ffffff\",\n};\n\nconst DEFAULT_CAPTURE: CaptureOptions = {\n screenshot: true,\n styles: true,\n timing: true,\n};\n\n// ---------------------------------------------------------------------------\n// Container builders\n// ---------------------------------------------------------------------------\n\n/**\n * Build a container wrapper element in a style understood by Satori.\n * Satori supports a subset of CSS — primarily flexbox + box model.\n */\nfunction buildContainerStyle(\n viewport: ViewportOptions,\n container: ContainerOptions,\n): React.CSSProperties {\n const base: React.CSSProperties = {\n width: viewport.width,\n height: viewport.height,\n padding: container.padding,\n backgroundColor: container.background ?? \"#ffffff\",\n display: \"flex\",\n overflow: \"hidden\",\n };\n\n const typeStyles: Record<ContainerType, React.CSSProperties> = {\n centered: {\n alignItems: \"center\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n },\n \"flex-row\": {\n alignItems: \"flex-start\",\n justifyContent: \"flex-start\",\n flexDirection: \"row\",\n },\n \"flex-col\": {\n alignItems: \"flex-start\",\n justifyContent: \"flex-start\",\n flexDirection: \"column\",\n },\n none: {},\n };\n\n return { ...base, ...(typeStyles[container.type] ?? {}) };\n}\n\n// ---------------------------------------------------------------------------\n// SatoriRenderer\n// ---------------------------------------------------------------------------\n\n/**\n * Satori-based renderer for simple (flexbox-only) React components.\n *\n * Usage:\n * ```ts\n * const renderer = new SatoriRenderer();\n * const result = await renderer.render(\n * <Button variant=\"primary\">Click me</Button>,\n * { viewport: { width: 375, height: 200 } },\n * );\n * ```\n */\nexport class SatoriRenderer {\n private readonly config: Required<RendererConfig>;\n private fontsPromise: Promise<import(\"./types.js\").FontEntry[]> | null = null;\n\n constructor(config: RendererConfig = {}) {\n this.config = {\n fontPath: config.fontPath ?? \"\",\n fontFamily: config.fontFamily ?? \"Inter\",\n defaultViewport: config.defaultViewport ?? DEFAULT_VIEWPORT,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Font loading (lazy, cached)\n // ---------------------------------------------------------------------------\n\n /**\n * Pre-load and cache the configured font. Calling this before `render()`\n * ensures the first render isn't slowed by font I/O.\n */\n async preloadFont(): Promise<void> {\n await this._getFonts();\n }\n\n private _getFonts(): Promise<import(\"./types.js\").FontEntry[]> {\n if (!this.fontsPromise) {\n const fontPath = this.config.fontPath || undefined;\n this.fontsPromise = loadFont(fontPath, this.config.fontFamily);\n }\n return this.fontsPromise;\n }\n\n // ---------------------------------------------------------------------------\n // Core render\n // ---------------------------------------------------------------------------\n\n /**\n * Render a React element tree to PNG via Satori (SVG) → resvg-js (PNG).\n *\n * @param element - The React element to render (pre-built, not a component class).\n * @param options - Viewport, container, capture, and environment overrides.\n * @param descriptor - Optional ComponentDescriptor for provider wrapping.\n * When provided, `requiredContexts` are used to inject\n * mock providers around the element.\n */\n async render(\n element: React.ReactElement,\n options: SatoriRenderOptions = {},\n descriptor?: Pick<ComponentDescriptor, \"requiredContexts\">,\n ): Promise<RenderResult> {\n const startMs = performance.now();\n\n // Resolve options\n const viewport: ViewportOptions = {\n ...this.config.defaultViewport,\n ...options.environment?.viewport,\n ...options.viewport,\n };\n\n const container: ContainerOptions = {\n ...DEFAULT_CONTAINER,\n ...options.container,\n };\n\n const capture: CaptureOptions = {\n ...DEFAULT_CAPTURE,\n ...options.capture,\n };\n\n // Wrap with mock providers if descriptor provided\n const requiredContexts = descriptor?.requiredContexts ?? [];\n const wrappedElement = wrapWithProviders(element, requiredContexts, {\n theme: options.environment?.theme,\n locale: options.environment?.locale,\n });\n\n // Extract computed styles before rendering (from the element tree)\n const computedStyles = capture.styles ? extractInlineStyles(wrappedElement) : {};\n\n // Build the top-level container element Satori will render\n const containerStyle = buildContainerStyle(viewport, container);\n const rootElement = React.createElement(\"div\", { style: containerStyle }, wrappedElement);\n\n // Load fonts\n const fonts = await this._getFonts();\n\n // Satori: React element → SVG string\n const svg = await satori(rootElement, {\n width: viewport.width,\n height: viewport.height,\n fonts: fonts.map((f) => ({\n name: f.name,\n data: f.data,\n weight: f.weight,\n style: f.style,\n })),\n });\n\n // resvg-js: SVG string → PNG Buffer\n let screenshot = Buffer.alloc(0);\n if (capture.screenshot) {\n const resvg = new Resvg(svg, {\n fitTo: { mode: \"width\", value: viewport.width },\n });\n const rendered = resvg.render();\n screenshot = Buffer.from(rendered.asPng());\n }\n\n const renderTimeMs = capture.timing ? performance.now() - startMs : 0;\n\n return {\n screenshot,\n width: viewport.width,\n height: viewport.height,\n renderTimeMs,\n computedStyles,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Convenience: render with explicit viewport\n // ---------------------------------------------------------------------------\n\n /**\n * Render at a specific viewport size. Shorthand for `render(el, { viewport })`.\n */\n async renderAt(\n element: React.ReactElement,\n width: number,\n height: number,\n descriptor?: Pick<ComponentDescriptor, \"requiredContexts\">,\n ): Promise<RenderResult> {\n return this.render(element, { viewport: { width, height } }, descriptor);\n }\n}\n","/**\n * SpriteSheetGenerator — composites a MatrixResult into a single PNG sprite sheet.\n *\n * Layout:\n * - Rows correspond to the last matrix axis values.\n * - Columns correspond to all remaining axis combinations.\n * - Axis labels are rendered on the top (column labels) and left (row labels) edges.\n * - Cell borders and padding separate each cell visually.\n *\n * Returns:\n * - A single PNG Buffer containing the full composite image.\n * - A `CellCoordinateMap` for programmatic access to individual cell positions.\n */\n\nimport sharp from \"sharp\";\nimport type { MatrixResult } from \"./matrix.js\";\n\n// ---------------------------------------------------------------------------\n// Coordinate map\n// ---------------------------------------------------------------------------\n\n/**\n * The pixel bounding box of a single cell within the sprite sheet.\n */\nexport interface CellBounds {\n /** Left edge in pixels (from sprite sheet origin). */\n x: number;\n /** Top edge in pixels (from sprite sheet origin). */\n y: number;\n /** Cell width in pixels (content only, excluding padding). */\n width: number;\n /** Cell height in pixels (content only, excluding padding). */\n height: number;\n}\n\n/**\n * Maps each cell's flat index to its pixel position in the sprite sheet.\n * Access via `coordinates[cellIndex]`.\n */\nexport type CellCoordinateMap = CellBounds[];\n\n// ---------------------------------------------------------------------------\n// Result\n// ---------------------------------------------------------------------------\n\n/**\n * The output of `SpriteSheetGenerator.generate()`.\n */\nexport interface SpriteSheetResult {\n /** Full composite PNG as a Buffer. */\n png: Buffer;\n /** Per-cell bounding boxes within the composite image. */\n coordinates: CellCoordinateMap;\n /** Total sprite sheet width in pixels. */\n width: number;\n /** Total sprite sheet height in pixels. */\n height: number;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/**\n * Configuration for `SpriteSheetGenerator`.\n */\nexport interface SpriteSheetOptions {\n /** Padding in pixels around each cell. @default 8 */\n cellPadding?: number;\n /** Border thickness in pixels between cells. @default 1 */\n borderWidth?: number;\n /** Background colour as a CSS hex string. @default \"#f5f5f5\" */\n background?: string;\n /** Border colour as a CSS hex string. @default \"#cccccc\" */\n borderColor?: string;\n /** Height in pixels reserved for column axis labels at the top. @default 32 */\n labelHeight?: number;\n /** Width in pixels reserved for row axis labels on the left. @default 80 */\n labelWidth?: number;\n /** DPI for axis label text rendering. @default 72 */\n labelDpi?: number;\n /** Label text colour (hex). @default \"#333333\" */\n labelColor?: string;\n /** Label area background colour (hex). @default \"#e8e8e8\" */\n labelBackground?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal resolved options\n// ---------------------------------------------------------------------------\n\ninterface ResolvedOptions {\n cellPadding: number;\n borderWidth: number;\n background: string;\n borderColor: string;\n labelHeight: number;\n labelWidth: number;\n labelDpi: number;\n labelBackground: string;\n}\n\nfunction resolveOptions(opts: SpriteSheetOptions): ResolvedOptions {\n return {\n cellPadding: opts.cellPadding ?? 8,\n borderWidth: opts.borderWidth ?? 1,\n background: opts.background ?? \"#f5f5f5\",\n borderColor: opts.borderColor ?? \"#cccccc\",\n labelHeight: opts.labelHeight ?? 32,\n labelWidth: opts.labelWidth ?? 80,\n labelDpi: opts.labelDpi ?? 72,\n labelBackground: opts.labelBackground ?? \"#e8e8e8\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Colour parsing helper\n// ---------------------------------------------------------------------------\n\n/** Parse a CSS hex colour string into { r, g, b } components. */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number; alpha: number } {\n const cleaned = hex.replace(/^#/, \"\");\n const full =\n cleaned.length === 3\n ? cleaned\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleaned;\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n return {\n r: Number.isNaN(r) ? 0 : r,\n g: Number.isNaN(g) ? 0 : g,\n b: Number.isNaN(b) ? 0 : b,\n alpha: 1,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: draw a solid-colour rectangle as a PNG buffer\n// ---------------------------------------------------------------------------\n\nasync function makeRect(width: number, height: number, color: string): Promise<Buffer> {\n const bg = hexToRgb(color);\n return sharp({\n create: { width: Math.max(1, width), height: Math.max(1, height), channels: 4, background: bg },\n })\n .png()\n .toBuffer();\n}\n\n// ---------------------------------------------------------------------------\n// Internal: render a text label as a PNG buffer\n// ---------------------------------------------------------------------------\n\nasync function makeLabelPng(\n text: string,\n width: number,\n height: number,\n dpi: number,\n bgColor: string,\n): Promise<Buffer> {\n const w = Math.max(1, width);\n const h = Math.max(1, height);\n const bg = await makeRect(w, h, bgColor);\n\n // Truncate label to reasonable length before rendering\n const maxChars = Math.max(1, Math.floor(w / 7));\n const displayText = text.length > maxChars ? `${text.slice(0, maxChars - 1)}…` : text;\n\n let textBuf: Buffer | null = null;\n try {\n textBuf = await sharp({\n text: {\n text: displayText,\n font: \"Sans\",\n width: w - 4,\n height: h - 4,\n dpi,\n rgba: true,\n align: \"centre\" as const,\n },\n })\n .png()\n .toBuffer();\n } catch {\n return bg;\n }\n\n const textMeta = await sharp(textBuf).metadata();\n const textW = textMeta.width ?? 0;\n const textH = textMeta.height ?? 0;\n const left = Math.max(0, Math.floor((w - textW) / 2));\n const top = Math.max(0, Math.floor((h - textH) / 2));\n\n return sharp(bg)\n .composite([{ input: textBuf, top, left, blend: \"over\" }])\n .png()\n .toBuffer();\n}\n\n// ---------------------------------------------------------------------------\n// SpriteSheetGenerator\n// ---------------------------------------------------------------------------\n\n/**\n * Composites a `MatrixResult` into a single PNG sprite sheet.\n *\n * Usage:\n * ```ts\n * const gen = new SpriteSheetGenerator({ cellPadding: 12 });\n * const { png, coordinates } = await gen.generate(matrixResult);\n * ```\n */\nexport class SpriteSheetGenerator {\n private readonly opts: ResolvedOptions;\n\n constructor(options: SpriteSheetOptions = {}) {\n this.opts = resolveOptions(options);\n }\n\n // ---------------------------------------------------------------------------\n // Public: generate\n // ---------------------------------------------------------------------------\n\n /**\n * Generate a sprite sheet from a `MatrixResult`.\n *\n * Grid layout:\n * - Rows = last axis cardinality\n * - Cols = product of all other axis cardinalities (or 1 if single axis)\n *\n * @param matrixResult - The result of `RenderMatrix.render()`.\n */\n async generate(matrixResult: MatrixResult): Promise<SpriteSheetResult> {\n const { cells, rows, cols, axisLabels } = matrixResult;\n\n if (cells.length === 0) {\n throw new Error(\"Cannot generate sprite sheet from empty MatrixResult\");\n }\n\n const opts = this.opts;\n\n // Determine cell dimensions from the first cell's render result\n const firstCell = cells[0];\n if (!firstCell) {\n throw new Error(\"Cannot generate sprite sheet from empty MatrixResult\");\n }\n const cellContentWidth = firstCell.result.width;\n const cellContentHeight = firstCell.result.height;\n\n // Slot dimensions (content + padding on all sides + border)\n const slotWidth = cellContentWidth + opts.cellPadding * 2 + opts.borderWidth;\n const slotHeight = cellContentHeight + opts.cellPadding * 2 + opts.borderWidth;\n\n // Full sprite sheet dimensions\n const gridWidth = cols * slotWidth + opts.borderWidth;\n const gridHeight = rows * slotHeight + opts.borderWidth;\n const totalWidth = opts.labelWidth + gridWidth;\n const totalHeight = opts.labelHeight + gridHeight;\n\n // ---------------------------------------------------------------------------\n // Build composite operations list\n // ---------------------------------------------------------------------------\n const compositeOps: sharp.OverlayOptions[] = [];\n\n // ---------------------------------------------------------------------------\n // Label area backgrounds\n // ---------------------------------------------------------------------------\n const topLabelBg = await makeRect(totalWidth, opts.labelHeight, opts.labelBackground);\n compositeOps.push({ input: topLabelBg, top: 0, left: 0 });\n\n const leftLabelBg = await makeRect(opts.labelWidth, totalHeight, opts.labelBackground);\n compositeOps.push({ input: leftLabelBg, top: 0, left: 0 });\n\n // ---------------------------------------------------------------------------\n // Border lines\n // ---------------------------------------------------------------------------\n for (let c = 0; c <= cols; c++) {\n const x = opts.labelWidth + c * slotWidth;\n const borderLine = await makeRect(opts.borderWidth, gridHeight, opts.borderColor);\n compositeOps.push({ input: borderLine, top: opts.labelHeight, left: x });\n }\n\n for (let r = 0; r <= rows; r++) {\n const y = opts.labelHeight + r * slotHeight;\n const borderLine = await makeRect(gridWidth, opts.borderWidth, opts.borderColor);\n compositeOps.push({ input: borderLine, top: y, left: opts.labelWidth });\n }\n\n // Separator between label areas and grid\n const vSep = await makeRect(opts.borderWidth, totalHeight, opts.borderColor);\n compositeOps.push({\n input: vSep,\n top: 0,\n left: Math.max(0, opts.labelWidth - opts.borderWidth),\n });\n const hSep = await makeRect(totalWidth, opts.borderWidth, opts.borderColor);\n compositeOps.push({\n input: hSep,\n top: Math.max(0, opts.labelHeight - opts.borderWidth),\n left: 0,\n });\n\n // ---------------------------------------------------------------------------\n // Column labels (top edge)\n // ---------------------------------------------------------------------------\n const axisCount = matrixResult.axes.length;\n const colLabels: string[] = [];\n\n for (let c = 0; c < cols; c++) {\n if (axisCount === 1) {\n colLabels.push(axisLabels[0]?.[c] ?? String(c));\n } else {\n const cellAtCol = cells[c * rows];\n if (cellAtCol) {\n const parts: string[] = [];\n for (let ai = 0; ai < axisCount - 1; ai++) {\n const axis = matrixResult.axes[ai];\n if (axis) {\n parts.push(`${axis.name}=${axisLabels[ai]?.[cellAtCol.axisIndices[ai] ?? 0] ?? \"?\"}`);\n }\n }\n colLabels.push(parts.join(\", \"));\n } else {\n colLabels.push(String(c));\n }\n }\n }\n\n for (let c = 0; c < cols; c++) {\n const labelBuf = await makeLabelPng(\n colLabels[c] ?? String(c),\n slotWidth,\n opts.labelHeight,\n opts.labelDpi,\n opts.labelBackground,\n );\n compositeOps.push({\n input: labelBuf,\n top: 0,\n left: opts.labelWidth + c * slotWidth,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Row labels (left edge)\n // ---------------------------------------------------------------------------\n const lastAxisLabels = axisLabels[matrixResult.axes.length - 1] ?? [];\n for (let r = 0; r < rows; r++) {\n const labelBuf = await makeLabelPng(\n lastAxisLabels[r] ?? String(r),\n opts.labelWidth,\n slotHeight,\n opts.labelDpi,\n opts.labelBackground,\n );\n compositeOps.push({\n input: labelBuf,\n top: opts.labelHeight + r * slotHeight,\n left: 0,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Cell screenshots\n // ---------------------------------------------------------------------------\n const coordinateMap: CellCoordinateMap = new Array(cells.length) as CellCoordinateMap;\n\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (!cell) continue;\n\n const col = Math.floor(i / rows);\n const row = i % rows;\n\n const slotLeft = opts.labelWidth + col * slotWidth + opts.borderWidth;\n const slotTop = opts.labelHeight + row * slotHeight + opts.borderWidth;\n const contentLeft = slotLeft + opts.cellPadding;\n const contentTop = slotTop + opts.cellPadding;\n\n coordinateMap[i] = {\n x: contentLeft,\n y: contentTop,\n width: cellContentWidth,\n height: cellContentHeight,\n };\n\n if (cell.result.screenshot.length > 0) {\n let cellPng: Buffer;\n try {\n cellPng = await sharp(cell.result.screenshot)\n .resize(cellContentWidth, cellContentHeight, { fit: \"fill\" })\n .png()\n .toBuffer();\n } catch {\n cellPng = await makeRect(cellContentWidth, cellContentHeight, \"#ffffff\");\n }\n\n compositeOps.push({\n input: cellPng,\n top: contentTop,\n left: contentLeft,\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Create base canvas and composite everything\n // ---------------------------------------------------------------------------\n const bg = hexToRgb(opts.background);\n const png = await sharp({\n create: {\n width: totalWidth,\n height: totalHeight,\n channels: 4,\n background: bg,\n },\n })\n .composite(compositeOps)\n .png()\n .toBuffer();\n\n return {\n png,\n coordinates: coordinateMap,\n width: totalWidth,\n height: totalHeight,\n };\n }\n}\n","/**\n * Content Stress Presets — edge-case prop values for use as RenderMatrix axes.\n *\n * Each preset category provides an array of values (of a specific type) that\n * exercise boundary and edge-case conditions: empty input, overflow text,\n * bidirectional text, numeric extremes, empty/huge lists, broken image URLs, etc.\n *\n * Usage:\n * ```ts\n * import { stressAxis } from \"@agent-scope/render\";\n *\n * const matrix = new RenderMatrix(renderer, [\n * stressAxis(\"text.short\"),\n * { name: \"disabled\", values: [false, true] },\n * ]);\n * ```\n */\n\n// ---------------------------------------------------------------------------\n// Category identifier type\n// ---------------------------------------------------------------------------\n\n/**\n * All built-in stress preset categories.\n *\n * | ID | Description |\n * |-----------------|----------------------------------------------------------|\n * | text.short | Empty string, single char, short word |\n * | text.long | 200+ character strings, repeated words, lorem ipsum |\n * | text.unicode | CJK ideographs, diacritics, emoji, zero-width chars |\n * | text.rtl | Arabic and Hebrew strings |\n * | number.edge | 0, -1, NaN, Infinity, -Infinity, 999999, MAX_SAFE_INT |\n * | list.count | Lists with 0, 1, 3, 10, 100, 1000 items |\n * | image.states | null URL, broken URL, 1×1 data URI, very large image URL |\n */\nexport type StressCategoryId =\n | \"text.short\"\n | \"text.long\"\n | \"text.unicode\"\n | \"text.rtl\"\n | \"number.edge\"\n | \"list.count\"\n | \"image.states\";\n\n// ---------------------------------------------------------------------------\n// Preset descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * A named set of stress values for a specific data category.\n */\nexport interface StressPreset<T = unknown> {\n /** Stable category identifier. */\n id: StressCategoryId;\n /** Short human-readable label (used as axis name). */\n label: string;\n /** Human-readable description of what this preset exercises. */\n description: string;\n /** The stress values. */\n values: T[];\n /** Labels parallel to `values` for display in sprite sheets. */\n valueLabels: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Preset definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Short text values: empty string, whitespace-only, single char, typical word.\n */\nconst SHORT_TEXT_VALUES = [\"\", \" \", \"A\", \"OK\", \"Hello\", \"Submit\", \"Cancel\"];\nconst SHORT_TEXT_LABELS = [\n \"empty\",\n \"space\",\n \"single-char\",\n \"2-char\",\n \"5-char\",\n \"6-char\",\n \"6-char-2\",\n];\n\n/**\n * Long text values: 50, 100, 200, 500 character strings + hyphenation stress.\n */\nconst LONG_TEXT_VALUES = [\n \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.\",\n \"The quick brown fox jumps over the lazy dog. \".repeat(3).trimEnd(),\n \"A very long label that contains many words and will likely overflow any container that does not handle text overflow properly in some manner or another.\",\n \"supercalifragilisticexpialidocious-pneumonoultramicroscopicsilicovolcanoconiosis-antidisestablishmentarianism\",\n \"Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n];\nconst LONG_TEXT_LABELS = [\"80-chars\", \"3x-sentence\", \"200-chars\", \"long-words\", \"100-a-chars\"];\n\n/**\n * Unicode stress: CJK, diacritics, emoji, zero-width joiners, right-to-left marks.\n */\nconst UNICODE_TEXT_VALUES = [\n \"日本語テキスト\",\n \"中文内容\",\n \"한국어 텍스트\",\n \"Héllo Wörld — café naïve résumé\",\n \"Ñoño señor\",\n \"👋 Hello 🌍\",\n \"🏳️‍🌈 🎉 💡 🚀 ✅\",\n \"a\\u200Bb\\u200Bc\", // Zero-width space\n \"\\u202Eflipped text\\u202C\", // Right-to-left override\n];\nconst UNICODE_TEXT_LABELS = [\n \"japanese\",\n \"chinese\",\n \"korean\",\n \"diacritics\",\n \"tilde-n\",\n \"emoji-basic\",\n \"emoji-complex\",\n \"zero-width\",\n \"rtl-override\",\n];\n\n/**\n * RTL text values: Arabic and Hebrew.\n */\nconst RTL_TEXT_VALUES = [\n \"مرحبا بالعالم\", // Arabic: Hello World\n \"النص العربي الطويل جداً الذي يمتد عبر أسطر متعددة\", // Arabic long\n \"שלום עולם\", // Hebrew: Hello World\n \"זהו טקסט עברי ארוך שמתפרס על פני כמה שורות\", // Hebrew long\n \"مرحباً \\u200F hello\", // Arabic mixed with LTR\n];\nconst RTL_TEXT_LABELS = [\n \"arabic-short\",\n \"arabic-long\",\n \"hebrew-short\",\n \"hebrew-long\",\n \"arabic-mixed\",\n];\n\n/**\n * Numeric edge cases.\n */\nconst NUMBER_EDGE_VALUES: number[] = [\n 0,\n -0,\n 1,\n -1,\n NaN,\n Infinity,\n -Infinity,\n 999_999,\n Number.MAX_SAFE_INTEGER,\n Number.MIN_SAFE_INTEGER,\n Number.EPSILON,\n];\nconst NUMBER_EDGE_LABELS = [\n \"zero\",\n \"neg-zero\",\n \"one\",\n \"neg-one\",\n \"NaN\",\n \"+Infinity\",\n \"-Infinity\",\n \"999999\",\n \"MAX_SAFE_INT\",\n \"MIN_SAFE_INT\",\n \"EPSILON\",\n];\n\n/**\n * List count presets: produce arrays of increasing lengths.\n * Values are arrays; the consumer is responsible for rendering them.\n */\nfunction makeList(count: number): string[] {\n if (count === 0) return [];\n return Array.from({ length: count }, (_, i) => `Item ${i + 1}`);\n}\n\nconst LIST_COUNT_VALUES: string[][] = [\n makeList(0),\n makeList(1),\n makeList(3),\n makeList(10),\n makeList(100),\n makeList(1000),\n];\nconst LIST_COUNT_LABELS = [\n \"empty-list\",\n \"1-item\",\n \"3-items\",\n \"10-items\",\n \"100-items\",\n \"1000-items\",\n];\n\n/**\n * Image states: null / missing / broken / tiny / normal / huge.\n */\ntype ImageState = string | null;\n\nconst IMAGE_STATE_VALUES: ImageState[] = [\n null,\n \"\",\n \"https://broken.invalid/image.png\",\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==\", // 1×1 transparent PNG\n \"https://picsum.photos/200/200\",\n \"https://picsum.photos/4000/4000\",\n];\nconst IMAGE_STATE_LABELS = [\n \"null\",\n \"empty-string\",\n \"broken-url\",\n \"1x1-data-uri\",\n \"200x200\",\n \"4000x4000\",\n];\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst STRESS_PRESETS: Record<StressCategoryId, StressPreset> = {\n \"text.short\": {\n id: \"text.short\",\n label: \"Short Text\",\n description: \"Empty, whitespace-only, single-char, and short-word string values.\",\n values: SHORT_TEXT_VALUES,\n valueLabels: SHORT_TEXT_LABELS,\n },\n \"text.long\": {\n id: \"text.long\",\n label: \"Long Text\",\n description: \"200+ character strings designed to overflow containers.\",\n values: LONG_TEXT_VALUES,\n valueLabels: LONG_TEXT_LABELS,\n },\n \"text.unicode\": {\n id: \"text.unicode\",\n label: \"Unicode Text\",\n description: \"CJK ideographs, diacritics, emoji, and zero-width characters.\",\n values: UNICODE_TEXT_VALUES,\n valueLabels: UNICODE_TEXT_LABELS,\n },\n \"text.rtl\": {\n id: \"text.rtl\",\n label: \"RTL Text\",\n description: \"Arabic and Hebrew strings for bidi text rendering.\",\n values: RTL_TEXT_VALUES,\n valueLabels: RTL_TEXT_LABELS,\n },\n \"number.edge\": {\n id: \"number.edge\",\n label: \"Edge Numbers\",\n description: \"0, -1, NaN, ±Infinity, MAX_SAFE_INTEGER, and other numeric extremes.\",\n values: NUMBER_EDGE_VALUES,\n valueLabels: NUMBER_EDGE_LABELS,\n },\n \"list.count\": {\n id: \"list.count\",\n label: \"List Count\",\n description: \"Arrays of 0, 1, 3, 10, 100, and 1000 items.\",\n values: LIST_COUNT_VALUES,\n valueLabels: LIST_COUNT_LABELS,\n },\n \"image.states\": {\n id: \"image.states\",\n label: \"Image States\",\n description: \"null, empty string, broken URL, 1×1 data URI, and large image URLs.\",\n values: IMAGE_STATE_VALUES,\n valueLabels: IMAGE_STATE_LABELS,\n },\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Retrieve a stress preset by category ID.\n *\n * @throws if the ID is not recognised.\n */\nexport function getStressPreset(id: StressCategoryId): StressPreset {\n const preset = STRESS_PRESETS[id];\n if (!preset) throw new Error(`Unknown stress preset category: \"${id}\"`);\n return preset;\n}\n\n/**\n * Retrieve multiple stress presets.\n */\nexport function getStressPresets(ids: StressCategoryId[]): StressPreset[] {\n return ids.map((id) => getStressPreset(id));\n}\n\n/** All built-in stress presets as an ordered array. */\nexport const ALL_STRESS_PRESETS: StressPreset[] = Object.values(STRESS_PRESETS);\n\n/** All stress category IDs. */\nexport const ALL_STRESS_IDS: StressCategoryId[] = Object.keys(STRESS_PRESETS) as StressCategoryId[];\n\n/**\n * Returns a `MatrixAxis`-compatible object for direct use in `RenderMatrix`.\n *\n * ```ts\n * const matrix = new RenderMatrix(renderer, [\n * stressAxis(\"text.short\"),\n * { name: \"disabled\", values: [false, true] },\n * ]);\n * ```\n */\nexport function stressAxis(id: StressCategoryId): { name: string; values: unknown[] } {\n const preset = getStressPreset(id);\n return {\n name: preset.label,\n values: preset.values,\n };\n}\n"]}