playwriter 0.3.1 → 0.4.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.
Files changed (51) hide show
  1. package/dist/bippy.js +5 -5
  2. package/dist/browser-config.d.ts.map +1 -1
  3. package/dist/browser-config.js +8 -2
  4. package/dist/browser-config.js.map +1 -1
  5. package/dist/browser-install.d.ts +16 -0
  6. package/dist/browser-install.d.ts.map +1 -0
  7. package/dist/browser-install.js +237 -0
  8. package/dist/browser-install.js.map +1 -0
  9. package/dist/cdp-relay.d.ts.map +1 -1
  10. package/dist/cdp-relay.js +254 -18
  11. package/dist/cdp-relay.js.map +1 -1
  12. package/dist/chrome-discovery.d.ts.map +1 -1
  13. package/dist/chrome-discovery.js +8 -0
  14. package/dist/chrome-discovery.js.map +1 -1
  15. package/dist/cli.js +568 -6
  16. package/dist/cli.js.map +1 -1
  17. package/dist/cloud-client.d.ts +56 -0
  18. package/dist/cloud-client.d.ts.map +1 -0
  19. package/dist/cloud-client.js +120 -0
  20. package/dist/cloud-client.js.map +1 -0
  21. package/dist/executor.d.ts +46 -2
  22. package/dist/executor.d.ts.map +1 -1
  23. package/dist/executor.js +245 -22
  24. package/dist/executor.js.map +1 -1
  25. package/dist/extension/background.js +106 -23
  26. package/dist/extension/manifest.json +1 -1
  27. package/dist/playwright-import.d.ts +19 -0
  28. package/dist/playwright-import.d.ts.map +1 -0
  29. package/dist/playwright-import.js +39 -0
  30. package/dist/playwright-import.js.map +1 -0
  31. package/dist/prompt.md +32 -0
  32. package/dist/readability.js +1 -1
  33. package/dist/relay-state.d.ts +1 -0
  34. package/dist/relay-state.d.ts.map +1 -1
  35. package/dist/relay-state.js +18 -0
  36. package/dist/relay-state.js.map +1 -1
  37. package/dist/relay-state.test.js +22 -0
  38. package/dist/relay-state.test.js.map +1 -1
  39. package/dist/selector-generator.js +1 -1
  40. package/package.json +3 -1
  41. package/src/browser-config.ts +11 -2
  42. package/src/browser-install.ts +283 -0
  43. package/src/cdp-relay.ts +300 -19
  44. package/src/chrome-discovery.ts +9 -0
  45. package/src/cli.ts +635 -7
  46. package/src/cloud-client.ts +172 -0
  47. package/src/executor.ts +291 -23
  48. package/src/playwright-import.ts +58 -0
  49. package/src/relay-state.test.ts +32 -0
  50. package/src/relay-state.ts +19 -1
  51. package/src/skill.md +154 -14
@@ -167,7 +167,7 @@ function hexToInt(c) {
167
167
  return -1;
168
168
  }
169
169
  //#endregion
