@agent-native/pinpoint 0.1.57 → 0.1.58-nightly-20260927013707
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-context-OICFLRJ7.js → agent-context-KOQ7YRIT.js} +3 -3
- package/dist/{chunk-BB7X7W3H.js → chunk-57BORC7I.js} +1 -1
- package/dist/chunk-57BORC7I.js.map +1 -0
- package/dist/{chunk-Y7IWDHIU.js → chunk-7D57EDI3.js} +1 -1
- package/dist/chunk-7D57EDI3.js.map +1 -0
- package/dist/{chunk-C5OZ7ZT5.js → chunk-AZEQQYM6.js} +2 -2
- package/dist/chunk-AZEQQYM6.js.map +1 -0
- package/dist/{chunk-7ZNIF5SV.js → chunk-EY7LQOCU.js} +1 -1
- package/dist/chunk-EY7LQOCU.js.map +1 -0
- package/dist/{chunk-SMEGMREJ.js → chunk-X5BQI267.js} +370 -394
- package/dist/chunk-X5BQI267.js.map +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/formatter-ROAO4W5M.js +8 -0
- package/dist/{index-CJGmgMCD.d.ts → index-C0P3S_D7.d.ts} +0 -36
- package/dist/{index-NvFcZ4SO.d.ts → index-Ct90phHd.d.ts} +0 -18
- package/dist/index.browser.d.ts +2 -113
- package/dist/index.browser.js +4 -6
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -68
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/dist/open-file-ZQC4OM37.js +8 -0
- package/dist/primitives/index.d.ts +1 -1
- package/dist/primitives/index.js +1 -1
- package/dist/react.d.ts +1 -18
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/server/index.d.ts +0 -32
- package/dist/server/index.js.map +1 -1
- package/dist/types/index.d.ts +0 -18
- package/package.json +3 -3
- package/src/scripts/delete-pin.spec.ts +0 -3
- package/src/scripts/list-sessions.ts +0 -1
- package/src/scripts/update-pin.spec.ts +1 -3
- package/dist/chunk-7ZNIF5SV.js.map +0 -1
- package/dist/chunk-BB7X7W3H.js.map +0 -1
- package/dist/chunk-C5OZ7ZT5.js.map +0 -1
- package/dist/chunk-SMEGMREJ.js.map +0 -1
- package/dist/chunk-Y7IWDHIU.js.map +0 -1
- package/dist/formatter-25JPHXYA.js +0 -8
- package/dist/open-file-RQVHOCXI.js +0 -8
- /package/dist/{agent-context-OICFLRJ7.js.map → agent-context-KOQ7YRIT.js.map} +0 -0
- /package/dist/{formatter-25JPHXYA.js.map → formatter-ROAO4W5M.js.map} +0 -0
- /package/dist/{open-file-RQVHOCXI.js.map → open-file-ZQC4OM37.js.map} +0 -0
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
formatPinsForAgent,
|
|
4
4
|
formatQueueForAgent,
|
|
5
5
|
formatRichPinContext
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-AZEQQYM6.js";
|
|
7
|
+
import "./chunk-57BORC7I.js";
|
|
8
8
|
export {
|
|
9
9
|
formatPinsForAgent,
|
|
10
10
|
formatQueueForAgent,
|
|
11
11
|
formatRichPinContext
|
|
12
12
|
};
|
|
13
|
-
//# sourceMappingURL=agent-context-
|
|
13
|
+
//# sourceMappingURL=agent-context-KOQ7YRIT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/output/formatter.ts"],"sourcesContent":["// @agent-native/pinpoint — Output formatting (compact/standard/detailed)\n// MIT License\n\nimport type { Pin, OutputFormat } from \"../types/index.js\";\n\nexport function formatPins(\n pins: Pin[],\n format: OutputFormat = \"standard\",\n): string {\n if (pins.length === 0) return \"No annotations.\";\n\n const pageUrl = pins[0].pageUrl;\n\n switch (format) {\n case \"compact\":\n return formatCompact(pins, pageUrl);\n case \"standard\":\n return formatStandard(pins, pageUrl);\n case \"detailed\":\n return formatDetailed(pins, pageUrl);\n default:\n return formatStandard(pins, pageUrl);\n }\n}\n\nfunction formatCompact(pins: Pin[], pageUrl: string): string {\n const lines = [`## Page Feedback: ${pageUrl} (${pins.length} annotations)`];\n for (let i = 0; i < pins.length; i++) {\n const pin = pins[i];\n lines.push(`${i + 1}. \\`${pin.element.selector}\\` — \"${pin.comment}\"`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction formatStandard(pins: Pin[], pageUrl: string): string {\n const lines = [\n `## Page Feedback: ${pageUrl}`,\n `${pins.length} annotation${pins.length === 1 ? \"\" : \"s\"} | ${new Date().toISOString()}`,\n \"\",\n ];\n\n for (let i = 0; i < pins.length; i++) {\n const pin = pins[i];\n lines.push(`### ${i + 1}: \\`${pin.element.selector}\\``);\n lines.push(`**Comment:** ${pin.comment}`);\n lines.push(\n `**Element:** \\`<${pin.element.tagName}>\\`${pin.element.classNames.length > 0 ? ` with classes \\`.${pin.element.classNames.join(\" .\")}\\`` : \"\"}`,\n );\n\n if (pin.framework) {\n lines.push(\n `**Component:** ${pin.framework.componentPath} (${pin.framework.framework})`,\n );\n if (pin.framework.sourceFile) {\n lines.push(`**Source:** \\`${pin.framework.sourceFile}\\``);\n }\n }\n\n const rect = pin.element.boundingRect;\n lines.push(\n `**Position:** (${rect.x}, ${rect.y}) ${rect.width}x${rect.height}`,\n );\n lines.push(`**Status:** ${pin.status.state}`);\n\n if (pin.author) {\n lines.push(`**Author:** ${pin.author}`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatDetailed(pins: Pin[], pageUrl: string): string {\n const lines = [formatStandard(pins, pageUrl)];\n\n for (let i = 0; i < pins.length; i++) {\n const pin = pins[i];\n const detailLines: string[] = [];\n\n if (pin.element.domPath) {\n detailLines.push(`**DOM Path:** ${pin.element.domPath}`);\n }\n\n if (\n pin.element.computedStyles &&\n Object.keys(pin.element.computedStyles).length > 0\n ) {\n const styles = Object.entries(pin.element.computedStyles)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\", \");\n detailLines.push(`**Computed Styles:** ${styles}`);\n }\n\n if (\n pin.element.ariaAttributes &&\n Object.keys(pin.element.ariaAttributes).length > 0\n ) {\n const aria = Object.entries(pin.element.ariaAttributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(\", \");\n detailLines.push(`**Accessibility:** ${aria}`);\n }\n\n if (pin.element.textContent) {\n detailLines.push(`**Text Content:** \"${pin.element.textContent}\"`);\n }\n\n if (\n pin.element.dataAttributes &&\n Object.keys(pin.element.dataAttributes).length > 0\n ) {\n const data = Object.entries(pin.element.dataAttributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(\", \");\n detailLines.push(`**Data Attributes:** ${data}`);\n }\n\n if (detailLines.length > 0) {\n lines.push(`#### Details for #${i + 1}:`);\n lines.push(detailLines.join(\"\\n\"));\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/open-file.ts"],"sourcesContent":["// @agent-native/pinpoint — Open file in editor\n// MIT License\n\n/**\n * Open a file in the user's editor. Tries vscode:// protocol first,\n * falls back to a fetch to /api/open-file.\n */\nexport async function openFile(\n filePath: string,\n lineNumber?: number,\n): Promise<void> {\n const vsCodeUrl = lineNumber\n ? `vscode://file/${filePath}:${lineNumber}`\n : `vscode://file/${filePath}`;\n\n try {\n window.open(vsCodeUrl, \"_blank\");\n return;\n } catch {\n // VS Code not available\n }\n\n try {\n await fetch(\"/api/open-file\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ filePath, lineNumber }),\n });\n } catch {\n console.warn(\"[pinpoint] Could not open file:\", filePath);\n }\n}\n"],"mappings":";;;AAOA,eAAsB,SACpB,UACA,YACe;AACf,QAAM,YAAY,aACd,iBAAiB,QAAQ,IAAI,UAAU,KACvC,iBAAiB,QAAQ;AAE7B,MAAI;AACF,WAAO,KAAK,WAAW,QAAQ;AAC/B;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAM,MAAM,kBAAkB;AAAA,MAC5B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,WAAW,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH,QAAQ;AACN,YAAQ,KAAK,mCAAmC,QAAQ;AAAA,EAC1D;AACF;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
formatPins
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-57BORC7I.js";
|
|
5
5
|
|
|
6
6
|
// src/output/agent-context.ts
|
|
7
7
|
function formatRichPinContext(pin) {
|
|
@@ -85,4 +85,4 @@ export {
|
|
|
85
85
|
formatPinsForAgent,
|
|
86
86
|
formatQueueForAgent
|
|
87
87
|
};
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
88
|
+
//# sourceMappingURL=chunk-AZEQQYM6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/output/agent-context.ts"],"sourcesContent":["// @agent-native/pinpoint — Split output for sendToAgentChat()\n// MIT License\n//\n// Splits annotation output into { message, context } for the agent chat bridge.\n// The message is shown in chat UI. The context is hidden, appended for the agent.\n\nimport type {\n AgentOutput,\n Pin,\n OutputFormat,\n QueuedAnnotation,\n} from \"../types/index.js\";\nimport { formatPins } from \"./formatter.js\";\n\nexport type { AgentOutput } from \"../types/index.js\";\n\nexport function formatRichPinContext(pin: Pin): string {\n const lines: string[] = [];\n\n const tagName = pin.element.tagName.toLowerCase();\n const classes =\n pin.element.classNames.length > 0\n ? ` class=\"${pin.element.classNames.join(\" \")}\"`\n : \"\";\n const component = pin.framework?.componentPath\n ? ` in ${pin.framework.componentPath} component`\n : \"\";\n\n lines.push(`[Annotation on <${tagName}${classes}>${component}]`);\n lines.push(`Comment: \"${pin.comment}\"`);\n\n const rect = pin.element.boundingRect;\n const classStr =\n pin.element.classNames.length > 0\n ? `.${pin.element.classNames.join(\".\")}`\n : \"\";\n lines.push(\n `Element: ${tagName}${classStr} at (${Math.round(rect.x)}, ${Math.round(rect.y)})`,\n );\n\n if (pin.framework?.sourceFile) {\n lines.push(`Source: ${pin.framework.sourceFile}`);\n }\n\n if (pin.element.textContent) {\n const truncated = pin.element.textContent.slice(0, 80);\n lines.push(\n `Text: \"${truncated}${pin.element.textContent.length > 80 ? \"...\" : \"\"}\"`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatPinsForAgent(\n pins: Pin[],\n format: OutputFormat = \"standard\",\n): AgentOutput {\n if (pins.length === 0) {\n return { message: \"No annotations to send.\", context: \"\" };\n }\n\n const richAnnotations = pins\n .map((pin) => formatRichPinContext(pin))\n .join(\"\\n\\n\");\n\n const instruction = `The user has annotated ${pins.length} element${pins.length === 1 ? \"\" : \"s\"} on the page with visual feedback. Review each annotation and make the requested changes.\\n\\n`;\n\n const details = formatPins(pins, format);\n const message = instruction + richAnnotations;\n\n return { message, context: details };\n}\n\nexport function formatQueueForAgent(\n queue: QueuedAnnotation[],\n format: OutputFormat = \"standard\",\n): AgentOutput {\n if (queue.length === 0) {\n return { message: \"No queued annotations to send.\", context: \"\" };\n }\n\n const parts: string[] = [];\n const pins: Pin[] = [];\n\n parts.push(\n `The user has queued ${queue.length} annotation${queue.length === 1 ? \"\" : \"s\"} for batch review. Process each one:\\n`,\n );\n\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n parts.push(`--- Item ${i + 1} ---`);\n\n if (item.pin) {\n parts.push(formatRichPinContext(item.pin));\n pins.push(item.pin);\n }\n\n if (item.drawings && item.drawings.length > 0) {\n parts.push(`[Drawing: ${item.drawings.length} stroke(s) on the page]`);\n for (const stroke of item.drawings) {\n const startPt = stroke.points[0];\n const endPt = stroke.points[stroke.points.length - 1];\n parts.push(\n ` ${stroke.type} from (${Math.round(startPt.x)}, ${Math.round(startPt.y)}) to (${Math.round(endPt.x)}, ${Math.round(endPt.y)}) [${stroke.color}]`,\n );\n }\n }\n\n if (item.textNotes && item.textNotes.length > 0) {\n for (const note of item.textNotes) {\n parts.push(\n `[Text note at (${Math.round(note.x)}, ${Math.round(note.y)}): \"${note.text}\"]`,\n );\n }\n }\n\n parts.push(\"\");\n }\n\n const message = parts.join(\"\\n\");\n const context = pins.length > 0 ? formatPins(pins, format) : \"\";\n\n return { message, context };\n}\n"],"mappings":";;;;;;AAgBO,SAAS,qBAAqB,KAAkB;AACrD,QAAM,QAAkB,CAAC;AAEzB,QAAM,UAAU,IAAI,QAAQ,QAAQ,YAAY;AAChD,QAAM,UACJ,IAAI,QAAQ,WAAW,SAAS,IAC5B,WAAW,IAAI,QAAQ,WAAW,KAAK,GAAG,CAAC,MAC3C;AACN,QAAM,YAAY,IAAI,WAAW,gBAC7B,OAAO,IAAI,UAAU,aAAa,eAClC;AAEJ,QAAM,KAAK,mBAAmB,OAAO,GAAG,OAAO,IAAI,SAAS,GAAG;AAC/D,QAAM,KAAK,aAAa,IAAI,OAAO,GAAG;AAEtC,QAAM,OAAO,IAAI,QAAQ;AACzB,QAAM,WACJ,IAAI,QAAQ,WAAW,SAAS,IAC5B,IAAI,IAAI,QAAQ,WAAW,KAAK,GAAG,CAAC,KACpC;AACN,QAAM;AAAA,IACJ,YAAY,OAAO,GAAG,QAAQ,QAAQ,KAAK,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EACjF;AAEA,MAAI,IAAI,WAAW,YAAY;AAC7B,UAAM,KAAK,WAAW,IAAI,UAAU,UAAU,EAAE;AAAA,EAClD;AAEA,MAAI,IAAI,QAAQ,aAAa;AAC3B,UAAM,YAAY,IAAI,QAAQ,YAAY,MAAM,GAAG,EAAE;AACrD,UAAM;AAAA,MACJ,UAAU,SAAS,GAAG,IAAI,QAAQ,YAAY,SAAS,KAAK,QAAQ,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,mBACd,MACA,SAAuB,YACV;AACb,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,EAAE,SAAS,2BAA2B,SAAS,GAAG;AAAA,EAC3D;AAEA,QAAM,kBAAkB,KACrB,IAAI,CAAC,QAAQ,qBAAqB,GAAG,CAAC,EACtC,KAAK,MAAM;AAEd,QAAM,cAAc,0BAA0B,KAAK,MAAM,WAAW,KAAK,WAAW,IAAI,KAAK,GAAG;AAAA;AAAA;AAEhG,QAAM,UAAU,WAAW,MAAM,MAAM;AACvC,QAAM,UAAU,cAAc;AAE9B,SAAO,EAAE,SAAS,SAAS,QAAQ;AACrC;AAEO,SAAS,oBACd,OACA,SAAuB,YACV;AACb,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,SAAS,kCAAkC,SAAS,GAAG;AAAA,EAClE;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAc,CAAC;AAErB,QAAM;AAAA,IACJ,uBAAuB,MAAM,MAAM,cAAc,MAAM,WAAW,IAAI,KAAK,GAAG;AAAA;AAAA,EAChF;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,KAAK,YAAY,IAAI,CAAC,MAAM;AAElC,QAAI,KAAK,KAAK;AACZ,YAAM,KAAK,qBAAqB,KAAK,GAAG,CAAC;AACzC,WAAK,KAAK,KAAK,GAAG;AAAA,IACpB;AAEA,QAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,YAAM,KAAK,aAAa,KAAK,SAAS,MAAM,yBAAyB;AACrE,iBAAW,UAAU,KAAK,UAAU;AAClC,cAAM,UAAU,OAAO,OAAO,CAAC;AAC/B,cAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,SAAS,CAAC;AACpD,cAAM;AAAA,UACJ,KAAK,OAAO,IAAI,UAAU,KAAK,MAAM,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,MAAM,CAAC,CAAC,MAAM,OAAO,KAAK;AAAA,QACjJ;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,iBAAW,QAAQ,KAAK,WAAW;AACjC,cAAM;AAAA,UACJ,kBAAkB,KAAK,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,QAAM,UAAU,KAAK,SAAS,IAAI,WAAW,MAAM,MAAM,IAAI;AAE7D,SAAO,EAAE,SAAS,QAAQ;AAC5B;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/memory-store.ts","../src/detection/selector-builder.ts","../src/detection/element-info.ts","../src/frameworks/adapter.ts","../src/freeze/css-freeze.ts","../src/freeze/js-freeze.ts","../src/freeze/media-freeze.ts","../src/freeze/react-freeze.ts","../src/freeze/waapi-freeze.ts","../src/freeze/controller.ts","../src/utils/open-file.ts"],"sourcesContent":["// @agent-native/pinpoint — In-memory storage adapter\n// MIT License\n//\n// Used for standalone/clipboard-only mode. Pins live in memory for\n// the current session. NOT localStorage (violates agent-native Rule 1).\n// Pins are lost on page reload — intentional. Connect to a server for persistence.\n\nimport type { Pin, PinStatus, PinStorage } from \"../types/index.js\";\n\nexport class MemoryStore implements PinStorage {\n private pins: Map<string, Pin> = new Map();\n\n async load(pageUrl: string): Promise<Pin[]> {\n return Array.from(this.pins.values()).filter(\n (pin) => pin.pageUrl === pageUrl,\n );\n }\n\n async save(pin: Pin): Promise<void> {\n this.pins.set(pin.id, { ...pin });\n }\n\n async update(id: string, patch: Partial<Pin>): Promise<void> {\n const existing = this.pins.get(id);\n if (!existing) return;\n this.pins.set(id, {\n ...existing,\n ...patch,\n id: existing.id, // never overwrite ID\n updatedAt: new Date().toISOString(),\n });\n }\n\n async delete(id: string): Promise<void> {\n this.pins.delete(id);\n }\n\n async list(filter?: {\n pageUrl?: string;\n status?: PinStatus;\n }): Promise<Pin[]> {\n let result = Array.from(this.pins.values());\n if (filter?.pageUrl) {\n result = result.filter((pin) => pin.pageUrl === filter.pageUrl);\n }\n if (filter?.status) {\n result = result.filter((pin) => pin.status.state === filter.status);\n }\n return result;\n }\n\n async clear(pageUrl?: string): Promise<void> {\n if (pageUrl) {\n for (const [id, pin] of this.pins) {\n if (pin.pageUrl === pageUrl) {\n this.pins.delete(id);\n }\n }\n } else {\n this.pins.clear();\n }\n }\n}\n","// @agent-native/pinpoint — CSS selector generation using @medv/finder\n// MIT License\n\nimport { finder } from \"@medv/finder\";\n\nexport interface SelectorOptions {\n timeoutMs?: number;\n skipClassPatterns?: RegExp[];\n}\n\nconst DEFAULT_SKIP_CLASSES = [\n /^css-/, // CSS-in-JS (Emotion, etc.)\n /^_/, // CSS Modules hashes\n /^sc-/, // styled-components\n /^go\\d/, // Goober\n /^tw-/, // Tailwind utilities (sometimes hashed)\n /^chakra-/, // Chakra UI internals\n];\n\nconst DEFAULT_SKIP_IDS = [\n /^:r[0-9]/, // React auto-generated IDs\n /^radix-/, // Radix UI auto IDs\n /^headlessui-/, // HeadlessUI auto IDs\n];\n\nexport function buildSelector(\n element: Element,\n options: SelectorOptions = {},\n): string {\n const { timeoutMs = 200, skipClassPatterns = [] } = options;\n\n const allSkipClasses = [...DEFAULT_SKIP_CLASSES, ...skipClassPatterns];\n\n try {\n return finder(element, {\n className: (name: string) =>\n !allSkipClasses.some((pattern) => pattern.test(name)),\n idName: (name: string) =>\n !DEFAULT_SKIP_IDS.some((pattern) => pattern.test(name)),\n attr: (name: string) =>\n name.startsWith(\"data-testid\") || name.startsWith(\"data-cy\"),\n timeoutMs,\n });\n } catch {\n return buildFallbackSelector(element);\n }\n}\n\nfunction buildFallbackSelector(element: Element): string {\n const parts: string[] = [];\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n parts.push(element.tagName.toLowerCase());\n\n const testId = element.getAttribute(\"data-testid\");\n if (testId) {\n return `[data-testid=\"${CSS.escape(testId)}\"]`;\n }\n\n const classes = Array.from(element.classList).filter(\n (name) => !DEFAULT_SKIP_CLASSES.some((pattern) => pattern.test(name)),\n );\n if (classes.length > 0) {\n parts.push(`.${classes.map((c) => CSS.escape(c)).join(\".\")}`);\n }\n\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child) => child.tagName === element.tagName,\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(element) + 1;\n parts.push(`:nth-child(${index})`);\n }\n }\n\n return parts.join(\"\");\n}\n","// @agent-native/pinpoint — Element metadata extraction\n// MIT License\n\nimport type {\n ElementInfo,\n ElementContext,\n FrameworkInfo,\n} from \"../types/index.js\";\nimport { buildSelector } from \"./selector-builder.js\";\n\nconst STYLE_KEYS = [\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"fontWeight\",\n \"lineHeight\",\n \"padding\",\n \"margin\",\n \"border\",\n \"borderRadius\",\n \"display\",\n \"position\",\n \"width\",\n \"height\",\n \"opacity\",\n \"zIndex\",\n \"overflow\",\n \"textAlign\",\n \"textDecoration\",\n] as const;\n\nexport function extractElementInfo(element: Element): ElementInfo {\n const rect = element.getBoundingClientRect();\n const computed = window.getComputedStyle(element);\n\n const computedStyles: Record<string, string> = {};\n for (const key of STYLE_KEYS) {\n const value = computed.getPropertyValue(\n key.replace(/([A-Z])/g, \"-$1\").toLowerCase(),\n );\n if (value) {\n computedStyles[key] = value;\n }\n }\n\n const ariaAttributes: Record<string, string> = {};\n for (const attr of element.attributes) {\n if (attr.name.startsWith(\"aria-\") || attr.name === \"role\") {\n ariaAttributes[attr.name] = attr.value;\n }\n }\n\n const dataAttributes: Record<string, string> = {};\n for (const attr of element.attributes) {\n if (attr.name.startsWith(\"data-\")) {\n dataAttributes[attr.name] = attr.value;\n }\n }\n\n const domPath = buildDomPath(element);\n\n const textContent = getTextContent(element);\n\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || undefined,\n classNames: Array.from(element.classList),\n selector: buildSelector(element),\n textContent,\n boundingRect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n computedStyles,\n ariaAttributes:\n Object.keys(ariaAttributes).length > 0 ? ariaAttributes : undefined,\n dataAttributes:\n Object.keys(dataAttributes).length > 0 ? dataAttributes : undefined,\n domPath,\n };\n}\n\nexport function buildElementContext(\n element: Element,\n frameworkInfo?: FrameworkInfo,\n): ElementContext {\n const info = extractElementInfo(element);\n const htmlSnippet = getCleanedHtml(element);\n\n return {\n element: info,\n framework: frameworkInfo,\n htmlSnippet,\n cssSelector: info.selector,\n computedStyles: info.computedStyles || {},\n };\n}\n\nfunction getTextContent(element: Element): string | undefined {\n let text = \"\";\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent?.trim() || \"\";\n }\n }\n\n if (!text) {\n text = element.textContent?.trim() || \"\";\n }\n\n if (!text) return undefined;\n return text.length > 200 ? text.slice(0, 200) + \"...\" : text;\n}\n\nfunction buildDomPath(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n\n while (current && current !== document.documentElement) {\n let part = current.tagName.toLowerCase();\n if (current.id) {\n part += `#${current.id}`;\n } else if (current.classList.length > 0) {\n const firstClass = current.classList[0];\n if (firstClass && !/^(css-|_|sc-)/.test(firstClass)) {\n part += `.${firstClass}`;\n }\n }\n parts.unshift(part);\n current = current.parentElement;\n }\n\n return parts.join(\" > \");\n}\n\nfunction getCleanedHtml(element: Element, maxLength = 500): string {\n const clone = element.cloneNode(true) as Element;\n\n const allElements = [clone, ...Array.from(clone.querySelectorAll(\"*\"))];\n for (const el of allElements) {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith(\"on\")) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n let html = clone.outerHTML;\n html = html.replace(/\\s+/g, \" \").trim();\n\n if (html.length > maxLength) {\n const openTagEnd = html.indexOf(\">\") + 1;\n if (openTagEnd > 0 && openTagEnd < maxLength) {\n html = html.slice(0, maxLength) + \"...\";\n }\n }\n\n return html;\n}\n","// @agent-native/pinpoint — Framework adapter interface and auto-detection\n// MIT License\n\nimport type {\n FrameworkAdapter,\n ComponentInfo,\n SourceLocation,\n} from \"../types/index.js\";\n\nconst adapters: FrameworkAdapter[] = [];\n\nlet detectedAdapter: FrameworkAdapter | null = null;\nlet detected = false;\n\nexport function registerAdapter(adapter: FrameworkAdapter): void {\n adapters.push(adapter);\n detected = false;\n detectedAdapter = null;\n}\n\nexport function detectFramework(): FrameworkAdapter {\n if (detected && detectedAdapter) return detectedAdapter;\n\n for (const adapter of adapters) {\n try {\n if (adapter.detect()) {\n detectedAdapter = adapter;\n detected = true;\n return adapter;\n }\n } catch {\n // Adapter detection failed, try next\n }\n }\n\n detectedAdapter = genericAdapter;\n detected = true;\n return genericAdapter;\n}\n\nexport function getComponentInfo(element: Element): ComponentInfo | null {\n const adapter = detectFramework();\n try {\n return adapter.getComponentInfo(element);\n } catch {\n return null;\n }\n}\n\nexport function getSourceLocation(element: Element): SourceLocation | null {\n const adapter = detectFramework();\n try {\n return adapter.getSourceLocation(element);\n } catch {\n return null;\n }\n}\n\nexport function resetDetection(): void {\n detected = false;\n detectedAdapter = null;\n}\n\nexport function getAdapters(): FrameworkAdapter[] {\n return [...adapters];\n}\n\nconst genericAdapter: FrameworkAdapter = {\n name: \"generic\",\n detect: () => true, // Always matches as fallback\n getComponentInfo: () => null,\n getSourceLocation: () => null,\n};\n","// @agent-native/pinpoint — CSS animation freezing\n// MIT License\n\nconst FREEZE_STYLE_ID = \"__pinpoint-css-freeze\";\n\nexport function freezeCSS(): () => void {\n if (document.getElementById(FREEZE_STYLE_ID)) {\n return () => {};\n }\n\n const style = document.createElement(\"style\");\n style.id = FREEZE_STYLE_ID;\n style.textContent = `*, *::before, *::after {\n animation-play-state: paused !important;\n transition-property: none !important;\n }`;\n document.head.appendChild(style);\n\n return () => {\n style.remove();\n };\n}\n","// @agent-native/pinpoint — JS timer monkey-patching (opt-in)\n// MIT License\n//\n// Opt-in: disabled by default, activated via options.freezeJSTimers: true\n// Bounded queue (max 1000), staggered replay, Symbol-based exclusion.\n\nconst PINPOINT_SYMBOL = Symbol.for(\"pinpoint-internal\");\nconst MAX_QUEUE = 1000;\n\ninterface QueuedTimer {\n type: \"timeout\" | \"interval\" | \"raf\";\n callback: Function;\n delay?: number;\n args?: any[];\n}\n\nlet frozen = false;\nlet queue: QueuedTimer[] = [];\nlet originals: {\n setTimeout: typeof setTimeout;\n setInterval: typeof setInterval;\n clearTimeout: typeof clearTimeout;\n clearInterval: typeof clearInterval;\n requestAnimationFrame: typeof requestAnimationFrame;\n} | null = null;\n\nexport function freezeJSTimers(): () => void {\n if (frozen) return () => {};\n\n frozen = true;\n queue = [];\n\n originals = {\n setTimeout: window.setTimeout.bind(window),\n setInterval: window.setInterval.bind(window),\n clearTimeout: window.clearTimeout.bind(window),\n clearInterval: window.clearInterval.bind(window),\n requestAnimationFrame: window.requestAnimationFrame.bind(window),\n };\n\n (window as any).setTimeout = (\n callback: Function | string,\n delay?: number,\n ...args: any[]\n ) => {\n if (typeof callback !== \"function\") return 0;\n if ((callback as any)[PINPOINT_SYMBOL]) {\n return originals!.setTimeout(callback, delay, ...args);\n }\n if (queue.length < MAX_QUEUE) {\n queue.push({ type: \"timeout\", callback, delay, args });\n }\n return 0;\n };\n\n (window as any).setInterval = (\n callback: Function | string,\n delay?: number,\n ...args: any[]\n ) => {\n if (typeof callback !== \"function\") return 0;\n if ((callback as any)[PINPOINT_SYMBOL]) {\n return originals!.setInterval(callback, delay, ...args);\n }\n if (queue.length < MAX_QUEUE) {\n queue.push({ type: \"interval\", callback, delay, args });\n }\n return 0;\n };\n\n (window as any).requestAnimationFrame = (callback: FrameRequestCallback) => {\n if ((callback as any)[PINPOINT_SYMBOL]) {\n return originals!.requestAnimationFrame(callback);\n }\n if (queue.length < MAX_QUEUE) {\n queue.push({ type: \"raf\", callback });\n }\n return 0;\n };\n\n return () => {\n if (!frozen || !originals) return;\n frozen = false;\n\n window.setTimeout = originals.setTimeout as any;\n window.setInterval = originals.setInterval as any;\n window.clearTimeout = originals.clearTimeout;\n window.clearInterval = originals.clearInterval;\n window.requestAnimationFrame = originals.requestAnimationFrame;\n\n const replayBatch = () => {\n const batch = queue.splice(0, 50);\n for (const item of batch) {\n try {\n if (item.type === \"raf\") {\n originals!.requestAnimationFrame(\n item.callback as FrameRequestCallback,\n );\n } else {\n originals!.setTimeout(\n item.callback as any,\n 0,\n ...(item.args || []),\n );\n }\n } catch {\n // Callback may no longer be valid\n }\n }\n if (queue.length > 0) {\n (window.requestIdleCallback || originals!.setTimeout)(replayBatch);\n }\n };\n\n if (queue.length > 0) {\n (window.requestIdleCallback || originals.setTimeout)(replayBatch);\n }\n\n originals = null;\n };\n}\n\nexport function markInternal<T extends Function>(fn: T): T {\n (fn as any)[PINPOINT_SYMBOL] = true;\n return fn;\n}\n","// @agent-native/pinpoint — Media element freeze (video, audio, SVG SMIL)\n// MIT License\n\n/**\n * Pause all playing media elements on the page.\n * Returns a cleanup function to resume.\n */\nexport function freezeMedia(): () => void {\n const mediaElements = document.querySelectorAll(\"video, audio\");\n const playing: HTMLMediaElement[] = [];\n\n mediaElements.forEach((el) => {\n const media = el as HTMLMediaElement;\n if (!media.paused) {\n media.pause();\n playing.push(media);\n }\n });\n\n const svgElements = document.querySelectorAll(\"svg\");\n const pausedSVGs: SVGSVGElement[] = [];\n svgElements.forEach((svg) => {\n if (typeof svg.pauseAnimations === \"function\") {\n try {\n svg.pauseAnimations();\n pausedSVGs.push(svg);\n } catch {\n // SVG may not support animation\n }\n }\n });\n\n return () => {\n playing.forEach((media) => {\n try {\n void media.play();\n } catch {\n // Media may have been removed\n }\n });\n\n pausedSVGs.forEach((svg) => {\n try {\n svg.unpauseAnimations();\n } catch {\n // SVG may have been removed\n }\n });\n };\n}\n","// @agent-native/pinpoint — React update freezing\n// MIT License\n//\n// Patches React's dispatcher to queue state updates instead of applying them.\n// On unfreeze, flush queued updates. This prevents the host app from\n// re-rendering while the user is selecting an element.\n//\n// Based on react-grab pattern (MIT).\n\ninterface QueuedUpdate {\n fiber: any;\n queue: any;\n update: any;\n}\n\nlet frozen = false;\nlet originalDispatcher: any = null;\nlet queuedUpdates: QueuedUpdate[] = [];\n\nfunction getInternals(): any {\n const hook = (window as any).__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook) return null;\n\n const renderers = hook.renderers;\n if (!renderers || renderers.size === 0) return null;\n\n const renderer = renderers.values().next().value;\n return renderer?.currentDispatcherRef || null;\n}\n\nexport function freezeReact(): () => void {\n if (frozen) return () => {};\n\n const internals = getInternals();\n if (!internals) return () => {};\n\n frozen = true;\n originalDispatcher = internals.current;\n queuedUpdates = [];\n\n const proxyDispatcher = new Proxy(originalDispatcher, {\n get(target, prop) {\n if (prop === \"useState\" || prop === \"useReducer\") {\n return (...args: any[]) => {\n const result = target[prop](...args);\n if (Array.isArray(result) && typeof result[1] === \"function\") {\n const originalSetter = result[1];\n result[1] = (action: any) => {\n queuedUpdates.push({\n fiber: null,\n queue: null,\n update: { setter: originalSetter, action },\n });\n };\n }\n return result;\n };\n }\n return target[prop];\n },\n });\n\n internals.current = proxyDispatcher;\n\n return () => {\n if (!frozen) return;\n frozen = false;\n\n if (internals && originalDispatcher) {\n internals.current = originalDispatcher;\n }\n\n for (const { update } of queuedUpdates) {\n try {\n update.setter(update.action);\n } catch {\n // Update may no longer be valid\n }\n }\n\n queuedUpdates = [];\n originalDispatcher = null;\n };\n}\n\nexport function isReactFrozen(): boolean {\n return frozen;\n}\n","// @agent-native/pinpoint — Web Animations API freeze\n// MIT License\n\n/**\n * Pause all WAAPI animations on the page.\n * Returns a cleanup function to resume.\n */\nexport function freezeWAAPI(): () => void {\n const animations = document.getAnimations();\n const playing = animations.filter((a) => a.playState === \"running\");\n playing.forEach((a) => a.pause());\n\n return () => {\n playing.forEach((a) => {\n try {\n a.play();\n } catch {\n // Animation may have been removed\n }\n });\n };\n}\n","// @agent-native/pinpoint — Unified freeze controller\n// MIT License\n//\n// Lazy initialization — nothing is patched until first freeze() call.\n\nimport { freezeCSS } from \"./css-freeze.js\";\nimport { freezeJSTimers } from \"./js-freeze.js\";\nimport { freezeMedia } from \"./media-freeze.js\";\nimport { freezeReact } from \"./react-freeze.js\";\nimport { freezeWAAPI } from \"./waapi-freeze.js\";\n\nlet cleanups: Array<() => void> = [];\nlet active = false;\n\nexport interface FreezeOptions {\n jsTimers?: boolean;\n}\n\nexport function freeze(\n _elements?: Element[],\n options: FreezeOptions = {},\n): void {\n if (active) return;\n active = true;\n\n cleanups = [freezeCSS(), freezeWAAPI(), freezeReact(), freezeMedia()];\n\n if (options.jsTimers) {\n cleanups.push(freezeJSTimers());\n }\n}\n\nexport function unfreeze(): void {\n if (!active) return;\n active = false;\n\n for (const cleanup of cleanups) {\n try {\n cleanup();\n } catch {\n // Best-effort cleanup\n }\n }\n cleanups = [];\n}\n\nexport function isFreezeActive(): boolean {\n return active;\n}\n","// @agent-native/pinpoint — Open file in editor\n// MIT License\n\n/**\n * Open a file in the user's editor. Tries vscode:// protocol first,\n * falls back to a fetch to /api/open-file.\n */\nexport async function openFile(\n filePath: string,\n lineNumber?: number,\n): Promise<void> {\n const vsCodeUrl = lineNumber\n ? `vscode://file/${filePath}:${lineNumber}`\n : `vscode://file/${filePath}`;\n\n try {\n window.open(vsCodeUrl, \"_blank\");\n return;\n } catch {\n // VS Code not available\n }\n\n try {\n await fetch(\"/api/open-file\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ filePath, lineNumber }),\n });\n } catch {\n console.warn(\"[pinpoint] Could not open file:\", filePath);\n }\n}\n"],"mappings":";AASO,IAAM,cAAN,MAAwC;AAAA,EACrC,OAAyB,oBAAI,IAAI;AAAA,EAEzC,MAAM,KAAK,SAAiC;AAC1C,WAAO,MAAM,KAAK,KAAK,KAAK,OAAO,CAAC,EAAE;AAAA,MACpC,CAAC,QAAQ,IAAI,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,KAAyB;AAClC,SAAK,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC;AAAA,EAClC;AAAA,EAEA,MAAM,OAAO,IAAY,OAAoC;AAC3D,UAAM,WAAW,KAAK,KAAK,IAAI,EAAE;AACjC,QAAI,CAAC,SAAU;AACf,SAAK,KAAK,IAAI,IAAI;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,IAAI,SAAS;AAAA;AAAA,MACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,IAA2B;AACtC,SAAK,KAAK,OAAO,EAAE;AAAA,EACrB;AAAA,EAEA,MAAM,KAAK,QAGQ;AACjB,QAAI,SAAS,MAAM,KAAK,KAAK,KAAK,OAAO,CAAC;AAC1C,QAAI,QAAQ,SAAS;AACnB,eAAS,OAAO,OAAO,CAAC,QAAQ,IAAI,YAAY,OAAO,OAAO;AAAA,IAChE;AACA,QAAI,QAAQ,QAAQ;AAClB,eAAS,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,UAAU,OAAO,MAAM;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,SAAiC;AAC3C,QAAI,SAAS;AACX,iBAAW,CAAC,IAAI,GAAG,KAAK,KAAK,MAAM;AACjC,YAAI,IAAI,YAAY,SAAS;AAC3B,eAAK,KAAK,OAAO,EAAE;AAAA,QACrB;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,KAAK,MAAM;AAAA,IAClB;AAAA,EACF;AACF;;;AC3DA,SAAS,cAAc;AAOvB,IAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEO,SAAS,cACd,SACA,UAA2B,CAAC,GACpB;AACR,QAAM,EAAE,YAAY,KAAK,oBAAoB,CAAC,EAAE,IAAI;AAEpD,QAAM,iBAAiB,CAAC,GAAG,sBAAsB,GAAG,iBAAiB;AAErE,MAAI;AACF,WAAO,OAAO,SAAS;AAAA,MACrB,WAAW,CAAC,SACV,CAAC,eAAe,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,MACtD,QAAQ,CAAC,SACP,CAAC,iBAAiB,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,MACxD,MAAM,CAAC,SACL,KAAK,WAAW,aAAa,KAAK,KAAK,WAAW,SAAS;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,sBAAsB,OAAO;AAAA,EACtC;AACF;AAEA,SAAS,sBAAsB,SAA0B;AACvD,QAAM,QAAkB,CAAC;AAEzB,MAAI,QAAQ,IAAI;AACd,WAAO,IAAI,IAAI,OAAO,QAAQ,EAAE,CAAC;AAAA,EACnC;AAEA,QAAM,KAAK,QAAQ,QAAQ,YAAY,CAAC;AAExC,QAAM,SAAS,QAAQ,aAAa,aAAa;AACjD,MAAI,QAAQ;AACV,WAAO,iBAAiB,IAAI,OAAO,MAAM,CAAC;AAAA,EAC5C;AAEA,QAAM,UAAU,MAAM,KAAK,QAAQ,SAAS,EAAE;AAAA,IAC5C,CAAC,SAAS,CAAC,qBAAqB,KAAK,CAAC,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,EACtE;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,IAAI,QAAQ,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,EAC9D;AAEA,QAAM,SAAS,QAAQ;AACvB,MAAI,QAAQ;AACV,UAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,EAAE;AAAA,MAC3C,CAAC,UAAU,MAAM,YAAY,QAAQ;AAAA,IACvC;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,QAAQ,SAAS,QAAQ,OAAO,IAAI;AAC1C,YAAM,KAAK,cAAc,KAAK,GAAG;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;;;ACvEA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,mBAAmB,SAA+B;AAChE,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAEhD,QAAM,iBAAyC,CAAC;AAChD,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,SAAS;AAAA,MACrB,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAAA,IAC7C;AACA,QAAI,OAAO;AACT,qBAAe,GAAG,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,iBAAyC,CAAC;AAChD,aAAW,QAAQ,QAAQ,YAAY;AACrC,QAAI,KAAK,KAAK,WAAW,OAAO,KAAK,KAAK,SAAS,QAAQ;AACzD,qBAAe,KAAK,IAAI,IAAI,KAAK;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,iBAAyC,CAAC;AAChD,aAAW,QAAQ,QAAQ,YAAY;AACrC,QAAI,KAAK,KAAK,WAAW,OAAO,GAAG;AACjC,qBAAe,KAAK,IAAI,IAAI,KAAK;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,OAAO;AAEpC,QAAM,cAAc,eAAe,OAAO;AAE1C,SAAO;AAAA,IACL,SAAS,QAAQ,QAAQ,YAAY;AAAA,IACrC,IAAI,QAAQ,MAAM;AAAA,IAClB,YAAY,MAAM,KAAK,QAAQ,SAAS;AAAA,IACxC,UAAU,cAAc,OAAO;AAAA,IAC/B;AAAA,IACA,cAAc;AAAA,MACZ,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,MACpB,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,MACpB,OAAO,KAAK,MAAM,KAAK,KAAK;AAAA,MAC5B,QAAQ,KAAK,MAAM,KAAK,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA,gBACE,OAAO,KAAK,cAAc,EAAE,SAAS,IAAI,iBAAiB;AAAA,IAC5D,gBACE,OAAO,KAAK,cAAc,EAAE,SAAS,IAAI,iBAAiB;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,eACgB;AAChB,QAAM,OAAO,mBAAmB,OAAO;AACvC,QAAM,cAAc,eAAe,OAAO;AAE1C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA,aAAa,KAAK;AAAA,IAClB,gBAAgB,KAAK,kBAAkB,CAAC;AAAA,EAC1C;AACF;AAEA,SAAS,eAAe,SAAsC;AAC5D,MAAI,OAAO;AACX,aAAW,QAAQ,QAAQ,YAAY;AACrC,QAAI,KAAK,aAAa,KAAK,WAAW;AACpC,cAAQ,KAAK,aAAa,KAAK,KAAK;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,WAAO,QAAQ,aAAa,KAAK,KAAK;AAAA,EACxC;AAEA,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,SAAS,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,QAAQ;AAC1D;AAEA,SAAS,aAAa,SAA0B;AAC9C,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAE9B,SAAO,WAAW,YAAY,SAAS,iBAAiB;AACtD,QAAI,OAAO,QAAQ,QAAQ,YAAY;AACvC,QAAI,QAAQ,IAAI;AACd,cAAQ,IAAI,QAAQ,EAAE;AAAA,IACxB,WAAW,QAAQ,UAAU,SAAS,GAAG;AACvC,YAAM,aAAa,QAAQ,UAAU,CAAC;AACtC,UAAI,cAAc,CAAC,gBAAgB,KAAK,UAAU,GAAG;AACnD,gBAAQ,IAAI,UAAU;AAAA,MACxB;AAAA,IACF;AACA,UAAM,QAAQ,IAAI;AAClB,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,SAAS,eAAe,SAAkB,YAAY,KAAa;AACjE,QAAM,QAAQ,QAAQ,UAAU,IAAI;AAEpC,QAAM,cAAc,CAAC,OAAO,GAAG,MAAM,KAAK,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACtE,aAAW,MAAM,aAAa;AAC5B,eAAW,QAAQ,MAAM,KAAK,GAAG,UAAU,GAAG;AAC5C,UAAI,KAAK,KAAK,WAAW,IAAI,GAAG;AAC9B,WAAG,gBAAgB,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,MAAM;AACjB,SAAO,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAEtC,MAAI,KAAK,SAAS,WAAW;AAC3B,UAAM,aAAa,KAAK,QAAQ,GAAG,IAAI;AACvC,QAAI,aAAa,KAAK,aAAa,WAAW;AAC5C,aAAO,KAAK,MAAM,GAAG,SAAS,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;;;ACxJA,IAAM,WAA+B,CAAC;AAEtC,IAAI,kBAA2C;AAC/C,IAAI,WAAW;AAER,SAAS,gBAAgB,SAAiC;AAC/D,WAAS,KAAK,OAAO;AACrB,aAAW;AACX,oBAAkB;AACpB;AAEO,SAAS,kBAAoC;AAClD,MAAI,YAAY,gBAAiB,QAAO;AAExC,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,UAAI,QAAQ,OAAO,GAAG;AACpB,0BAAkB;AAClB,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,oBAAkB;AAClB,aAAW;AACX,SAAO;AACT;AAEO,SAAS,iBAAiB,SAAwC;AACvE,QAAM,UAAU,gBAAgB;AAChC,MAAI;AACF,WAAO,QAAQ,iBAAiB,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,SAAyC;AACzE,QAAM,UAAU,gBAAgB;AAChC,MAAI;AACF,WAAO,QAAQ,kBAAkB,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWA,IAAM,iBAAmC;AAAA,EACvC,MAAM;AAAA,EACN,QAAQ,MAAM;AAAA;AAAA,EACd,kBAAkB,MAAM;AAAA,EACxB,mBAAmB,MAAM;AAC3B;;;ACrEA,IAAM,kBAAkB;AAEjB,SAAS,YAAwB;AACtC,MAAI,SAAS,eAAe,eAAe,GAAG;AAC5C,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,cAAc;AAAA;AAAA;AAAA;AAIpB,WAAS,KAAK,YAAY,KAAK;AAE/B,SAAO,MAAM;AACX,UAAM,OAAO;AAAA,EACf;AACF;;;ACfA,IAAM,kBAAkB,uBAAO,IAAI,mBAAmB;AACtD,IAAM,YAAY;AASlB,IAAI,SAAS;AACb,IAAI,QAAuB,CAAC;AAC5B,IAAI,YAMO;AAEJ,SAAS,iBAA6B;AAC3C,MAAI,OAAQ,QAAO,MAAM;AAAA,EAAC;AAE1B,WAAS;AACT,UAAQ,CAAC;AAET,cAAY;AAAA,IACV,YAAY,OAAO,WAAW,KAAK,MAAM;AAAA,IACzC,aAAa,OAAO,YAAY,KAAK,MAAM;AAAA,IAC3C,cAAc,OAAO,aAAa,KAAK,MAAM;AAAA,IAC7C,eAAe,OAAO,cAAc,KAAK,MAAM;AAAA,IAC/C,uBAAuB,OAAO,sBAAsB,KAAK,MAAM;AAAA,EACjE;AAEA,EAAC,OAAe,aAAa,CAC3B,UACA,UACG,SACA;AACH,QAAI,OAAO,aAAa,WAAY,QAAO;AAC3C,QAAK,SAAiB,eAAe,GAAG;AACtC,aAAO,UAAW,WAAW,UAAU,OAAO,GAAG,IAAI;AAAA,IACvD;AACA,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,KAAK,EAAE,MAAM,WAAW,UAAU,OAAO,KAAK,CAAC;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAEA,EAAC,OAAe,cAAc,CAC5B,UACA,UACG,SACA;AACH,QAAI,OAAO,aAAa,WAAY,QAAO;AAC3C,QAAK,SAAiB,eAAe,GAAG;AACtC,aAAO,UAAW,YAAY,UAAU,OAAO,GAAG,IAAI;AAAA,IACxD;AACA,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,KAAK,EAAE,MAAM,YAAY,UAAU,OAAO,KAAK,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAEA,EAAC,OAAe,wBAAwB,CAAC,aAAmC;AAC1E,QAAK,SAAiB,eAAe,GAAG;AACtC,aAAO,UAAW,sBAAsB,QAAQ;AAAA,IAClD;AACA,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,KAAK,EAAE,MAAM,OAAO,SAAS,CAAC;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACX,QAAI,CAAC,UAAU,CAAC,UAAW;AAC3B,aAAS;AAET,WAAO,aAAa,UAAU;AAC9B,WAAO,cAAc,UAAU;AAC/B,WAAO,eAAe,UAAU;AAChC,WAAO,gBAAgB,UAAU;AACjC,WAAO,wBAAwB,UAAU;AAEzC,UAAM,cAAc,MAAM;AACxB,YAAM,QAAQ,MAAM,OAAO,GAAG,EAAE;AAChC,iBAAW,QAAQ,OAAO;AACxB,YAAI;AACF,cAAI,KAAK,SAAS,OAAO;AACvB,sBAAW;AAAA,cACT,KAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,sBAAW;AAAA,cACT,KAAK;AAAA,cACL;AAAA,cACA,GAAI,KAAK,QAAQ,CAAC;AAAA,YACpB;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AACA,UAAI,MAAM,SAAS,GAAG;AACpB,SAAC,OAAO,uBAAuB,UAAW,YAAY,WAAW;AAAA,MACnE;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,OAAC,OAAO,uBAAuB,UAAU,YAAY,WAAW;AAAA,IAClE;AAEA,gBAAY;AAAA,EACd;AACF;;;ACjHO,SAAS,cAA0B;AACxC,QAAM,gBAAgB,SAAS,iBAAiB,cAAc;AAC9D,QAAM,UAA8B,CAAC;AAErC,gBAAc,QAAQ,CAAC,OAAO;AAC5B,UAAM,QAAQ;AACd,QAAI,CAAC,MAAM,QAAQ;AACjB,YAAM,MAAM;AACZ,cAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,cAAc,SAAS,iBAAiB,KAAK;AACnD,QAAM,aAA8B,CAAC;AACrC,cAAY,QAAQ,CAAC,QAAQ;AAC3B,QAAI,OAAO,IAAI,oBAAoB,YAAY;AAC7C,UAAI;AACF,YAAI,gBAAgB;AACpB,mBAAW,KAAK,GAAG;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,MAAM;AACX,YAAQ,QAAQ,CAAC,UAAU;AACzB,UAAI;AACF,aAAK,MAAM,KAAK;AAAA,MAClB,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAED,eAAW,QAAQ,CAAC,QAAQ;AAC1B,UAAI;AACF,YAAI,kBAAkB;AAAA,MACxB,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AClCA,IAAIA,UAAS;AACb,IAAI,qBAA0B;AAC9B,IAAI,gBAAgC,CAAC;AAErC,SAAS,eAAoB;AAC3B,QAAM,OAAQ,OAAe;AAC7B,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,KAAK;AACvB,MAAI,CAAC,aAAa,UAAU,SAAS,EAAG,QAAO;AAE/C,QAAM,WAAW,UAAU,OAAO,EAAE,KAAK,EAAE;AAC3C,SAAO,UAAU,wBAAwB;AAC3C;AAEO,SAAS,cAA0B;AACxC,MAAIA,QAAQ,QAAO,MAAM;AAAA,EAAC;AAE1B,QAAM,YAAY,aAAa;AAC/B,MAAI,CAAC,UAAW,QAAO,MAAM;AAAA,EAAC;AAE9B,EAAAA,UAAS;AACT,uBAAqB,UAAU;AAC/B,kBAAgB,CAAC;AAEjB,QAAM,kBAAkB,IAAI,MAAM,oBAAoB;AAAA,IACpD,IAAI,QAAQ,MAAM;AAChB,UAAI,SAAS,cAAc,SAAS,cAAc;AAChD,eAAO,IAAI,SAAgB;AACzB,gBAAM,SAAS,OAAO,IAAI,EAAE,GAAG,IAAI;AACnC,cAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,CAAC,MAAM,YAAY;AAC5D,kBAAM,iBAAiB,OAAO,CAAC;AAC/B,mBAAO,CAAC,IAAI,CAAC,WAAgB;AAC3B,4BAAc,KAAK;AAAA,gBACjB,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ,EAAE,QAAQ,gBAAgB,OAAO;AAAA,cAC3C,CAAC;AAAA,YACH;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,OAAO,IAAI;AAAA,IACpB;AAAA,EACF,CAAC;AAED,YAAU,UAAU;AAEpB,SAAO,MAAM;AACX,QAAI,CAACA,QAAQ;AACb,IAAAA,UAAS;AAET,QAAI,aAAa,oBAAoB;AACnC,gBAAU,UAAU;AAAA,IACtB;AAEA,eAAW,EAAE,OAAO,KAAK,eAAe;AACtC,UAAI;AACF,eAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,oBAAgB,CAAC;AACjB,yBAAqB;AAAA,EACvB;AACF;;;AC5EO,SAAS,cAA0B;AACxC,QAAM,aAAa,SAAS,cAAc;AAC1C,QAAM,UAAU,WAAW,OAAO,CAAC,MAAM,EAAE,cAAc,SAAS;AAClE,UAAQ,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;AAEhC,SAAO,MAAM;AACX,YAAQ,QAAQ,CAAC,MAAM;AACrB,UAAI;AACF,UAAE,KAAK;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACVA,IAAI,WAA8B,CAAC;AACnC,IAAI,SAAS;AAMN,SAAS,OACd,WACA,UAAyB,CAAC,GACpB;AACN,MAAI,OAAQ;AACZ,WAAS;AAET,aAAW,CAAC,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE,MAAI,QAAQ,UAAU;AACpB,aAAS,KAAK,eAAe,CAAC;AAAA,EAChC;AACF;AAEO,SAAS,WAAiB;AAC/B,MAAI,CAAC,OAAQ;AACb,WAAS;AAET,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,cAAQ;AAAA,IACV,QAAQ;AAAA,IAER;AAAA,EACF;AACA,aAAW,CAAC;AACd;AAEO,SAAS,iBAA0B;AACxC,SAAO;AACT;;;ACzCA,eAAsB,SACpB,UACA,YACe;AACf,QAAM,YAAY,aACd,iBAAiB,QAAQ,IAAI,UAAU,KACvC,iBAAiB,QAAQ;AAE7B,MAAI;AACF,WAAO,KAAK,WAAW,QAAQ;AAC/B;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAM,MAAM,kBAAkB;AAAA,MAC5B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,WAAW,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH,QAAQ;AACN,YAAQ,KAAK,mCAAmC,QAAQ;AAAA,EAC1D;AACF;","names":["frozen"]}
|