playwriter 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bippy.js +1 -1
- package/dist/cdp-log.d.ts +4 -1
- package/dist/cdp-log.d.ts.map +1 -1
- package/dist/cdp-log.js +39 -2
- package/dist/cdp-log.js.map +1 -1
- package/dist/cdp-log.test.d.ts +2 -0
- package/dist/cdp-log.test.d.ts.map +1 -0
- package/dist/cdp-log.test.js +109 -0
- package/dist/cdp-log.test.js.map +1 -0
- package/dist/cdp-relay.d.ts.map +1 -1
- package/dist/cdp-relay.js +103 -6
- package/dist/cdp-relay.js.map +1 -1
- package/dist/cli.js +8 -5
- package/dist/cli.js.map +1 -1
- package/dist/executor.d.ts +4 -0
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +102 -32
- package/dist/executor.js.map +1 -1
- package/dist/extension/background.js +23 -12
- package/dist/extension/manifest.json +1 -1
- package/dist/prompt.md +32 -13
- package/dist/readability.js +1 -1
- package/dist/relay-client.d.ts +11 -0
- package/dist/relay-client.d.ts.map +1 -1
- package/dist/relay-client.js +46 -1
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-core.test.js +10 -6
- package/dist/relay-core.test.js.map +1 -1
- package/dist/relay-session.test.js +9 -1
- package/dist/relay-session.test.js.map +1 -1
- package/dist/relay-state.test.js +57 -1
- package/dist/relay-state.test.js.map +1 -1
- package/dist/selector-generator.js +1 -1
- package/dist/start-relay-server.d.ts +1 -1
- package/dist/start-relay-server.d.ts.map +1 -1
- package/dist/start-relay-server.js +23 -1
- package/dist/start-relay-server.js.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/cdp-log.test.ts +131 -0
- package/src/cdp-log.ts +44 -2
- package/src/cdp-relay.ts +110 -5
- package/src/cli.ts +8 -5
- package/src/executor.ts +119 -35
- package/src/relay-client.ts +62 -5
- package/src/relay-core.test.ts +10 -6
- package/src/relay-session.test.ts +9 -1
- package/src/relay-state.test.ts +67 -1
- package/src/skill.md +32 -13
- package/src/start-relay-server.ts +22 -1
- package/src/utils.ts +5 -0
|
@@ -547,7 +547,7 @@ async function handleGhostBrowserCommand(params, chromeApi) {
|
|
|
547
547
|
var ghost_cursor_client_default = "(() => {\n var __defProp = Object.defineProperty;\n var __getOwnPropNames = Object.getOwnPropertyNames;\n var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n var __hasOwnProp = Object.prototype.hasOwnProperty;\n function __accessProp(key) {\n return this[key];\n }\n var __toCommonJS = (from) => {\n var entry = (__moduleCache ??= new WeakMap).get(from), desc;\n if (entry)\n return entry;\n entry = __defProp({}, \"__esModule\", { value: true });\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (var key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(entry, key))\n __defProp(entry, key, {\n get: __accessProp.bind(from, key),\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n __moduleCache.set(from, entry);\n return entry;\n };\n var __moduleCache;\n\n // src/ghost-cursor-client.ts\n var exports_ghost_cursor_client = {};\n\n // src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts\n var SCREENSTUDIO_POINTER_MACOS_TAHOE_DATA_URL = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjE4IiBoZWlnaHQ9Ijk1OCIgdmlld0JveD0iMCAwIDYxOCA5NTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfMzg0XzI3KSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTI3LjA2MiAzNy4wMzMxTDU0MC42OTYgNDUxLjU1NUM1OTIuNjUzIDUwMy42NiA1NTUuNzk0IDU5Mi41NzQgNDgyLjIyNiA1OTIuNTc0TDQyMS44MzEgNTkyLjU2OUw0ODEuODIxIDczNS4wNTRDNDkyLjMzMSA3NjAuMDIxIDQ5Mi40NzkgNzg3LjY1MiA0ODIuMjY1IDgxMi43NjdDNDcyLjAwMiA4MzcuOTMyIDQ1Mi41NjEgODU3LjU3IDQyNy40OTYgODY4LjA4QzQxNC44NjQgODczLjM1OSA0MDEuNjQgODc2LjAyNCAzODguMTIxIDg3Ni4wMjRDMzQ3LjExNyA4NzYuMDI0IDMxMC4zNTggODUxLjYgMjk0LjQ3IDgxMy44MDRMMjMxLjQyIDY2My45MThMMTkwLjM2OCA3MDAuMzM3QzEzNy4wMjkgNzQ3LjUwOCA1MyA3MDkuNjYzIDUzIDYzOC40MTNWNjcuNjc0NEM1MyAyOC45OTAzIDk5LjcyNjggOS42NDgyOCAxMjcuMDYyIDM3LjAzMzFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTEwMi4zMTYgOTkuNjUyQzEwMi4zMTYgOTMuMTg4MiAxMTAuMTYyIDg5LjkzMTYgMTE0LjcwMSA5NC41MjA0TDUwNC44OTcgNDg1LjU1NUM1MjYuMTY0IDUwNi44NzEgNTExLjA2NSA1NDMuMjM2IDQ4MC45NjcgNTQzLjIzNkwzNDcuNTQ2IDU0My4xNjFMNDM2LjM0MiA3NTQuMTQzQzQ0Ny41NDIgNzgwLjc4OCA0MzUuMDA5IDgxMS40MjkgNDA4LjQxNCA4MjIuNTgxQzM4MS43MiA4MzMuNzgxIDM1MS4xMjggODIxLjI5OCAzMzkuOTc3IDc5NC43MDJMMjUwLjI5MyA1ODEuMzUyTDE1OC41MTcgNjYyLjY0NEMxMzcuOTkxIDY4MC44MDEgMTA2LjMxOSA2NjguMTQ1IDEwMi42NjQgNjQyLjMyM0wxMDIuMzE2IDYzNy4zMzFWOTkuNjUyWiIgZmlsbD0iYmxhY2siLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kXzM4NF8yNyIgeD0iMC4zNCIgeT0iMC43OTkyMTkiIHdpZHRoPSI2MTcuMzIiIGhlaWdodD0iOTU3LjE0NCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIgcmVzdWx0PSJoYXJkQWxwaGEiLz4KPGZlT2Zmc2V0IGR5PSIyOS4yNiIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyNi4zMyIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuNjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd18zODRfMjciLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMzg0XzI3IiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8L2RlZnM+Cjwvc3ZnPg==\";\n\n // src/ghost-cursor-client.ts\n var isTopFrame = (() => {\n try {\n return window === window.top;\n } catch {\n return false;\n }\n })();\n var CURSOR_ID = \"__playwriter_ghost_cursor__\";\n var SCREENSTUDIO_POINTER_ASPECT_RATIO = 618 / 958;\n var SCREENSTUDIO_HOTSPOT_X_RATIO = 0.14;\n var SCREENSTUDIO_HOTSPOT_Y_RATIO = 0.06;\n var MINIMAL_TRIANGLE_HOTSPOT_X_RATIO = 0.07;\n var MINIMAL_TRIANGLE_HOTSPOT_Y_RATIO = 0.06;\n var MOVE_EASING = \"cubic-bezier(0.65, 0, 0.35, 1)\";\n var PRESS_EASING = \"cubic-bezier(0.23, 1, 0.32, 1)\";\n var PRESS_DURATION_MS = 140;\n var IDLE_HIDE_DELAY_MS = 5000;\n var IDLE_FADE_OUT_MS = 600;\n var DEFAULT_OPTIONS = {\n style: \"minimal\",\n color: \"#111827\",\n size: 22,\n zIndex: 2147483647,\n easing: MOVE_EASING,\n minDurationMs: 220,\n maxDurationMs: 1500,\n speedPxPerMs: 1.2\n };\n var runtime = {\n outerElement: null,\n innerElement: null,\n options: DEFAULT_OPTIONS,\n x: 0,\n y: 0,\n scale: 1,\n hasPosition: false,\n enabled: false,\n idleHidden: false\n };\n var idleHideTimer = null;\n function clamp(options) {\n const { value, min, max } = options;\n return Math.min(max, Math.max(min, value));\n }\n function mergeOptions(options) {\n if (!options) {\n return DEFAULT_OPTIONS;\n }\n return {\n style: options.style ?? DEFAULT_OPTIONS.style,\n color: options.color ?? DEFAULT_OPTIONS.color,\n size: options.size ?? DEFAULT_OPTIONS.size,\n zIndex: options.zIndex ?? DEFAULT_OPTIONS.zIndex,\n easing: options.easing ?? DEFAULT_OPTIONS.easing,\n minDurationMs: options.minDurationMs ?? DEFAULT_OPTIONS.minDurationMs,\n maxDurationMs: options.maxDurationMs ?? DEFAULT_OPTIONS.maxDurationMs,\n speedPxPerMs: options.speedPxPerMs ?? DEFAULT_OPTIONS.speedPxPerMs\n };\n }\n function getCursorDimensions() {\n if (runtime.options.style === \"screenstudio\") {\n const height = runtime.options.size;\n const width = Math.max(10, Math.round(height * SCREENSTUDIO_POINTER_ASPECT_RATIO));\n return { width, height };\n }\n if (runtime.options.style === \"minimal\") {\n const size = Math.max(12, runtime.options.size);\n return { width: size, height: size };\n }\n return { width: runtime.options.size, height: runtime.options.size };\n }\n function getHotspotOffsetPx() {\n const dimensions = getCursorDimensions();\n if (runtime.options.style === \"screenstudio\") {\n return {\n x: Math.round(dimensions.width * SCREENSTUDIO_HOTSPOT_X_RATIO),\n y: Math.round(dimensions.height * SCREENSTUDIO_HOTSPOT_Y_RATIO)\n };\n }\n if (runtime.options.style === \"minimal\") {\n return {\n x: Math.round(dimensions.width * MINIMAL_TRIANGLE_HOTSPOT_X_RATIO),\n y: Math.round(dimensions.height * MINIMAL_TRIANGLE_HOTSPOT_Y_RATIO)\n };\n }\n return {\n x: Math.round(dimensions.width / 2),\n y: Math.round(dimensions.height / 2)\n };\n }\n function getBaseOpacity() {\n if (runtime.options.style === \"screenstudio\") {\n return \"0.95\";\n }\n if (runtime.options.style === \"minimal\") {\n return \"1\";\n }\n return \"0.72\";\n }\n function applyTranslate() {\n if (!runtime.outerElement) {\n return;\n }\n const hotspot = getHotspotOffsetPx();\n runtime.outerElement.style.transform = `translate3d(${runtime.x - hotspot.x}px, ${runtime.y - hotspot.y}px, 0)`;\n }\n function applyScale() {\n if (!runtime.innerElement) {\n return;\n }\n runtime.innerElement.style.transform = `scale(${runtime.scale})`;\n }\n function computeDurationMs(options) {\n if (!runtime.hasPosition) {\n return 0;\n }\n const dx = options.targetX - runtime.x;\n const dy = options.targetY - runtime.y;\n const distance = Math.hypot(dx, dy);\n const rawDurationMs = distance / runtime.options.speedPxPerMs;\n return clamp({\n value: rawDurationMs,\n min: runtime.options.minDurationMs,\n max: runtime.options.maxDurationMs\n });\n }\n function createCursorElement() {\n const outer = document.createElement(\"div\");\n outer.id = CURSOR_ID;\n outer.setAttribute(\"aria-hidden\", \"true\");\n outer.style.position = \"fixed\";\n outer.style.left = \"0\";\n outer.style.top = \"0\";\n outer.style.pointerEvents = \"none\";\n outer.style.zIndex = `${runtime.options.zIndex}`;\n outer.style.transitionProperty = \"transform\";\n outer.style.transitionTimingFunction = runtime.options.easing;\n outer.style.transitionDuration = \"0ms\";\n outer.style.willChange = \"transform\";\n const inner = document.createElement(\"div\");\n inner.style.transitionProperty = \"transform, opacity\";\n inner.style.transitionTimingFunction = PRESS_EASING;\n inner.style.transitionDuration = `${PRESS_DURATION_MS}ms`;\n inner.style.opacity = getBaseOpacity();\n outer.appendChild(inner);\n runtime.outerElement = outer;\n runtime.innerElement = inner;\n applyRuntimeVisualOptions();\n return outer;\n }\n function ensureCursorElement() {\n const existing = document.getElementById(CURSOR_ID);\n if (existing) {\n runtime.outerElement = existing;\n runtime.innerElement = existing.firstElementChild || null;\n return existing;\n }\n const outer = createCursorElement();\n const root = document.documentElement || document.body;\n root.appendChild(outer);\n return outer;\n }\n function applyRuntimeVisualOptions() {\n if (!runtime.innerElement) {\n return;\n }\n const dimensions = getCursorDimensions();\n runtime.innerElement.style.width = `${dimensions.width}px`;\n runtime.innerElement.style.height = `${dimensions.height}px`;\n if (runtime.outerElement) {\n runtime.outerElement.style.zIndex = `${runtime.options.zIndex}`;\n runtime.outerElement.style.transitionTimingFunction = runtime.options.easing;\n }\n const hotspot = getHotspotOffsetPx();\n runtime.innerElement.style.transformOrigin = `${hotspot.x}px ${hotspot.y}px`;\n if (runtime.options.style === \"screenstudio\") {\n runtime.innerElement.style.borderRadius = \"0\";\n runtime.innerElement.style.border = \"none\";\n runtime.innerElement.style.backgroundColor = \"transparent\";\n runtime.innerElement.style.backgroundImage = `url(\"${SCREENSTUDIO_POINTER_MACOS_TAHOE_DATA_URL}\")`;\n runtime.innerElement.style.backgroundRepeat = \"no-repeat\";\n runtime.innerElement.style.backgroundPosition = \"left top\";\n runtime.innerElement.style.backgroundSize = \"contain\";\n runtime.innerElement.style.backdropFilter = \"none\";\n runtime.innerElement.style.filter = \"none\";\n runtime.innerElement.style.boxShadow = \"none\";\n runtime.innerElement.style.opacity = getBaseOpacity();\n return;\n }\n if (runtime.options.style === \"minimal\") {\n const triangleSvg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"-1 -1 26 26\"><path fill=\"white\" stroke=\"${runtime.options.color}\" stroke-width=\"1.5\" stroke-linejoin=\"round\" d=\"m23.284 19.124l-6.866-6.895a.4.4 0 0 1-.118-.296a.43.43 0 0 1 .163-.282l4.439-3.077a1.48 1.48 0 0 0 .621-1.48a1.48 1.48 0 0 0-1.036-1.198L1.623.302a1.14 1.14 0 0 0-1.11.282A1.13 1.13 0 0 0 .29 1.649L5.928 20.44a1.48 1.48 0 0 0 1.183 1.035a1.48 1.48 0 0 0 1.48-.621l3.078-4.44a.37.37 0 0 1 .31-.118a.43.43 0 0 1 .296.104l6.91 6.91a1.48 1.48 0 0 0 2.087 0l2.086-2.086a1.48 1.48 0 0 0-.074-2.101\"/></svg>`;\n const triangleDataUrl = `url(\"data:image/svg+xml,${encodeURIComponent(triangleSvg)}\")`;\n runtime.innerElement.style.borderRadius = \"0\";\n runtime.innerElement.style.border = \"none\";\n runtime.innerElement.style.backgroundColor = \"transparent\";\n runtime.innerElement.style.backgroundImage = triangleDataUrl;\n runtime.innerElement.style.backgroundRepeat = \"no-repeat\";\n runtime.innerElement.style.backgroundSize = \"contain\";\n runtime.innerElement.style.backgroundPosition = \"left top\";\n runtime.innerElement.style.backdropFilter = \"none\";\n runtime.innerElement.style.boxShadow = \"none\";\n runtime.innerElement.style.filter = \"drop-shadow(0 1px 2px rgba(0, 0, 0, 0.4))\";\n runtime.innerElement.style.opacity = getBaseOpacity();\n return;\n }\n runtime.innerElement.style.borderRadius = \"999px\";\n runtime.innerElement.style.border = \"none\";\n runtime.innerElement.style.backgroundColor = runtime.options.color;\n runtime.innerElement.style.backgroundImage = \"none\";\n runtime.innerElement.style.backdropFilter = \"none\";\n runtime.innerElement.style.filter = \"none\";\n runtime.innerElement.style.boxShadow = \"0 2px 10px rgba(0, 0, 0, 0.18), inset 0 0 0 2px rgba(255, 255, 255, 0.55)\";\n runtime.innerElement.style.opacity = getBaseOpacity();\n }\n function clearIdleHideTimer() {\n if (idleHideTimer !== null) {\n clearTimeout(idleHideTimer);\n idleHideTimer = null;\n }\n }\n function scheduleIdleHide() {\n clearIdleHideTimer();\n idleHideTimer = setTimeout(() => {\n idleHideTimer = null;\n if (!runtime.enabled || !runtime.innerElement) {\n return;\n }\n runtime.idleHidden = true;\n runtime.innerElement.style.transitionDuration = `${IDLE_FADE_OUT_MS}ms`;\n runtime.innerElement.style.transitionTimingFunction = PRESS_EASING;\n runtime.innerElement.style.opacity = \"0\";\n }, IDLE_HIDE_DELAY_MS);\n }\n function wakeFromIdle(options) {\n runtime.x = options.x;\n runtime.y = options.y;\n runtime.hasPosition = true;\n if (runtime.innerElement) {\n runtime.innerElement.style.transitionDuration = `${PRESS_DURATION_MS}ms`;\n runtime.innerElement.style.transitionTimingFunction = PRESS_EASING;\n runtime.innerElement.style.opacity = getBaseOpacity();\n }\n }\n function moveCursor(options) {\n if (!runtime.enabled) {\n return;\n }\n ensureCursorElement();\n const durationMs = computeDurationMs({ targetX: options.x, targetY: options.y });\n if (runtime.outerElement) {\n runtime.outerElement.style.transitionDuration = `${Math.round(durationMs)}ms`;\n runtime.outerElement.style.transitionTimingFunction = runtime.options.easing;\n }\n runtime.x = options.x;\n runtime.y = options.y;\n runtime.hasPosition = true;\n applyTranslate();\n }\n function setPressed(options) {\n if (!runtime.enabled || !runtime.innerElement) {\n return;\n }\n runtime.scale = options.pressed ? runtime.options.style === \"dot\" ? 0.92 : 0.95 : 1;\n runtime.innerElement.style.transitionDuration = `${PRESS_DURATION_MS}ms`;\n runtime.innerElement.style.transitionTimingFunction = PRESS_EASING;\n runtime.innerElement.style.opacity = options.pressed ? \"1\" : getBaseOpacity();\n applyScale();\n }\n function enable(options) {\n runtime.options = mergeOptions(options);\n runtime.enabled = true;\n ensureCursorElement();\n applyRuntimeVisualOptions();\n if (!runtime.hasPosition) {\n runtime.x = Math.round(window.innerWidth / 2);\n runtime.y = Math.round(window.innerHeight / 2);\n runtime.scale = 1;\n runtime.hasPosition = true;\n }\n runtime.idleHidden = false;\n if (runtime.innerElement) {\n runtime.innerElement.style.opacity = getBaseOpacity();\n }\n applyTranslate();\n applyScale();\n scheduleIdleHide();\n }\n function disable() {\n runtime.enabled = false;\n runtime.scale = 1;\n runtime.hasPosition = false;\n runtime.idleHidden = false;\n clearIdleHideTimer();\n if (runtime.outerElement) {\n runtime.outerElement.remove();\n runtime.outerElement = null;\n runtime.innerElement = null;\n }\n }\n function applyMouseAction(action) {\n if (!runtime.enabled) {\n return;\n }\n if (runtime.idleHidden) {\n runtime.idleHidden = false;\n wakeFromIdle({ x: action.x, y: action.y });\n }\n if (action.type === \"move\" || action.type === \"wheel\") {\n moveCursor({ x: action.x, y: action.y });\n } else if (action.type === \"down\") {\n moveCursor({ x: action.x, y: action.y });\n setPressed({ pressed: true });\n } else if (action.type === \"up\") {\n moveCursor({ x: action.x, y: action.y });\n setPressed({ pressed: false });\n }\n scheduleIdleHide();\n }\n var api = {\n enable,\n disable,\n applyMouseAction,\n isEnabled: () => {\n return runtime.enabled;\n }\n };\n if (isTopFrame) {\n globalThis.__playwriterGhostCursor = api;\n try {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => {\n try {\n api.enable();\n } catch {}\n }, { once: true });\n } else {\n api.enable();\n }\n } catch {}\n }\n})();\n";
|
|
548
548
|
//#endregion
|
|
549
549
|
//#region ../playwriter/dist/bippy.js?raw
|
|
550
|
-
var bippy_default = "(() => {\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/rdt-hook-BZMdLD7S.js\n var e = `0.5.27`;\n var t = `bippy-${e}`;\n var n = Object.defineProperty;\n var r = Object.prototype.hasOwnProperty;\n var i = () => {};\n var a = (e2) => {\n try {\n let t2 = Function.prototype.toString.call(e2);\n t2.indexOf(`^_^`) > -1 && setTimeout(() => {\n throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`);\n });\n } catch {}\n };\n var o = (e2 = h()) => (`getFiberRoots` in e2);\n var s = false;\n var c;\n var l = (e2 = h()) => s ? true : (typeof e2.inject == `function` && (c = e2.inject.toString()), !!c?.includes(`(injected)`));\n var u = new Set;\n var d = new Set;\n var f = (e2) => {\n let r2 = new Map, o2 = 0, s2 = { _instrumentationIsActive: false, _instrumentationSource: t, checkDCE: a, hasUnsupportedRendererAttached: false, inject(e3) {\n let t2 = ++o2;\n return r2.set(t2, e3), d.add(e3), s2._instrumentationIsActive || (s2._instrumentationIsActive = true, u.forEach((e4) => e4())), t2;\n }, on: i, onCommitFiberRoot: i, onCommitFiberUnmount: i, onPostCommitFiberRoot: i, renderers: r2, supportsFiber: true, supportsFlight: true };\n try {\n n(globalThis, `__REACT_DEVTOOLS_GLOBAL_HOOK__`, { configurable: true, enumerable: true, get() {\n return s2;\n }, set(t3) {\n if (t3 && typeof t3 == `object`) {\n let n2 = s2.renderers;\n s2 = t3, n2.size > 0 && (n2.forEach((e3, n3) => {\n d.add(e3), t3.renderers.set(n3, e3);\n }), p(e2));\n }\n } });\n let t2 = window.hasOwnProperty, r3 = false;\n n(window, `hasOwnProperty`, { configurable: true, value: function(...e3) {\n try {\n if (!r3 && e3[0] === `__REACT_DEVTOOLS_GLOBAL_HOOK__`)\n return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = undefined, r3 = true, -0;\n } catch {}\n return t2.apply(this, e3);\n }, writable: true });\n } catch {\n p(e2);\n }\n return s2;\n };\n var p = (e2) => {\n e2 && u.add(e2);\n try {\n let n2 = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!n2)\n return;\n if (!n2._instrumentationSource) {\n n2.checkDCE = a, n2.supportsFiber = true, n2.supportsFlight = true, n2.hasUnsupportedRendererAttached = false, n2._instrumentationSource = t, n2._instrumentationIsActive = false;\n let e3 = o(n2);\n if (e3 || (n2.on = i), n2.renderers.size) {\n n2._instrumentationIsActive = true, u.forEach((e4) => e4());\n return;\n }\n let r2 = n2.inject, c2 = l(n2);\n if (c2 && !e3) {\n s = true;\n let e4 = n2.inject({ scheduleRefresh() {} });\n e4 && (n2._instrumentationIsActive = true);\n }\n n2.inject = (e4) => {\n let t2 = r2(e4);\n return d.add(e4), c2 && n2.renderers.set(t2, e4), n2._instrumentationIsActive = true, u.forEach((e5) => e5()), t2;\n };\n }\n (n2.renderers.size || n2._instrumentationIsActive || l()) && e2?.();\n } catch {}\n };\n var m = () => r.call(globalThis, `__REACT_DEVTOOLS_GLOBAL_HOOK__`);\n var h = (e2) => m() ? (p(e2), globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__) : f(e2);\n var g = () => !!(typeof window < `u` && (window.document?.createElement || window.navigator?.product === `ReactNative`));\n var _ = () => {\n try {\n g() && h();\n } catch {}\n };\n\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/install-hook-only-BOBPiBkc.js\n _();\n\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/core-coQbWNwP.js\n var a2 = 0;\n var o2 = 1;\n var c2 = 5;\n var f2 = 11;\n var p2 = 13;\n var m2 = 14;\n var h2 = 15;\n var ee = 16;\n var te = 19;\n var y = 26;\n var b = 27;\n var ne = 28;\n var re = 30;\n var ie = 2;\n var ae = 4096;\n var oe = 4;\n var se = 16;\n var ce = 32;\n var le = 1024;\n var ue = 8192;\n var O = ie | oe | se | ce | ae | ue | le;\n var k = (e2) => {\n switch (e2.tag) {\n case c2:\n case y:\n case b:\n return true;\n default:\n return typeof e2.type == `string`;\n }\n };\n var pe = (e2) => {\n switch (e2.tag) {\n case o2:\n case f2:\n case a2:\n case m2:\n case h2:\n return true;\n default:\n return false;\n }\n };\n function N(e2, t2, n2 = false) {\n if (!e2)\n return null;\n let r2 = t2(e2);\n if (r2 instanceof Promise)\n return (async () => {\n if (await r2 === true)\n return e2;\n let i3 = n2 ? e2.return : e2.child;\n for (;i3; ) {\n let e3 = await F(i3, t2, n2);\n if (e3)\n return e3;\n i3 = n2 ? null : i3.sibling;\n }\n return null;\n })();\n if (r2 === true)\n return e2;\n let i2 = n2 ? e2.return : e2.child;\n for (;i2; ) {\n let e3 = P(i2, t2, n2);\n if (e3)\n return e3;\n i2 = n2 ? null : i2.sibling;\n }\n return null;\n }\n var P = (e2, t2, n2 = false) => {\n if (!e2)\n return null;\n if (t2(e2) === true)\n return e2;\n let r2 = n2 ? e2.return : e2.child;\n for (;r2; ) {\n let e3 = P(r2, t2, n2);\n if (e3)\n return e3;\n r2 = n2 ? null : r2.sibling;\n }\n return null;\n };\n var F = async (e2, t2, n2 = false) => {\n if (!e2)\n return null;\n if (await t2(e2) === true)\n return e2;\n let r2 = n2 ? e2.return : e2.child;\n for (;r2; ) {\n let e3 = await F(r2, t2, n2);\n if (e3)\n return e3;\n r2 = n2 ? null : r2.sibling;\n }\n return null;\n };\n var I = (e2) => {\n let t2 = e2;\n return typeof t2 == `function` ? t2 : typeof t2 == `object` && t2 ? I(t2.type || t2.render) : null;\n };\n var Te = (e2) => {\n let t2 = e2;\n if (typeof t2 == `string`)\n return t2;\n if (typeof t2 != `function` && !(typeof t2 == `object` && t2))\n return null;\n let n2 = t2.displayName || t2.name || null;\n if (n2)\n return n2;\n let r2 = I(t2);\n return r2 && (r2.displayName || r2.name) || null;\n };\n var z = new WeakMap;\n var K = new WeakMap;\n var Pe = (e2) => {\n let n2 = h();\n for (let t2 of n2.renderers.values())\n try {\n let n3 = t2.findFiberByHostInstance?.(e2);\n if (n3)\n return n3;\n } catch {}\n if (typeof e2 == `object` && e2) {\n if (`_reactRootContainer` in e2)\n return e2._reactRootContainer?._internalRoot?.current?.child;\n for (let t2 in e2)\n if (t2.startsWith(`__reactContainer$`) || t2.startsWith(`__reactInternalInstance$`) || t2.startsWith(`__reactFiber`))\n return e2[t2] || null;\n }\n return null;\n };\n var Fe = Error();\n var $ = new Set;\n\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/source.js\n var g3 = Object.create;\n var _3 = Object.defineProperty;\n var v2 = Object.getOwnPropertyDescriptor;\n var y2 = Object.getOwnPropertyNames;\n var b2 = Object.getPrototypeOf;\n var x2 = Object.prototype.hasOwnProperty;\n var S2 = (e2, t2) => () => (t2 || e2((t2 = { exports: {} }).exports, t2), t2.exports);\n var ee2 = (e2, t2, n2, r2) => {\n if (t2 && typeof t2 == `object` || typeof t2 == `function`)\n for (var i2 = y2(t2), a3 = 0, o3 = i2.length, s3;a3 < o3; a3++)\n s3 = i2[a3], !x2.call(e2, s3) && s3 !== n2 && _3(e2, s3, { get: ((e3) => t2[e3]).bind(null, s3), enumerable: !(r2 = v2(t2, s3)) || r2.enumerable });\n return e2;\n };\n var C2 = (e2, t2, n2) => (n2 = e2 == null ? {} : g3(b2(e2)), ee2(t2 || !e2 || !e2.__esModule ? _3(n2, `default`, { value: e2, enumerable: true }) : n2, e2));\n var w2 = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:/;\n var te2 = [`rsc://`, `file:///`, `webpack://`, `webpack-internal://`, `node:`, `turbopack://`, `metro://`, `/app-pages-browser/`];\n var T2 = `about://React/`;\n var ne2 = [`<anonymous>`, `eval`, ``];\n var re2 = /\\.(jsx|tsx|ts|js)$/;\n var ie2 = /(\\.min|bundle|chunk|vendor|vendors|runtime|polyfill|polyfills)\\.(js|mjs|cjs)$|(chunk|bundle|vendor|vendors|runtime|polyfill|polyfills|framework|app|main|index)[-_.][A-Za-z0-9_-]{4,}\\.(js|mjs|cjs)$|[\\da-f]{8,}\\.(js|mjs|cjs)$|[-_.][\\da-f]{20,}\\.(js|mjs|cjs)$|\\/dist\\/|\\/build\\/|\\/.next\\/|\\/out\\/|\\/node_modules\\/|\\.webpack\\.|\\.vite\\.|\\.turbopack\\./i;\n var ae2 = /^\\?[\\w~.\\-]+(?:=[^&#]*)?(?:&[\\w~.\\-]+(?:=[^&#]*)?)*$/;\n var E = `(at Server)`;\n var oe2 = /(^|@)\\S+:\\d+/;\n var se2 = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\n var ce2 = /^(eval@)?(\\[native code\\])?$/;\n var D = (e2, t2) => {\n if (t2?.includeInElement !== false) {\n let n2 = e2.split(`\n`), r2 = [];\n for (let e3 of n2)\n if (/^\\s*at\\s+/.test(e3)) {\n let t3 = A2(e3, undefined)[0];\n t3 && r2.push(t3);\n } else if (/^\\s*in\\s+/.test(e3)) {\n let t3 = e3.replace(/^\\s*in\\s+/, ``).replace(/\\s*\\(at .*\\)$/, ``);\n r2.push({ functionName: t3, source: e3 });\n } else if (e3.match(oe2)) {\n let t3 = j2(e3, undefined)[0];\n t3 && r2.push(t3);\n }\n return k2(r2, t2);\n }\n return e2.match(se2) ? A2(e2, t2) : j2(e2, t2);\n };\n var O2 = (e2) => {\n if (!e2.includes(`:`))\n return [e2, undefined, undefined];\n let t2 = /(.+?)(?::(\\d+))?(?::(\\d+))?$/, n2 = e2.startsWith(`(`) && e2.endsWith(`)`) ? e2.slice(1, -1) : e2, r2 = t2.exec(n2);\n return [r2[1], r2[2] || undefined, r2[3] || undefined];\n };\n var k2 = (e2, t2) => t2 && t2.slice != null ? Array.isArray(t2.slice) ? e2.slice(t2.slice[0], t2.slice[1]) : e2.slice(0, t2.slice) : e2;\n var A2 = (e2, t2) => {\n let n2 = k2(e2.split(`\n`).filter((e3) => !!e3.match(se2)), t2);\n return n2.map((e3) => {\n let t3 = e3;\n t3.includes(`(eval `) && (t3 = t3.replace(/eval code/g, `eval`).replace(/(\\(eval at [^()]*)|(,.*$)/g, ``));\n let n3 = t3.replace(/^\\s+/, ``).replace(/\\(eval code/g, `(`).replace(/^.*?\\s+/, ``), r2 = n3.match(/ (\\(.+\\)$)/);\n n3 = r2 ? n3.replace(r2[0], ``) : n3;\n let i2 = O2(r2 ? r2[1] : n3), a3 = r2 && n3 || undefined, o3 = [`eval`, `<anonymous>`].includes(i2[0]) ? undefined : i2[0];\n return { functionName: a3, fileName: o3, lineNumber: i2[1] ? +i2[1] : undefined, columnNumber: i2[2] ? +i2[2] : undefined, source: t3 };\n });\n };\n var j2 = (e2, t2) => {\n let n2 = k2(e2.split(`\n`).filter((e3) => !e3.match(ce2)), t2);\n return n2.map((e3) => {\n let t3 = e3;\n if (t3.includes(` > eval`) && (t3 = t3.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g, `:$1`)), !t3.includes(`@`) && !t3.includes(`:`))\n return { functionName: t3 };\n {\n let e4 = /(([^\\n\\r\"\\u2028\\u2029]*\".[^\\n\\r\"\\u2028\\u2029]*\"[^\\n\\r@\\u2028\\u2029]*(?:@[^\\n\\r\"\\u2028\\u2029]*\"[^\\n\\r@\\u2028\\u2029]*)*(?:[\\n\\r\\u2028\\u2029][^@]*)?)?[^@]*)@/, n3 = t3.match(e4), r2 = n3 && n3[1] ? n3[1] : undefined, i2 = O2(t3.replace(e4, ``));\n return { functionName: r2, fileName: i2[0], lineNumber: i2[1] ? +i2[1] : undefined, columnNumber: i2[2] ? +i2[2] : undefined, source: t3 };\n }\n });\n };\n var pe2 = S2((exports, t2) => {\n (function(n2, r2) {\n typeof exports == `object` && t2 !== undefined ? r2(exports) : typeof define == `function` && define.amd ? define([`exports`], r2) : (n2 = typeof globalThis < `u` ? globalThis : n2 || self, r2(n2.sourcemapCodec = {}));\n })(undefined, function(e2) {\n let t3 = 44, n2 = 59, r2 = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`, i2 = new Uint8Array(64), a3 = new Uint8Array(128);\n for (let e3 = 0;e3 < r2.length; e3++) {\n let t4 = r2.charCodeAt(e3);\n i2[e3] = t4, a3[t4] = e3;\n }\n function o3(e3, t4) {\n let n3 = 0, r3 = 0, i3 = 0;\n do {\n let t5 = e3.next();\n i3 = a3[t5], n3 |= (i3 & 31) << r3, r3 += 5;\n } while (i3 & 32);\n let o4 = n3 & 1;\n return n3 >>>= 1, o4 && (n3 = -2147483648 | -n3), t4 + n3;\n }\n function s3(e3, t4, n3) {\n let r3 = t4 - n3;\n r3 = r3 < 0 ? -r3 << 1 | 1 : r3 << 1;\n do {\n let t5 = r3 & 31;\n r3 >>>= 5, r3 > 0 && (t5 |= 32), e3.write(i2[t5]);\n } while (r3 > 0);\n return t4;\n }\n function c3(e3, n3) {\n return e3.pos >= n3 ? false : e3.peek() !== t3;\n }\n let l3 = 1024 * 16, u3 = typeof TextDecoder < `u` ? new TextDecoder : typeof Buffer < `u` ? { decode(e3) {\n let t4 = Buffer.from(e3.buffer, e3.byteOffset, e3.byteLength);\n return t4.toString();\n } } : { decode(e3) {\n let t4 = ``;\n for (let n3 = 0;n3 < e3.length; n3++)\n t4 += String.fromCharCode(e3[n3]);\n return t4;\n } };\n\n class d3 {\n constructor() {\n this.pos = 0, this.out = ``, this.buffer = new Uint8Array(l3);\n }\n write(e3) {\n let { buffer: t4 } = this;\n t4[this.pos++] = e3, this.pos === l3 && (this.out += u3.decode(t4), this.pos = 0);\n }\n flush() {\n let { buffer: e3, out: t4, pos: n3 } = this;\n return n3 > 0 ? t4 + u3.decode(e3.subarray(0, n3)) : t4;\n }\n }\n\n class f3 {\n constructor(e3) {\n this.pos = 0, this.buffer = e3;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(e3) {\n let { buffer: t4, pos: n3 } = this, r3 = t4.indexOf(e3, n3);\n return r3 === -1 ? t4.length : r3;\n }\n }\n let p3 = [];\n function m3(e3) {\n let { length: t4 } = e3, n3 = new f3(e3), r3 = [], i3 = [], a4 = 0;\n for (;n3.pos < t4; n3.pos++) {\n a4 = o3(n3, a4);\n let e4 = o3(n3, 0);\n if (!c3(n3, t4)) {\n let t5 = i3.pop();\n t5[2] = a4, t5[3] = e4;\n continue;\n }\n let s4 = o3(n3, 0), l4 = o3(n3, 0), u4 = l4 & 1, d4 = u4 ? [a4, e4, 0, 0, s4, o3(n3, 0)] : [a4, e4, 0, 0, s4], f4 = p3;\n if (c3(n3, t4)) {\n f4 = [];\n do {\n let e5 = o3(n3, 0);\n f4.push(e5);\n } while (c3(n3, t4));\n }\n d4.vars = f4, r3.push(d4), i3.push(d4);\n }\n return r3;\n }\n function h3(e3) {\n let t4 = new d3;\n for (let n3 = 0;n3 < e3.length; )\n n3 = g4(e3, n3, t4, [0]);\n return t4.flush();\n }\n function g4(e3, n3, r3, i3) {\n let a4 = e3[n3], { 0: o4, 1: c4, 2: l4, 3: u4, 4: d4, vars: f4 } = a4;\n n3 > 0 && r3.write(t3), i3[0] = s3(r3, o4, i3[0]), s3(r3, c4, 0), s3(r3, d4, 0);\n let p4 = a4.length === 6 ? 1 : 0;\n s3(r3, p4, 0), a4.length === 6 && s3(r3, a4[5], 0);\n for (let e4 of f4)\n s3(r3, e4, 0);\n for (n3++;n3 < e3.length; ) {\n let t4 = e3[n3], { 0: a5, 1: o5 } = t4;\n if (a5 > l4 || a5 === l4 && o5 >= u4)\n break;\n n3 = g4(e3, n3, r3, i3);\n }\n return r3.write(t3), i3[0] = s3(r3, l4, i3[0]), s3(r3, u4, 0), n3;\n }\n function _4(e3) {\n let { length: t4 } = e3, n3 = new f3(e3), r3 = [], i3 = [], a4 = 0, s4 = 0, l4 = 0, u4 = 0, d4 = 0, m4 = 0, h4 = 0, g5 = 0;\n do {\n let e4 = n3.indexOf(`;`), t5 = 0;\n for (;n3.pos < e4; n3.pos++) {\n if (t5 = o3(n3, t5), !c3(n3, e4)) {\n let e5 = i3.pop();\n e5[2] = a4, e5[3] = t5;\n continue;\n }\n let f4 = o3(n3, 0), _5 = f4 & 1, v4 = f4 & 2, y4 = f4 & 4, b4 = null, x4 = p3, S4;\n if (_5) {\n let e5 = o3(n3, s4);\n l4 = o3(n3, s4 === e5 ? l4 : 0), s4 = e5, S4 = [a4, t5, 0, 0, e5, l4];\n } else\n S4 = [a4, t5, 0, 0];\n if (S4.isScope = !!y4, v4) {\n let e5 = u4, t6 = d4;\n u4 = o3(n3, u4);\n let r4 = e5 === u4;\n d4 = o3(n3, r4 ? d4 : 0), m4 = o3(n3, r4 && t6 === d4 ? m4 : 0), b4 = [u4, d4, m4];\n }\n if (S4.callsite = b4, c3(n3, e4)) {\n x4 = [];\n do {\n h4 = a4, g5 = t5;\n let e5 = o3(n3, 0), r4;\n if (e5 < -1) {\n r4 = [[o3(n3, 0)]];\n for (let t6 = -1;t6 > e5; t6--) {\n let e6 = h4;\n h4 = o3(n3, h4), g5 = o3(n3, h4 === e6 ? g5 : 0);\n let t7 = o3(n3, 0);\n r4.push([t7, h4, g5]);\n }\n } else\n r4 = [[e5]];\n x4.push(r4);\n } while (c3(n3, e4));\n }\n S4.bindings = x4, r3.push(S4), i3.push(S4);\n }\n a4++, n3.pos = e4 + 1;\n } while (n3.pos < t4);\n return r3;\n }\n function v3(e3) {\n if (e3.length === 0)\n return ``;\n let t4 = new d3;\n for (let n3 = 0;n3 < e3.length; )\n n3 = y3(e3, n3, t4, [0, 0, 0, 0, 0, 0, 0]);\n return t4.flush();\n }\n function y3(e3, n3, r3, i3) {\n let a4 = e3[n3], { 0: o4, 1: c4, 2: l4, 3: u4, isScope: d4, callsite: f4, bindings: p4 } = a4;\n i3[0] < o4 ? (b3(r3, i3[0], o4), i3[0] = o4, i3[1] = 0) : n3 > 0 && r3.write(t3), i3[1] = s3(r3, a4[1], i3[1]);\n let m4 = (a4.length === 6 ? 1 : 0) | (f4 ? 2 : 0) | (d4 ? 4 : 0);\n if (s3(r3, m4, 0), a4.length === 6) {\n let { 4: e4, 5: t4 } = a4;\n e4 !== i3[2] && (i3[3] = 0), i3[2] = s3(r3, e4, i3[2]), i3[3] = s3(r3, t4, i3[3]);\n }\n if (f4) {\n let { 0: e4, 1: t4, 2: n4 } = a4.callsite;\n e4 === i3[4] ? t4 !== i3[5] && (i3[6] = 0) : (i3[5] = 0, i3[6] = 0), i3[4] = s3(r3, e4, i3[4]), i3[5] = s3(r3, t4, i3[5]), i3[6] = s3(r3, n4, i3[6]);\n }\n if (p4)\n for (let e4 of p4) {\n e4.length > 1 && s3(r3, -e4.length, 0);\n let t4 = e4[0][0];\n s3(r3, t4, 0);\n let n4 = o4, i4 = c4;\n for (let t5 = 1;t5 < e4.length; t5++) {\n let a5 = e4[t5];\n n4 = s3(r3, a5[1], n4), i4 = s3(r3, a5[2], i4), s3(r3, a5[0], 0);\n }\n }\n for (n3++;n3 < e3.length; ) {\n let t4 = e3[n3], { 0: a5, 1: o5 } = t4;\n if (a5 > l4 || a5 === l4 && o5 >= u4)\n break;\n n3 = y3(e3, n3, r3, i3);\n }\n return i3[0] < l4 ? (b3(r3, i3[0], l4), i3[0] = l4, i3[1] = 0) : r3.write(t3), i3[1] = s3(r3, u4, i3[1]), n3;\n }\n function b3(e3, t4, r3) {\n do\n e3.write(n2);\n while (++t4 < r3);\n }\n function x3(e3) {\n let { length: t4 } = e3, n3 = new f3(e3), r3 = [], i3 = 0, a4 = 0, s4 = 0, l4 = 0, u4 = 0;\n do {\n let e4 = n3.indexOf(`;`), t5 = [], d4 = true, f4 = 0;\n for (i3 = 0;n3.pos < e4; ) {\n let r4;\n i3 = o3(n3, i3), i3 < f4 && (d4 = false), f4 = i3, c3(n3, e4) ? (a4 = o3(n3, a4), s4 = o3(n3, s4), l4 = o3(n3, l4), c3(n3, e4) ? (u4 = o3(n3, u4), r4 = [i3, a4, s4, l4, u4]) : r4 = [i3, a4, s4, l4]) : r4 = [i3], t5.push(r4), n3.pos++;\n }\n d4 || S3(t5), r3.push(t5), n3.pos = e4 + 1;\n } while (n3.pos <= t4);\n return r3;\n }\n function S3(e3) {\n e3.sort(ee3);\n }\n function ee3(e3, t4) {\n return e3[0] - t4[0];\n }\n function C3(e3) {\n let r3 = new d3, i3 = 0, a4 = 0, o4 = 0, c4 = 0;\n for (let l4 = 0;l4 < e3.length; l4++) {\n let u4 = e3[l4];\n if (l4 > 0 && r3.write(n2), u4.length === 0)\n continue;\n let d4 = 0;\n for (let e4 = 0;e4 < u4.length; e4++) {\n let n3 = u4[e4];\n e4 > 0 && r3.write(t3), d4 = s3(r3, n3[0], d4), n3.length !== 1 && (i3 = s3(r3, n3[1], i3), a4 = s3(r3, n3[2], a4), o4 = s3(r3, n3[3], o4), n3.length !== 4 && (c4 = s3(r3, n3[4], c4)));\n }\n }\n return r3.flush();\n }\n e2.decode = x3, e2.decodeGeneratedRanges = _4, e2.decodeOriginalScopes = m3, e2.encode = C3, e2.encodeGeneratedRanges = v3, e2.encodeOriginalScopes = h3, Object.defineProperty(e2, `__esModule`, { value: true });\n });\n });\n var F2 = C2(pe2(), 1);\n var I2 = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:/;\n var me2 = /^data:application\\/json[^,]+base64,/;\n var he2 = /(?:\\/\\/[@#][ \\t]+sourceMappingURL=([^\\s'\"]+?)[ \\t]*$)|(?:\\/\\*[@#][ \\t]+sourceMappingURL=([^*]+?)[ \\t]*(?:\\*\\/)[ \\t]*$)/;\n var L2 = typeof WeakRef < `u`;\n var R = new Map;\n var z2 = new Map;\n var ge2 = (e2) => L2 && e2 instanceof WeakRef;\n var B2 = (e2, t2, n2, r2) => {\n if (n2 < 0 || n2 >= e2.length)\n return null;\n let i2 = e2[n2];\n if (!i2 || i2.length === 0)\n return null;\n let a3 = null;\n for (let e3 of i2)\n if (e3[0] <= r2)\n a3 = e3;\n else\n break;\n if (!a3 || a3.length < 4)\n return null;\n let [, o3, s3, c3] = a3;\n if (o3 === undefined || s3 === undefined || c3 === undefined)\n return null;\n let l3 = t2[o3];\n return l3 ? { columnNumber: c3, fileName: l3, lineNumber: s3 + 1 } : null;\n };\n var V2 = (e2, t2, n2) => {\n if (e2.sections) {\n let r2 = null;\n for (let i3 of e2.sections)\n if (t2 > i3.offset.line || t2 === i3.offset.line && n2 >= i3.offset.column)\n r2 = i3;\n else\n break;\n if (!r2)\n return null;\n let i2 = t2 - r2.offset.line, a3 = t2 === r2.offset.line ? n2 - r2.offset.column : n2;\n return B2(r2.map.mappings, r2.map.sources, i2, a3);\n }\n return B2(e2.mappings, e2.sources, t2 - 1, n2);\n };\n var _e2 = (e2, t2) => {\n let n2 = t2.split(`\n`), r2;\n for (let e3 = n2.length - 1;e3 >= 0 && !r2; e3--) {\n let t3 = n2[e3].match(he2);\n t3 && (r2 = t3[1] || t3[2]);\n }\n if (!r2)\n return null;\n let i2 = I2.test(r2);\n if (!(me2.test(r2) || i2 || r2.startsWith(`/`))) {\n let t3 = e2.split(`/`);\n t3[t3.length - 1] = r2, r2 = t3.join(`/`);\n }\n return r2;\n };\n var ve2 = (e2) => ({ file: e2.file, mappings: (0, F2.decode)(e2.mappings), names: e2.names, sourceRoot: e2.sourceRoot, sources: e2.sources, sourcesContent: e2.sourcesContent, version: 3 });\n var ye2 = (e2) => {\n let t2 = e2.sections.map(({ map: e3, offset: t3 }) => ({ map: { ...e3, mappings: (0, F2.decode)(e3.mappings) }, offset: t3 })), n2 = new Set;\n for (let e3 of t2)\n for (let t3 of e3.map.sources)\n n2.add(t3);\n return { file: e2.file, mappings: [], names: [], sections: t2, sourceRoot: undefined, sources: Array.from(n2), sourcesContent: undefined, version: 3 };\n };\n var H2 = (e2) => {\n if (!e2)\n return false;\n let t2 = e2.trim();\n if (!t2)\n return false;\n let n2 = t2.match(I2);\n if (!n2)\n return true;\n let r2 = n2[0].toLowerCase();\n return r2 === `http:` || r2 === `https:`;\n };\n var U2 = async (e2, t2 = fetch) => {\n if (!H2(e2))\n return null;\n let n2;\n try {\n let r3 = await t2(e2);\n n2 = await r3.text();\n } catch {\n return null;\n }\n if (!n2)\n return null;\n let r2 = _e2(e2, n2);\n if (!r2 || !H2(r2))\n return null;\n try {\n let e3 = await t2(r2), n3 = await e3.json();\n return `sections` in n3 ? ye2(n3) : ve2(n3);\n } catch {\n return null;\n }\n };\n var W2 = async (e2, t2 = true, n2) => {\n if (t2 && R.has(e2)) {\n let t3 = R.get(e2);\n if (t3 == null)\n return null;\n if (ge2(t3)) {\n let n3 = t3.deref();\n if (n3)\n return n3;\n R.delete(e2);\n } else\n return t3;\n }\n if (t2 && z2.has(e2))\n return z2.get(e2);\n let r2 = U2(e2, n2);\n t2 && z2.set(e2, r2);\n let i2 = await r2;\n return t2 && z2.delete(e2), t2 && (i2 === null ? R.set(e2, null) : R.set(e2, L2 ? new WeakRef(i2) : i2)), i2;\n };\n var G2 = async (e2, t2 = true, n2) => await Promise.all(e2.map(async (e3) => {\n if (!e3.fileName)\n return e3;\n let r2 = await W2(e3.fileName, t2, n2);\n if (!r2 || typeof e3.lineNumber != `number` || typeof e3.columnNumber != `number`)\n return e3;\n let i2 = V2(r2, e3.lineNumber, e3.columnNumber);\n return i2 ? { ...e3, source: i2.fileName && e3.source ? e3.source.replace(e3.fileName, i2.fileName) : e3.source, fileName: i2.fileName, lineNumber: i2.lineNumber, columnNumber: i2.columnNumber, isSymbolicated: true } : e3;\n }));\n var K2 = (e2) => e2._debugStack instanceof Error && typeof e2._debugStack?.stack == `string`;\n var be2 = () => {\n let n2 = h();\n for (let t2 of [...Array.from(d), ...Array.from(n2.renderers.values())]) {\n let e2 = t2.currentDispatcherRef;\n if (e2 && typeof e2 == `object`)\n return `H` in e2 ? e2.H : e2.current;\n }\n return null;\n };\n var q = (t2) => {\n for (let n2 of d) {\n let e2 = n2.currentDispatcherRef;\n e2 && typeof e2 == `object` && (`H` in e2 ? e2.H = t2 : e2.current = t2);\n }\n };\n var J = (e2) => `\n in ${e2}`;\n var Y = (e2, t2) => {\n let n2 = J(e2);\n return t2 && (n2 += ` (at ${t2})`), n2;\n };\n var X2 = false;\n var Z = (e2, t2) => {\n if (!e2 || X2)\n return ``;\n let n2 = Error.prepareStackTrace;\n Error.prepareStackTrace = undefined, X2 = true;\n let r2 = be2();\n q(null);\n let { error: i2, warn: a3 } = console;\n console.error = () => {}, console.warn = () => {};\n try {\n let n3 = { DetermineComponentFrameRoot() {\n let n4;\n try {\n if (t2) {\n let t3 = function() {\n throw Error();\n };\n if (Object.defineProperty(t3.prototype, `props`, { set: function() {\n throw Error();\n } }), typeof Reflect == `object` && Reflect.construct) {\n try {\n Reflect.construct(t3, []);\n } catch (e3) {\n n4 = e3;\n }\n Reflect.construct(e2, [], t3);\n } else {\n try {\n t3.call();\n } catch (e3) {\n n4 = e3;\n }\n e2.call(t3.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (e3) {\n n4 = e3;\n }\n let t3 = e2();\n t3 && typeof t3.catch == `function` && t3.catch(() => {});\n }\n } catch (e3) {\n if (e3 instanceof Error && n4 instanceof Error && typeof e3.stack == `string`)\n return [e3.stack, n4.stack];\n }\n return [null, null];\n } };\n n3.DetermineComponentFrameRoot.displayName = `DetermineComponentFrameRoot`;\n let r3 = Object.getOwnPropertyDescriptor(n3.DetermineComponentFrameRoot, `name`);\n r3?.configurable && Object.defineProperty(n3.DetermineComponentFrameRoot, `name`, { value: `DetermineComponentFrameRoot` });\n let [i3, a4] = n3.DetermineComponentFrameRoot();\n if (i3 && a4) {\n let t3 = i3.split(`\n`), n4 = a4.split(`\n`), r4 = 0, o4 = 0;\n for (;r4 < t3.length && !t3[r4].includes(`DetermineComponentFrameRoot`); )\n r4++;\n for (;o4 < n4.length && !n4[o4].includes(`DetermineComponentFrameRoot`); )\n o4++;\n if (r4 === t3.length || o4 === n4.length)\n for (r4 = t3.length - 1, o4 = n4.length - 1;r4 >= 1 && o4 >= 0 && t3[r4] !== n4[o4]; )\n o4--;\n for (;r4 >= 1 && o4 >= 0; r4--, o4--)\n if (t3[r4] !== n4[o4]) {\n if (r4 !== 1 || o4 !== 1)\n do\n if (r4--, o4--, o4 < 0 || t3[r4] !== n4[o4]) {\n let n5 = `\n${t3[r4].replace(` at new `, ` at `)}`, i4 = Te(e2);\n return i4 && n5.includes(`<anonymous>`) && (n5 = n5.replace(`<anonymous>`, i4)), n5;\n }\n while (r4 >= 1 && o4 >= 0);\n break;\n }\n }\n } finally {\n X2 = false, Error.prepareStackTrace = n2, q(r2), console.error = i2, console.warn = a3;\n }\n let o3 = e2 ? Te(e2) : ``, s3 = o3 ? J(o3) : ``;\n return s3;\n };\n var xe2 = (e2, t2) => {\n let m3 = e2.tag, h3 = ``;\n switch (m3) {\n case ne:\n h3 = J(`Activity`);\n break;\n case o2:\n h3 = Z(e2.type, true);\n break;\n case f2:\n h3 = Z(e2.type.render, false);\n break;\n case a2:\n case h2:\n h3 = Z(e2.type, false);\n break;\n case c2:\n case y:\n case b:\n h3 = J(e2.type);\n break;\n case ee:\n h3 = J(`Lazy`);\n break;\n case p2:\n h3 = e2.child !== t2 && t2 !== null ? J(`Suspense Fallback`) : J(`Suspense`);\n break;\n case te:\n h3 = J(`SuspenseList`);\n break;\n case re:\n h3 = J(`ViewTransition`);\n break;\n default:\n return ``;\n }\n return h3;\n };\n var Se2 = (e2) => {\n try {\n let t2 = ``, n2 = e2, r2 = null;\n do {\n t2 += xe2(n2, r2);\n let e3 = n2._debugInfo;\n if (e3 && Array.isArray(e3))\n for (let n3 = e3.length - 1;n3 >= 0; n3--) {\n let r3 = e3[n3];\n typeof r3.name == `string` && (t2 += Y(r3.name, r3.env));\n }\n r2 = n2, n2 = n2.return;\n } while (n2);\n return t2;\n } catch (e3) {\n return e3 instanceof Error ? `\nError generating stack: ${e3.message}\n${e3.stack}` : ``;\n }\n };\n var Ce2 = (e2) => {\n let t2 = Error.prepareStackTrace;\n Error.prepareStackTrace = undefined;\n let n2 = e2;\n if (!n2)\n return ``;\n Error.prepareStackTrace = t2, n2.startsWith(`Error: react-stack-top-frame\n`) && (n2 = n2.slice(29));\n let r2 = n2.indexOf(`\n`);\n if (r2 !== -1 && (n2 = n2.slice(r2 + 1)), r2 = Math.max(n2.indexOf(`react_stack_bottom_frame`), n2.indexOf(`react-stack-bottom-frame`)), r2 !== -1 && (r2 = n2.lastIndexOf(`\n`, r2)), r2 !== -1)\n n2 = n2.slice(0, r2);\n else\n return ``;\n return n2;\n };\n var we2 = (e2) => !!(e2.fileName?.startsWith(`rsc://`) && e2.functionName);\n var Te2 = (e2, t2) => e2.fileName === t2.fileName && e2.lineNumber === t2.lineNumber && e2.columnNumber === t2.columnNumber;\n var Ee2 = (e2) => {\n let t2 = new Map;\n for (let n2 of e2)\n for (let e3 of n2.stackFrames) {\n if (!we2(e3))\n continue;\n let n3 = e3.functionName, r2 = t2.get(n3) ?? [], i2 = r2.some((t3) => Te2(t3, e3));\n i2 || (r2.push(e3), t2.set(n3, r2));\n }\n return t2;\n };\n var De2 = (e2, t2, n2) => {\n if (!e2.functionName)\n return { ...e2, isServer: true };\n let r2 = t2.get(e2.functionName);\n if (!r2 || r2.length === 0)\n return { ...e2, isServer: true };\n let i2 = n2.get(e2.functionName) ?? 0, a3 = r2[i2 % r2.length];\n return n2.set(e2.functionName, i2 + 1), { ...e2, isServer: true, fileName: a3.fileName, lineNumber: a3.lineNumber, columnNumber: a3.columnNumber, source: e2.source?.replace(E, `(${a3.fileName}:${a3.lineNumber}:${a3.columnNumber})`) };\n };\n var Oe = (e2) => {\n let t2 = [];\n return N(e2, (e3) => {\n if (!K2(e3))\n return;\n let n2 = typeof e3.type == `string` ? e3.type : Te(e3.type) || `<anonymous>`;\n t2.push({ componentName: n2, stackFrames: D(Ce2(e3._debugStack?.stack)) });\n }, true), t2;\n };\n var Q = async (e2, t2 = true, n2) => {\n let r2 = Oe(e2), i2 = D(Se2(e2)), a3 = Ee2(r2), o3 = new Map, s3 = i2.map((e3) => {\n let t3 = e3.source?.includes(E) ?? false;\n return t3 ? De2(e3, a3, o3) : e3;\n }), c3 = s3.filter((e3, t3, n3) => {\n if (t3 === 0)\n return true;\n let r3 = n3[t3 - 1];\n return e3.functionName !== r3.functionName;\n });\n return G2(c3, t2, n2);\n };\n var ke2 = (e2) => {\n let t2 = e2._debugSource;\n return t2 ? typeof t2 == `object` && !!t2 && `fileName` in t2 && typeof t2.fileName == `string` && `lineNumber` in t2 && typeof t2.lineNumber == `number` : false;\n };\n var Ae2 = async (e2, t2 = true, n2) => {\n if (ke2(e2)) {\n let t3 = e2._debugSource;\n return t3 || null;\n }\n let r2 = await Q(e2, t2, n2);\n for (let e3 of r2)\n if (e3.fileName)\n return { fileName: e3.fileName, lineNumber: e3.lineNumber, columnNumber: e3.columnNumber, functionName: e3.functionName };\n return null;\n };\n var $2 = (e2) => {\n if (!e2 || ne2.some((t3) => t3 === e2))\n return ``;\n let t2 = e2;\n if (t2.startsWith(`http://`) || t2.startsWith(`https://`))\n try {\n let e3 = new URL(t2);\n t2 = e3.pathname;\n } catch {}\n if (t2.startsWith(T2)) {\n let e3 = t2.slice(T2.length), n3 = e3.indexOf(`/`), r3 = e3.indexOf(`:`);\n t2 = n3 !== -1 && (r3 === -1 || n3 < r3) ? e3.slice(n3 + 1) : e3;\n }\n let n2 = true;\n for (;n2; ) {\n n2 = false;\n for (let e3 of te2)\n if (t2.startsWith(e3)) {\n t2 = t2.slice(e3.length), e3 === `file:///` && (t2 = `/${t2.replace(/^\\/+/, ``)}`), n2 = true;\n break;\n }\n }\n if (w2.test(t2)) {\n let e3 = t2.match(w2);\n e3 && (t2 = t2.slice(e3[0].length));\n }\n if (t2.startsWith(`//`)) {\n let e3 = t2.indexOf(`/`, 2);\n t2 = e3 === -1 ? `` : t2.slice(e3);\n }\n let r2 = t2.indexOf(`?`);\n if (r2 !== -1) {\n let e3 = t2.slice(r2);\n ae2.test(e3) && (t2 = t2.slice(0, r2));\n }\n return t2;\n };\n var je2 = (e2) => {\n let t2 = $2(e2);\n return !(!t2 || !re2.test(t2) || ie2.test(t2));\n };\n\n // dist/_bippy-entry-26306-1779191184823.js\n globalThis.__bippy = {\n getFiberFromHostInstance: Pe,\n getDisplayName: Te,\n traverseFiber: N,\n isCompositeFiber: pe,\n isHostFiber: k,\n getSource: Ae2,\n getOwnerStack: Q,\n normalizeFileName: $2,\n isSourceFile: je2\n };\n})();\n";
|
|
550
|
+
var bippy_default = "(() => {\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/rdt-hook-BZMdLD7S.js\n var e = `0.5.27`;\n var t = `bippy-${e}`;\n var n = Object.defineProperty;\n var r = Object.prototype.hasOwnProperty;\n var i = () => {};\n var a = (e2) => {\n try {\n let t2 = Function.prototype.toString.call(e2);\n t2.indexOf(`^_^`) > -1 && setTimeout(() => {\n throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`);\n });\n } catch {}\n };\n var o = (e2 = h()) => (`getFiberRoots` in e2);\n var s = false;\n var c;\n var l = (e2 = h()) => s ? true : (typeof e2.inject == `function` && (c = e2.inject.toString()), !!c?.includes(`(injected)`));\n var u = new Set;\n var d = new Set;\n var f = (e2) => {\n let r2 = new Map, o2 = 0, s2 = { _instrumentationIsActive: false, _instrumentationSource: t, checkDCE: a, hasUnsupportedRendererAttached: false, inject(e3) {\n let t2 = ++o2;\n return r2.set(t2, e3), d.add(e3), s2._instrumentationIsActive || (s2._instrumentationIsActive = true, u.forEach((e4) => e4())), t2;\n }, on: i, onCommitFiberRoot: i, onCommitFiberUnmount: i, onPostCommitFiberRoot: i, renderers: r2, supportsFiber: true, supportsFlight: true };\n try {\n n(globalThis, `__REACT_DEVTOOLS_GLOBAL_HOOK__`, { configurable: true, enumerable: true, get() {\n return s2;\n }, set(t3) {\n if (t3 && typeof t3 == `object`) {\n let n2 = s2.renderers;\n s2 = t3, n2.size > 0 && (n2.forEach((e3, n3) => {\n d.add(e3), t3.renderers.set(n3, e3);\n }), p(e2));\n }\n } });\n let t2 = window.hasOwnProperty, r3 = false;\n n(window, `hasOwnProperty`, { configurable: true, value: function(...e3) {\n try {\n if (!r3 && e3[0] === `__REACT_DEVTOOLS_GLOBAL_HOOK__`)\n return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = undefined, r3 = true, -0;\n } catch {}\n return t2.apply(this, e3);\n }, writable: true });\n } catch {\n p(e2);\n }\n return s2;\n };\n var p = (e2) => {\n e2 && u.add(e2);\n try {\n let n2 = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!n2)\n return;\n if (!n2._instrumentationSource) {\n n2.checkDCE = a, n2.supportsFiber = true, n2.supportsFlight = true, n2.hasUnsupportedRendererAttached = false, n2._instrumentationSource = t, n2._instrumentationIsActive = false;\n let e3 = o(n2);\n if (e3 || (n2.on = i), n2.renderers.size) {\n n2._instrumentationIsActive = true, u.forEach((e4) => e4());\n return;\n }\n let r2 = n2.inject, c2 = l(n2);\n if (c2 && !e3) {\n s = true;\n let e4 = n2.inject({ scheduleRefresh() {} });\n e4 && (n2._instrumentationIsActive = true);\n }\n n2.inject = (e4) => {\n let t2 = r2(e4);\n return d.add(e4), c2 && n2.renderers.set(t2, e4), n2._instrumentationIsActive = true, u.forEach((e5) => e5()), t2;\n };\n }\n (n2.renderers.size || n2._instrumentationIsActive || l()) && e2?.();\n } catch {}\n };\n var m = () => r.call(globalThis, `__REACT_DEVTOOLS_GLOBAL_HOOK__`);\n var h = (e2) => m() ? (p(e2), globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__) : f(e2);\n var g = () => !!(typeof window < `u` && (window.document?.createElement || window.navigator?.product === `ReactNative`));\n var _ = () => {\n try {\n g() && h();\n } catch {}\n };\n\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/install-hook-only-BOBPiBkc.js\n _();\n\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/core-coQbWNwP.js\n var a2 = 0;\n var o2 = 1;\n var c2 = 5;\n var f2 = 11;\n var p2 = 13;\n var m2 = 14;\n var h2 = 15;\n var ee = 16;\n var te = 19;\n var y = 26;\n var b = 27;\n var ne = 28;\n var re = 30;\n var ie = 2;\n var ae = 4096;\n var oe = 4;\n var se = 16;\n var ce = 32;\n var le = 1024;\n var ue = 8192;\n var O = ie | oe | se | ce | ae | ue | le;\n var k = (e2) => {\n switch (e2.tag) {\n case c2:\n case y:\n case b:\n return true;\n default:\n return typeof e2.type == `string`;\n }\n };\n var pe = (e2) => {\n switch (e2.tag) {\n case o2:\n case f2:\n case a2:\n case m2:\n case h2:\n return true;\n default:\n return false;\n }\n };\n function N(e2, t2, n2 = false) {\n if (!e2)\n return null;\n let r2 = t2(e2);\n if (r2 instanceof Promise)\n return (async () => {\n if (await r2 === true)\n return e2;\n let i3 = n2 ? e2.return : e2.child;\n for (;i3; ) {\n let e3 = await F(i3, t2, n2);\n if (e3)\n return e3;\n i3 = n2 ? null : i3.sibling;\n }\n return null;\n })();\n if (r2 === true)\n return e2;\n let i2 = n2 ? e2.return : e2.child;\n for (;i2; ) {\n let e3 = P(i2, t2, n2);\n if (e3)\n return e3;\n i2 = n2 ? null : i2.sibling;\n }\n return null;\n }\n var P = (e2, t2, n2 = false) => {\n if (!e2)\n return null;\n if (t2(e2) === true)\n return e2;\n let r2 = n2 ? e2.return : e2.child;\n for (;r2; ) {\n let e3 = P(r2, t2, n2);\n if (e3)\n return e3;\n r2 = n2 ? null : r2.sibling;\n }\n return null;\n };\n var F = async (e2, t2, n2 = false) => {\n if (!e2)\n return null;\n if (await t2(e2) === true)\n return e2;\n let r2 = n2 ? e2.return : e2.child;\n for (;r2; ) {\n let e3 = await F(r2, t2, n2);\n if (e3)\n return e3;\n r2 = n2 ? null : r2.sibling;\n }\n return null;\n };\n var I = (e2) => {\n let t2 = e2;\n return typeof t2 == `function` ? t2 : typeof t2 == `object` && t2 ? I(t2.type || t2.render) : null;\n };\n var Te = (e2) => {\n let t2 = e2;\n if (typeof t2 == `string`)\n return t2;\n if (typeof t2 != `function` && !(typeof t2 == `object` && t2))\n return null;\n let n2 = t2.displayName || t2.name || null;\n if (n2)\n return n2;\n let r2 = I(t2);\n return r2 && (r2.displayName || r2.name) || null;\n };\n var z = new WeakMap;\n var K = new WeakMap;\n var Pe = (e2) => {\n let n2 = h();\n for (let t2 of n2.renderers.values())\n try {\n let n3 = t2.findFiberByHostInstance?.(e2);\n if (n3)\n return n3;\n } catch {}\n if (typeof e2 == `object` && e2) {\n if (`_reactRootContainer` in e2)\n return e2._reactRootContainer?._internalRoot?.current?.child;\n for (let t2 in e2)\n if (t2.startsWith(`__reactContainer$`) || t2.startsWith(`__reactInternalInstance$`) || t2.startsWith(`__reactFiber`))\n return e2[t2] || null;\n }\n return null;\n };\n var Fe = Error();\n var $ = new Set;\n\n // ../node_modules/.pnpm/bippy@0.5.27_@types+react@19.2.7_react@19.2.6/node_modules/bippy/dist/source.js\n var g3 = Object.create;\n var _3 = Object.defineProperty;\n var v2 = Object.getOwnPropertyDescriptor;\n var y2 = Object.getOwnPropertyNames;\n var b2 = Object.getPrototypeOf;\n var x2 = Object.prototype.hasOwnProperty;\n var S2 = (e2, t2) => () => (t2 || e2((t2 = { exports: {} }).exports, t2), t2.exports);\n var ee2 = (e2, t2, n2, r2) => {\n if (t2 && typeof t2 == `object` || typeof t2 == `function`)\n for (var i2 = y2(t2), a3 = 0, o3 = i2.length, s3;a3 < o3; a3++)\n s3 = i2[a3], !x2.call(e2, s3) && s3 !== n2 && _3(e2, s3, { get: ((e3) => t2[e3]).bind(null, s3), enumerable: !(r2 = v2(t2, s3)) || r2.enumerable });\n return e2;\n };\n var C2 = (e2, t2, n2) => (n2 = e2 == null ? {} : g3(b2(e2)), ee2(t2 || !e2 || !e2.__esModule ? _3(n2, `default`, { value: e2, enumerable: true }) : n2, e2));\n var w2 = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:/;\n var te2 = [`rsc://`, `file:///`, `webpack://`, `webpack-internal://`, `node:`, `turbopack://`, `metro://`, `/app-pages-browser/`];\n var T2 = `about://React/`;\n var ne2 = [`<anonymous>`, `eval`, ``];\n var re2 = /\\.(jsx|tsx|ts|js)$/;\n var ie2 = /(\\.min|bundle|chunk|vendor|vendors|runtime|polyfill|polyfills)\\.(js|mjs|cjs)$|(chunk|bundle|vendor|vendors|runtime|polyfill|polyfills|framework|app|main|index)[-_.][A-Za-z0-9_-]{4,}\\.(js|mjs|cjs)$|[\\da-f]{8,}\\.(js|mjs|cjs)$|[-_.][\\da-f]{20,}\\.(js|mjs|cjs)$|\\/dist\\/|\\/build\\/|\\/.next\\/|\\/out\\/|\\/node_modules\\/|\\.webpack\\.|\\.vite\\.|\\.turbopack\\./i;\n var ae2 = /^\\?[\\w~.\\-]+(?:=[^&#]*)?(?:&[\\w~.\\-]+(?:=[^&#]*)?)*$/;\n var E = `(at Server)`;\n var oe2 = /(^|@)\\S+:\\d+/;\n var se2 = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\n var ce2 = /^(eval@)?(\\[native code\\])?$/;\n var D = (e2, t2) => {\n if (t2?.includeInElement !== false) {\n let n2 = e2.split(`\n`), r2 = [];\n for (let e3 of n2)\n if (/^\\s*at\\s+/.test(e3)) {\n let t3 = A2(e3, undefined)[0];\n t3 && r2.push(t3);\n } else if (/^\\s*in\\s+/.test(e3)) {\n let t3 = e3.replace(/^\\s*in\\s+/, ``).replace(/\\s*\\(at .*\\)$/, ``);\n r2.push({ functionName: t3, source: e3 });\n } else if (e3.match(oe2)) {\n let t3 = j2(e3, undefined)[0];\n t3 && r2.push(t3);\n }\n return k2(r2, t2);\n }\n return e2.match(se2) ? A2(e2, t2) : j2(e2, t2);\n };\n var O2 = (e2) => {\n if (!e2.includes(`:`))\n return [e2, undefined, undefined];\n let t2 = /(.+?)(?::(\\d+))?(?::(\\d+))?$/, n2 = e2.startsWith(`(`) && e2.endsWith(`)`) ? e2.slice(1, -1) : e2, r2 = t2.exec(n2);\n return [r2[1], r2[2] || undefined, r2[3] || undefined];\n };\n var k2 = (e2, t2) => t2 && t2.slice != null ? Array.isArray(t2.slice) ? e2.slice(t2.slice[0], t2.slice[1]) : e2.slice(0, t2.slice) : e2;\n var A2 = (e2, t2) => {\n let n2 = k2(e2.split(`\n`).filter((e3) => !!e3.match(se2)), t2);\n return n2.map((e3) => {\n let t3 = e3;\n t3.includes(`(eval `) && (t3 = t3.replace(/eval code/g, `eval`).replace(/(\\(eval at [^()]*)|(,.*$)/g, ``));\n let n3 = t3.replace(/^\\s+/, ``).replace(/\\(eval code/g, `(`).replace(/^.*?\\s+/, ``), r2 = n3.match(/ (\\(.+\\)$)/);\n n3 = r2 ? n3.replace(r2[0], ``) : n3;\n let i2 = O2(r2 ? r2[1] : n3), a3 = r2 && n3 || undefined, o3 = [`eval`, `<anonymous>`].includes(i2[0]) ? undefined : i2[0];\n return { functionName: a3, fileName: o3, lineNumber: i2[1] ? +i2[1] : undefined, columnNumber: i2[2] ? +i2[2] : undefined, source: t3 };\n });\n };\n var j2 = (e2, t2) => {\n let n2 = k2(e2.split(`\n`).filter((e3) => !e3.match(ce2)), t2);\n return n2.map((e3) => {\n let t3 = e3;\n if (t3.includes(` > eval`) && (t3 = t3.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g, `:$1`)), !t3.includes(`@`) && !t3.includes(`:`))\n return { functionName: t3 };\n {\n let e4 = /(([^\\n\\r\"\\u2028\\u2029]*\".[^\\n\\r\"\\u2028\\u2029]*\"[^\\n\\r@\\u2028\\u2029]*(?:@[^\\n\\r\"\\u2028\\u2029]*\"[^\\n\\r@\\u2028\\u2029]*)*(?:[\\n\\r\\u2028\\u2029][^@]*)?)?[^@]*)@/, n3 = t3.match(e4), r2 = n3 && n3[1] ? n3[1] : undefined, i2 = O2(t3.replace(e4, ``));\n return { functionName: r2, fileName: i2[0], lineNumber: i2[1] ? +i2[1] : undefined, columnNumber: i2[2] ? +i2[2] : undefined, source: t3 };\n }\n });\n };\n var pe2 = S2((exports, t2) => {\n (function(n2, r2) {\n typeof exports == `object` && t2 !== undefined ? r2(exports) : typeof define == `function` && define.amd ? define([`exports`], r2) : (n2 = typeof globalThis < `u` ? globalThis : n2 || self, r2(n2.sourcemapCodec = {}));\n })(undefined, function(e2) {\n let t3 = 44, n2 = 59, r2 = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`, i2 = new Uint8Array(64), a3 = new Uint8Array(128);\n for (let e3 = 0;e3 < r2.length; e3++) {\n let t4 = r2.charCodeAt(e3);\n i2[e3] = t4, a3[t4] = e3;\n }\n function o3(e3, t4) {\n let n3 = 0, r3 = 0, i3 = 0;\n do {\n let t5 = e3.next();\n i3 = a3[t5], n3 |= (i3 & 31) << r3, r3 += 5;\n } while (i3 & 32);\n let o4 = n3 & 1;\n return n3 >>>= 1, o4 && (n3 = -2147483648 | -n3), t4 + n3;\n }\n function s3(e3, t4, n3) {\n let r3 = t4 - n3;\n r3 = r3 < 0 ? -r3 << 1 | 1 : r3 << 1;\n do {\n let t5 = r3 & 31;\n r3 >>>= 5, r3 > 0 && (t5 |= 32), e3.write(i2[t5]);\n } while (r3 > 0);\n return t4;\n }\n function c3(e3, n3) {\n return e3.pos >= n3 ? false : e3.peek() !== t3;\n }\n let l3 = 1024 * 16, u3 = typeof TextDecoder < `u` ? new TextDecoder : typeof Buffer < `u` ? { decode(e3) {\n let t4 = Buffer.from(e3.buffer, e3.byteOffset, e3.byteLength);\n return t4.toString();\n } } : { decode(e3) {\n let t4 = ``;\n for (let n3 = 0;n3 < e3.length; n3++)\n t4 += String.fromCharCode(e3[n3]);\n return t4;\n } };\n\n class d3 {\n constructor() {\n this.pos = 0, this.out = ``, this.buffer = new Uint8Array(l3);\n }\n write(e3) {\n let { buffer: t4 } = this;\n t4[this.pos++] = e3, this.pos === l3 && (this.out += u3.decode(t4), this.pos = 0);\n }\n flush() {\n let { buffer: e3, out: t4, pos: n3 } = this;\n return n3 > 0 ? t4 + u3.decode(e3.subarray(0, n3)) : t4;\n }\n }\n\n class f3 {\n constructor(e3) {\n this.pos = 0, this.buffer = e3;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(e3) {\n let { buffer: t4, pos: n3 } = this, r3 = t4.indexOf(e3, n3);\n return r3 === -1 ? t4.length : r3;\n }\n }\n let p3 = [];\n function m3(e3) {\n let { length: t4 } = e3, n3 = new f3(e3), r3 = [], i3 = [], a4 = 0;\n for (;n3.pos < t4; n3.pos++) {\n a4 = o3(n3, a4);\n let e4 = o3(n3, 0);\n if (!c3(n3, t4)) {\n let t5 = i3.pop();\n t5[2] = a4, t5[3] = e4;\n continue;\n }\n let s4 = o3(n3, 0), l4 = o3(n3, 0), u4 = l4 & 1, d4 = u4 ? [a4, e4, 0, 0, s4, o3(n3, 0)] : [a4, e4, 0, 0, s4], f4 = p3;\n if (c3(n3, t4)) {\n f4 = [];\n do {\n let e5 = o3(n3, 0);\n f4.push(e5);\n } while (c3(n3, t4));\n }\n d4.vars = f4, r3.push(d4), i3.push(d4);\n }\n return r3;\n }\n function h3(e3) {\n let t4 = new d3;\n for (let n3 = 0;n3 < e3.length; )\n n3 = g4(e3, n3, t4, [0]);\n return t4.flush();\n }\n function g4(e3, n3, r3, i3) {\n let a4 = e3[n3], { 0: o4, 1: c4, 2: l4, 3: u4, 4: d4, vars: f4 } = a4;\n n3 > 0 && r3.write(t3), i3[0] = s3(r3, o4, i3[0]), s3(r3, c4, 0), s3(r3, d4, 0);\n let p4 = a4.length === 6 ? 1 : 0;\n s3(r3, p4, 0), a4.length === 6 && s3(r3, a4[5], 0);\n for (let e4 of f4)\n s3(r3, e4, 0);\n for (n3++;n3 < e3.length; ) {\n let t4 = e3[n3], { 0: a5, 1: o5 } = t4;\n if (a5 > l4 || a5 === l4 && o5 >= u4)\n break;\n n3 = g4(e3, n3, r3, i3);\n }\n return r3.write(t3), i3[0] = s3(r3, l4, i3[0]), s3(r3, u4, 0), n3;\n }\n function _4(e3) {\n let { length: t4 } = e3, n3 = new f3(e3), r3 = [], i3 = [], a4 = 0, s4 = 0, l4 = 0, u4 = 0, d4 = 0, m4 = 0, h4 = 0, g5 = 0;\n do {\n let e4 = n3.indexOf(`;`), t5 = 0;\n for (;n3.pos < e4; n3.pos++) {\n if (t5 = o3(n3, t5), !c3(n3, e4)) {\n let e5 = i3.pop();\n e5[2] = a4, e5[3] = t5;\n continue;\n }\n let f4 = o3(n3, 0), _5 = f4 & 1, v4 = f4 & 2, y4 = f4 & 4, b4 = null, x4 = p3, S4;\n if (_5) {\n let e5 = o3(n3, s4);\n l4 = o3(n3, s4 === e5 ? l4 : 0), s4 = e5, S4 = [a4, t5, 0, 0, e5, l4];\n } else\n S4 = [a4, t5, 0, 0];\n if (S4.isScope = !!y4, v4) {\n let e5 = u4, t6 = d4;\n u4 = o3(n3, u4);\n let r4 = e5 === u4;\n d4 = o3(n3, r4 ? d4 : 0), m4 = o3(n3, r4 && t6 === d4 ? m4 : 0), b4 = [u4, d4, m4];\n }\n if (S4.callsite = b4, c3(n3, e4)) {\n x4 = [];\n do {\n h4 = a4, g5 = t5;\n let e5 = o3(n3, 0), r4;\n if (e5 < -1) {\n r4 = [[o3(n3, 0)]];\n for (let t6 = -1;t6 > e5; t6--) {\n let e6 = h4;\n h4 = o3(n3, h4), g5 = o3(n3, h4 === e6 ? g5 : 0);\n let t7 = o3(n3, 0);\n r4.push([t7, h4, g5]);\n }\n } else\n r4 = [[e5]];\n x4.push(r4);\n } while (c3(n3, e4));\n }\n S4.bindings = x4, r3.push(S4), i3.push(S4);\n }\n a4++, n3.pos = e4 + 1;\n } while (n3.pos < t4);\n return r3;\n }\n function v3(e3) {\n if (e3.length === 0)\n return ``;\n let t4 = new d3;\n for (let n3 = 0;n3 < e3.length; )\n n3 = y3(e3, n3, t4, [0, 0, 0, 0, 0, 0, 0]);\n return t4.flush();\n }\n function y3(e3, n3, r3, i3) {\n let a4 = e3[n3], { 0: o4, 1: c4, 2: l4, 3: u4, isScope: d4, callsite: f4, bindings: p4 } = a4;\n i3[0] < o4 ? (b3(r3, i3[0], o4), i3[0] = o4, i3[1] = 0) : n3 > 0 && r3.write(t3), i3[1] = s3(r3, a4[1], i3[1]);\n let m4 = (a4.length === 6 ? 1 : 0) | (f4 ? 2 : 0) | (d4 ? 4 : 0);\n if (s3(r3, m4, 0), a4.length === 6) {\n let { 4: e4, 5: t4 } = a4;\n e4 !== i3[2] && (i3[3] = 0), i3[2] = s3(r3, e4, i3[2]), i3[3] = s3(r3, t4, i3[3]);\n }\n if (f4) {\n let { 0: e4, 1: t4, 2: n4 } = a4.callsite;\n e4 === i3[4] ? t4 !== i3[5] && (i3[6] = 0) : (i3[5] = 0, i3[6] = 0), i3[4] = s3(r3, e4, i3[4]), i3[5] = s3(r3, t4, i3[5]), i3[6] = s3(r3, n4, i3[6]);\n }\n if (p4)\n for (let e4 of p4) {\n e4.length > 1 && s3(r3, -e4.length, 0);\n let t4 = e4[0][0];\n s3(r3, t4, 0);\n let n4 = o4, i4 = c4;\n for (let t5 = 1;t5 < e4.length; t5++) {\n let a5 = e4[t5];\n n4 = s3(r3, a5[1], n4), i4 = s3(r3, a5[2], i4), s3(r3, a5[0], 0);\n }\n }\n for (n3++;n3 < e3.length; ) {\n let t4 = e3[n3], { 0: a5, 1: o5 } = t4;\n if (a5 > l4 || a5 === l4 && o5 >= u4)\n break;\n n3 = y3(e3, n3, r3, i3);\n }\n return i3[0] < l4 ? (b3(r3, i3[0], l4), i3[0] = l4, i3[1] = 0) : r3.write(t3), i3[1] = s3(r3, u4, i3[1]), n3;\n }\n function b3(e3, t4, r3) {\n do\n e3.write(n2);\n while (++t4 < r3);\n }\n function x3(e3) {\n let { length: t4 } = e3, n3 = new f3(e3), r3 = [], i3 = 0, a4 = 0, s4 = 0, l4 = 0, u4 = 0;\n do {\n let e4 = n3.indexOf(`;`), t5 = [], d4 = true, f4 = 0;\n for (i3 = 0;n3.pos < e4; ) {\n let r4;\n i3 = o3(n3, i3), i3 < f4 && (d4 = false), f4 = i3, c3(n3, e4) ? (a4 = o3(n3, a4), s4 = o3(n3, s4), l4 = o3(n3, l4), c3(n3, e4) ? (u4 = o3(n3, u4), r4 = [i3, a4, s4, l4, u4]) : r4 = [i3, a4, s4, l4]) : r4 = [i3], t5.push(r4), n3.pos++;\n }\n d4 || S3(t5), r3.push(t5), n3.pos = e4 + 1;\n } while (n3.pos <= t4);\n return r3;\n }\n function S3(e3) {\n e3.sort(ee3);\n }\n function ee3(e3, t4) {\n return e3[0] - t4[0];\n }\n function C3(e3) {\n let r3 = new d3, i3 = 0, a4 = 0, o4 = 0, c4 = 0;\n for (let l4 = 0;l4 < e3.length; l4++) {\n let u4 = e3[l4];\n if (l4 > 0 && r3.write(n2), u4.length === 0)\n continue;\n let d4 = 0;\n for (let e4 = 0;e4 < u4.length; e4++) {\n let n3 = u4[e4];\n e4 > 0 && r3.write(t3), d4 = s3(r3, n3[0], d4), n3.length !== 1 && (i3 = s3(r3, n3[1], i3), a4 = s3(r3, n3[2], a4), o4 = s3(r3, n3[3], o4), n3.length !== 4 && (c4 = s3(r3, n3[4], c4)));\n }\n }\n return r3.flush();\n }\n e2.decode = x3, e2.decodeGeneratedRanges = _4, e2.decodeOriginalScopes = m3, e2.encode = C3, e2.encodeGeneratedRanges = v3, e2.encodeOriginalScopes = h3, Object.defineProperty(e2, `__esModule`, { value: true });\n });\n });\n var F2 = C2(pe2(), 1);\n var I2 = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:/;\n var me2 = /^data:application\\/json[^,]+base64,/;\n var he2 = /(?:\\/\\/[@#][ \\t]+sourceMappingURL=([^\\s'\"]+?)[ \\t]*$)|(?:\\/\\*[@#][ \\t]+sourceMappingURL=([^*]+?)[ \\t]*(?:\\*\\/)[ \\t]*$)/;\n var L2 = typeof WeakRef < `u`;\n var R = new Map;\n var z2 = new Map;\n var ge2 = (e2) => L2 && e2 instanceof WeakRef;\n var B2 = (e2, t2, n2, r2) => {\n if (n2 < 0 || n2 >= e2.length)\n return null;\n let i2 = e2[n2];\n if (!i2 || i2.length === 0)\n return null;\n let a3 = null;\n for (let e3 of i2)\n if (e3[0] <= r2)\n a3 = e3;\n else\n break;\n if (!a3 || a3.length < 4)\n return null;\n let [, o3, s3, c3] = a3;\n if (o3 === undefined || s3 === undefined || c3 === undefined)\n return null;\n let l3 = t2[o3];\n return l3 ? { columnNumber: c3, fileName: l3, lineNumber: s3 + 1 } : null;\n };\n var V2 = (e2, t2, n2) => {\n if (e2.sections) {\n let r2 = null;\n for (let i3 of e2.sections)\n if (t2 > i3.offset.line || t2 === i3.offset.line && n2 >= i3.offset.column)\n r2 = i3;\n else\n break;\n if (!r2)\n return null;\n let i2 = t2 - r2.offset.line, a3 = t2 === r2.offset.line ? n2 - r2.offset.column : n2;\n return B2(r2.map.mappings, r2.map.sources, i2, a3);\n }\n return B2(e2.mappings, e2.sources, t2 - 1, n2);\n };\n var _e2 = (e2, t2) => {\n let n2 = t2.split(`\n`), r2;\n for (let e3 = n2.length - 1;e3 >= 0 && !r2; e3--) {\n let t3 = n2[e3].match(he2);\n t3 && (r2 = t3[1] || t3[2]);\n }\n if (!r2)\n return null;\n let i2 = I2.test(r2);\n if (!(me2.test(r2) || i2 || r2.startsWith(`/`))) {\n let t3 = e2.split(`/`);\n t3[t3.length - 1] = r2, r2 = t3.join(`/`);\n }\n return r2;\n };\n var ve2 = (e2) => ({ file: e2.file, mappings: (0, F2.decode)(e2.mappings), names: e2.names, sourceRoot: e2.sourceRoot, sources: e2.sources, sourcesContent: e2.sourcesContent, version: 3 });\n var ye2 = (e2) => {\n let t2 = e2.sections.map(({ map: e3, offset: t3 }) => ({ map: { ...e3, mappings: (0, F2.decode)(e3.mappings) }, offset: t3 })), n2 = new Set;\n for (let e3 of t2)\n for (let t3 of e3.map.sources)\n n2.add(t3);\n return { file: e2.file, mappings: [], names: [], sections: t2, sourceRoot: undefined, sources: Array.from(n2), sourcesContent: undefined, version: 3 };\n };\n var H2 = (e2) => {\n if (!e2)\n return false;\n let t2 = e2.trim();\n if (!t2)\n return false;\n let n2 = t2.match(I2);\n if (!n2)\n return true;\n let r2 = n2[0].toLowerCase();\n return r2 === `http:` || r2 === `https:`;\n };\n var U2 = async (e2, t2 = fetch) => {\n if (!H2(e2))\n return null;\n let n2;\n try {\n let r3 = await t2(e2);\n n2 = await r3.text();\n } catch {\n return null;\n }\n if (!n2)\n return null;\n let r2 = _e2(e2, n2);\n if (!r2 || !H2(r2))\n return null;\n try {\n let e3 = await t2(r2), n3 = await e3.json();\n return `sections` in n3 ? ye2(n3) : ve2(n3);\n } catch {\n return null;\n }\n };\n var W2 = async (e2, t2 = true, n2) => {\n if (t2 && R.has(e2)) {\n let t3 = R.get(e2);\n if (t3 == null)\n return null;\n if (ge2(t3)) {\n let n3 = t3.deref();\n if (n3)\n return n3;\n R.delete(e2);\n } else\n return t3;\n }\n if (t2 && z2.has(e2))\n return z2.get(e2);\n let r2 = U2(e2, n2);\n t2 && z2.set(e2, r2);\n let i2 = await r2;\n return t2 && z2.delete(e2), t2 && (i2 === null ? R.set(e2, null) : R.set(e2, L2 ? new WeakRef(i2) : i2)), i2;\n };\n var G2 = async (e2, t2 = true, n2) => await Promise.all(e2.map(async (e3) => {\n if (!e3.fileName)\n return e3;\n let r2 = await W2(e3.fileName, t2, n2);\n if (!r2 || typeof e3.lineNumber != `number` || typeof e3.columnNumber != `number`)\n return e3;\n let i2 = V2(r2, e3.lineNumber, e3.columnNumber);\n return i2 ? { ...e3, source: i2.fileName && e3.source ? e3.source.replace(e3.fileName, i2.fileName) : e3.source, fileName: i2.fileName, lineNumber: i2.lineNumber, columnNumber: i2.columnNumber, isSymbolicated: true } : e3;\n }));\n var K2 = (e2) => e2._debugStack instanceof Error && typeof e2._debugStack?.stack == `string`;\n var be2 = () => {\n let n2 = h();\n for (let t2 of [...Array.from(d), ...Array.from(n2.renderers.values())]) {\n let e2 = t2.currentDispatcherRef;\n if (e2 && typeof e2 == `object`)\n return `H` in e2 ? e2.H : e2.current;\n }\n return null;\n };\n var q = (t2) => {\n for (let n2 of d) {\n let e2 = n2.currentDispatcherRef;\n e2 && typeof e2 == `object` && (`H` in e2 ? e2.H = t2 : e2.current = t2);\n }\n };\n var J = (e2) => `\n in ${e2}`;\n var Y = (e2, t2) => {\n let n2 = J(e2);\n return t2 && (n2 += ` (at ${t2})`), n2;\n };\n var X2 = false;\n var Z = (e2, t2) => {\n if (!e2 || X2)\n return ``;\n let n2 = Error.prepareStackTrace;\n Error.prepareStackTrace = undefined, X2 = true;\n let r2 = be2();\n q(null);\n let { error: i2, warn: a3 } = console;\n console.error = () => {}, console.warn = () => {};\n try {\n let n3 = { DetermineComponentFrameRoot() {\n let n4;\n try {\n if (t2) {\n let t3 = function() {\n throw Error();\n };\n if (Object.defineProperty(t3.prototype, `props`, { set: function() {\n throw Error();\n } }), typeof Reflect == `object` && Reflect.construct) {\n try {\n Reflect.construct(t3, []);\n } catch (e3) {\n n4 = e3;\n }\n Reflect.construct(e2, [], t3);\n } else {\n try {\n t3.call();\n } catch (e3) {\n n4 = e3;\n }\n e2.call(t3.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (e3) {\n n4 = e3;\n }\n let t3 = e2();\n t3 && typeof t3.catch == `function` && t3.catch(() => {});\n }\n } catch (e3) {\n if (e3 instanceof Error && n4 instanceof Error && typeof e3.stack == `string`)\n return [e3.stack, n4.stack];\n }\n return [null, null];\n } };\n n3.DetermineComponentFrameRoot.displayName = `DetermineComponentFrameRoot`;\n let r3 = Object.getOwnPropertyDescriptor(n3.DetermineComponentFrameRoot, `name`);\n r3?.configurable && Object.defineProperty(n3.DetermineComponentFrameRoot, `name`, { value: `DetermineComponentFrameRoot` });\n let [i3, a4] = n3.DetermineComponentFrameRoot();\n if (i3 && a4) {\n let t3 = i3.split(`\n`), n4 = a4.split(`\n`), r4 = 0, o4 = 0;\n for (;r4 < t3.length && !t3[r4].includes(`DetermineComponentFrameRoot`); )\n r4++;\n for (;o4 < n4.length && !n4[o4].includes(`DetermineComponentFrameRoot`); )\n o4++;\n if (r4 === t3.length || o4 === n4.length)\n for (r4 = t3.length - 1, o4 = n4.length - 1;r4 >= 1 && o4 >= 0 && t3[r4] !== n4[o4]; )\n o4--;\n for (;r4 >= 1 && o4 >= 0; r4--, o4--)\n if (t3[r4] !== n4[o4]) {\n if (r4 !== 1 || o4 !== 1)\n do\n if (r4--, o4--, o4 < 0 || t3[r4] !== n4[o4]) {\n let n5 = `\n${t3[r4].replace(` at new `, ` at `)}`, i4 = Te(e2);\n return i4 && n5.includes(`<anonymous>`) && (n5 = n5.replace(`<anonymous>`, i4)), n5;\n }\n while (r4 >= 1 && o4 >= 0);\n break;\n }\n }\n } finally {\n X2 = false, Error.prepareStackTrace = n2, q(r2), console.error = i2, console.warn = a3;\n }\n let o3 = e2 ? Te(e2) : ``, s3 = o3 ? J(o3) : ``;\n return s3;\n };\n var xe2 = (e2, t2) => {\n let m3 = e2.tag, h3 = ``;\n switch (m3) {\n case ne:\n h3 = J(`Activity`);\n break;\n case o2:\n h3 = Z(e2.type, true);\n break;\n case f2:\n h3 = Z(e2.type.render, false);\n break;\n case a2:\n case h2:\n h3 = Z(e2.type, false);\n break;\n case c2:\n case y:\n case b:\n h3 = J(e2.type);\n break;\n case ee:\n h3 = J(`Lazy`);\n break;\n case p2:\n h3 = e2.child !== t2 && t2 !== null ? J(`Suspense Fallback`) : J(`Suspense`);\n break;\n case te:\n h3 = J(`SuspenseList`);\n break;\n case re:\n h3 = J(`ViewTransition`);\n break;\n default:\n return ``;\n }\n return h3;\n };\n var Se2 = (e2) => {\n try {\n let t2 = ``, n2 = e2, r2 = null;\n do {\n t2 += xe2(n2, r2);\n let e3 = n2._debugInfo;\n if (e3 && Array.isArray(e3))\n for (let n3 = e3.length - 1;n3 >= 0; n3--) {\n let r3 = e3[n3];\n typeof r3.name == `string` && (t2 += Y(r3.name, r3.env));\n }\n r2 = n2, n2 = n2.return;\n } while (n2);\n return t2;\n } catch (e3) {\n return e3 instanceof Error ? `\nError generating stack: ${e3.message}\n${e3.stack}` : ``;\n }\n };\n var Ce2 = (e2) => {\n let t2 = Error.prepareStackTrace;\n Error.prepareStackTrace = undefined;\n let n2 = e2;\n if (!n2)\n return ``;\n Error.prepareStackTrace = t2, n2.startsWith(`Error: react-stack-top-frame\n`) && (n2 = n2.slice(29));\n let r2 = n2.indexOf(`\n`);\n if (r2 !== -1 && (n2 = n2.slice(r2 + 1)), r2 = Math.max(n2.indexOf(`react_stack_bottom_frame`), n2.indexOf(`react-stack-bottom-frame`)), r2 !== -1 && (r2 = n2.lastIndexOf(`\n`, r2)), r2 !== -1)\n n2 = n2.slice(0, r2);\n else\n return ``;\n return n2;\n };\n var we2 = (e2) => !!(e2.fileName?.startsWith(`rsc://`) && e2.functionName);\n var Te2 = (e2, t2) => e2.fileName === t2.fileName && e2.lineNumber === t2.lineNumber && e2.columnNumber === t2.columnNumber;\n var Ee2 = (e2) => {\n let t2 = new Map;\n for (let n2 of e2)\n for (let e3 of n2.stackFrames) {\n if (!we2(e3))\n continue;\n let n3 = e3.functionName, r2 = t2.get(n3) ?? [], i2 = r2.some((t3) => Te2(t3, e3));\n i2 || (r2.push(e3), t2.set(n3, r2));\n }\n return t2;\n };\n var De2 = (e2, t2, n2) => {\n if (!e2.functionName)\n return { ...e2, isServer: true };\n let r2 = t2.get(e2.functionName);\n if (!r2 || r2.length === 0)\n return { ...e2, isServer: true };\n let i2 = n2.get(e2.functionName) ?? 0, a3 = r2[i2 % r2.length];\n return n2.set(e2.functionName, i2 + 1), { ...e2, isServer: true, fileName: a3.fileName, lineNumber: a3.lineNumber, columnNumber: a3.columnNumber, source: e2.source?.replace(E, `(${a3.fileName}:${a3.lineNumber}:${a3.columnNumber})`) };\n };\n var Oe = (e2) => {\n let t2 = [];\n return N(e2, (e3) => {\n if (!K2(e3))\n return;\n let n2 = typeof e3.type == `string` ? e3.type : Te(e3.type) || `<anonymous>`;\n t2.push({ componentName: n2, stackFrames: D(Ce2(e3._debugStack?.stack)) });\n }, true), t2;\n };\n var Q = async (e2, t2 = true, n2) => {\n let r2 = Oe(e2), i2 = D(Se2(e2)), a3 = Ee2(r2), o3 = new Map, s3 = i2.map((e3) => {\n let t3 = e3.source?.includes(E) ?? false;\n return t3 ? De2(e3, a3, o3) : e3;\n }), c3 = s3.filter((e3, t3, n3) => {\n if (t3 === 0)\n return true;\n let r3 = n3[t3 - 1];\n return e3.functionName !== r3.functionName;\n });\n return G2(c3, t2, n2);\n };\n var ke2 = (e2) => {\n let t2 = e2._debugSource;\n return t2 ? typeof t2 == `object` && !!t2 && `fileName` in t2 && typeof t2.fileName == `string` && `lineNumber` in t2 && typeof t2.lineNumber == `number` : false;\n };\n var Ae2 = async (e2, t2 = true, n2) => {\n if (ke2(e2)) {\n let t3 = e2._debugSource;\n return t3 || null;\n }\n let r2 = await Q(e2, t2, n2);\n for (let e3 of r2)\n if (e3.fileName)\n return { fileName: e3.fileName, lineNumber: e3.lineNumber, columnNumber: e3.columnNumber, functionName: e3.functionName };\n return null;\n };\n var $2 = (e2) => {\n if (!e2 || ne2.some((t3) => t3 === e2))\n return ``;\n let t2 = e2;\n if (t2.startsWith(`http://`) || t2.startsWith(`https://`))\n try {\n let e3 = new URL(t2);\n t2 = e3.pathname;\n } catch {}\n if (t2.startsWith(T2)) {\n let e3 = t2.slice(T2.length), n3 = e3.indexOf(`/`), r3 = e3.indexOf(`:`);\n t2 = n3 !== -1 && (r3 === -1 || n3 < r3) ? e3.slice(n3 + 1) : e3;\n }\n let n2 = true;\n for (;n2; ) {\n n2 = false;\n for (let e3 of te2)\n if (t2.startsWith(e3)) {\n t2 = t2.slice(e3.length), e3 === `file:///` && (t2 = `/${t2.replace(/^\\/+/, ``)}`), n2 = true;\n break;\n }\n }\n if (w2.test(t2)) {\n let e3 = t2.match(w2);\n e3 && (t2 = t2.slice(e3[0].length));\n }\n if (t2.startsWith(`//`)) {\n let e3 = t2.indexOf(`/`, 2);\n t2 = e3 === -1 ? `` : t2.slice(e3);\n }\n let r2 = t2.indexOf(`?`);\n if (r2 !== -1) {\n let e3 = t2.slice(r2);\n ae2.test(e3) && (t2 = t2.slice(0, r2));\n }\n return t2;\n };\n var je2 = (e2) => {\n let t2 = $2(e2);\n return !(!t2 || !re2.test(t2) || ie2.test(t2));\n };\n\n // dist/_bippy-entry-28588-1781364082573.js\n globalThis.__bippy = {\n getFiberFromHostInstance: Pe,\n getDisplayName: Te,\n traverseFiber: N,\n isCompositeFiber: pe,\n isHostFiber: k,\n getSource: Ae2,\n getOwnerStack: Q,\n normalizeFileName: $2,\n isSourceFile: je2\n };\n})();\n";
|
|
551
551
|
//#endregion
|
|
552
552
|
//#region src/recording.ts
|
|
553
553
|
var activeRecordings = /* @__PURE__ */ new Map();
|
|
@@ -780,19 +780,30 @@ function createInstallId() {
|
|
|
780
780
|
return value.toString(36);
|
|
781
781
|
}).join("");
|
|
782
782
|
}
|
|
783
|
+
function browserNameFromBrands(brands) {
|
|
784
|
+
const brandNames = brands.map((brand) => {
|
|
785
|
+
return brand.brand.trim().toLowerCase();
|
|
786
|
+
});
|
|
787
|
+
if (brandNames.some((brand) => brand === "brave")) return "Brave";
|
|
788
|
+
if (brandNames.some((brand) => brand === "microsoft edge")) return "Edge";
|
|
789
|
+
if (brandNames.some((brand) => brand === "opera")) return "Opera";
|
|
790
|
+
if (brandNames.some((brand) => brand === "vivaldi")) return "Vivaldi";
|
|
791
|
+
if (brandNames.some((brand) => brand === "google chrome canary")) return "Chrome Canary";
|
|
792
|
+
if (brandNames.some((brand) => brand === "google chrome")) return "Chrome";
|
|
793
|
+
if (brandNames.some((brand) => brand === "chromium")) return "Chromium";
|
|
794
|
+
return null;
|
|
795
|
+
}
|
|
783
796
|
async function detectBrowserName() {
|
|
784
797
|
if (chrome.ghostPublicAPI) return "Ghost";
|
|
785
|
-
const
|
|
798
|
+
const navigatorWithUaData = navigator;
|
|
799
|
+
const brands = navigatorWithUaData.userAgentData?.brands;
|
|
800
|
+
const highEntropyName = browserNameFromBrands((await navigatorWithUaData.userAgentData?.getHighEntropyValues?.(["fullVersionList"]).catch(() => {
|
|
801
|
+
return null;
|
|
802
|
+
}))?.fullVersionList || []);
|
|
803
|
+
if (highEntropyName) return highEntropyName;
|
|
786
804
|
if (brands && brands.length > 0) {
|
|
787
|
-
const
|
|
788
|
-
|
|
789
|
-
});
|
|
790
|
-
if (brandNames.some((brand) => brand === "brave")) return "Brave";
|
|
791
|
-
if (brandNames.some((brand) => brand === "microsoft edge")) return "Edge";
|
|
792
|
-
if (brandNames.some((brand) => brand === "opera")) return "Opera";
|
|
793
|
-
if (brandNames.some((brand) => brand === "vivaldi")) return "Vivaldi";
|
|
794
|
-
if (brandNames.some((brand) => brand === "google chrome")) return "Chrome";
|
|
795
|
-
if (brandNames.some((brand) => brand === "chromium")) return "Chromium";
|
|
805
|
+
const lowEntropyName = browserNameFromBrands(brands);
|
|
806
|
+
if (lowEntropyName) return lowEntropyName;
|
|
796
807
|
}
|
|
797
808
|
const ua = navigator.userAgent.toLowerCase();
|
|
798
809
|
if (ua.includes("edg/")) return "Edge";
|
|
@@ -922,7 +933,7 @@ var ConnectionManager = class {
|
|
|
922
933
|
if (identity.email) relayUrl.searchParams.set("email", identity.email);
|
|
923
934
|
if (identity.id) relayUrl.searchParams.set("id", identity.id);
|
|
924
935
|
if (identity.installId) relayUrl.searchParams.set("installId", identity.installId);
|
|
925
|
-
relayUrl.searchParams.set("v", "0.
|
|
936
|
+
relayUrl.searchParams.set("v", "0.3.0");
|
|
926
937
|
logger.debug("Creating WebSocket connection to:", relayUrl);
|
|
927
938
|
const socket = new WebSocket(relayUrl.toString());
|
|
928
939
|
await new Promise((resolve, reject) => {
|
package/dist/prompt.md
CHANGED
|
@@ -41,10 +41,19 @@ You can collaborate with the user - they can help with captchas, difficult eleme
|
|
|
41
41
|
- `page` - a default page (may be shared with other agents). Prefer creating your own page and storing it in `state` (see "working with pages")
|
|
42
42
|
- `context` - browser context, access all pages via `context.pages()`
|
|
43
43
|
- `require` - load Node.js modules (e.g., `const fs = require('node:fs')`). ESM `import` is not available in the sandbox
|
|
44
|
-
- Node.js globals: `setTimeout`, `setInterval`, `fetch`, `URL`, `Buffer`, `crypto`, etc.
|
|
44
|
+
- Node.js globals: `setTimeout`, `setInterval`, `fetch`, `URL`, `Buffer`, `crypto`, `process`, etc.
|
|
45
|
+
|
|
46
|
+
**Not available in the sandbox:** `__dirname`, `__filename`, `import`.
|
|
45
47
|
|
|
46
48
|
**Important:** `state` is **session-isolated** but pages are **shared** across all sessions. See "working with pages" for how to avoid interference.
|
|
47
49
|
|
|
50
|
+
**Sandboxed `fs` write restrictions:** `require('node:fs')` is scoped. Writes (writeFileSync, mkdirSync, etc.) only succeed in:
|
|
51
|
+
- The **directory where `playwriter` CLI was invoked** (the session's cwd)
|
|
52
|
+
- `/tmp`
|
|
53
|
+
- The OS temp directory (`os.tmpdir()`, e.g. `/var/folders/.../T/` on macOS)
|
|
54
|
+
|
|
55
|
+
Writing to any other path (e.g. `~/Downloads`, `~/Desktop`) throws `EPERM: operation not permitted, access outside allowed directories`. To save files elsewhere, write to a temp path first, then move the file using a shell command outside the sandbox.
|
|
56
|
+
|
|
48
57
|
## rules
|
|
49
58
|
|
|
50
59
|
- **Initialize state.page first**: see "working with pages" — at the start of a task, assign `state.page` (reuse `about:blank` or create one) and use `state.page` for all automation steps.
|
|
@@ -53,6 +62,7 @@ You can collaborate with the user - they can help with captchas, difficult eleme
|
|
|
53
62
|
- **No bringToFront**: never call unless user asks - it's disruptive and unnecessary, you can interact with background pages
|
|
54
63
|
- **Check state after actions**: always verify page state after clicking/submitting (see next section)
|
|
55
64
|
- **Clean up listeners**: call `state.page.removeAllListeners()` at end of message to prevent leaks
|
|
65
|
+
- **Always print page logs after every action**: call `getLatestLogs({ page: state.page, sinceLastCall: true })` after every goto, click, or submit to catch console errors and warnings. Do not manually collect `page.on('console')` events; manual listeners miss logs emitted before the listener is attached. The first `sinceLastCall` call returns all buffered logs including startup and hydration errors.
|
|
56
66
|
- **CDP sessions**: use `getCDPSession({ page: state.page })` not `state.page.context().newCDPSession()` - NEVER use `newCDPSession()` method, it doesn't work through playwriter relay
|
|
57
67
|
- **Wait for load**: use `state.page.waitForLoadState('domcontentloaded')` not `state.page.waitForEvent('load')` - waitForEvent times out if already loaded
|
|
58
68
|
- **Minimize timeouts**: prefer proper waits (`waitForSelector`, `waitForPageLoad`) over `state.page.waitForTimeout()`. Short timeouts (1-2s) are acceptable for non-deterministic events like animations, tab opens, or async UI updates where no specific selector is available
|
|
@@ -65,18 +75,21 @@ You can collaborate with the user - they can help with captchas, difficult eleme
|
|
|
65
75
|
Every browser interaction must follow **observe → act → observe**. Never chain multiple actions blindly.
|
|
66
76
|
|
|
67
77
|
1. **Open page** — get or create your page, navigate to URL
|
|
68
|
-
2. **Observe** — print `state.page.url()` + `snapshot()`. Always print URL — pages can redirect unexpectedly.
|
|
78
|
+
2. **Observe** — print `state.page.url()` + `snapshot()` + `getLatestLogs({ sinceLastCall: true })`. Always print URL — pages can redirect unexpectedly.
|
|
69
79
|
3. **Check** — if page isn't ready (loading, wrong URL, content missing), wait and observe again
|
|
70
80
|
4. **Act** — perform one action (click, type, submit)
|
|
71
|
-
5. **Observe again** — print URL + snapshot to verify the action's effect
|
|
81
|
+
5. **Observe again** — print URL + snapshot + page logs to verify the action's effect
|
|
72
82
|
6. **Repeat** from step 3 until task is complete
|
|
73
83
|
|
|
84
|
+
**Always print page logs after every action** using `getLatestLogs({ sinceLastCall: true })`. This returns only new console messages and errors since the last call, so you catch hydration errors, failed network requests, and runtime exceptions without duplicates. The first call returns all buffered logs from the page, including logs emitted before your script started.
|
|
85
|
+
|
|
74
86
|
```js
|
|
75
87
|
// Each step should be a separate execute call:
|
|
76
88
|
// Step 1: navigate + observe
|
|
77
89
|
state.page = context.pages().find((p) => p.url() === 'about:blank') ?? (await context.newPage())
|
|
78
90
|
await state.page.goto('https://example.com', { waitUntil: 'domcontentloaded' })
|
|
79
91
|
console.log('URL:', state.page.url())
|
|
92
|
+
console.log('Page logs:', await getLatestLogs({ page: state.page, sinceLastCall: true }))
|
|
80
93
|
await snapshot({ page: state.page }).then(console.log)
|
|
81
94
|
```
|
|
82
95
|
|
|
@@ -84,25 +97,26 @@ await snapshot({ page: state.page }).then(console.log)
|
|
|
84
97
|
// Step 2: act + observe
|
|
85
98
|
await state.page.locator('button:has-text("Submit")').click()
|
|
86
99
|
console.log('URL:', state.page.url())
|
|
100
|
+
console.log('Page logs:', await getLatestLogs({ page: state.page, sinceLastCall: true }))
|
|
87
101
|
await snapshot({ page: state.page }).then(console.log)
|
|
88
102
|
```
|
|
89
103
|
|
|
90
104
|
If nothing changed after an action, try `waitForPageLoad({ page: state.page, timeout: 3000 })` or you may have clicked the wrong element.
|
|
91
105
|
|
|
92
|
-
**Deeper observation** — when snapshots aren't enough to understand what happened, combine
|
|
106
|
+
**Deeper observation** — when snapshots aren't enough to understand what happened, combine snapshot with filtered logs:
|
|
93
107
|
|
|
94
108
|
```js
|
|
95
|
-
//
|
|
109
|
+
// Search for specific errors in all logs (not just since last call)
|
|
96
110
|
const errors = await getLatestLogs({ page: state.page, search: /error|fail/i, count: 20 })
|
|
97
111
|
|
|
98
|
-
// Combine snapshot + logs for full picture
|
|
112
|
+
// Combine snapshot + filtered logs for full picture
|
|
99
113
|
const snap = await snapshot({ page: state.page, search: /dialog|error|message/ })
|
|
100
114
|
const logs = await getLatestLogs({ page: state.page, search: /error/i, count: 10 })
|
|
101
115
|
console.log('UI:', snap)
|
|
102
116
|
console.log('Logs:', logs)
|
|
103
117
|
```
|
|
104
118
|
|
|
105
|
-
Use `getLatestLogs()` for
|
|
119
|
+
Use `getLatestLogs({ sinceLastCall: true })` after every action, `getLatestLogs({ search })` for targeted debugging, `state.page.url()` for navigation, screenshots only for visual layout issues.
|
|
106
120
|
|
|
107
121
|
## common mistakes to avoid
|
|
108
122
|
|
|
@@ -518,17 +532,22 @@ For carousels or lazy-loaded galleries, you may need to click navigation arrows
|
|
|
518
532
|
|
|
519
533
|
## utility functions
|
|
520
534
|
|
|
521
|
-
**getLatestLogs** - retrieve captured browser console logs (up to 5000 per page
|
|
535
|
+
**getLatestLogs** - retrieve captured browser console logs and page errors (up to 5000 per page):
|
|
536
|
+
|
|
537
|
+
Always use this helper when inspecting browser logs. Do not attach new `page.on('console')` listeners for debugging because they only see future events and can miss logs emitted during page startup or hydration.
|
|
538
|
+
|
|
539
|
+
Use `sinceLastCall: true` after every action to get only new logs since the previous call. The first call returns all buffered logs including pre-existing ones. Logs persist across navigations so you never miss errors from page transitions.
|
|
522
540
|
|
|
523
541
|
```js
|
|
524
|
-
await getLatestLogs({ page?, count?, search? })
|
|
525
|
-
//
|
|
542
|
+
await getLatestLogs({ page?, count?, search?, sinceLastCall? })
|
|
543
|
+
// After every action: get only new logs
|
|
544
|
+
const newLogs = await getLatestLogs({ page: state.page, sinceLastCall: true })
|
|
545
|
+
// Search all logs (ignores cursor):
|
|
526
546
|
const errors = await getLatestLogs({ search: /error/i, count: 50 })
|
|
527
|
-
const pageLogs = await getLatestLogs({ page: state.page })
|
|
547
|
+
const pageLogs = await getLatestLogs({ page: state.page, count: 100 })
|
|
548
|
+
const hydrationErrors = await getLatestLogs({ page: state.page, search: /hydration|pageerror|React/i })
|
|
528
549
|
```
|
|
529
550
|
|
|
530
|
-
For custom log collection across runs, store in state: `state.logs = []; state.page.on('console', m => state.logs.push(m.text()))`
|
|
531
|
-
|
|
532
551
|
**getCleanHTML** - get cleaned HTML from a locator or page, with search and diffing:
|
|
533
552
|
|
|
534
553
|
```js
|
package/dist/readability.js
CHANGED
|
@@ -1668,7 +1668,7 @@
|
|
|
1668
1668
|
};
|
|
1669
1669
|
});
|
|
1670
1670
|
|
|
1671
|
-
// dist/_readability-entry-
|
|
1671
|
+
// dist/_readability-entry-28588-1781364082573.js
|
|
1672
1672
|
var import_readability = __toESM(require_readability(), 1);
|
|
1673
1673
|
globalThis.__readability = { Readability: import_readability.Readability, isProbablyReaderable: import_readability.isProbablyReaderable };
|
|
1674
1674
|
})();
|
package/dist/relay-client.d.ts
CHANGED
|
@@ -15,6 +15,16 @@ export type ExtensionStatus = {
|
|
|
15
15
|
playwriterVersion: string | null;
|
|
16
16
|
};
|
|
17
17
|
export declare function getRelayServerVersion(port?: number): Promise<string | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Poll /version until a relay responds or timeout expires.
|
|
20
|
+
* Used during startup races where a relay may have bound the port
|
|
21
|
+
* but isn't serving HTTP yet (issue #75).
|
|
22
|
+
*/
|
|
23
|
+
export declare function waitForRelayVersion({ port, timeoutMs, intervalMs, }?: {
|
|
24
|
+
port?: number;
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
intervalMs?: number;
|
|
27
|
+
}): Promise<string | null>;
|
|
18
28
|
export declare function getExtensionStatus(port?: number): Promise<{
|
|
19
29
|
connected: boolean;
|
|
20
30
|
activeTargets: number;
|
|
@@ -59,6 +69,7 @@ export interface EnsureRelayServerOptions {
|
|
|
59
69
|
/**
|
|
60
70
|
* Ensures the relay server is running. Starts it if not running.
|
|
61
71
|
* Optionally restarts on version mismatch.
|
|
72
|
+
* Concurrent calls within the same process are deduplicated.
|
|
62
73
|
*/
|
|
63
74
|
export declare function ensureRelayServer(options?: EnsureRelayServerOptions): Promise<true | undefined>;
|
|
64
75
|
//# sourceMappingURL=relay-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,eAAO,MAAM,UAAU,QAA+C,CAAA;AAEtE,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC7C,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC,CAAA;AAED,wBAAsB,qBAAqB,CAAC,IAAI,GAAE,MAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa7F;AAED,wBAAsB,kBAAkB,CACtC,IAAI,GAAE,MAAmB,GACxB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAYjG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA6C/F;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;CACtC,GACL,OAAO,CAAC,eAAe,EAAE,CAAC,CAiB5B;AAqBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAa9D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,0BAA0B,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQhH;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;IAC1C,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;
|
|
1
|
+
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,eAAO,MAAM,UAAU,QAA+C,CAAA;AAEtE,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC7C,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC,CAAA;AAED,wBAAsB,qBAAqB,CAAC,IAAI,GAAE,MAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa7F;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,IAAiB,EACjB,SAAgB,EAChB,UAAgB,GACjB,GAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU9B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,GAAE,MAAmB,GACxB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAYjG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA6C/F;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;CACtC,GACL,OAAO,CAAC,eAAe,EAAE,CAAC,CAiB5B;AAqBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAa9D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,0BAA0B,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQhH;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;IAC1C,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAQzG"}
|
package/dist/relay-client.js
CHANGED
|
@@ -26,6 +26,22 @@ export async function getRelayServerVersion(port = RELAY_PORT) {
|
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Poll /version until a relay responds or timeout expires.
|
|
31
|
+
* Used during startup races where a relay may have bound the port
|
|
32
|
+
* but isn't serving HTTP yet (issue #75).
|
|
33
|
+
*/
|
|
34
|
+
export async function waitForRelayVersion({ port = RELAY_PORT, timeoutMs = 2000, intervalMs = 200, } = {}) {
|
|
35
|
+
const end = Date.now() + timeoutMs;
|
|
36
|
+
while (Date.now() < end) {
|
|
37
|
+
const version = await getRelayServerVersion(port);
|
|
38
|
+
if (version) {
|
|
39
|
+
return version;
|
|
40
|
+
}
|
|
41
|
+
await sleep(intervalMs);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
29
45
|
export async function getExtensionStatus(port = RELAY_PORT) {
|
|
30
46
|
try {
|
|
31
47
|
const response = await fetch(`http://127.0.0.1:${port}/extension/status`, {
|
|
@@ -144,11 +160,24 @@ export function getExtensionOutdatedWarning(extensionPlaywriterVersion) {
|
|
|
144
160
|
}
|
|
145
161
|
return null;
|
|
146
162
|
}
|
|
163
|
+
// Module-level dedup: if ensureRelayServer is called concurrently within the
|
|
164
|
+
// same process (e.g. two MCP tool handlers at once), only one spawn runs.
|
|
165
|
+
let pendingEnsure = null;
|
|
147
166
|
/**
|
|
148
167
|
* Ensures the relay server is running. Starts it if not running.
|
|
149
168
|
* Optionally restarts on version mismatch.
|
|
169
|
+
* Concurrent calls within the same process are deduplicated.
|
|
150
170
|
*/
|
|
151
171
|
export async function ensureRelayServer(options = {}) {
|
|
172
|
+
if (pendingEnsure) {
|
|
173
|
+
return pendingEnsure;
|
|
174
|
+
}
|
|
175
|
+
pendingEnsure = ensureRelayServerImpl(options).finally(() => {
|
|
176
|
+
pendingEnsure = null;
|
|
177
|
+
});
|
|
178
|
+
return pendingEnsure;
|
|
179
|
+
}
|
|
180
|
+
async function ensureRelayServerImpl(options = {}) {
|
|
152
181
|
const { logger, restartOnVersionMismatch = true, env: additionalEnv } = options;
|
|
153
182
|
const serverVersion = await getRelayServerVersion(RELAY_PORT);
|
|
154
183
|
if (serverVersion === VERSION) {
|
|
@@ -172,7 +201,23 @@ export async function ensureRelayServer(options = {}) {
|
|
|
172
201
|
else {
|
|
173
202
|
const listeningPids = await getListeningPidsForPort({ port: RELAY_PORT }).catch(() => []);
|
|
174
203
|
if (listeningPids.length > 0) {
|
|
175
|
-
|
|
204
|
+
// Something is on the port but /version didn't respond. It might be a
|
|
205
|
+
// relay that's still starting (race with another CLI/MCP instance).
|
|
206
|
+
// Poll /version briefly before deciding to kill it (issue #75).
|
|
207
|
+
const foundVersion = await waitForRelayVersion({ port: RELAY_PORT });
|
|
208
|
+
if (foundVersion) {
|
|
209
|
+
// A relay came up while we waited; use it
|
|
210
|
+
if (foundVersion === VERSION || compareVersions(foundVersion, VERSION) > 0) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (!restartOnVersionMismatch) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
logger?.log(pc.yellow(`CDP relay server version mismatch (server: ${foundVersion}, client: ${VERSION}), restarting...`));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
logger?.log(pc.yellow(`Port ${RELAY_PORT} is already in use (pid(s): ${listeningPids.join(', ')}). Attempting to stop the existing process...`));
|
|
220
|
+
}
|
|
176
221
|
await killRelayServer({ port: RELAY_PORT });
|
|
177
222
|
}
|
|
178
223
|
logger?.log(pc.dim('CDP relay server not running, starting it...'));
|
package/dist/relay-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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"}
|
package/dist/relay-core.test.js
CHANGED
|
@@ -641,6 +641,7 @@ describe('Relay Core Tests', () => {
|
|
|
641
641
|
console.error('Test error 67890');
|
|
642
642
|
console.warn('Test warning 11111');
|
|
643
643
|
console.log('Test log 2 with', { data: 'object' });
|
|
644
|
+
setTimeout(() => { throw new Error('Test pageerror 22222'); }, 0);
|
|
644
645
|
});
|
|
645
646
|
// Wait for logs to be captured
|
|
646
647
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
@@ -661,6 +662,7 @@ describe('Relay Core Tests', () => {
|
|
|
661
662
|
expect(output).toContain('[log] Test log 12345');
|
|
662
663
|
expect(output).toContain('[error] Test error 67890');
|
|
663
664
|
expect(output).toContain('[warning] Test warning 11111');
|
|
665
|
+
expect(output).toContain('[pageerror] Test pageerror 22222');
|
|
664
666
|
// Test filtering by search string
|
|
665
667
|
const errorLogsResult = await client.callTool({
|
|
666
668
|
name: 'execute',
|
|
@@ -675,7 +677,7 @@ describe('Relay Core Tests', () => {
|
|
|
675
677
|
expect(errorOutput).toContain('[error] Test error 67890');
|
|
676
678
|
// With context lines (5 above/below), nearby logs are also included
|
|
677
679
|
expect(errorOutput).toContain('[log] Test log 12345');
|
|
678
|
-
// Test that logs
|
|
680
|
+
// Test that logs persist across page reload
|
|
679
681
|
await client.callTool({
|
|
680
682
|
name: 'execute',
|
|
681
683
|
arguments: {
|
|
@@ -714,7 +716,9 @@ describe('Relay Core Tests', () => {
|
|
|
714
716
|
`,
|
|
715
717
|
},
|
|
716
718
|
});
|
|
717
|
-
// Check logs after reload - old logs
|
|
719
|
+
// Check logs after reload - old logs persist (no longer cleared on navigation)
|
|
720
|
+
// so both pre- and post-reload logs are present. Use sinceLastCall to get
|
|
721
|
+
// only new logs if needed.
|
|
718
722
|
const afterReloadResult = await client.callTool({
|
|
719
723
|
name: 'execute',
|
|
720
724
|
arguments: {
|
|
@@ -727,7 +731,7 @@ describe('Relay Core Tests', () => {
|
|
|
727
731
|
});
|
|
728
732
|
const afterReloadOutput = afterReloadResult.content[0].text;
|
|
729
733
|
expect(afterReloadOutput).toContain('[log] After reload 88888');
|
|
730
|
-
expect(afterReloadOutput).
|
|
734
|
+
expect(afterReloadOutput).toContain('[log] Before reload 99999');
|
|
731
735
|
// Clean up
|
|
732
736
|
await client.callTool({
|
|
733
737
|
name: 'execute',
|
|
@@ -832,7 +836,7 @@ describe('Relay Core Tests', () => {
|
|
|
832
836
|
const allOutput = allLogsResult.content[0].text;
|
|
833
837
|
expect(allOutput).toContain('[log] PageA log 11111');
|
|
834
838
|
expect(allOutput).toContain('[log] PageB log 33333');
|
|
835
|
-
// Test that reloading page A
|
|
839
|
+
// Test that reloading page A preserves logs (no longer cleared on navigation)
|
|
836
840
|
await client.callTool({
|
|
837
841
|
name: 'execute',
|
|
838
842
|
arguments: {
|
|
@@ -845,7 +849,7 @@ describe('Relay Core Tests', () => {
|
|
|
845
849
|
`,
|
|
846
850
|
},
|
|
847
851
|
});
|
|
848
|
-
// Check page A logs -
|
|
852
|
+
// Check page A logs - logs persist across navigation, so both old and new are present
|
|
849
853
|
const pageAAfterReloadResult = await client.callTool({
|
|
850
854
|
name: 'execute',
|
|
851
855
|
arguments: {
|
|
@@ -858,7 +862,7 @@ describe('Relay Core Tests', () => {
|
|
|
858
862
|
});
|
|
859
863
|
const pageAAfterReloadOutput = pageAAfterReloadResult.content[0].text;
|
|
860
864
|
expect(pageAAfterReloadOutput).toContain('[log] PageA after reload 55555');
|
|
861
|
-
expect(pageAAfterReloadOutput).
|
|
865
|
+
expect(pageAAfterReloadOutput).toContain('[log] PageA log 11111');
|
|
862
866
|
// Check page B logs - should still have original logs
|
|
863
867
|
const pageBAfterAReloadResult = await client.callTool({
|
|
864
868
|
name: 'execute',
|