170
- //#region ../node_modules/.pnpm/zustand@5.0.13_@types+react@19.2.7_react@19.2.6/node_modules/zustand/esm/vanilla.mjs
170
+ //#region ../node_modules/.pnpm/zustand@5.0.14_@types+react@19.2.7_react@19.2.7/node_modules/zustand/esm/vanilla.mjs
171
171
  var createStoreImpl = (createState) => {
172
172
  let state;
173
173
  const listeners = /* @__PURE__ */ new Set();
@@ -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-35395-1781365259216.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.7/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.7/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.7/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.7/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-31733-1782389048114.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();
@@ -770,6 +770,32 @@ async function cleanupRecordingForTab(tabId) {
770
770
  var js = dedent;
771
771
  var RELAY_HOST = "127.0.0.1";
772
772
  var RELAY_PORT = 19988;
773
+ var FAST_CDP_COMMAND_TIMEOUT_MS = new Map([
774
+ ["Browser.getWindowForTarget", 1e4],
775
+ ["Page.enable", 1e4],
776
+ ["Page.getFrameTree", 1e4],
777
+ ["Page.setLifecycleEventsEnabled", 1e4],
778
+ ["Page.createIsolatedWorld", 1e4],
779
+ ["Page.setDownloadBehavior", 1e4],
780
+ ["Log.enable", 1e4],
781
+ ["Network.enable", 1e4],
782
+ ["Emulation.setFocusEmulationEnabled", 1e4],
783
+ ["Emulation.setEmulatedMedia", 1e4],
784
+ ["Runtime.runIfWaitingForDebugger", 1e4],
785
+ ["Target.setAutoAttach", 1e4]
786
+ ]);
787
+ async function sendCommandWithTimeout(debuggee, method, params, timeout) {
788
+ let timeoutId;
789
+ try {
790
+ return await Promise.race([chrome.debugger.sendCommand(debuggee, method, params), new Promise((_, reject) => {
791
+ timeoutId = setTimeout(() => {
792
+ reject(/* @__PURE__ */ new Error(`CDP command timed out after ${timeout}ms: ${method} (tab may be frozen/hibernated)`));
793
+ }, timeout);
794
+ })]);
795
+ } finally {
796
+ if (timeoutId) clearTimeout(timeoutId);
797
+ }
798
+ }
773
799
  function sleep(ms) {
774
800
  return new Promise((resolve) => setTimeout(resolve, ms));
775
801
  }
@@ -933,7 +959,7 @@ var ConnectionManager = class {
933
959
  if (identity.email) relayUrl.searchParams.set("email", identity.email);
934
960
  if (identity.id) relayUrl.searchParams.set("id", identity.id);
935
961
  if (identity.installId) relayUrl.searchParams.set("installId", identity.installId);
936
- relayUrl.searchParams.set("v", "0.3.1");
962
+ relayUrl.searchParams.set("v", "0.4.0");
937
963
  logger.debug("Creating WebSocket connection to:", relayUrl);
938
964
  const socket = new WebSocket(relayUrl.toString());
939
965
  await new Promise((resolve, reject) => {
@@ -994,7 +1020,7 @@ var ConnectionManager = class {
994
1020
  if (message.method === "createInitialTab") {
995
1021
  try {
996
1022
  logger.debug("Creating initial tab for Playwright client");
997
- const tab = await chrome.tabs.create({
1023
+ const tab = await createTabInPreferredWindow({
998
1024
  url: "about:blank",
999
1025
  active: false
1000
1026
  });
@@ -1258,6 +1284,7 @@ var store = createStore(() => ({
1258
1284
  tabs: /* @__PURE__ */ new Map(),
1259
1285
  connectionState: "idle",
1260
1286
  currentTabId: void 0,
1287
+ preferredWindowId: void 0,
1261
1288
  errorText: void 0
1262
1289
  }));
1263
1290
  globalThis.toggleExtensionForActiveTab = toggleExtensionForActiveTab;
@@ -1349,6 +1376,41 @@ function sendMessage(message) {
1349
1376
  console.debug("ERROR sending message:", error, "message type:", message.method || "response");
1350
1377
  }
1351
1378
  }
1379
+ async function getPreferredWindowId() {
1380
+ const { preferredWindowId, currentTabId } = store.getState();
1381
+ if (preferredWindowId !== void 0) try {
1382
+ await chrome.windows.get(preferredWindowId);
1383
+ return preferredWindowId;
1384
+ } catch {
1385
+ store.setState({ preferredWindowId: void 0 });
1386
+ }
1387
+ if (currentTabId !== void 0) try {
1388
+ const tab = await chrome.tabs.get(currentTabId);
1389
+ if (tab.windowId !== void 0) return tab.windowId;
1390
+ } catch {}
1391
+ try {
1392
+ return (await chrome.windows.getLastFocused({ populate: false })).id;
1393
+ } catch {
1394
+ return;
1395
+ }
1396
+ }
1397
+ async function createTabInPreferredWindow(options) {
1398
+ const windowId = await getPreferredWindowId();
1399
+ const createProperties = {
1400
+ url: options.url,
1401
+ active: options.active,
1402
+ ...windowId !== void 0 ? { windowId } : {}
1403
+ };
1404
+ try {
1405
+ return await chrome.tabs.create(createProperties);
1406
+ } catch (error) {
1407
+ logger.debug("Could not create tab in preferred window, falling back:", error.message);
1408
+ return await chrome.tabs.create({
1409
+ url: options.url,
1410
+ active: options.active
1411
+ });
1412
+ }
1413
+ }
1352
1414
  async function syncTabGroup() {
1353
1415
  try {
1354
1416
  const { connectionState } = store.getState();
@@ -1480,7 +1542,7 @@ async function handleCommand(msg) {
1480
1542
  const connectedTabIds = Array.from(store.getState().tabs.entries()).filter(([_, info]) => info.state === "connected").map(([tabId]) => tabId);
1481
1543
  await Promise.all(connectedTabIds.map(async (tabId) => {
1482
1544
  try {
1483
- await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", params);
1545
+ await sendCommandWithTimeout({ tabId }, "Target.setAutoAttach", params, 1e4);
1484
1546
  } catch (error) {
1485
1547
  logger.debug("Failed to set auto-attach for tab:", tabId, error);
1486
1548
  }
@@ -1495,17 +1557,17 @@ async function handleCommand(msg) {
1495
1557
  sessionId: msg.params.sessionId !== targetTab?.sessionId ? msg.params.sessionId : void 0
1496
1558
  };
1497
1559
  try {
1498
- await chrome.debugger.sendCommand(runtimeSession, "Runtime.disable");
1560
+ await sendCommandWithTimeout(runtimeSession, "Runtime.disable", void 0, 1e4);
1499
1561
  await sleep(50);
1500
1562
  } catch (e) {
1501
1563
  logger.debug("Error disabling Runtime (ignoring):", e);
1502
1564
  }
1503
- return await chrome.debugger.sendCommand(runtimeSession, "Runtime.enable", msg.params.params);
1565
+ return await sendCommandWithTimeout(runtimeSession, "Runtime.enable", msg.params.params, 1e4);
1504
1566
  }
1505
1567
  case "Target.createTarget": {
1506
1568
  const url = msg.params.params?.url || "about:blank";
1507
1569
  logger.debug("Creating new tab with URL:", url);
1508
- const tab = await chrome.tabs.create({
1570
+ const tab = await createTabInPreferredWindow({
1509
1571
  url,
1510
1572
  active: false
1511
1573
  });
@@ -1533,6 +1595,8 @@ async function handleCommand(msg) {
1533
1595
  ...debuggee,
1534
1596
  sessionId: msg.params.sessionId !== targetTab.sessionId ? msg.params.sessionId : void 0
1535
1597
  };
1598
+ const timeout = FAST_CDP_COMMAND_TIMEOUT_MS.get(msg.params.method);
1599
+ if (timeout) return await sendCommandWithTimeout(debuggerSession, msg.params.method, msg.params.params, timeout);
1536
1600
  return await chrome.debugger.sendCommand(debuggerSession, msg.params.method, msg.params.params);
1537
1601
  }
1538
1602
  function onDebuggerEvent(source, method, params) {
@@ -1590,27 +1654,35 @@ function onDebuggerDetach(source, reason) {
1590
1654
  return;
1591
1655
  }
1592
1656
  logger.warn(`DISCONNECT: onDebuggerDetach tabId=${tabId} reason=${reason}`);
1593
- const tab = store.getState().tabs.get(tabId);
1594
- if (tab) sendMessage({
1595
- method: "forwardCDPEvent",
1596
- params: {
1597
- method: "Target.detachedFromTarget",
1657
+ const detachTabFromPlaywright = (detachedTabId, tab) => {
1658
+ sendMessage({
1659
+ method: "forwardCDPEvent",
1598
1660
  params: {
1599
- sessionId: tab.sessionId,
1600
- targetId: tab.targetId
1661
+ method: "Target.detachedFromTarget",
1662
+ params: {
1663
+ sessionId: tab.sessionId,
1664
+ targetId: tab.targetId
1665
+ }
1601
1666
  }
1602
- }
1603
- });
1604
- emitChildDetachesForTab(tabId);
1667
+ });
1668
+ emitChildDetachesForTab(detachedTabId);
1669
+ };
1670
+ if (reason === chrome.debugger.DetachReason.CANCELED_BY_USER) {
1671
+ for (const [detachedTabId, tab] of store.getState().tabs.entries()) detachTabFromPlaywright(detachedTabId, tab);
1672
+ store.setState({
1673
+ tabs: /* @__PURE__ */ new Map(),
1674
+ connectionState: "idle",
1675
+ errorText: void 0
1676
+ });
1677
+ return;
1678
+ }
1679
+ const tab = store.getState().tabs.get(tabId);
1680
+ if (tab) detachTabFromPlaywright(tabId, tab);
1605
1681
  store.setState((state) => {
1606
1682
  const newTabs = new Map(state.tabs);
1607
1683
  newTabs.delete(tabId);
1608
1684
  return { tabs: newTabs };
1609
1685
  });
1610
- if (reason === chrome.debugger.DetachReason.CANCELED_BY_USER) store.setState({
1611
- connectionState: "idle",
1612
- errorText: void 0
1613
- });
1614
1686
  }
1615
1687
  async function removeRestrictedIframes(tabId) {
1616
1688
  try {
@@ -1818,6 +1890,10 @@ async function connectTab(tabId) {
1818
1890
  });
1819
1891
  return;
1820
1892
  }
1893
+ if (!store.getState().tabs.has(tabId)) {
1894
+ logger.debug(`Tab ${tabId} was detached during connect, dropping error state`);
1895
+ return;
1896
+ }
1821
1897
  store.setState((state) => {
1822
1898
  const newTabs = new Map(state.tabs);
1823
1899
  newTabs.set(tabId, {
@@ -2050,13 +2126,20 @@ async function onTabRemoved(tabId) {
2050
2126
  await disconnectTab(tabId);
2051
2127
  }
2052
2128
  async function onTabActivated(activeInfo) {
2053
- store.setState({ currentTabId: activeInfo.tabId });
2129
+ store.setState({
2130
+ currentTabId: activeInfo.tabId,
2131
+ preferredWindowId: activeInfo.windowId
2132
+ });
2054
2133
  }
2055
2134
  async function onActionClicked(tab) {
2056
2135
  if (!tab.id) {
2057
2136
  logger.debug("No tab ID available");
2058
2137
  return;
2059
2138
  }
2139
+ if (tab.windowId !== void 0) store.setState({
2140
+ currentTabId: tab.id,
2141
+ preferredWindowId: tab.windowId
2142
+ });
2060
2143
  if (isRestrictedUrl(tab.url)) {
2061
2144
  logger.debug("Cannot attach to restricted URL:", tab.url);
2062
2145
  return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Playwriter",
4
- "version": "0.0.95",
4
+ "version": "0.0.97",
5
5
  "description": "Automate your Browser using Cursor, Claude, VS Code. More capable and context efficient than Playwright MCP.",
6
6
  "permissions": [
7
7
  "debugger",
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Conditional playwright-core import. When patchright mode is enabled via
3
+ * PLAYWRITER_PATCHRIGHT=1 env var, imports from @playwriter/patchright-core
4
+ * instead of @xmorse/playwright-core. Both packages expose identical APIs.
5
+ *
6
+ * Type imports continue to use @xmorse/playwright-core directly (types are
7
+ * the same in both packages) so TypeScript resolution works without the
8
+ * optional patchright dep being installed.
9
+ */
10
+ export type { Page, Frame, Browser, BrowserContext, Locator, FrameLocator, ElementHandle, CDPSession, MouseActionEvent, } from '@xmorse/playwright-core';
11
+ export type { BrowserType } from '@xmorse/playwright-core';
12
+ type Chromium = typeof import('@xmorse/playwright-core').chromium;
13
+ /**
14
+ * Returns the chromium BrowserType, loading from patchright-core if enabled.
15
+ * Caches after first call.
16
+ */
17
+ export declare function getChromium(): Promise<Chromium>;
18
+ export declare function isPatchrightEnabled(): boolean;
19
+ //# sourceMappingURL=playwright-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-import.d.ts","sourceRoot":"","sources":["../src/playwright-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,IAAI,EACJ,KAAK,EACL,OAAO,EACP,cAAc,EACd,OAAO,EACP,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,GACjB,MAAM,yBAAyB,CAAA;AAEhC,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D,KAAK,QAAQ,GAAG,cAAc,yBAAyB,EAAE,QAAQ,CAAA;AAIjE;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAqBrD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Conditional playwright-core import. When patchright mode is enabled via
3
+ * PLAYWRITER_PATCHRIGHT=1 env var, imports from @playwriter/patchright-core
4
+ * instead of @xmorse/playwright-core. Both packages expose identical APIs.
5
+ *
6
+ * Type imports continue to use @xmorse/playwright-core directly (types are
7
+ * the same in both packages) so TypeScript resolution works without the
8
+ * optional patchright dep being installed.
9
+ */
10
+ let _chromium;
11
+ /**
12
+ * Returns the chromium BrowserType, loading from patchright-core if enabled.
13
+ * Caches after first call.
14
+ */
15
+ export async function getChromium() {
16
+ if (_chromium) {
17
+ return _chromium;
18
+ }
19
+ if (isPatchrightEnabled()) {
20
+ try {
21
+ // Dynamic import — @playwriter/patchright-core is an optional dependency.
22
+ // Types come from @xmorse/playwright-core (identical API surface).
23
+ const mod = await import('@playwriter/patchright-core');
24
+ _chromium = mod.chromium;
25
+ }
26
+ catch (e) {
27
+ throw new Error('@playwriter/patchright-core is not installed. Install it with: pnpm add @playwriter/patchright-core', { cause: e });
28
+ }
29
+ }
30
+ else {
31
+ const mod = await import('@xmorse/playwright-core');
32
+ _chromium = mod.chromium;
33
+ }
34
+ return _chromium;
35
+ }
36
+ export function isPatchrightEnabled() {
37
+ return process.env.PLAYWRITER_PATCHRIGHT === '1' || process.env.PLAYWRITER_PATCHRIGHT === 'true';
38
+ }
39
+ //# sourceMappingURL=playwright-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-import.js","sourceRoot":"","sources":["../src/playwright-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,IAAI,SAA+B,CAAA;AAEnC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,0EAA0E;YAC1E,mEAAmE;YACnE,MAAM,GAAG,GAA2B,MAAM,MAAM,CAAC,6BAAuC,CAAC,CAAA;YACzF,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAA;QAC1B,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,qGAAqG,EACrG,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAA;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;QACnD,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC1B,CAAC;IACD,OAAO,SAAU,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM,CAAA;AAClG,CAAC"}
package/dist/prompt.md CHANGED
@@ -35,6 +35,24 @@ start chrome.exe --profile-directory=Default --allowlisted-extension-id=jfeammnj
35
35
 
36
36
  You can collaborate with the user - they can help with captchas, difficult elements, or reproducing bugs.
37
37
 
38
+ **Direct CDP mode (no extension needed):** Playwriter can connect directly to Chrome's DevTools Protocol, bypassing the extension. This is useful in CI, Docker, headless environments, when Chrome has `--remote-debugging-port=9222`, or with cloud browser providers (e.g. `wss://xxx.cdp.browser-use.com`). If the user provides a CDP URL, set `PLAYWRITER_DIRECT` in the MCP client config:
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "playwriter": {
44
+ "command": "npx",
45
+ "args": ["-y", "playwriter@latest"],
46
+ "env": {
47
+ "PLAYWRITER_DIRECT": "wss://xxx.cdp.browser-use.com"
48
+ }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ `PLAYWRITER_DIRECT` accepts `1` (auto-discover Chrome on port 9222), a `ws://` or `wss://` endpoint (including cloud browser providers), or `host:port`. Screen recording is not available in direct CDP mode since it relies on the extension's `chrome.tabCapture` API.
55
+
38
56
  ## context variables
39
57
 
40
58
  - `state` - object persisted between calls **within your session**. Each session has its own isolated state. Use to store pages, data, listeners (e.g., `state.page = await context.newPage()`)
@@ -435,6 +453,20 @@ console.log(cookies)
435
453
 
436
454
  MUST use this for page-scoped cookies in extension mode. `Storage.getCookies` is a root-session command and will fail in playwriter.
437
455
 
456
+ **NEVER use `Network.clearBrowserCookies` or `Network.clearBrowserCache`** — these CDP commands are **profile-wide destructive operations** that wipe ALL cookies/cache across every domain in the user's Chrome profile. They will log the user out of Gmail, GitHub, and every authenticated session.
457
+
458
+ **Clear cookies for a specific domain** — use `Network.getCookies` to fetch cookies scoped to URLs, then delete them individually with `Network.deleteCookies`:
459
+
460
+ ```js
461
+ const cdp = await getCDPSession({ page: state.page })
462
+ const { cookies } = await cdp.send('Network.getCookies', {
463
+ urls: ['https://example.com', 'https://www.example.com'],
464
+ })
465
+ for (const cookie of cookies) {
466
+ await cdp.send('Network.deleteCookies', { name: cookie.name, domain: cookie.domain })
467
+ }
468
+ ```
469
+
438
470
  **Downloading large data** - console output truncates large strings. Trigger a browser download instead:
439
471
 
440
472
  ```js
@@ -1668,7 +1668,7 @@
1668
1668
  };
1669
1669
  });
1670
1670
 
1671
- // dist/_readability-entry-35395-1781365259216.js
1671
+ // dist/_readability-entry-31733-1782389048114.js
1672
1672
  var import_readability = __toESM(require_readability(), 1);
1673
1673
  globalThis.__readability = { Readability: import_readability.Readability, isProbablyReaderable: import_readability.isProbablyReaderable };
1674
1674
  })();
@@ -59,6 +59,7 @@ export declare function createRelayStore(): StoreApi<RelayState>;
59
59
  * coexist briefly. Map iteration order is insertion order, so last wins.
60
60
  */
61
61
  export declare function findExtensionByStableKey(state: RelayState, stableKey: string): ExtensionEntry | undefined;
62
+ export declare function buildStableExtensionKey(info: ExtensionInfo, connectionId: string): string;
62
63
  /** Find which extension owns a CDP tab sessionId (e.g. "pw-tab-1"). */
63
64
  export declare function findExtensionIdByCdpSession(state: RelayState, cdpSessionId: string): string | null;
64
65
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"relay-state.d.ts","sourceRoot":"","sources":["../src/relay-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relay-state.d.ts","sourceRoot":"","sources":["../src/relay-state.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,24 @@ export function findExtensionByStableKey(state, stableKey) {
36
36
  }
37
37
  return match;
38
38
  }
39
+ export function buildStableExtensionKey(info, connectionId) {
40
+ // chrome.identity ids and emails identify the signed-in Google account, not
41
+ // the Chrome profile. Use the per-profile extension storage install id first
42
+ // so two profiles signed into the same account never replace each other.
43
+ if (info.installId) {
44
+ return `install:${info.browser || 'unknown'}:${info.installId}`;
45
+ }
46
+ if (info.id) {
47
+ return `profile:${info.id}`;
48
+ }
49
+ if (info.email) {
50
+ return `email:${info.email}`;
51
+ }
52
+ if (info.browser) {
53
+ return `browser:${info.browser}`;
54
+ }
55
+ return `connection:${connectionId}`;
56
+ }
39
57
  /** Find which extension owns a CDP tab sessionId (e.g. "pw-tab-1"). */
40
58
  export function findExtensionIdByCdpSession(state, cdpSessionId) {
41
59
  for (const [connectionId, ext] of state.extensions.entries()) {