@qontinui/ui-bridge 0.2.0 → 0.3.1
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/ai/index.d.mts +312 -155
- package/dist/ai/index.d.ts +312 -155
- package/dist/ai/index.js +2363 -67
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +2328 -68
- package/dist/ai/index.mjs.map +1 -1
- package/dist/annotations/index.d.mts +218 -0
- package/dist/annotations/index.d.ts +218 -0
- package/dist/annotations/index.js +246 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/index.mjs +241 -0
- package/dist/annotations/index.mjs.map +1 -0
- package/dist/assertions-BSR3afVr.d.ts +161 -0
- package/dist/assertions-CTw1hfOx.d.mts +161 -0
- package/dist/babel-plugin/index.js +504 -0
- package/dist/babel-plugin/index.js.map +1 -0
- package/dist/babel-plugin/index.mjs +488 -0
- package/dist/babel-plugin/index.mjs.map +1 -0
- package/dist/browser-capture-Bms60T6f.d.mts +47 -0
- package/dist/browser-capture-CsTU29mb.d.ts +47 -0
- package/dist/control/index.d.mts +26 -7
- package/dist/control/index.d.ts +26 -7
- package/dist/control/index.js +276 -48
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +276 -48
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.d.mts +115 -44
- package/dist/core/index.d.ts +115 -44
- package/dist/core/index.js +0 -1560
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +1 -1549
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +5 -3
- package/dist/debug/index.d.ts +5 -3
- package/dist/debug/index.js +925 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +924 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.mts +13 -9
- package/dist/index.d.ts +13 -9
- package/dist/index.js +8310 -3777
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8246 -3766
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-NC3csD0R.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
- package/dist/{metrics-C9XRi_mL.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
- package/dist/native/control/index.js +448 -0
- package/dist/native/control/index.js.map +1 -0
- package/dist/native/control/index.mjs +445 -0
- package/dist/native/control/index.mjs.map +1 -0
- package/dist/native/core/index.js +486 -0
- package/dist/native/core/index.js.map +1 -0
- package/dist/native/core/index.mjs +475 -0
- package/dist/native/core/index.mjs.map +1 -0
- package/dist/native/debug/index.js +408 -0
- package/dist/native/debug/index.js.map +1 -0
- package/dist/native/debug/index.mjs +406 -0
- package/dist/native/debug/index.mjs.map +1 -0
- package/dist/native/index.js +2232 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/index.mjs +2204 -0
- package/dist/native/index.mjs.map +1 -0
- package/dist/native/react/index.js +1377 -0
- package/dist/native/react/index.js.map +1 -0
- package/dist/native/react/index.mjs +1365 -0
- package/dist/native/react/index.mjs.map +1 -0
- package/dist/native/server/index.js +440 -0
- package/dist/native/server/index.js.map +1 -0
- package/dist/native/server/index.mjs +435 -0
- package/dist/native/server/index.mjs.map +1 -0
- package/dist/react/index.d.mts +121 -9
- package/dist/react/index.d.ts +121 -9
- package/dist/react/index.js +2239 -91
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +2239 -92
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-CIEDjbQ9.d.ts → registry-C6dDtn1v.d.ts} +34 -15
- package/dist/{registry-SsSDq46X.d.mts → registry-POtcxnal.d.mts} +34 -15
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +37 -0
- package/dist/server/express.d.ts +37 -0
- package/dist/server/express.js +298 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.mjs +294 -0
- package/dist/server/express.mjs.map +1 -0
- package/dist/server/handlers.d.mts +124 -0
- package/dist/server/handlers.d.ts +124 -0
- package/dist/server/handlers.js +7183 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/handlers.mjs +7180 -0
- package/dist/server/handlers.mjs.map +1 -0
- package/dist/server/index.d.mts +12 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.js +8384 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +8369 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/nextjs.d.mts +128 -0
- package/dist/server/nextjs.d.ts +128 -0
- package/dist/server/nextjs.js +390 -0
- package/dist/server/nextjs.js.map +1 -0
- package/dist/server/nextjs.mjs +385 -0
- package/dist/server/nextjs.mjs.map +1 -0
- package/dist/server/standalone.d.mts +7 -0
- package/dist/server/standalone.d.ts +7 -0
- package/dist/server/standalone.js +845 -0
- package/dist/server/standalone.js.map +1 -0
- package/dist/server/standalone.mjs +841 -0
- package/dist/server/standalone.mjs.map +1 -0
- package/dist/specs/index.d.mts +365 -0
- package/dist/specs/index.d.ts +365 -0
- package/dist/specs/index.js +2809 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/index.mjs +2786 -0
- package/dist/specs/index.mjs.map +1 -0
- package/dist/standalone-B6GLIEmR.d.ts +216 -0
- package/dist/standalone-CjdYqj3P.d.mts +216 -0
- package/dist/swc-plugin/index.d.mts +79 -0
- package/dist/swc-plugin/index.d.ts +79 -0
- package/dist/swc-plugin/index.js +15 -0
- package/dist/swc-plugin/index.js.map +1 -0
- package/dist/swc-plugin/index.mjs +9 -0
- package/dist/swc-plugin/index.mjs.map +1 -0
- package/dist/types-B2EfvEaq.d.ts +236 -0
- package/dist/{types-Dr6tH-bm.d.mts → types-C7gVYRnF.d.ts} +72 -2
- package/dist/{types-oCTrRxSw.d.ts → types-CJGrBEhC.d.mts} +72 -2
- package/dist/types-CebMQj76.d.ts +1275 -0
- package/dist/types-D_ypYl3T.d.mts +1275 -0
- package/dist/types-UBtp7R0u.d.mts +132 -0
- package/dist/types-UBtp7R0u.d.ts +132 -0
- package/dist/types-gO696T_t.d.mts +236 -0
- package/dist/{types-CPMbN_Iw.d.mts → types-suaYwWWg.d.mts} +519 -152
- package/dist/{types-CPMbN_Iw.d.ts → types-suaYwWWg.d.ts} +519 -152
- package/package.json +123 -4
- package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
- package/dist/types-BvCfFuEV.d.ts +0 -534
- package/dist/types-CFT3Dnx4.d.mts +0 -534
- package/dist/websocket-client-CX4QJesI.d.ts +0 -124
- package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
package/dist/debug/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/element-identifier.ts","../../src/debug/inspector.tsx","../../src/debug/metrics.ts"],"names":["jsx","jsxs","useState","useMemo","useCallback","useEffect","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Element Identification Module\n *\n * Provides utilities for identifying DOM elements using multiple strategies:\n * 1. data-ui-id (explicit UI Bridge identifier - preferred)\n * 2. data-testid (testing library convention)\n * 3. data-awas-element (legacy support)\n * 4. id (HTML id attribute)\n * 5. Generated XPath/CSS selector (fallback)\n */\n\nimport type { ElementIdentifier } from './types';\n\n/**\n * Data attributes used for element identification (in priority order)\n */\nexport const ID_ATTRIBUTES = ['data-ui-id', 'data-testid', 'data-awas-element', 'id'] as const;\n\n/**\n * Generate a unique XPath for an element\n */\nexport function generateXPath(element: HTMLElement): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for identifying attributes\n const uiId = current.getAttribute('data-ui-id');\n if (uiId) {\n selector += `[@data-ui-id=\"${uiId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const testId = current.getAttribute('data-testid');\n if (testId) {\n selector += `[@data-testid=\"${testId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const id = current.id;\n if (id) {\n selector += `[@id=\"${id}\"]`;\n parts.unshift(selector);\n break;\n }\n\n // Calculate position among siblings with same tag\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children).filter(\n (child): child is Element => child.nodeName === currentEl.nodeName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `[${index}]`;\n }\n }\n\n parts.unshift(selector);\n current = parentEl;\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Generate a unique CSS selector for an element\n */\nexport function generateCSSSelector(element: HTMLElement): string {\n // Check for identifying attributes first\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) {\n return `[data-ui-id=\"${uiId}\"]`;\n }\n\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) {\n return `[data-awas-element=\"${awasId}\"]`;\n }\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Build a path selector\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for unique identifiers on ancestors\n const parentUiId = current.getAttribute('data-ui-id');\n if (parentUiId && current !== element) {\n path.unshift(`[data-ui-id=\"${parentUiId}\"]`);\n break;\n }\n\n const parentTestId = current.getAttribute('data-testid');\n if (parentTestId && current !== element) {\n path.unshift(`[data-testid=\"${parentTestId}\"]`);\n break;\n }\n\n if (current.id) {\n path.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n // Add nth-child if needed for uniqueness\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children);\n const sameTagSiblings = siblings.filter(\n (s): s is Element => s.nodeName === currentEl.nodeName\n );\n\n if (sameTagSiblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get the best identifier for an element based on available attributes\n */\nexport function getBestIdentifier(element: HTMLElement): string {\n // Priority order\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) return awasId;\n\n if (element.id) return element.id;\n\n // Fallback to generated CSS selector\n return generateCSSSelector(element);\n}\n\n/**\n * Create a full ElementIdentifier object for an element\n */\nexport function createElementIdentifier(element: HTMLElement): ElementIdentifier {\n return {\n uiId: element.getAttribute('data-ui-id') || undefined,\n testId: element.getAttribute('data-testid') || undefined,\n awasId: element.getAttribute('data-awas-element') || undefined,\n htmlId: element.id || undefined,\n xpath: generateXPath(element),\n selector: generateCSSSelector(element),\n };\n}\n\n/**\n * Find an element by its identifier\n *\n * Tries each identification method in priority order\n */\nexport function findElementByIdentifier(\n identifier: string | ElementIdentifier,\n root: ParentNode = document\n): HTMLElement | null {\n // If string, try each identification method\n if (typeof identifier === 'string') {\n // Try data-ui-id\n const byUiId = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier}\"]`);\n if (byUiId) return byUiId;\n\n // Try data-testid\n const byTestId = root.querySelector<HTMLElement>(`[data-testid=\"${identifier}\"]`);\n if (byTestId) return byTestId;\n\n // Try data-awas-element\n const byAwasId = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier}\"]`);\n if (byAwasId) return byAwasId;\n\n // Try id\n const byId = root.querySelector<HTMLElement>(`#${CSS.escape(identifier)}`);\n if (byId) return byId;\n\n // Try as CSS selector\n try {\n const bySelector = root.querySelector<HTMLElement>(identifier);\n if (bySelector) return bySelector;\n } catch {\n // Invalid selector, ignore\n }\n\n // Try as XPath\n try {\n const result = document.evaluate(\n identifier,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath, ignore\n }\n\n return null;\n }\n\n // If ElementIdentifier object, try in priority order\n if (identifier.uiId) {\n const el = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier.uiId}\"]`);\n if (el) return el;\n }\n\n if (identifier.testId) {\n const el = root.querySelector<HTMLElement>(`[data-testid=\"${identifier.testId}\"]`);\n if (el) return el;\n }\n\n if (identifier.awasId) {\n const el = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier.awasId}\"]`);\n if (el) return el;\n }\n\n if (identifier.htmlId) {\n const el = root.querySelector<HTMLElement>(`#${CSS.escape(identifier.htmlId)}`);\n if (el) return el;\n }\n\n // Try CSS selector\n if (identifier.selector) {\n try {\n const el = root.querySelector<HTMLElement>(identifier.selector);\n if (el) return el;\n } catch {\n // Invalid selector\n }\n }\n\n // Try XPath\n if (identifier.xpath) {\n try {\n const result = document.evaluate(\n identifier.xpath,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching an identifier pattern\n */\nexport function findAllElementsByIdentifier(\n pattern: string,\n root: ParentNode = document\n): HTMLElement[] {\n const results: HTMLElement[] = [];\n\n // Try as CSS selector first (supports wildcards better)\n try {\n const elements = root.querySelectorAll<HTMLElement>(pattern);\n results.push(...Array.from(elements));\n if (results.length > 0) return results;\n } catch {\n // Not a valid CSS selector\n }\n\n // Try partial matching on data attributes\n const partials = [\n `[data-ui-id*=\"${pattern}\"]`,\n `[data-testid*=\"${pattern}\"]`,\n `[data-awas-element*=\"${pattern}\"]`,\n `[id*=\"${pattern}\"]`,\n ];\n\n for (const selector of partials) {\n try {\n const elements = root.querySelectorAll<HTMLElement>(selector);\n for (const el of elements) {\n if (!results.includes(el)) {\n results.push(el);\n }\n }\n } catch {\n // Invalid selector\n }\n }\n\n return results;\n}\n\n/**\n * Check if an element matches an identifier\n */\nexport function elementMatchesIdentifier(\n element: HTMLElement,\n identifier: string | ElementIdentifier\n): boolean {\n if (typeof identifier === 'string') {\n return (\n element.getAttribute('data-ui-id') === identifier ||\n element.getAttribute('data-testid') === identifier ||\n element.getAttribute('data-awas-element') === identifier ||\n element.id === identifier ||\n element.matches(identifier)\n );\n }\n\n return (\n (identifier.uiId && element.getAttribute('data-ui-id') === identifier.uiId) ||\n (identifier.testId && element.getAttribute('data-testid') === identifier.testId) ||\n (identifier.awasId && element.getAttribute('data-awas-element') === identifier.awasId) ||\n (identifier.htmlId && element.id === identifier.htmlId) ||\n false\n );\n}\n","/**\n * Element Inspector\n *\n * Visual debugging tools for inspecting UI elements.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RegisteredElement, ElementState, ElementIdentifier } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\n\n/**\n * Inspector state\n */\nexport interface InspectorState {\n /** Whether inspector is active */\n active: boolean;\n /** Currently hovered element */\n hoveredElement: HTMLElement | null;\n /** Selected element */\n selectedElement: HTMLElement | null;\n /** Highlight bounds */\n highlightBounds: DOMRect | null;\n}\n\n/**\n * Element info for display\n */\nexport interface ElementInfo {\n identifier: ElementIdentifier;\n bestId: string;\n tagName: string;\n role?: string;\n state: ElementState;\n registered?: RegisteredElement;\n}\n\n/**\n * Inspector overlay styles\n */\nconst overlayStyles: React.CSSProperties = {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: 999999,\n border: '2px solid #3b82f6',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n transition: 'all 0.1s ease-out',\n};\n\nconst labelStyles: React.CSSProperties = {\n position: 'absolute',\n top: '-24px',\n left: '0',\n padding: '2px 8px',\n backgroundColor: '#3b82f6',\n color: 'white',\n fontSize: '12px',\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n borderRadius: '4px 4px 0 0',\n};\n\nconst panelStyles: React.CSSProperties = {\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '400px',\n maxHeight: '500px',\n overflow: 'auto',\n backgroundColor: '#1f2937',\n color: '#f3f4f6',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.3)',\n fontFamily: 'monospace',\n fontSize: '12px',\n zIndex: 999998,\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: '12px 16px',\n backgroundColor: '#111827',\n borderBottom: '1px solid #374151',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n borderRadius: '8px 8px 0 0',\n};\n\nconst sectionStyles: React.CSSProperties = {\n padding: '12px 16px',\n borderBottom: '1px solid #374151',\n};\n\nconst labelKeyStyles: React.CSSProperties = {\n color: '#9ca3af',\n marginRight: '8px',\n};\n\nconst valueStyles: React.CSSProperties = {\n color: '#60a5fa',\n};\n\n/**\n * Get element state\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: rect.width > 0 && rect.height > 0 && style.display !== 'none',\n enabled: !('disabled' in element && (element as HTMLInputElement).disabled),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n }\n\n return state;\n}\n\n/**\n * Inspector overlay component\n */\nexport interface InspectorOverlayProps {\n bounds: DOMRect;\n label: string;\n}\n\nexport function InspectorOverlay({ bounds, label }: InspectorOverlayProps) {\n return (\n <div\n style={{\n ...overlayStyles,\n left: bounds.left + window.scrollX,\n top: bounds.top + window.scrollY,\n width: bounds.width,\n height: bounds.height,\n }}\n >\n <span style={labelStyles}>{label}</span>\n </div>\n );\n}\n\n/**\n * Element info panel component\n */\nexport interface InfoPanelProps {\n element: HTMLElement | null;\n onClose: () => void;\n registeredElement?: RegisteredElement;\n}\n\nexport function InfoPanel({ element, onClose, registeredElement }: InfoPanelProps) {\n if (!element) return null;\n\n const identifier = createElementIdentifier(element);\n const state = getElementState(element);\n const bestId = getBestIdentifier(element);\n\n return (\n <div style={panelStyles}>\n <div style={headerStyles}>\n <span style={{ fontWeight: 'bold', color: '#60a5fa' }}>UI Bridge Inspector</span>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n color: '#9ca3af',\n cursor: 'pointer',\n fontSize: '16px',\n }}\n >\n ×\n </button>\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Element</div>\n <div>\n <span style={labelKeyStyles}>Tag:</span>\n <span style={valueStyles}>{element.tagName.toLowerCase()}</span>\n </div>\n <div>\n <span style={labelKeyStyles}>Best ID:</span>\n <span style={valueStyles}>{bestId}</span>\n </div>\n {identifier.uiId && (\n <div>\n <span style={labelKeyStyles}>data-ui-id:</span>\n <span style={valueStyles}>{identifier.uiId}</span>\n </div>\n )}\n {identifier.testId && (\n <div>\n <span style={labelKeyStyles}>data-testid:</span>\n <span style={valueStyles}>{identifier.testId}</span>\n </div>\n )}\n {identifier.htmlId && (\n <div>\n <span style={labelKeyStyles}>id:</span>\n <span style={valueStyles}>{identifier.htmlId}</span>\n </div>\n )}\n {registeredElement && (\n <div>\n <span style={labelKeyStyles}>Registered:</span>\n <span style={{ color: '#10b981' }}>Yes ({registeredElement.type})</span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>State</div>\n <div>\n <span style={labelKeyStyles}>Visible:</span>\n <span style={{ color: state.visible ? '#10b981' : '#ef4444' }}>\n {state.visible ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Enabled:</span>\n <span style={{ color: state.enabled ? '#10b981' : '#ef4444' }}>\n {state.enabled ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Focused:</span>\n <span style={{ color: state.focused ? '#10b981' : '#9ca3af' }}>\n {state.focused ? 'Yes' : 'No'}\n </span>\n </div>\n {state.value !== undefined && (\n <div>\n <span style={labelKeyStyles}>Value:</span>\n <span style={valueStyles}>"{state.value}"</span>\n </div>\n )}\n {state.checked !== undefined && (\n <div>\n <span style={labelKeyStyles}>Checked:</span>\n <span style={{ color: state.checked ? '#10b981' : '#9ca3af' }}>\n {state.checked ? 'Yes' : 'No'}\n </span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Bounds</div>\n <div>\n <span style={labelKeyStyles}>Position:</span>\n <span style={valueStyles}>\n ({Math.round(state.rect.x)}, {Math.round(state.rect.y)})\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Size:</span>\n <span style={valueStyles}>\n {Math.round(state.rect.width)} × {Math.round(state.rect.height)}\n </span>\n </div>\n </div>\n\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Selectors</div>\n <div style={{ wordBreak: 'break-all', marginBottom: '4px' }}>\n <span style={labelKeyStyles}>CSS:</span>\n <span style={valueStyles}>{identifier.selector}</span>\n </div>\n <div style={{ wordBreak: 'break-all' }}>\n <span style={labelKeyStyles}>XPath:</span>\n <span style={valueStyles}>{identifier.xpath}</span>\n </div>\n </div>\n\n {registeredElement && registeredElement.actions.length > 0 && (\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Actions</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {registeredElement.actions.map((action) => (\n <span\n key={action}\n style={{\n padding: '2px 8px',\n backgroundColor: '#374151',\n borderRadius: '4px',\n color: '#60a5fa',\n }}\n >\n {action}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useInspector hook options\n */\nexport interface UseInspectorOptions {\n /** Callback when element is selected */\n onSelect?: (element: HTMLElement) => void;\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Keyboard shortcut to toggle (default: Ctrl+Shift+I) */\n shortcut?: { key: string; ctrl?: boolean; shift?: boolean; alt?: boolean };\n}\n\n/**\n * useInspector hook\n *\n * Provides inspector functionality for debugging.\n */\nexport function useInspector(options: UseInspectorOptions = {}) {\n const [active, setActive] = useState(false);\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null);\n const [selectedElement, setSelectedElement] = useState<HTMLElement | null>(null);\n\n const shortcut = useMemo(\n () => options.shortcut ?? { key: 'i', ctrl: true, shift: true },\n [options.shortcut]\n );\n\n // Toggle handler\n const toggle = useCallback(() => {\n setActive((prev) => !prev);\n if (active) {\n setHoveredElement(null);\n setSelectedElement(null);\n }\n }, [active]);\n\n // Keyboard shortcut\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.key.toLowerCase() === shortcut.key &&\n e.ctrlKey === !!shortcut.ctrl &&\n e.shiftKey === !!shortcut.shift &&\n e.altKey === !!shortcut.alt\n ) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggle, shortcut]);\n\n // Mouse handlers\n useEffect(() => {\n if (!active) return;\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target && target !== hoveredElement) {\n setHoveredElement(target);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as HTMLElement;\n setSelectedElement(target);\n options.onSelect?.(target);\n };\n\n document.addEventListener('mouseover', handleMouseOver, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mouseover', handleMouseOver, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, hoveredElement, options]);\n\n // Build display element (selected takes precedence over hovered)\n const displayElement = selectedElement || hoveredElement;\n const bounds = displayElement?.getBoundingClientRect() || null;\n const registeredElement = displayElement\n ? options.getRegisteredElement?.(displayElement)\n : undefined;\n\n return {\n active,\n toggle,\n hoveredElement,\n selectedElement,\n setSelectedElement,\n displayElement,\n bounds,\n registeredElement,\n clearSelection: () => {\n setSelectedElement(null);\n },\n };\n}\n\n/**\n * Inspector component\n *\n * Full inspector UI with overlay and info panel.\n */\nexport interface InspectorProps {\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Initial active state */\n initialActive?: boolean;\n}\n\nexport function Inspector({ getRegisteredElement, initialActive }: InspectorProps) {\n const inspector = useInspector({\n getRegisteredElement,\n });\n\n // Set initial state\n useEffect(() => {\n if (initialActive && !inspector.active) {\n inspector.toggle();\n }\n }, [initialActive]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!inspector.active) return null;\n\n return (\n <>\n {inspector.bounds && (\n <InspectorOverlay\n bounds={inspector.bounds}\n label={inspector.displayElement ? getBestIdentifier(inspector.displayElement) : ''}\n />\n )}\n {inspector.selectedElement && (\n <InfoPanel\n element={inspector.selectedElement}\n onClose={inspector.clearSelection}\n registeredElement={inspector.registeredElement}\n />\n )}\n </>\n );\n}\n","/**\n * Metrics Module\n *\n * Performance metrics and action history tracking.\n */\n\nimport type { BridgeEvent } from '../core/types';\nimport type {\n ControlActionResponse,\n ComponentActionResponse,\n WorkflowStepResult,\n} from '../control/types';\n\n/**\n * Action history entry\n */\nexport interface ActionHistoryEntry {\n /** Unique entry ID */\n id: string;\n /** Timestamp */\n timestamp: number;\n /** Action type */\n type: 'element' | 'component' | 'workflow-step';\n /** Target ID */\n target: string;\n /** Action name */\n action: string;\n /** Whether the action succeeded */\n success: boolean;\n /** Duration in milliseconds */\n durationMs: number;\n /** Error message if failed */\n error?: string;\n /** Action parameters */\n params?: Record<string, unknown>;\n /** Response data */\n response?: unknown;\n}\n\n/**\n * Performance metrics\n */\nexport interface PerformanceMetrics {\n /** Total actions executed */\n totalActions: number;\n /** Successful actions */\n successfulActions: number;\n /** Failed actions */\n failedActions: number;\n /** Success rate (0-1) */\n successRate: number;\n /** Average action duration */\n avgDurationMs: number;\n /** Minimum action duration */\n minDurationMs: number;\n /** Maximum action duration */\n maxDurationMs: number;\n /** 95th percentile duration */\n p95DurationMs: number;\n /** Actions per second (last minute) */\n actionsPerSecond: number;\n /** Errors by type */\n errorsByType: Record<string, number>;\n /** Actions by type */\n actionsByType: Record<string, number>;\n}\n\n/**\n * Metrics collector options\n */\nexport interface MetricsCollectorOptions {\n /** Maximum history entries to keep */\n maxHistoryEntries?: number;\n /** Window for rate calculations (ms) */\n rateWindow?: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Metrics collector\n *\n * Collects and aggregates performance metrics.\n */\nexport class MetricsCollector {\n private history: ActionHistoryEntry[] = [];\n private maxHistoryEntries: number;\n private rateWindow: number;\n\n constructor(options: MetricsCollectorOptions = {}) {\n this.maxHistoryEntries = options.maxHistoryEntries ?? 1000;\n this.rateWindow = options.rateWindow ?? 60000; // 1 minute\n }\n\n /**\n * Record an element action\n */\n recordElementAction(\n target: string,\n action: string,\n response: ControlActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'element',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.elementState,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a component action\n */\n recordComponentAction(\n target: string,\n action: string,\n response: ComponentActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'component',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a workflow step\n */\n recordWorkflowStep(workflowId: string, result: WorkflowStepResult): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: result.timestamp,\n type: 'workflow-step',\n target: workflowId,\n action: result.stepId,\n success: result.success,\n durationMs: result.durationMs,\n error: result.error,\n response: result.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record from a bridge event\n */\n recordEvent(event: BridgeEvent): void {\n if (event.type === 'action:completed' || event.type === 'action:failed') {\n const data = event.data as {\n elementId?: string;\n componentId?: string;\n action: string;\n response: ControlActionResponse | ComponentActionResponse;\n params?: Record<string, unknown>;\n };\n\n if (data.elementId) {\n this.recordElementAction(\n data.elementId,\n data.action,\n data.response as ControlActionResponse,\n data.params\n );\n } else if (data.componentId) {\n this.recordComponentAction(\n data.componentId,\n data.action,\n data.response as ComponentActionResponse,\n data.params\n );\n }\n }\n }\n\n /**\n * Get action history\n */\n getHistory(options?: {\n type?: 'element' | 'component' | 'workflow-step';\n target?: string;\n action?: string;\n success?: boolean;\n since?: number;\n limit?: number;\n }): ActionHistoryEntry[] {\n let results = [...this.history];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.target) {\n results = results.filter((e) => e.target === options.target);\n }\n if (options?.action) {\n results = results.filter((e) => e.action === options.action);\n }\n if (options?.success !== undefined) {\n results = results.filter((e) => e.success === options.success);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n /**\n * Get performance metrics\n */\n getMetrics(since?: number): PerformanceMetrics {\n const entries = since ? this.history.filter((e) => e.timestamp >= since) : this.history;\n\n if (entries.length === 0) {\n return {\n totalActions: 0,\n successfulActions: 0,\n failedActions: 0,\n successRate: 0,\n avgDurationMs: 0,\n minDurationMs: 0,\n maxDurationMs: 0,\n p95DurationMs: 0,\n actionsPerSecond: 0,\n errorsByType: {},\n actionsByType: {},\n };\n }\n\n const successful = entries.filter((e) => e.success);\n const failed = entries.filter((e) => !e.success);\n const durations = entries.map((e) => e.durationMs).sort((a, b) => a - b);\n\n // Calculate actions per second in the rate window\n const now = Date.now();\n const windowStart = now - this.rateWindow;\n const recentActions = this.history.filter((e) => e.timestamp >= windowStart);\n const windowSeconds = this.rateWindow / 1000;\n\n // Error aggregation\n const errorsByType: Record<string, number> = {};\n for (const entry of failed) {\n const errorType = entry.error?.split(':')[0] || 'Unknown';\n errorsByType[errorType] = (errorsByType[errorType] || 0) + 1;\n }\n\n // Action aggregation\n const actionsByType: Record<string, number> = {};\n for (const entry of entries) {\n const key = `${entry.type}:${entry.action}`;\n actionsByType[key] = (actionsByType[key] || 0) + 1;\n }\n\n return {\n totalActions: entries.length,\n successfulActions: successful.length,\n failedActions: failed.length,\n successRate: successful.length / entries.length,\n avgDurationMs: durations.reduce((a, b) => a + b, 0) / durations.length,\n minDurationMs: durations[0],\n maxDurationMs: durations[durations.length - 1],\n p95DurationMs: durations[Math.floor(durations.length * 0.95)],\n actionsPerSecond: recentActions.length / windowSeconds,\n errorsByType,\n actionsByType,\n };\n }\n\n /**\n * Get recent errors\n */\n getRecentErrors(limit = 10): ActionHistoryEntry[] {\n return this.history.filter((e) => !e.success).slice(-limit);\n }\n\n /**\n * Get slowest actions\n */\n getSlowestActions(limit = 10): ActionHistoryEntry[] {\n return [...this.history].sort((a, b) => b.durationMs - a.durationMs).slice(0, limit);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Export history as JSON\n */\n exportHistory(): string {\n return JSON.stringify(this.history, null, 2);\n }\n\n /**\n * Import history from JSON\n */\n importHistory(json: string): void {\n const entries = JSON.parse(json) as ActionHistoryEntry[];\n this.history = entries.slice(-this.maxHistoryEntries);\n }\n\n private addEntry(entry: ActionHistoryEntry): void {\n this.history.push(entry);\n while (this.history.length > this.maxHistoryEntries) {\n this.history.shift();\n }\n }\n}\n\n/**\n * Create a metrics collector\n */\nexport function createMetricsCollector(options?: MetricsCollectorOptions): MetricsCollector {\n return new MetricsCollector(options);\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1) return '<1ms';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n/**\n * Format percentage for display\n */\nexport function formatPercentage(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/element-identifier.ts","../../src/annotations/types.ts","../../src/annotations/store.ts","../../src/debug/inspector.tsx","../../src/debug/browser-capture-types.ts","../../src/debug/captures/console.ts","../../src/debug/captures/network.ts","../../src/debug/captures/navigation.ts","../../src/debug/captures/long-tasks.ts","../../src/debug/captures/resource-errors.ts","../../src/debug/captures/web-vitals.ts","../../src/debug/captures/memory.ts","../../src/debug/captures/hmr.ts","../../src/debug/captures/long-animation-frames.ts","../../src/debug/browser-capture.ts","../../src/debug/metrics.ts"],"names":["jsx","jsxs","useState","useMemo","useCallback","useEffect","Fragment","makeEvent"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Element Identification Module\n *\n * Provides utilities for identifying DOM elements using multiple strategies:\n * 1. data-ui-id (explicit UI Bridge identifier - preferred)\n * 2. data-testid (testing library convention)\n * 3. data-awas-element (legacy support)\n * 4. id (HTML id attribute)\n * 5. Generated XPath/CSS selector (fallback)\n */\n\nimport type { ElementIdentifier } from './types';\n\n/**\n * Data attributes used for element identification (in priority order)\n */\nexport const ID_ATTRIBUTES = ['data-ui-id', 'data-testid', 'data-awas-element', 'id'] as const;\n\n/**\n * Generate a unique XPath for an element\n */\nexport function generateXPath(element: HTMLElement): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for identifying attributes\n const uiId = current.getAttribute('data-ui-id');\n if (uiId) {\n selector += `[@data-ui-id=\"${uiId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const testId = current.getAttribute('data-testid');\n if (testId) {\n selector += `[@data-testid=\"${testId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const id = current.id;\n if (id) {\n selector += `[@id=\"${id}\"]`;\n parts.unshift(selector);\n break;\n }\n\n // Calculate position among siblings with same tag\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children).filter(\n (child): child is Element => child.nodeName === currentEl.nodeName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `[${index}]`;\n }\n }\n\n parts.unshift(selector);\n current = parentEl;\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Generate a unique CSS selector for an element\n */\nexport function generateCSSSelector(element: HTMLElement): string {\n // Check for identifying attributes first\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) {\n return `[data-ui-id=\"${uiId}\"]`;\n }\n\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) {\n return `[data-awas-element=\"${awasId}\"]`;\n }\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Build a path selector\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for unique identifiers on ancestors\n const parentUiId = current.getAttribute('data-ui-id');\n if (parentUiId && current !== element) {\n path.unshift(`[data-ui-id=\"${parentUiId}\"]`);\n break;\n }\n\n const parentTestId = current.getAttribute('data-testid');\n if (parentTestId && current !== element) {\n path.unshift(`[data-testid=\"${parentTestId}\"]`);\n break;\n }\n\n if (current.id) {\n path.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n // Add nth-child if needed for uniqueness\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children);\n const sameTagSiblings = siblings.filter(\n (s): s is Element => s.nodeName === currentEl.nodeName\n );\n\n if (sameTagSiblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get the best identifier for an element based on available attributes\n */\nexport function getBestIdentifier(element: HTMLElement): string {\n // Priority order\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) return awasId;\n\n if (element.id) return element.id;\n\n // Fallback to generated CSS selector\n return generateCSSSelector(element);\n}\n\n/**\n * Create a full ElementIdentifier object for an element\n */\nexport function createElementIdentifier(element: HTMLElement): ElementIdentifier {\n return {\n uiId: element.getAttribute('data-ui-id') || undefined,\n testId: element.getAttribute('data-testid') || undefined,\n awasId: element.getAttribute('data-awas-element') || undefined,\n htmlId: element.id || undefined,\n xpath: generateXPath(element),\n selector: generateCSSSelector(element),\n };\n}\n\n/**\n * Find an element by its identifier\n *\n * Tries each identification method in priority order\n */\nexport function findElementByIdentifier(\n identifier: string | ElementIdentifier,\n root: ParentNode = document\n): HTMLElement | null {\n // If string, try each identification method\n if (typeof identifier === 'string') {\n // Try data-ui-id\n const byUiId = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier}\"]`);\n if (byUiId) return byUiId;\n\n // Try data-testid\n const byTestId = root.querySelector<HTMLElement>(`[data-testid=\"${identifier}\"]`);\n if (byTestId) return byTestId;\n\n // Try data-awas-element\n const byAwasId = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier}\"]`);\n if (byAwasId) return byAwasId;\n\n // Try id\n const byId = root.querySelector<HTMLElement>(`#${CSS.escape(identifier)}`);\n if (byId) return byId;\n\n // Try as CSS selector\n try {\n const bySelector = root.querySelector<HTMLElement>(identifier);\n if (bySelector) return bySelector;\n } catch {\n // Invalid selector, ignore\n }\n\n // Try as XPath\n try {\n const result = document.evaluate(\n identifier,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath, ignore\n }\n\n return null;\n }\n\n // If ElementIdentifier object, try in priority order\n if (identifier.uiId) {\n const el = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier.uiId}\"]`);\n if (el) return el;\n }\n\n if (identifier.testId) {\n const el = root.querySelector<HTMLElement>(`[data-testid=\"${identifier.testId}\"]`);\n if (el) return el;\n }\n\n if (identifier.awasId) {\n const el = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier.awasId}\"]`);\n if (el) return el;\n }\n\n if (identifier.htmlId) {\n const el = root.querySelector<HTMLElement>(`#${CSS.escape(identifier.htmlId)}`);\n if (el) return el;\n }\n\n // Try CSS selector\n if (identifier.selector) {\n try {\n const el = root.querySelector<HTMLElement>(identifier.selector);\n if (el) return el;\n } catch {\n // Invalid selector\n }\n }\n\n // Try XPath\n if (identifier.xpath) {\n try {\n const result = document.evaluate(\n identifier.xpath,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching an identifier pattern\n */\nexport function findAllElementsByIdentifier(\n pattern: string,\n root: ParentNode = document\n): HTMLElement[] {\n const results: HTMLElement[] = [];\n\n // Try as CSS selector first (supports wildcards better)\n try {\n const elements = root.querySelectorAll<HTMLElement>(pattern);\n results.push(...Array.from(elements));\n if (results.length > 0) return results;\n } catch {\n // Not a valid CSS selector\n }\n\n // Try partial matching on data attributes\n const partials = [\n `[data-ui-id*=\"${pattern}\"]`,\n `[data-testid*=\"${pattern}\"]`,\n `[data-awas-element*=\"${pattern}\"]`,\n `[id*=\"${pattern}\"]`,\n ];\n\n for (const selector of partials) {\n try {\n const elements = root.querySelectorAll<HTMLElement>(selector);\n for (const el of elements) {\n if (!results.includes(el)) {\n results.push(el);\n }\n }\n } catch {\n // Invalid selector\n }\n }\n\n return results;\n}\n\n/**\n * Check if an element matches an identifier\n */\nexport function elementMatchesIdentifier(\n element: HTMLElement,\n identifier: string | ElementIdentifier\n): boolean {\n if (typeof identifier === 'string') {\n return (\n element.getAttribute('data-ui-id') === identifier ||\n element.getAttribute('data-testid') === identifier ||\n element.getAttribute('data-awas-element') === identifier ||\n element.id === identifier ||\n element.matches(identifier)\n );\n }\n\n return (\n (identifier.uiId && element.getAttribute('data-ui-id') === identifier.uiId) ||\n (identifier.testId && element.getAttribute('data-testid') === identifier.testId) ||\n (identifier.awasId && element.getAttribute('data-awas-element') === identifier.awasId) ||\n (identifier.htmlId && element.id === identifier.htmlId) ||\n false\n );\n}\n","/**\n * Annotation Types\n *\n * Types for the semantic annotation system that allows developers\n * to attach rich human-authored context to UI elements.\n */\n\n/**\n * Annotation for a single UI element.\n *\n * All fields are optional - annotate only what's useful.\n * Annotations provide human-authored semantic context that enriches\n * the UI Bridge's understanding of elements beyond what can be\n * inferred from the DOM alone.\n *\n * @example Basic annotation for a button\n * ```ts\n * const annotation: ElementAnnotation = {\n * description: 'Primary login button',\n * purpose: 'Submits the login form and authenticates the user',\n * tags: ['auth', 'primary-action'],\n * };\n * store.set('login-btn', annotation);\n * ```\n *\n * @example Detailed annotation with relationships and metadata\n * ```ts\n * const annotation: ElementAnnotation = {\n * description: 'Email input field',\n * purpose: 'Collects the user email for authentication',\n * notes: 'Validates email format on blur. Shows inline error below the field.',\n * tags: ['auth', 'form-input', 'required'],\n * relatedElements: ['email-label', 'email-error', 'login-btn'],\n * metadata: { validationPattern: '^[^@]+@[^@]+\\\\.[^@]+$' },\n * author: 'design-team',\n * };\n * ```\n */\nexport interface ElementAnnotation {\n /** Human-readable description of what this element is */\n description?: string;\n /** Why this element exists / what it's for */\n purpose?: string;\n /** Behavioral notes, edge cases, or caveats */\n notes?: string;\n /** Searchable tags for categorization */\n tags?: string[];\n /** IDs of related elements (e.g., a label and its input) */\n relatedElements?: string[];\n /** Arbitrary key-value metadata */\n metadata?: Record<string, unknown>;\n /** Timestamp of last update (auto-set by store) */\n updatedAt?: number;\n /** Author of this annotation */\n author?: string;\n}\n\n/**\n * Annotation configuration file format.\n *\n * This is the import/export format - a JSON file with version and annotations map.\n * Use `AnnotationStore.exportConfig()` to generate this object, and\n * `AnnotationStore.importConfig()` to load it back.\n *\n * @example JSON file format (`annotations.json`)\n * ```json\n * {\n * \"version\": \"1.0.0\",\n * \"annotations\": {\n * \"login-btn\": {\n * \"description\": \"Primary login button\",\n * \"purpose\": \"Submits the login form\",\n * \"tags\": [\"auth\", \"primary-action\"]\n * },\n * \"email-input\": {\n * \"description\": \"Email address input\",\n * \"purpose\": \"Collects user email for authentication\",\n * \"relatedElements\": [\"email-label\", \"email-error\"]\n * }\n * },\n * \"metadata\": {\n * \"appName\": \"MyApp\",\n * \"description\": \"Annotations for the login page\"\n * }\n * }\n * ```\n */\nexport interface AnnotationConfig {\n /** Config format version */\n version: string;\n /** Map of element ID to annotation */\n annotations: Record<string, ElementAnnotation>;\n /** Optional file-level metadata */\n metadata?: {\n appName?: string;\n exportedAt?: number;\n description?: string;\n };\n}\n\n/**\n * Annotation coverage statistics.\n */\nexport interface AnnotationCoverage {\n /** Total elements known to the system */\n totalElements: number;\n /** Elements that have annotations */\n annotatedElements: number;\n /** Coverage as a percentage (0-100) */\n coveragePercent: number;\n /** IDs of annotated elements */\n annotatedIds: string[];\n /** IDs of unannotated elements */\n unannotatedIds: string[];\n /** When this coverage was computed */\n timestamp: number;\n}\n\n/**\n * Event types emitted by the annotation store.\n */\nexport type AnnotationEventType =\n | 'annotation:set'\n | 'annotation:deleted'\n | 'annotation:imported'\n | 'annotation:cleared';\n\n/**\n * Event payload for annotation store events.\n */\nexport interface AnnotationEvent {\n type: AnnotationEventType;\n elementId?: string;\n annotation?: ElementAnnotation;\n count?: number;\n timestamp: number;\n}\n\n/** Current annotation config version */\nexport const ANNOTATION_CONFIG_VERSION = '1.0.0';\n","/**\n * Annotation Store\n *\n * In-memory store for element annotations with CRUD operations,\n * import/export, coverage tracking, and event emission.\n */\n\nimport type {\n ElementAnnotation,\n AnnotationConfig,\n AnnotationCoverage,\n AnnotationEvent,\n} from './types';\nimport { ANNOTATION_CONFIG_VERSION } from './types';\n\n/**\n * Listener function for annotation events.\n */\nexport type AnnotationListener = (event: AnnotationEvent) => void;\n\n/**\n * Annotation Store\n *\n * Stores element annotations in memory with event-driven updates.\n * Provides CRUD operations, import/export, coverage tracking, and\n * an event system for reacting to annotation changes.\n *\n * @example Basic CRUD usage\n * ```ts\n * const store = new AnnotationStore();\n *\n * // Set an annotation\n * store.set('login-btn', {\n * description: 'Primary login button',\n * purpose: 'Submits the login form',\n * tags: ['auth', 'primary-action'],\n * });\n *\n * // Read it back\n * const annotation = store.get('login-btn');\n * console.log(annotation?.description); // 'Primary login button'\n *\n * // Check existence\n * store.has('login-btn'); // true\n *\n * // Delete it\n * store.delete('login-btn'); // true\n * ```\n *\n * @example Import/export workflow\n * ```ts\n * const store = new AnnotationStore();\n *\n * // Import from a config file\n * const config = JSON.parse(fs.readFileSync('annotations.json', 'utf-8'));\n * const count = store.importConfig(config);\n * console.log(`Imported ${count} annotations`);\n *\n * // Export current state\n * const exported = store.exportConfig({ appName: 'MyApp' });\n * fs.writeFileSync('annotations.json', JSON.stringify(exported, null, 2));\n * ```\n *\n * @example Listening for changes\n * ```ts\n * const store = new AnnotationStore();\n *\n * const unsubscribe = store.on((event) => {\n * switch (event.type) {\n * case 'annotation:set':\n * console.log(`Updated: ${event.elementId}`);\n * break;\n * case 'annotation:deleted':\n * console.log(`Deleted: ${event.elementId}`);\n * break;\n * case 'annotation:imported':\n * console.log(`Imported ${event.count} annotations`);\n * break;\n * case 'annotation:cleared':\n * console.log('All annotations cleared');\n * break;\n * }\n * });\n *\n * // Later, stop listening\n * unsubscribe();\n * ```\n */\nexport class AnnotationStore {\n private store = new Map<string, ElementAnnotation>();\n private listeners = new Set<AnnotationListener>();\n\n /**\n * Get an annotation by element ID.\n */\n get(elementId: string): ElementAnnotation | undefined {\n return this.store.get(elementId);\n }\n\n /**\n * Get all annotations as a record.\n */\n getAll(): Record<string, ElementAnnotation> {\n const result: Record<string, ElementAnnotation> = {};\n for (const [id, annotation] of this.store) {\n result[id] = annotation;\n }\n return result;\n }\n\n /**\n * Set an annotation for an element. Auto-sets `updatedAt`.\n */\n set(elementId: string, annotation: ElementAnnotation): void {\n const updated: ElementAnnotation = {\n ...annotation,\n updatedAt: Date.now(),\n };\n this.store.set(elementId, updated);\n this.emit({\n type: 'annotation:set',\n elementId,\n annotation: updated,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Delete an annotation by element ID.\n *\n * @returns true if the annotation existed and was deleted\n */\n delete(elementId: string): boolean {\n const existed = this.store.delete(elementId);\n if (existed) {\n this.emit({\n type: 'annotation:deleted',\n elementId,\n timestamp: Date.now(),\n });\n }\n return existed;\n }\n\n /**\n * Check if an annotation exists for an element.\n */\n has(elementId: string): boolean {\n return this.store.has(elementId);\n }\n\n /**\n * Get the number of stored annotations.\n */\n get count(): number {\n return this.store.size;\n }\n\n /**\n * Clear all annotations.\n */\n clear(): void {\n this.store.clear();\n this.emit({\n type: 'annotation:cleared',\n timestamp: Date.now(),\n });\n }\n\n /**\n * Import annotations from a config object.\n *\n * Merges with existing annotations (new values overwrite per element ID).\n *\n * @returns Number of annotations imported\n *\n * @example\n * ```ts\n * const config: AnnotationConfig = {\n * version: '1.0.0',\n * annotations: {\n * 'btn-1': { description: 'Submit button', tags: ['form'] },\n * 'input-1': { description: 'Name field' },\n * },\n * };\n * const count = store.importConfig(config); // 2\n * ```\n */\n importConfig(config: AnnotationConfig): number {\n let count = 0;\n for (const [id, annotation] of Object.entries(config.annotations)) {\n this.store.set(id, {\n ...annotation,\n updatedAt: annotation.updatedAt ?? Date.now(),\n });\n count++;\n }\n this.emit({\n type: 'annotation:imported',\n count,\n timestamp: Date.now(),\n });\n return count;\n }\n\n /**\n * Export all annotations as a config object.\n *\n * The returned object can be serialized to JSON and saved to a file,\n * then later re-imported with {@link importConfig}.\n *\n * @param metadata - Optional metadata to include (appName, description, etc.)\n * @returns AnnotationConfig with all current annotations\n *\n * @example\n * ```ts\n * const config = store.exportConfig({ appName: 'MyApp' });\n * // config.version === '1.0.0'\n * // config.annotations === { 'btn-1': { ... }, 'input-1': { ... } }\n * // config.metadata === { appName: 'MyApp', exportedAt: 1706900000000 }\n *\n * // Save to file\n * fs.writeFileSync('annotations.json', JSON.stringify(config, null, 2));\n * ```\n */\n exportConfig(metadata?: AnnotationConfig['metadata']): AnnotationConfig {\n return {\n version: ANNOTATION_CONFIG_VERSION,\n annotations: this.getAll(),\n metadata: {\n ...metadata,\n exportedAt: Date.now(),\n },\n };\n }\n\n /**\n * Compute annotation coverage against a set of known element IDs.\n *\n * Compares the store's annotations against the provided list of element IDs\n * to determine what percentage of elements have been annotated.\n *\n * @param allElementIds - Array of all known element IDs in the UI\n * @returns Coverage statistics including percentages and lists of annotated/unannotated IDs\n *\n * @example\n * ```ts\n * store.set('btn-1', { description: 'Submit' });\n * store.set('input-1', { description: 'Name' });\n *\n * const coverage = store.getCoverage(['btn-1', 'input-1', 'input-2', 'link-1']);\n * // coverage.totalElements === 4\n * // coverage.annotatedElements === 2\n * // coverage.coveragePercent === 50\n * // coverage.annotatedIds === ['btn-1', 'input-1']\n * // coverage.unannotatedIds === ['input-2', 'link-1']\n * ```\n */\n getCoverage(allElementIds: string[]): AnnotationCoverage {\n const annotatedIds: string[] = [];\n const unannotatedIds: string[] = [];\n\n for (const id of allElementIds) {\n if (this.store.has(id)) {\n annotatedIds.push(id);\n } else {\n unannotatedIds.push(id);\n }\n }\n\n const total = allElementIds.length;\n return {\n totalElements: total,\n annotatedElements: annotatedIds.length,\n coveragePercent: total > 0 ? (annotatedIds.length / total) * 100 : 0,\n annotatedIds,\n unannotatedIds,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Subscribe to annotation events.\n *\n * The listener is called whenever annotations are set, deleted, imported,\n * or cleared. Returns an unsubscribe function to stop listening.\n *\n * @param listener - Callback function receiving {@link AnnotationEvent} objects\n * @returns Unsubscribe function - call it to remove the listener\n *\n * @example\n * ```ts\n * const unsubscribe = store.on((event) => {\n * if (event.type === 'annotation:set') {\n * console.log(`Element ${event.elementId} annotated:`, event.annotation);\n * }\n * });\n *\n * store.set('btn-1', { description: 'Submit' });\n * // Logs: \"Element btn-1 annotated: { description: 'Submit', updatedAt: ... }\"\n *\n * unsubscribe(); // Stop listening\n * ```\n */\n on(listener: AnnotationListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Emit an event to all listeners.\n */\n private emit(event: AnnotationEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Don't let listener errors break the store\n }\n }\n }\n}\n\n// Global singleton\nlet globalStore: AnnotationStore | null = null;\n\n/**\n * Get the global annotation store singleton.\n */\nexport function getGlobalAnnotationStore(): AnnotationStore {\n if (!globalStore) {\n globalStore = new AnnotationStore();\n }\n return globalStore;\n}\n\n/**\n * Reset the global annotation store (primarily for testing).\n */\nexport function resetGlobalAnnotationStore(): void {\n globalStore = null;\n}\n","/**\n * Element Inspector\n *\n * Visual debugging tools for inspecting UI elements.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RegisteredElement, ElementState, ElementIdentifier } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\nimport { getGlobalAnnotationStore } from '../annotations';\n\n/**\n * Inspector state\n */\nexport interface InspectorState {\n /** Whether inspector is active */\n active: boolean;\n /** Currently hovered element */\n hoveredElement: HTMLElement | null;\n /** Selected element */\n selectedElement: HTMLElement | null;\n /** Highlight bounds */\n highlightBounds: DOMRect | null;\n}\n\n/**\n * Element info for display\n */\nexport interface ElementInfo {\n identifier: ElementIdentifier;\n bestId: string;\n tagName: string;\n role?: string;\n state: ElementState;\n registered?: RegisteredElement;\n}\n\n/**\n * Inspector overlay styles\n */\nconst overlayStyles: React.CSSProperties = {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: 999999,\n border: '2px solid #3b82f6',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n transition: 'all 0.1s ease-out',\n};\n\nconst labelStyles: React.CSSProperties = {\n position: 'absolute',\n top: '-24px',\n left: '0',\n padding: '2px 8px',\n backgroundColor: '#3b82f6',\n color: 'white',\n fontSize: '12px',\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n borderRadius: '4px 4px 0 0',\n};\n\nconst panelStyles: React.CSSProperties = {\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '400px',\n maxHeight: '500px',\n overflow: 'auto',\n backgroundColor: '#1f2937',\n color: '#f3f4f6',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.3)',\n fontFamily: 'monospace',\n fontSize: '12px',\n zIndex: 999998,\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: '12px 16px',\n backgroundColor: '#111827',\n borderBottom: '1px solid #374151',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n borderRadius: '8px 8px 0 0',\n};\n\nconst sectionStyles: React.CSSProperties = {\n padding: '12px 16px',\n borderBottom: '1px solid #374151',\n};\n\nconst labelKeyStyles: React.CSSProperties = {\n color: '#9ca3af',\n marginRight: '8px',\n};\n\nconst valueStyles: React.CSSProperties = {\n color: '#60a5fa',\n};\n\n/**\n * Get element state\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: rect.width > 0 && rect.height > 0 && style.display !== 'none',\n enabled: !('disabled' in element && (element as HTMLInputElement).disabled),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n }\n\n return state;\n}\n\n/**\n * Inspector overlay component\n */\nexport interface InspectorOverlayProps {\n bounds: DOMRect;\n label: string;\n}\n\nexport function InspectorOverlay({ bounds, label }: InspectorOverlayProps) {\n return (\n <div\n style={{\n ...overlayStyles,\n left: bounds.left + window.scrollX,\n top: bounds.top + window.scrollY,\n width: bounds.width,\n height: bounds.height,\n }}\n >\n <span style={labelStyles}>{label}</span>\n </div>\n );\n}\n\n/**\n * Element info panel component\n */\nexport interface InfoPanelProps {\n element: HTMLElement | null;\n onClose: () => void;\n registeredElement?: RegisteredElement;\n}\n\nexport function InfoPanel({ element, onClose, registeredElement }: InfoPanelProps) {\n if (!element) return null;\n\n const identifier = createElementIdentifier(element);\n const state = getElementState(element);\n const bestId = getBestIdentifier(element);\n\n return (\n <div style={panelStyles}>\n <div style={headerStyles}>\n <span style={{ fontWeight: 'bold', color: '#60a5fa' }}>UI Bridge Inspector</span>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n color: '#9ca3af',\n cursor: 'pointer',\n fontSize: '16px',\n }}\n >\n ×\n </button>\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Element</div>\n <div>\n <span style={labelKeyStyles}>Tag:</span>\n <span style={valueStyles}>{element.tagName.toLowerCase()}</span>\n </div>\n <div>\n <span style={labelKeyStyles}>Best ID:</span>\n <span style={valueStyles}>{bestId}</span>\n </div>\n {identifier.uiId && (\n <div>\n <span style={labelKeyStyles}>data-ui-id:</span>\n <span style={valueStyles}>{identifier.uiId}</span>\n </div>\n )}\n {identifier.testId && (\n <div>\n <span style={labelKeyStyles}>data-testid:</span>\n <span style={valueStyles}>{identifier.testId}</span>\n </div>\n )}\n {identifier.htmlId && (\n <div>\n <span style={labelKeyStyles}>id:</span>\n <span style={valueStyles}>{identifier.htmlId}</span>\n </div>\n )}\n {registeredElement && (\n <div>\n <span style={labelKeyStyles}>Registered:</span>\n <span style={{ color: '#10b981' }}>Yes ({registeredElement.type})</span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>State</div>\n <div>\n <span style={labelKeyStyles}>Visible:</span>\n <span style={{ color: state.visible ? '#10b981' : '#ef4444' }}>\n {state.visible ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Enabled:</span>\n <span style={{ color: state.enabled ? '#10b981' : '#ef4444' }}>\n {state.enabled ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Focused:</span>\n <span style={{ color: state.focused ? '#10b981' : '#9ca3af' }}>\n {state.focused ? 'Yes' : 'No'}\n </span>\n </div>\n {state.value !== undefined && (\n <div>\n <span style={labelKeyStyles}>Value:</span>\n <span style={valueStyles}>"{state.value}"</span>\n </div>\n )}\n {state.checked !== undefined && (\n <div>\n <span style={labelKeyStyles}>Checked:</span>\n <span style={{ color: state.checked ? '#10b981' : '#9ca3af' }}>\n {state.checked ? 'Yes' : 'No'}\n </span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Bounds</div>\n <div>\n <span style={labelKeyStyles}>Position:</span>\n <span style={valueStyles}>\n ({Math.round(state.rect.x)}, {Math.round(state.rect.y)})\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Size:</span>\n <span style={valueStyles}>\n {Math.round(state.rect.width)} × {Math.round(state.rect.height)}\n </span>\n </div>\n </div>\n\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Selectors</div>\n <div style={{ wordBreak: 'break-all', marginBottom: '4px' }}>\n <span style={labelKeyStyles}>CSS:</span>\n <span style={valueStyles}>{identifier.selector}</span>\n </div>\n <div style={{ wordBreak: 'break-all' }}>\n <span style={labelKeyStyles}>XPath:</span>\n <span style={valueStyles}>{identifier.xpath}</span>\n </div>\n </div>\n\n {registeredElement && registeredElement.actions.length > 0 && (\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Actions</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {registeredElement.actions.map((action) => (\n <span\n key={action}\n style={{\n padding: '2px 8px',\n backgroundColor: '#374151',\n borderRadius: '4px',\n color: '#60a5fa',\n }}\n >\n {action}\n </span>\n ))}\n </div>\n </div>\n )}\n\n <AnnotationSection elementId={bestId} />\n </div>\n );\n}\n\n/**\n * Annotation section in the inspector panel.\n * Only renders if an annotation exists for the element.\n */\nfunction AnnotationSection({ elementId }: { elementId: string }) {\n const annotation = getGlobalAnnotationStore().get(elementId);\n if (!annotation) return null;\n\n return (\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Annotation</div>\n {annotation.description && (\n <div style={{ marginBottom: '4px' }}>\n <span style={labelKeyStyles}>Description:</span>\n <span style={valueStyles}>{annotation.description}</span>\n </div>\n )}\n {annotation.purpose && (\n <div style={{ marginBottom: '4px' }}>\n <span style={labelKeyStyles}>Purpose:</span>\n <span style={valueStyles}>{annotation.purpose}</span>\n </div>\n )}\n {annotation.notes && (\n <div style={{ marginBottom: '4px' }}>\n <span style={labelKeyStyles}>Notes:</span>\n <span style={{ color: '#fbbf24' }}>{annotation.notes}</span>\n </div>\n )}\n {annotation.tags && annotation.tags.length > 0 && (\n <div>\n <span style={labelKeyStyles}>Tags:</span>\n <span style={{ display: 'inline-flex', flexWrap: 'wrap', gap: '4px' }}>\n {annotation.tags.map((tag) => (\n <span\n key={tag}\n style={{\n padding: '1px 6px',\n backgroundColor: '#1e3a5f',\n borderRadius: '4px',\n color: '#93c5fd',\n fontSize: '11px',\n }}\n >\n {tag}\n </span>\n ))}\n </span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useInspector hook options\n */\nexport interface UseInspectorOptions {\n /** Callback when element is selected */\n onSelect?: (element: HTMLElement) => void;\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Keyboard shortcut to toggle (default: Ctrl+Shift+I) */\n shortcut?: { key: string; ctrl?: boolean; shift?: boolean; alt?: boolean };\n}\n\n/**\n * useInspector hook\n *\n * Provides inspector functionality for debugging.\n */\nexport function useInspector(options: UseInspectorOptions = {}) {\n const [active, setActive] = useState(false);\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null);\n const [selectedElement, setSelectedElement] = useState<HTMLElement | null>(null);\n\n const shortcut = useMemo(\n () => options.shortcut ?? { key: 'i', ctrl: true, shift: true },\n [options.shortcut]\n );\n\n // Toggle handler\n const toggle = useCallback(() => {\n setActive((prev) => !prev);\n if (active) {\n setHoveredElement(null);\n setSelectedElement(null);\n }\n }, [active]);\n\n // Keyboard shortcut\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.key.toLowerCase() === shortcut.key &&\n e.ctrlKey === !!shortcut.ctrl &&\n e.shiftKey === !!shortcut.shift &&\n e.altKey === !!shortcut.alt\n ) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggle, shortcut]);\n\n // Mouse handlers\n useEffect(() => {\n if (!active) return;\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target && target !== hoveredElement) {\n setHoveredElement(target);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as HTMLElement;\n setSelectedElement(target);\n options.onSelect?.(target);\n };\n\n document.addEventListener('mouseover', handleMouseOver, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mouseover', handleMouseOver, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, hoveredElement, options]);\n\n // Build display element (selected takes precedence over hovered)\n const displayElement = selectedElement || hoveredElement;\n const bounds = displayElement?.getBoundingClientRect() || null;\n const registeredElement = displayElement\n ? options.getRegisteredElement?.(displayElement)\n : undefined;\n\n return {\n active,\n toggle,\n hoveredElement,\n selectedElement,\n setSelectedElement,\n displayElement,\n bounds,\n registeredElement,\n clearSelection: () => {\n setSelectedElement(null);\n },\n };\n}\n\n/**\n * Inspector component\n *\n * Full inspector UI with overlay and info panel.\n */\nexport interface InspectorProps {\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Initial active state */\n initialActive?: boolean;\n}\n\nexport function Inspector({ getRegisteredElement, initialActive }: InspectorProps) {\n const inspector = useInspector({\n getRegisteredElement,\n });\n\n // Set initial state\n useEffect(() => {\n if (initialActive && !inspector.active) {\n inspector.toggle();\n }\n }, [initialActive]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!inspector.active) return null;\n\n return (\n <>\n {inspector.bounds && (\n <InspectorOverlay\n bounds={inspector.bounds}\n label={inspector.displayElement ? getBestIdentifier(inspector.displayElement) : ''}\n />\n )}\n {inspector.selectedElement && (\n <InfoPanel\n element={inspector.selectedElement}\n onClose={inspector.clearSelection}\n registeredElement={inspector.registeredElement}\n />\n )}\n </>\n );\n}\n","/**\n * Browser Event Capture Types\n *\n * Discriminated union of all browser-side events captured for debugging.\n */\n\n// ---------------------------------------------------------------------------\n// Event type discriminator\n// ---------------------------------------------------------------------------\n\nexport type BrowserEventType =\n | 'console'\n | 'network'\n | 'react-error'\n | 'navigation'\n | 'long-task'\n | 'long-animation-frame'\n | 'resource-error'\n | 'web-vital'\n | 'memory'\n | 'ws-disconnection'\n | 'hmr';\n\n// ---------------------------------------------------------------------------\n// Base interface (all events share these fields)\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCapturedEvent {\n type: BrowserEventType;\n timestamp: number;\n url: string;\n}\n\n// ---------------------------------------------------------------------------\n// Per-type event interfaces\n// ---------------------------------------------------------------------------\n\nexport interface ConsoleCapturedEvent extends BrowserCapturedEvent {\n type: 'console';\n level: 'error' | 'warn' | 'unhandledrejection';\n message: string;\n stack?: string;\n}\n\nexport interface NetworkCapturedEvent extends BrowserCapturedEvent {\n type: 'network';\n method: string;\n requestUrl: string;\n status?: number;\n statusText?: string;\n durationMs: number;\n kind: 'http-error' | 'network-error' | 'timeout' | 'cors' | 'abort';\n errorMessage?: string;\n}\n\nexport interface ReactErrorCapturedEvent extends BrowserCapturedEvent {\n type: 'react-error';\n message: string;\n stack?: string;\n componentStack?: string;\n}\n\nexport interface NavigationCapturedEvent extends BrowserCapturedEvent {\n type: 'navigation';\n from: string;\n to: string;\n trigger: 'pushState' | 'replaceState' | 'popstate';\n}\n\nexport interface LongTaskCapturedEvent extends BrowserCapturedEvent {\n type: 'long-task';\n durationMs: number;\n}\n\nexport interface ResourceErrorCapturedEvent extends BrowserCapturedEvent {\n type: 'resource-error';\n resourceUrl: string;\n tagName: string;\n}\n\nexport interface WebVitalCapturedEvent extends BrowserCapturedEvent {\n type: 'web-vital';\n metric: 'LCP' | 'CLS';\n value: number;\n}\n\nexport interface MemoryCapturedEvent extends BrowserCapturedEvent {\n type: 'memory';\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n}\n\nexport interface WsDisconnectionCapturedEvent extends BrowserCapturedEvent {\n type: 'ws-disconnection';\n previousState: string;\n newState: string;\n reconnectAttempt?: number;\n}\n\nexport interface HmrCapturedEvent extends BrowserCapturedEvent {\n type: 'hmr';\n level: 'error' | 'warning';\n message: string;\n /** Source file that caused the error, if available */\n moduleName?: string;\n /** Source location (line:col), if available */\n loc?: string;\n}\n\nexport interface LoafScriptAttribution {\n invoker: string;\n sourceURL: string;\n sourceFunctionName: string;\n sourceCharPosition: number;\n duration: number;\n}\n\nexport interface LoafCapturedEvent extends BrowserCapturedEvent {\n type: 'long-animation-frame';\n durationMs: number;\n blockingDurationMs: number;\n scripts: LoafScriptAttribution[];\n}\n\n// ---------------------------------------------------------------------------\n// Union type\n// ---------------------------------------------------------------------------\n\nexport type AnyCapturedEvent =\n | ConsoleCapturedEvent\n | NetworkCapturedEvent\n | ReactErrorCapturedEvent\n | NavigationCapturedEvent\n | LongTaskCapturedEvent\n | LoafCapturedEvent\n | ResourceErrorCapturedEvent\n | WebVitalCapturedEvent\n | MemoryCapturedEvent\n | WsDisconnectionCapturedEvent\n | HmrCapturedEvent;\n\n// ---------------------------------------------------------------------------\n// Callback\n// ---------------------------------------------------------------------------\n\nexport type OnBrowserEventCallback = (event: AnyCapturedEvent) => void;\n\n// ---------------------------------------------------------------------------\n// Backward-compat alias: CapturedError\n// ActionExecutor uses this in ControlActionResponse.consoleErrors\n// ---------------------------------------------------------------------------\n\nexport interface CapturedError {\n timestamp: number;\n level: 'error' | 'warn' | 'unhandledrejection';\n message: string;\n stack?: string;\n}\n\n/**\n * @deprecated Use OnBrowserEventCallback instead\n */\nexport type OnCaptureCallback = (entry: CapturedError) => void;\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCaptureConfig {\n /** Capture console.error/warn + unhandled rejections. Default: true */\n console?: boolean;\n /** Capture failed fetch requests (4xx/5xx/network errors). Default: true */\n network?: boolean;\n /** Capture History API navigation. Default: true */\n navigation?: boolean;\n /** Capture PerformanceObserver long tasks. Default: true */\n longTasks?: boolean;\n /** Capture Long Animation Frames (LoAF) with script attribution. Default: true */\n longAnimationFrames?: boolean;\n /** Capture failed resource loads (img/script/link). Default: true */\n resourceErrors?: boolean;\n /** Capture WebSocket disconnection events. Default: true */\n wsDisconnections?: boolean;\n /** Capture Next.js HMR compilation errors/warnings via EventSource. Default: true */\n hmr?: boolean;\n /** Capture Web Vitals (LCP, CLS). Default: false (opt-in) */\n webVitals?: boolean;\n /** Capture Chrome memory snapshots. Default: false (opt-in) */\n memory?: boolean;\n\n /** Advanced: network capture options */\n networkOptions?: {\n /** URL patterns to ignore (substrings). Defaults to dev-debug/ui-bridge endpoints. */\n ignorePatterns?: string[];\n };\n /** Advanced: memory polling interval in ms. Default: 30000 */\n memoryIntervalMs?: number;\n /** Maximum buffer size. Default: 200 */\n maxEntries?: number;\n}\n\nexport const DEFAULT_CAPTURE_CONFIG: Required<\n Pick<\n BrowserCaptureConfig,\n | 'console'\n | 'network'\n | 'navigation'\n | 'longTasks'\n | 'longAnimationFrames'\n | 'resourceErrors'\n | 'wsDisconnections'\n | 'hmr'\n | 'webVitals'\n | 'memory'\n | 'memoryIntervalMs'\n | 'maxEntries'\n >\n> = {\n console: true,\n network: true,\n navigation: true,\n longTasks: true,\n longAnimationFrames: true,\n resourceErrors: true,\n wsDisconnections: true,\n hmr: true,\n webVitals: false,\n memory: false,\n memoryIntervalMs: 30000,\n maxEntries: 200,\n};\n","/**\n * Console Capture Sub-module\n *\n * Wraps console.error/console.warn and listens for unhandledrejection events.\n */\n\nimport type { ConsoleCapturedEvent, AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nfunction argsToMessage(args: unknown[]): string {\n return args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ');\n}\n\nfunction extractStack(args: unknown[]): string | undefined {\n const err = args.find((a) => a instanceof Error) as Error | undefined;\n return err?.stack;\n}\n\nfunction makeEvent(\n level: ConsoleCapturedEvent['level'],\n message: string,\n stack?: string\n): ConsoleCapturedEvent {\n return {\n type: 'console',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n level,\n message,\n stack,\n };\n}\n\nexport function installConsoleCapture(emit: Emit): () => void {\n const originalError = console.error;\n const originalWarn = console.warn;\n\n console.error = (...args: unknown[]) => {\n emit(makeEvent('error', argsToMessage(args), extractStack(args)));\n originalError.apply(console, args);\n };\n\n console.warn = (...args: unknown[]) => {\n emit(makeEvent('warn', argsToMessage(args), extractStack(args)));\n originalWarn.apply(console, args);\n };\n\n const rejectionHandler = (event: PromiseRejectionEvent) => {\n const reason = event.reason;\n const message =\n reason instanceof Error ? reason.message : String(reason ?? 'Unhandled rejection');\n const stack = reason instanceof Error ? reason.stack : undefined;\n emit(makeEvent('unhandledrejection', message, stack));\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('unhandledrejection', rejectionHandler);\n }\n\n return () => {\n console.error = originalError;\n console.warn = originalWarn;\n if (typeof window !== 'undefined') {\n window.removeEventListener('unhandledrejection', rejectionHandler);\n }\n };\n}\n","/**\n * Network Capture Sub-module\n *\n * Wraps window.fetch to emit events on failure only (4xx/5xx, network error,\n * timeout, CORS, abort). Coexists with other fetch wrappers (e.g., DevDebugLogger)\n * by chaining rather than replacing.\n */\n\nimport type { NetworkCapturedEvent, AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\ninterface NetworkOptions {\n ignorePatterns?: string[];\n}\n\nconst DEFAULT_IGNORE = ['/api/dev-debug/', '/api/ui-bridge/', 'localhost:9876'];\n\nexport function installNetworkCapture(emit: Emit, options?: NetworkOptions): () => void {\n if (typeof window === 'undefined' || typeof window.fetch !== 'function') {\n return () => {};\n }\n\n const originalFetch = window.fetch;\n const ignorePatterns = options?.ignorePatterns ?? DEFAULT_IGNORE;\n\n function shouldIgnore(url: string): boolean {\n return ignorePatterns.some((p) => url.includes(p));\n }\n\n function getMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase();\n if (input instanceof Request) return input.method.toUpperCase();\n return 'GET';\n }\n\n function getUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n if (input instanceof Request) return input.url;\n return String(input);\n }\n\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const requestUrl = getUrl(input);\n if (shouldIgnore(requestUrl)) {\n return originalFetch.call(window, input, init);\n }\n\n const method = getMethod(input, init);\n const start = performance.now();\n\n try {\n const response = await originalFetch.call(window, input, init);\n const durationMs = Math.round(performance.now() - start);\n\n if (response.status >= 400) {\n const event: NetworkCapturedEvent = {\n type: 'network',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n method,\n requestUrl,\n status: response.status,\n statusText: response.statusText,\n durationMs,\n kind: 'http-error',\n };\n emit(event);\n }\n\n return response;\n } catch (err) {\n const durationMs = Math.round(performance.now() - start);\n const errorMessage = err instanceof Error ? err.message : String(err);\n\n let kind: NetworkCapturedEvent['kind'] = 'network-error';\n if (err instanceof DOMException && err.name === 'AbortError') {\n kind = 'abort';\n } else if (errorMessage.includes('CORS') || errorMessage.includes('cross-origin')) {\n kind = 'cors';\n } else if (errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n kind = 'timeout';\n }\n\n const event: NetworkCapturedEvent = {\n type: 'network',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n method,\n requestUrl,\n durationMs,\n kind,\n errorMessage,\n };\n emit(event);\n\n throw err;\n }\n };\n\n return () => {\n window.fetch = originalFetch;\n };\n}\n","/**\n * Navigation Capture Sub-module\n *\n * Patches history.pushState/replaceState and listens for popstate events\n * to emit navigation events with from/to URLs and trigger type.\n */\n\nimport type { NavigationCapturedEvent, AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installNavigationCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof history === 'undefined') {\n return () => {};\n }\n\n let lastUrl = window.location.href;\n\n function emitNav(to: string, trigger: NavigationCapturedEvent['trigger']) {\n const from = lastUrl;\n lastUrl = to;\n if (from === to) return;\n emit({\n type: 'navigation',\n timestamp: Date.now(),\n url: to,\n from,\n to,\n trigger,\n });\n }\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n originalPushState.apply(this, args);\n emitNav(window.location.href, 'pushState');\n };\n\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n originalReplaceState.apply(this, args);\n emitNav(window.location.href, 'replaceState');\n };\n\n const popstateHandler = () => {\n emitNav(window.location.href, 'popstate');\n };\n window.addEventListener('popstate', popstateHandler);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', popstateHandler);\n };\n}\n","/**\n * Long Task Capture Sub-module\n *\n * Uses PerformanceObserver to capture long tasks (>50ms).\n * Graceful no-op if PerformanceObserver or the 'longtask' type is not supported.\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installLongTaskCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n return () => {};\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n emit({\n type: 'long-task',\n timestamp: Date.now(),\n url: window.location.href,\n durationMs: Math.round(entry.duration),\n });\n }\n });\n\n observer.observe({ type: 'longtask', buffered: true });\n\n return () => {\n observer.disconnect();\n };\n } catch {\n // 'longtask' type not supported in this browser\n return () => {};\n }\n}\n","/**\n * Resource Error Capture Sub-module\n *\n * Listens for resource load failures (img, script, link) using the\n * window 'error' event in capture phase (these don't bubble).\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nconst TRACKED_TAGS = new Set(['IMG', 'SCRIPT', 'LINK']);\n\nexport function installResourceErrorCapture(emit: Emit): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const handler = (event: Event) => {\n const target = event.target as HTMLElement | null;\n if (!target || !target.tagName) return;\n if (!TRACKED_TAGS.has(target.tagName)) return;\n\n const resourceUrl =\n (target as HTMLImageElement).src ||\n (target as HTMLScriptElement).src ||\n (target as HTMLLinkElement).href ||\n '';\n\n if (!resourceUrl) return;\n\n emit({\n type: 'resource-error',\n timestamp: Date.now(),\n url: window.location.href,\n resourceUrl,\n tagName: target.tagName,\n });\n };\n\n // Must use capture phase — resource errors don't bubble\n window.addEventListener('error', handler, true);\n\n return () => {\n window.removeEventListener('error', handler, true);\n };\n}\n","/**\n * Web Vitals Capture Sub-module\n *\n * Captures LCP (Largest Contentful Paint) and CLS (Cumulative Layout Shift)\n * using PerformanceObserver. Simplified implementation — no npm dependency.\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installWebVitalsCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n return () => {};\n }\n\n const observers: PerformanceObserver[] = [];\n\n // LCP — report the last entry (largest contentful paint)\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const last = entries[entries.length - 1];\n if (last) {\n emit({\n type: 'web-vital',\n timestamp: Date.now(),\n url: window.location.href,\n metric: 'LCP',\n value: Math.round(last.startTime),\n });\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // Not supported\n }\n\n // CLS — accumulate layout shift values\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // Only count shifts without recent input\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n }\n }\n emit({\n type: 'web-vital',\n timestamp: Date.now(),\n url: window.location.href,\n metric: 'CLS',\n value: Math.round(clsValue * 1000) / 1000,\n });\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // Not supported\n }\n\n return () => {\n for (const obs of observers) {\n obs.disconnect();\n }\n };\n}\n","/**\n * Memory Capture Sub-module\n *\n * Periodically snapshots performance.memory (Chrome-only, non-standard).\n * No-op if the API is unavailable.\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\ninterface PerformanceMemory {\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n}\n\nexport function installMemoryCapture(emit: Emit, intervalMs = 30000): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const perf = performance as Performance & { memory?: PerformanceMemory };\n if (!perf.memory) {\n return () => {};\n }\n\n const tick = () => {\n const mem = perf.memory;\n if (!mem) return;\n emit({\n type: 'memory',\n timestamp: Date.now(),\n url: window.location.href,\n usedJSHeapSize: mem.usedJSHeapSize,\n totalJSHeapSize: mem.totalJSHeapSize,\n jsHeapSizeLimit: mem.jsHeapSizeLimit,\n });\n };\n\n // Emit initial snapshot immediately\n tick();\n const id = setInterval(tick, intervalMs);\n\n return () => {\n clearInterval(id);\n };\n}\n","/**\n * HMR Capture Sub-module\n *\n * Intercepts HMR connections to Next.js dev server endpoints and emits\n * compilation errors/warnings into the unified event pipeline.\n *\n * Next.js 15+ uses WebSocket for HMR (at ws://host/_next/webpack-hmr).\n * Older versions (≤14) used EventSource (at /_next/webpack-hmr).\n * Turbopack variants use /__turbopack_hmr or /_next/turbopack-hmr.\n *\n * Strategy: Wrap the WebSocket and EventSource constructors so any HMR\n * connection created by the bundler is automatically intercepted.\n */\n\nimport type { AnyCapturedEvent, HmrCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\n// Path patterns that identify HMR connections (used for both WS and SSE)\nconst HMR_PATH_PATTERNS = ['/_next/webpack-hmr', '/__turbopack_hmr', '/_next/turbopack-hmr'];\n\nfunction isHmrUrl(url: string): boolean {\n return HMR_PATH_PATTERNS.some((p) => url.includes(p));\n}\n\nfunction makeEvent(\n level: HmrCapturedEvent['level'],\n message: string,\n moduleName?: string,\n loc?: string\n): HmrCapturedEvent {\n return {\n type: 'hmr',\n level,\n message,\n moduleName,\n loc,\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n };\n}\n\n/**\n * Parse an HMR message (JSON string) and emit any errors/warnings.\n * Handles both Next.js webpack format and turbopack format.\n */\nfunction processHmrMessage(data: string, emit: Emit): void {\n try {\n const msg = JSON.parse(data);\n\n // Next.js webpack format (action: \"sync\" or \"built\"):\n // { action: \"sync\"|\"built\", errors: CompilationError[], warnings: CompilationError[] }\n // CompilationError: { message, moduleName, details, moduleTrace, stack }\n if (Array.isArray(msg.errors)) {\n for (const err of msg.errors) {\n emit(\n makeEvent(\n 'error',\n typeof err === 'string' ? err : (err.message ?? String(err)),\n err.moduleName ?? err.moduleIdentifier,\n err.loc ? String(err.loc) : undefined\n )\n );\n }\n }\n if (Array.isArray(msg.warnings)) {\n for (const warn of msg.warnings) {\n emit(\n makeEvent(\n 'warning',\n typeof warn === 'string' ? warn : (warn.message ?? String(warn)),\n warn.moduleName ?? warn.moduleIdentifier,\n warn.loc ? String(warn.loc) : undefined\n )\n );\n }\n }\n\n // Next.js serverError format: { action: \"serverError\", errorJSON: \"...\" }\n if (msg.action === 'serverError' && msg.errorJSON) {\n try {\n const err = JSON.parse(msg.errorJSON);\n emit(makeEvent('error', err.message ?? String(err)));\n } catch {\n emit(makeEvent('error', msg.errorJSON));\n }\n }\n\n // Turbopack format: { type: \"turbopack-message\", data: { diagnostics: [...] } }\n if (\n (msg.action === 'turbopack-message' || msg.type === 'turbopack-message') &&\n msg.data?.diagnostics\n ) {\n for (const diag of msg.data.diagnostics) {\n emit(\n makeEvent(\n diag.category === 'warning' ? 'warning' : 'error',\n diag.message ?? String(diag),\n diag.filePath,\n diag.line != null ? `${diag.line}:${diag.column ?? 0}` : undefined\n )\n );\n }\n }\n } catch {\n // Not JSON or unexpected format — ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket interception (Next.js 15+)\n// ---------------------------------------------------------------------------\n\nfunction installWebSocketCapture(emit: Emit, cleanups: (() => void)[]): void {\n if (!window.WebSocket) return;\n\n const OriginalWebSocket = window.WebSocket;\n const trackedSockets: WebSocket[] = [];\n\n // Wrap WebSocket constructor to intercept HMR connections\n const PatchedWebSocket = function (\n this: WebSocket,\n url: string | URL,\n protocols?: string | string[]\n ) {\n const ws = new OriginalWebSocket(url, protocols);\n const urlStr = typeof url === 'string' ? url : url.toString();\n\n if (isHmrUrl(urlStr)) {\n ws.addEventListener('message', (event: MessageEvent) => {\n if (typeof event.data === 'string') {\n processHmrMessage(event.data, emit);\n }\n });\n trackedSockets.push(ws);\n }\n\n return ws;\n } as unknown as typeof WebSocket;\n\n PatchedWebSocket.prototype = OriginalWebSocket.prototype;\n Object.defineProperty(PatchedWebSocket, 'CONNECTING', { value: OriginalWebSocket.CONNECTING });\n Object.defineProperty(PatchedWebSocket, 'OPEN', { value: OriginalWebSocket.OPEN });\n Object.defineProperty(PatchedWebSocket, 'CLOSING', { value: OriginalWebSocket.CLOSING });\n Object.defineProperty(PatchedWebSocket, 'CLOSED', { value: OriginalWebSocket.CLOSED });\n\n window.WebSocket = PatchedWebSocket;\n\n cleanups.push(() => {\n window.WebSocket = OriginalWebSocket;\n for (const ws of trackedSockets) {\n ws.close();\n }\n trackedSockets.length = 0;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventSource interception (Next.js ≤14 / fallback)\n// ---------------------------------------------------------------------------\n\nfunction installEventSourceCapture(emit: Emit, cleanups: (() => void)[]): void {\n if (!window.EventSource) return;\n\n const OriginalEventSource = window.EventSource;\n const trackedSources: EventSource[] = [];\n\n const messageHandler = (event: MessageEvent) => {\n if (typeof event.data === 'string') {\n processHmrMessage(event.data, emit);\n }\n };\n\n // Wrap EventSource constructor to intercept HMR connections\n const PatchedEventSource = function (\n this: EventSource,\n url: string | URL,\n init?: EventSourceInit\n ) {\n const es = new OriginalEventSource(url, init);\n const urlStr = typeof url === 'string' ? url : url.toString();\n\n if (isHmrUrl(urlStr)) {\n es.addEventListener('message', messageHandler);\n trackedSources.push(es);\n }\n\n return es;\n } as unknown as typeof EventSource;\n\n PatchedEventSource.prototype = OriginalEventSource.prototype;\n Object.defineProperty(PatchedEventSource, 'CONNECTING', {\n value: OriginalEventSource.CONNECTING,\n });\n Object.defineProperty(PatchedEventSource, 'OPEN', { value: OriginalEventSource.OPEN });\n Object.defineProperty(PatchedEventSource, 'CLOSED', { value: OriginalEventSource.CLOSED });\n\n window.EventSource = PatchedEventSource;\n\n cleanups.push(() => {\n window.EventSource = OriginalEventSource;\n for (const es of trackedSources) {\n es.close();\n }\n trackedSources.length = 0;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function installHmrCapture(emit: Emit): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const cleanups: (() => void)[] = [];\n\n // Install both transports — the one matching the bundler will intercept\n installWebSocketCapture(emit, cleanups); // Next.js 15+\n installEventSourceCapture(emit, cleanups); // Next.js ≤14 / other bundlers\n\n return () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n };\n}\n","/**\n * Long Animation Frame (LoAF) Capture Sub-module\n *\n * Uses PerformanceObserver to capture long animation frames (Chrome 123+)\n * with per-script attribution: which script file, function, and duration.\n * Graceful no-op if unsupported.\n */\n\nimport type { AnyCapturedEvent, LoafScriptAttribution } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installLoafCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n return () => {};\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const scripts: LoafScriptAttribution[] = (\n (entry as unknown as { scripts?: unknown[] }).scripts ?? []\n ).map((s: unknown) => {\n const script = s as Record<string, unknown>;\n return {\n invoker: (script.invoker as string) ?? '',\n sourceURL: (script.sourceURL as string) ?? '',\n sourceFunctionName: (script.sourceFunctionName as string) ?? '',\n sourceCharPosition: (script.sourceCharPosition as number) ?? 0,\n duration: Math.round((script.duration as number) ?? 0),\n };\n });\n\n emit({\n type: 'long-animation-frame',\n timestamp: Date.now(),\n url: window.location.href,\n durationMs: Math.round(entry.duration),\n blockingDurationMs: Math.round(\n (entry as unknown as { blockingDuration?: number }).blockingDuration ?? 0\n ),\n scripts,\n });\n }\n });\n\n observer.observe({ type: 'long-animation-frame' as string, buffered: true });\n\n return () => {\n observer.disconnect();\n };\n } catch {\n // 'long-animation-frame' type not supported in this browser\n return () => {};\n }\n}\n","/**\n * Browser Event Capture Orchestrator\n *\n * Single entry point that delegates to focused sub-modules.\n * Replaces the old ConsoleCapture class with unified event capture.\n */\n\nimport type {\n AnyCapturedEvent,\n BrowserCaptureConfig,\n BrowserEventType,\n CapturedError,\n OnBrowserEventCallback,\n} from './browser-capture-types';\nimport { DEFAULT_CAPTURE_CONFIG } from './browser-capture-types';\nimport { installConsoleCapture } from './captures/console';\nimport { installNetworkCapture } from './captures/network';\nimport { installNavigationCapture } from './captures/navigation';\nimport { installLongTaskCapture } from './captures/long-tasks';\nimport { installResourceErrorCapture } from './captures/resource-errors';\nimport { installWebVitalsCapture } from './captures/web-vitals';\nimport { installMemoryCapture } from './captures/memory';\nimport { installHmrCapture } from './captures/hmr';\nimport { installLoafCapture } from './captures/long-animation-frames';\n\nexport class BrowserEventCapture {\n private buffer: AnyCapturedEvent[] = [];\n private maxEntries: number;\n private installed = false;\n private cleanups: (() => void)[] = [];\n private onEvent: OnBrowserEventCallback | null = null;\n private config: BrowserCaptureConfig;\n\n constructor(config?: BrowserCaptureConfig) {\n this.config = config ?? {};\n this.maxEntries = config?.maxEntries ?? DEFAULT_CAPTURE_CONFIG.maxEntries;\n }\n\n setOnEvent(cb: OnBrowserEventCallback | null): void {\n this.onEvent = cb;\n }\n\n /**\n * Install all enabled capture sub-modules.\n * Safe to call multiple times (no-ops if already installed).\n */\n install(): void {\n if (this.installed) return;\n\n const cfg = { ...DEFAULT_CAPTURE_CONFIG, ...this.config };\n const emit = (event: AnyCapturedEvent) => {\n this.buffer.push(event);\n this.trim();\n this.onEvent?.(event);\n };\n\n if (cfg.console) {\n this.cleanups.push(installConsoleCapture(emit));\n }\n if (cfg.network) {\n this.cleanups.push(installNetworkCapture(emit, cfg.networkOptions));\n }\n if (cfg.navigation) {\n this.cleanups.push(installNavigationCapture(emit));\n }\n if (cfg.longTasks) {\n this.cleanups.push(installLongTaskCapture(emit));\n }\n if (cfg.longAnimationFrames) {\n this.cleanups.push(installLoafCapture(emit));\n }\n if (cfg.resourceErrors) {\n this.cleanups.push(installResourceErrorCapture(emit));\n }\n if (cfg.webVitals) {\n this.cleanups.push(installWebVitalsCapture(emit));\n }\n if (cfg.memory) {\n this.cleanups.push(installMemoryCapture(emit, cfg.memoryIntervalMs));\n }\n if (cfg.hmr) {\n this.cleanups.push(installHmrCapture(emit));\n }\n\n this.installed = true;\n }\n\n /**\n * Uninstall all capture sub-modules.\n */\n uninstall(): void {\n if (!this.installed) return;\n for (const cleanup of this.cleanups) {\n cleanup();\n }\n this.cleanups = [];\n this.installed = false;\n }\n\n // -------------------------------------------------------------------------\n // Manual event reporting (for events that can't be auto-captured)\n // -------------------------------------------------------------------------\n\n reportReactError(error: Error, errorInfo: { componentStack?: string }): void {\n const event: AnyCapturedEvent = {\n type: 'react-error',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n message: error.message,\n stack: error.stack,\n componentStack: errorInfo.componentStack,\n };\n this.buffer.push(event);\n this.trim();\n this.onEvent?.(event);\n }\n\n reportWsStateChange(prev: string, next: string, reconnectAttempt?: number): void {\n // Only emit on actual disconnections\n if (next === 'disconnected' || next === 'error') {\n const event: AnyCapturedEvent = {\n type: 'ws-disconnection',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n previousState: prev,\n newState: next,\n reconnectAttempt,\n };\n this.buffer.push(event);\n this.trim();\n this.onEvent?.(event);\n }\n }\n\n // -------------------------------------------------------------------------\n // Query methods\n // -------------------------------------------------------------------------\n\n getSince(ts: number): AnyCapturedEvent[] {\n return this.buffer.filter((e) => e.timestamp >= ts);\n }\n\n getRecent(n = 50): AnyCapturedEvent[] {\n return this.buffer.slice(-n);\n }\n\n getByType(type: BrowserEventType): AnyCapturedEvent[] {\n return this.buffer.filter((e) => e.type === type);\n }\n\n /**\n * Get console errors since a timestamp (backward-compat for ActionExecutor).\n */\n getConsoleSince(ts: number): CapturedError[] {\n return this.buffer\n .filter((e) => (e.type === 'console' || e.type === 'hmr') && e.timestamp >= ts)\n .map((e) => ({\n timestamp: e.timestamp,\n level:\n e.type === 'hmr'\n ? e.level === 'warning'\n ? 'warn'\n : e.level\n : (e as { level: CapturedError['level'] }).level,\n message: (e as { message: string }).message,\n stack: (e as { stack?: string }).stack,\n }));\n }\n\n /**\n * Get recent console errors (backward-compat for ActionExecutor).\n */\n getConsoleRecent(n = 50): CapturedError[] {\n return this.buffer\n .filter((e) => e.type === 'console' || e.type === 'hmr')\n .slice(-n)\n .map((e) => ({\n timestamp: e.timestamp,\n level:\n e.type === 'hmr'\n ? e.level === 'warning'\n ? 'warn'\n : e.level\n : (e as { level: CapturedError['level'] }).level,\n message: (e as { message: string }).message,\n stack: (e as { stack?: string }).stack,\n }));\n }\n\n clear(): void {\n this.buffer = [];\n }\n\n private trim(): void {\n if (this.buffer.length > this.maxEntries) {\n this.buffer = this.buffer.slice(-this.maxEntries);\n }\n }\n}\n","/**\n * Metrics Module\n *\n * Performance metrics and action history tracking.\n */\n\nimport type { BridgeEvent } from '../core/types';\nimport type {\n ControlActionResponse,\n ComponentActionResponse,\n WorkflowStepResult,\n} from '../control/types';\n\n/**\n * Action history entry\n */\nexport interface ActionHistoryEntry {\n /** Unique entry ID */\n id: string;\n /** Timestamp */\n timestamp: number;\n /** Action type */\n type: 'element' | 'component' | 'workflow-step';\n /** Target ID */\n target: string;\n /** Action name */\n action: string;\n /** Whether the action succeeded */\n success: boolean;\n /** Duration in milliseconds */\n durationMs: number;\n /** Error message if failed */\n error?: string;\n /** Action parameters */\n params?: Record<string, unknown>;\n /** Response data */\n response?: unknown;\n}\n\n/**\n * Performance metrics\n */\nexport interface PerformanceMetrics {\n /** Total actions executed */\n totalActions: number;\n /** Successful actions */\n successfulActions: number;\n /** Failed actions */\n failedActions: number;\n /** Success rate (0-1) */\n successRate: number;\n /** Average action duration */\n avgDurationMs: number;\n /** Minimum action duration */\n minDurationMs: number;\n /** Maximum action duration */\n maxDurationMs: number;\n /** 95th percentile duration */\n p95DurationMs: number;\n /** Actions per second (last minute) */\n actionsPerSecond: number;\n /** Errors by type */\n errorsByType: Record<string, number>;\n /** Actions by type */\n actionsByType: Record<string, number>;\n}\n\n/**\n * Metrics collector options\n */\nexport interface MetricsCollectorOptions {\n /** Maximum history entries to keep */\n maxHistoryEntries?: number;\n /** Window for rate calculations (ms) */\n rateWindow?: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Metrics collector\n *\n * Collects and aggregates performance metrics.\n */\nexport class MetricsCollector {\n private history: ActionHistoryEntry[] = [];\n private maxHistoryEntries: number;\n private rateWindow: number;\n\n constructor(options: MetricsCollectorOptions = {}) {\n this.maxHistoryEntries = options.maxHistoryEntries ?? 1000;\n this.rateWindow = options.rateWindow ?? 60000; // 1 minute\n }\n\n /**\n * Record an element action\n */\n recordElementAction(\n target: string,\n action: string,\n response: ControlActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'element',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.elementState,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a component action\n */\n recordComponentAction(\n target: string,\n action: string,\n response: ComponentActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'component',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a workflow step\n */\n recordWorkflowStep(workflowId: string, result: WorkflowStepResult): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: result.timestamp,\n type: 'workflow-step',\n target: workflowId,\n action: result.stepId,\n success: result.success,\n durationMs: result.durationMs,\n error: result.error,\n response: result.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record from a bridge event\n */\n recordEvent(event: BridgeEvent): void {\n if (event.type === 'action:completed' || event.type === 'action:failed') {\n const data = event.data as {\n elementId?: string;\n componentId?: string;\n action: string;\n response: ControlActionResponse | ComponentActionResponse;\n params?: Record<string, unknown>;\n };\n\n if (data.elementId) {\n this.recordElementAction(\n data.elementId,\n data.action,\n data.response as ControlActionResponse,\n data.params\n );\n } else if (data.componentId) {\n this.recordComponentAction(\n data.componentId,\n data.action,\n data.response as ComponentActionResponse,\n data.params\n );\n }\n }\n }\n\n /**\n * Get action history\n */\n getHistory(options?: {\n type?: 'element' | 'component' | 'workflow-step';\n target?: string;\n action?: string;\n success?: boolean;\n since?: number;\n limit?: number;\n }): ActionHistoryEntry[] {\n let results = [...this.history];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.target) {\n results = results.filter((e) => e.target === options.target);\n }\n if (options?.action) {\n results = results.filter((e) => e.action === options.action);\n }\n if (options?.success !== undefined) {\n results = results.filter((e) => e.success === options.success);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n /**\n * Get performance metrics\n */\n getMetrics(since?: number): PerformanceMetrics {\n const entries = since ? this.history.filter((e) => e.timestamp >= since) : this.history;\n\n if (entries.length === 0) {\n return {\n totalActions: 0,\n successfulActions: 0,\n failedActions: 0,\n successRate: 0,\n avgDurationMs: 0,\n minDurationMs: 0,\n maxDurationMs: 0,\n p95DurationMs: 0,\n actionsPerSecond: 0,\n errorsByType: {},\n actionsByType: {},\n };\n }\n\n const successful = entries.filter((e) => e.success);\n const failed = entries.filter((e) => !e.success);\n const durations = entries.map((e) => e.durationMs).sort((a, b) => a - b);\n\n // Calculate actions per second in the rate window\n const now = Date.now();\n const windowStart = now - this.rateWindow;\n const recentActions = this.history.filter((e) => e.timestamp >= windowStart);\n const windowSeconds = this.rateWindow / 1000;\n\n // Error aggregation\n const errorsByType: Record<string, number> = {};\n for (const entry of failed) {\n const errorType = entry.error?.split(':')[0] || 'Unknown';\n errorsByType[errorType] = (errorsByType[errorType] || 0) + 1;\n }\n\n // Action aggregation\n const actionsByType: Record<string, number> = {};\n for (const entry of entries) {\n const key = `${entry.type}:${entry.action}`;\n actionsByType[key] = (actionsByType[key] || 0) + 1;\n }\n\n return {\n totalActions: entries.length,\n successfulActions: successful.length,\n failedActions: failed.length,\n successRate: successful.length / entries.length,\n avgDurationMs: durations.reduce((a, b) => a + b, 0) / durations.length,\n minDurationMs: durations[0],\n maxDurationMs: durations[durations.length - 1],\n p95DurationMs: durations[Math.floor(durations.length * 0.95)],\n actionsPerSecond: recentActions.length / windowSeconds,\n errorsByType,\n actionsByType,\n };\n }\n\n /**\n * Get recent errors\n */\n getRecentErrors(limit = 10): ActionHistoryEntry[] {\n return this.history.filter((e) => !e.success).slice(-limit);\n }\n\n /**\n * Get slowest actions\n */\n getSlowestActions(limit = 10): ActionHistoryEntry[] {\n return [...this.history].sort((a, b) => b.durationMs - a.durationMs).slice(0, limit);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Export history as JSON\n */\n exportHistory(): string {\n return JSON.stringify(this.history, null, 2);\n }\n\n /**\n * Import history from JSON\n */\n importHistory(json: string): void {\n const entries = JSON.parse(json) as ActionHistoryEntry[];\n this.history = entries.slice(-this.maxHistoryEntries);\n }\n\n private addEntry(entry: ActionHistoryEntry): void {\n this.history.push(entry);\n while (this.history.length > this.maxHistoryEntries) {\n this.history.shift();\n }\n }\n}\n\n/**\n * Create a metrics collector\n */\nexport function createMetricsCollector(options?: MetricsCollectorOptions): MetricsCollector {\n return new MetricsCollector(options);\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1) return '<1ms';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n/**\n * Format percentage for display\n */\nexport function formatPercentage(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n"]}
|