@qontinui/ui-bridge 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.d.mts +4 -4
- package/dist/ai/index.d.ts +4 -4
- package/dist/babel-plugin/index.js +515 -0
- package/dist/babel-plugin/index.js.map +1 -0
- package/dist/babel-plugin/index.mjs +499 -0
- package/dist/babel-plugin/index.mjs.map +1 -0
- package/dist/control/index.d.mts +5 -5
- package/dist/control/index.d.ts +5 -5
- 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 +3 -3
- package/dist/debug/index.d.ts +3 -3
- package/dist/index.d.mts +7 -8
- package/dist/index.d.ts +7 -8
- package/dist/index.js +859 -873
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +860 -862
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-C9XRi_mL.d.ts → metrics-BfiT_rhZ.d.ts} +2 -2
- package/dist/{metrics-NC3csD0R.d.mts → metrics-DTA2bwG7.d.mts} +2 -2
- package/dist/native/control/index.js +453 -0
- package/dist/native/control/index.js.map +1 -0
- package/dist/native/control/index.mjs +450 -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 +451 -0
- package/dist/native/debug/index.js.map +1 -0
- package/dist/native/debug/index.mjs +449 -0
- package/dist/native/debug/index.mjs.map +1 -0
- package/dist/native/index.js +2274 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/index.mjs +2246 -0
- package/dist/native/index.mjs.map +1 -0
- package/dist/native/react/index.js +1401 -0
- package/dist/native/react/index.js.map +1 -0
- package/dist/native/react/index.mjs +1389 -0
- package/dist/native/react/index.mjs.map +1 -0
- package/dist/native/server/index.js +415 -0
- package/dist/native/server/index.js.map +1 -0
- package/dist/native/server/index.mjs +410 -0
- package/dist/native/server/index.mjs.map +1 -0
- package/dist/react/index.d.mts +20 -7
- package/dist/react/index.d.ts +20 -7
- package/dist/react/index.js +42 -4
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +42 -4
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-CIEDjbQ9.d.ts → registry-BKLEm-yk.d.ts} +9 -15
- package/dist/{registry-SsSDq46X.d.mts → registry-BmZgyCz8.d.mts} +9 -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 +36 -0
- package/dist/server/express.d.ts +36 -0
- package/dist/server/express.js +196 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.mjs +192 -0
- package/dist/server/express.mjs.map +1 -0
- package/dist/server/handlers.d.mts +93 -0
- package/dist/server/handlers.d.ts +93 -0
- package/dist/server/handlers.js +4278 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/handlers.mjs +4275 -0
- package/dist/server/handlers.mjs.map +1 -0
- package/dist/server/index.d.mts +10 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +5352 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +5337 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/nextjs.d.mts +126 -0
- package/dist/server/nextjs.d.ts +126 -0
- package/dist/server/nextjs.js +287 -0
- package/dist/server/nextjs.js.map +1 -0
- package/dist/server/nextjs.mjs +282 -0
- package/dist/server/nextjs.mjs.map +1 -0
- package/dist/server/standalone.d.mts +6 -0
- package/dist/server/standalone.d.ts +6 -0
- package/dist/server/standalone.js +719 -0
- package/dist/server/standalone.js.map +1 -0
- package/dist/server/standalone.mjs +715 -0
- package/dist/server/standalone.mjs.map +1 -0
- package/dist/standalone-BURj8J3G.d.ts +212 -0
- package/dist/standalone-Dwmel29d.d.mts +212 -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-CFT3Dnx4.d.mts → types-B5Q0GVo0.d.mts} +115 -3
- package/dist/{types-Dr6tH-bm.d.mts → types-B7J7noLK.d.mts} +1 -1
- package/dist/{types-oCTrRxSw.d.ts → types-BkNRILUa.d.ts} +1 -1
- package/dist/types-CEQLnFMv.d.mts +156 -0
- package/dist/types-CHnlwiTK.d.ts +156 -0
- package/dist/{types-BvCfFuEV.d.ts → types-DfPqwU-i.d.ts} +115 -3
- package/dist/{types-CPMbN_Iw.d.mts → types-jKVgTI6_.d.mts} +356 -160
- package/dist/{types-CPMbN_Iw.d.ts → types-jKVgTI6_.d.ts} +356 -160
- package/package.json +106 -3
- package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
- package/dist/websocket-client-CX4QJesI.d.ts +0 -124
- package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/element-identifier.ts","../../src/ai/fuzzy-matcher.ts","../../src/ai/alias-generator.ts","../../src/core/registry.ts","../../src/core/websocket-client.ts","../../src/control/action-executor.ts","../../src/control/workflow-engine.ts","../../src/render-log/dom-capture.ts","../../src/render-log/snapshot.ts","../../src/debug/metrics.ts","../../src/react/UIBridgeProvider.tsx","../../src/react/useUIElement.ts","../../src/react/useUIComponent.ts","../../src/react/useUIBridge.ts","../../src/react/useUIState.ts","../../src/react/useUITransition.ts","../../src/react/useUINavigation.ts","../../src/react/useAutoRegister.ts","../../src/react/AutoRegisterProvider.tsx"],"names":["aliases","getElementState","isVisible","isDisabled","generateId","createContext","useRef","useState","useMemo","useEffect","useCallback","useContext","id","state","group","transition","INTERACTIVE_SELECTORS","inferElementType","inferActions","isElementVisible","jsx","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 * Fuzzy Matcher\n *\n * Provides fuzzy text matching utilities for finding elements by natural language descriptions.\n * Implements multiple matching algorithms with configurable thresholds.\n */\n\n/**\n * Configuration for fuzzy matching\n */\nexport interface FuzzyMatchConfig {\n /** Minimum similarity threshold (0-1) */\n threshold: number;\n /** Weight for Levenshtein distance */\n levenshteinWeight: number;\n /** Weight for Jaro-Winkler similarity */\n jaroWinklerWeight: number;\n /** Weight for N-gram matching */\n ngramWeight: number;\n /** N-gram size */\n ngramSize: number;\n /** Case sensitive matching */\n caseSensitive: boolean;\n /** Ignore whitespace differences */\n ignoreWhitespace: boolean;\n}\n\n/**\n * Default fuzzy match configuration\n */\nexport const DEFAULT_FUZZY_CONFIG: FuzzyMatchConfig = {\n threshold: 0.7,\n levenshteinWeight: 0.3,\n jaroWinklerWeight: 0.4,\n ngramWeight: 0.3,\n ngramSize: 2,\n caseSensitive: false,\n ignoreWhitespace: true,\n};\n\n/**\n * Result from a fuzzy match operation\n */\nexport interface FuzzyMatchResult {\n /** Overall similarity score (0-1) */\n similarity: number;\n /** Whether the match passes the threshold */\n isMatch: boolean;\n /** Individual algorithm scores */\n scores: {\n levenshtein: number;\n jaroWinkler: number;\n ngram: number;\n };\n /** Normalized source string */\n normalizedSource: string;\n /** Normalized target string */\n normalizedTarget: string;\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n */\nexport function levenshteinDistance(s1: string, s2: string): number {\n const len1 = s1.length;\n const len2 = s2.length;\n\n // Create distance matrix\n const matrix: number[][] = Array(len1 + 1)\n .fill(null)\n .map(() => Array(len2 + 1).fill(0));\n\n // Initialize first column and row\n for (let i = 0; i <= len1; i++) matrix[i][0] = i;\n for (let j = 0; j <= len2; j++) matrix[0][j] = j;\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // deletion\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n return matrix[len1][len2];\n}\n\n/**\n * Calculate Levenshtein similarity (0-1)\n */\nexport function levenshteinSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const distance = levenshteinDistance(s1, s2);\n const maxLength = Math.max(s1.length, s2.length);\n\n return 1 - distance / maxLength;\n}\n\n/**\n * Calculate Jaro similarity between two strings\n */\nexport function jaroSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const matchDistance = Math.floor(Math.max(s1.length, s2.length) / 2) - 1;\n const s1Matches = new Array(s1.length).fill(false);\n const s2Matches = new Array(s2.length).fill(false);\n\n let matches = 0;\n let transpositions = 0;\n\n // Find matches\n for (let i = 0; i < s1.length; i++) {\n const start = Math.max(0, i - matchDistance);\n const end = Math.min(i + matchDistance + 1, s2.length);\n\n for (let j = start; j < end; j++) {\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\n s1Matches[i] = true;\n s2Matches[j] = true;\n matches++;\n break;\n }\n }\n\n if (matches === 0) return 0;\n\n // Count transpositions\n let k = 0;\n for (let i = 0; i < s1.length; i++) {\n if (!s1Matches[i]) continue;\n while (!s2Matches[k]) k++;\n if (s1[i] !== s2[k]) transpositions++;\n k++;\n }\n\n return (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\n}\n\n/**\n * Calculate Jaro-Winkler similarity\n * Gives more weight to strings that match from the beginning\n */\nexport function jaroWinklerSimilarity(s1: string, s2: string, prefixScale: number = 0.1): number {\n const jaroSim = jaroSimilarity(s1, s2);\n\n // Find common prefix (up to 4 characters)\n let prefixLength = 0;\n const maxPrefix = Math.min(4, Math.min(s1.length, s2.length));\n\n for (let i = 0; i < maxPrefix; i++) {\n if (s1[i] === s2[i]) {\n prefixLength++;\n } else {\n break;\n }\n }\n\n return jaroSim + prefixLength * prefixScale * (1 - jaroSim);\n}\n\n/**\n * Generate N-grams from a string\n */\nexport function generateNgrams(s: string, n: number): Set<string> {\n const ngrams = new Set<string>();\n\n if (s.length < n) {\n ngrams.add(s);\n return ngrams;\n }\n\n for (let i = 0; i <= s.length - n; i++) {\n ngrams.add(s.substring(i, i + n));\n }\n\n return ngrams;\n}\n\n/**\n * Calculate N-gram similarity (Jaccard coefficient)\n */\nexport function ngramSimilarity(s1: string, s2: string, n: number = 2): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const ngrams1 = generateNgrams(s1, n);\n const ngrams2 = generateNgrams(s2, n);\n\n // Calculate intersection\n let intersection = 0;\n for (const ngram of ngrams1) {\n if (ngrams2.has(ngram)) {\n intersection++;\n }\n }\n\n // Jaccard coefficient: |A ∩ B| / |A ∪ B|\n const union = ngrams1.size + ngrams2.size - intersection;\n\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Normalize a string for comparison\n */\nexport function normalizeString(s: string, config: Partial<FuzzyMatchConfig> = {}): string {\n let normalized = s;\n\n // Handle case sensitivity\n if (!config.caseSensitive) {\n normalized = normalized.toLowerCase();\n }\n\n // Handle whitespace\n if (config.ignoreWhitespace !== false) {\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n }\n\n return normalized;\n}\n\n/**\n * Main fuzzy match function\n * Combines multiple algorithms for robust matching\n */\nexport function fuzzyMatch(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): FuzzyMatchResult {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n\n // Normalize strings\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Calculate individual scores\n const levenshteinScore = levenshteinSimilarity(normalizedSource, normalizedTarget);\n const jaroWinklerScore = jaroWinklerSimilarity(normalizedSource, normalizedTarget);\n const ngramScore = ngramSimilarity(normalizedSource, normalizedTarget, finalConfig.ngramSize);\n\n // Weighted combination\n const similarity =\n levenshteinScore * finalConfig.levenshteinWeight +\n jaroWinklerScore * finalConfig.jaroWinklerWeight +\n ngramScore * finalConfig.ngramWeight;\n\n return {\n similarity,\n isMatch: similarity >= finalConfig.threshold,\n scores: {\n levenshtein: levenshteinScore,\n jaroWinkler: jaroWinklerScore,\n ngram: ngramScore,\n },\n normalizedSource,\n normalizedTarget,\n };\n}\n\n/**\n * Find the best match from a list of candidates\n */\nexport function findBestMatch(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): { match: string | null; index: number; result: FuzzyMatchResult | null } {\n if (candidates.length === 0) {\n return { match: null, index: -1, result: null };\n }\n\n let bestMatch: string | null = null;\n let bestIndex = -1;\n let bestResult: FuzzyMatchResult | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch && (!bestResult || result.similarity > bestResult.similarity)) {\n bestMatch = candidates[i];\n bestIndex = i;\n bestResult = result;\n }\n }\n\n return { match: bestMatch, index: bestIndex, result: bestResult };\n}\n\n/**\n * Find all matches above threshold\n */\nexport function findAllMatches(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): Array<{ candidate: string; index: number; result: FuzzyMatchResult }> {\n const matches: Array<{ candidate: string; index: number; result: FuzzyMatchResult }> = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch) {\n matches.push({ candidate: candidates[i], index: i, result });\n }\n }\n\n // Sort by similarity descending\n matches.sort((a, b) => b.result.similarity - a.result.similarity);\n\n return matches;\n}\n\n/**\n * Check if source contains target (fuzzy)\n */\nexport function fuzzyContains(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): boolean {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Exact contains check\n if (normalizedSource.includes(normalizedTarget)) {\n return true;\n }\n\n // Word-by-word fuzzy check\n const sourceWords = normalizedSource.split(/\\s+/);\n const targetWords = normalizedTarget.split(/\\s+/);\n\n // All target words must have a fuzzy match in source\n for (const targetWord of targetWords) {\n const hasMatch = sourceWords.some((sourceWord) => {\n const result = fuzzyMatch(sourceWord, targetWord, { ...finalConfig, threshold: 0.8 });\n return result.isMatch;\n });\n\n if (!hasMatch) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Calculate word-level similarity\n * Useful for comparing phrases\n */\nexport function wordSimilarity(\n s1: string,\n s2: string,\n config: Partial<FuzzyMatchConfig> = {}\n): number {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const words1 = normalizeString(s1, finalConfig).split(/\\s+/);\n const words2 = normalizeString(s2, finalConfig).split(/\\s+/);\n\n if (words1.length === 0 && words2.length === 0) return 1;\n if (words1.length === 0 || words2.length === 0) return 0;\n\n let totalSimilarity = 0;\n let matchCount = 0;\n\n // For each word in s1, find best match in s2\n for (const word1 of words1) {\n let bestSim = 0;\n for (const word2 of words2) {\n const result = fuzzyMatch(word1, word2, finalConfig);\n if (result.similarity > bestSim) {\n bestSim = result.similarity;\n }\n }\n totalSimilarity += bestSim;\n if (bestSim >= finalConfig.threshold) {\n matchCount++;\n }\n }\n\n // Return combination of average similarity and match ratio\n const avgSimilarity = totalSimilarity / words1.length;\n const matchRatio = matchCount / Math.max(words1.length, words2.length);\n\n return avgSimilarity * 0.5 + matchRatio * 0.5;\n}\n\n/**\n * Tokenize a string for matching\n * Handles camelCase, PascalCase, snake_case, kebab-case\n */\nexport function tokenize(s: string): string[] {\n return s\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n .split(' ')\n .filter((token) => token.length > 0);\n}\n\n/**\n * Calculate token-based similarity\n * Better for matching identifiers and labels\n */\nexport function tokenSimilarity(s1: string, s2: string): number {\n const tokens1 = tokenize(s1);\n const tokens2 = tokenize(s2);\n\n if (tokens1.length === 0 && tokens2.length === 0) return 1;\n if (tokens1.length === 0 || tokens2.length === 0) return 0;\n\n const set1 = new Set(tokens1);\n const set2 = new Set(tokens2);\n\n // Calculate Jaccard similarity on tokens\n let intersection = 0;\n for (const token of set1) {\n if (set2.has(token)) {\n intersection++;\n }\n }\n\n const union = set1.size + set2.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n","/**\n * Alias Generator\n *\n * Auto-generates element aliases from visible text, aria-label, placeholders,\n * titles, and common synonyms for natural language matching.\n */\n\nimport { tokenize } from './fuzzy-matcher';\n\n/**\n * Configuration for alias generation\n */\nexport interface AliasGeneratorConfig {\n /** Include text content as alias */\n includeText: boolean;\n /** Include aria-label as alias */\n includeAriaLabel: boolean;\n /** Include placeholder text as alias */\n includePlaceholder: boolean;\n /** Include title attribute as alias */\n includeTitle: boolean;\n /** Include common synonyms */\n includeSynonyms: boolean;\n /** Maximum number of aliases to generate */\n maxAliases: number;\n /** Minimum alias length */\n minLength: number;\n /** Maximum alias length */\n maxLength: number;\n}\n\n/**\n * Default alias generator configuration\n */\nexport const DEFAULT_ALIAS_CONFIG: AliasGeneratorConfig = {\n includeText: true,\n includeAriaLabel: true,\n includePlaceholder: true,\n includeTitle: true,\n includeSynonyms: true,\n maxAliases: 20,\n minLength: 2,\n maxLength: 50,\n};\n\n/**\n * Common synonyms for UI actions and elements\n */\nconst SYNONYMS: Record<string, string[]> = {\n // Submit-related\n submit: ['send', 'go', 'confirm', 'ok', 'apply', 'save', 'done', 'finish'],\n send: ['submit', 'deliver', 'post'],\n save: ['submit', 'store', 'keep', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit', 'quit', 'nevermind'],\n close: ['cancel', 'dismiss', 'exit', 'x'],\n delete: ['remove', 'trash', 'erase', 'clear', 'destroy'],\n remove: ['delete', 'clear', 'discard'],\n edit: ['modify', 'change', 'update', 'alter'],\n update: ['edit', 'modify', 'save', 'refresh'],\n add: ['create', 'new', 'plus', 'insert'],\n create: ['add', 'new', 'make'],\n search: ['find', 'lookup', 'query', 'filter'],\n find: ['search', 'locate', 'lookup'],\n login: ['signin', 'sign in', 'log in', 'authenticate', 'enter'],\n logout: ['signout', 'sign out', 'log out', 'exit'],\n register: ['signup', 'sign up', 'join', 'create account'],\n next: ['continue', 'forward', 'proceed', 'advance'],\n previous: ['back', 'backward', 'return', 'prior'],\n back: ['previous', 'return', 'backward'],\n start: ['begin', 'launch', 'initiate', 'run', 'execute'],\n stop: ['end', 'halt', 'pause', 'terminate'],\n enable: ['activate', 'turn on', 'switch on'],\n disable: ['deactivate', 'turn off', 'switch off'],\n show: ['display', 'reveal', 'view', 'open'],\n hide: ['conceal', 'collapse', 'close'],\n expand: ['open', 'show', 'unfold', 'reveal'],\n collapse: ['close', 'hide', 'fold', 'minimize'],\n yes: ['ok', 'confirm', 'agree', 'accept'],\n no: ['cancel', 'decline', 'reject', 'deny'],\n help: ['support', 'assistance', 'info', 'information', 'faq'],\n settings: ['preferences', 'options', 'config', 'configuration'],\n profile: ['account', 'user', 'me'],\n download: ['export', 'save', 'get'],\n upload: ['import', 'load', 'attach'],\n refresh: ['reload', 'update', 'sync'],\n copy: ['duplicate', 'clone'],\n paste: ['insert'],\n select: ['choose', 'pick'],\n toggle: ['switch', 'flip'],\n\n // Form fields\n email: ['e-mail', 'mail'],\n password: ['pass', 'pwd', 'secret'],\n username: ['user', 'login', 'account', 'name'],\n firstname: ['first name', 'given name', 'forename'],\n lastname: ['last name', 'surname', 'family name'],\n fullname: ['full name', 'name', 'complete name'],\n phone: ['telephone', 'tel', 'mobile', 'cell'],\n address: ['location', 'street'],\n city: ['town'],\n country: ['nation'],\n zip: ['zipcode', 'postal', 'postal code', 'postcode'],\n\n // Navigation\n home: ['main', 'start', 'dashboard'],\n menu: ['navigation', 'nav'],\n sidebar: ['side bar', 'side panel', 'side menu'],\n};\n\n/**\n * Element type to action word mappings\n */\nconst ELEMENT_ACTION_WORDS: Record<string, string[]> = {\n button: ['button', 'btn', 'click'],\n input: ['input', 'field', 'textbox', 'box'],\n textarea: ['textarea', 'text area', 'text field', 'multiline'],\n select: ['select', 'dropdown', 'combo', 'picker', 'chooser'],\n checkbox: ['checkbox', 'check', 'tick'],\n radio: ['radio', 'option', 'choice'],\n link: ['link', 'anchor', 'href'],\n form: ['form'],\n menu: ['menu'],\n menuitem: ['menu item', 'option'],\n tab: ['tab'],\n dialog: ['dialog', 'modal', 'popup'],\n switch: ['switch', 'toggle'],\n slider: ['slider', 'range'],\n};\n\n/**\n * Normalize text for alias comparison\n */\nfunction normalizeAlias(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract words from text, handling various naming conventions\n */\nfunction extractWords(text: string): string[] {\n const tokens = tokenize(text);\n return tokens.filter((t) => t.length >= 2);\n}\n\n/**\n * Generate aliases from text content\n */\nfunction generateTextAliases(text: string | null | undefined, config: AliasGeneratorConfig): string[] {\n if (!text || !config.includeText) return [];\n\n const aliases: string[] = [];\n const normalized = normalizeAlias(text);\n\n // Add full normalized text\n if (normalized.length >= config.minLength && normalized.length <= config.maxLength) {\n aliases.push(normalized);\n }\n\n // Add individual words\n const words = extractWords(text);\n for (const word of words) {\n if (word.length >= config.minLength) {\n aliases.push(word);\n }\n }\n\n // Add word combinations\n if (words.length >= 2 && words.length <= 4) {\n // First two words\n const twoWords = words.slice(0, 2).join(' ');\n if (twoWords.length <= config.maxLength) {\n aliases.push(twoWords);\n }\n\n // Last two words\n if (words.length > 2) {\n const lastTwo = words.slice(-2).join(' ');\n if (lastTwo.length <= config.maxLength) {\n aliases.push(lastTwo);\n }\n }\n }\n\n return aliases;\n}\n\n/**\n * Generate synonyms for given aliases\n */\nfunction generateSynonyms(aliases: string[], config: AliasGeneratorConfig): string[] {\n if (!config.includeSynonyms) return [];\n\n const synonyms: string[] = [];\n\n for (const alias of aliases) {\n const words = alias.toLowerCase().split(/\\s+/);\n\n for (const word of words) {\n if (SYNONYMS[word]) {\n for (const synonym of SYNONYMS[word]) {\n // Replace word with synonym in the alias\n const newAlias = alias.toLowerCase().replace(word, synonym);\n if (newAlias !== alias.toLowerCase()) {\n synonyms.push(newAlias);\n }\n\n // Also add standalone synonym\n if (synonym.length >= config.minLength) {\n synonyms.push(synonym);\n }\n }\n }\n }\n }\n\n return synonyms;\n}\n\n/**\n * Generate element type aliases\n */\nfunction generateTypeAliases(elementType: string): string[] {\n const type = elementType.toLowerCase();\n return ELEMENT_ACTION_WORDS[type] || [type];\n}\n\n/**\n * Interface for element information used in alias generation\n */\nexport interface AliasGeneratorInput {\n /** Element text content */\n textContent?: string | null;\n /** ARIA label */\n ariaLabel?: string | null;\n /** ARIA labelledby resolved text */\n ariaLabelledBy?: string | null;\n /** Placeholder text */\n placeholder?: string | null;\n /** Title attribute */\n title?: string | null;\n /** Element type */\n elementType?: string;\n /** Element tag name */\n tagName?: string;\n /** Input type */\n inputType?: string;\n /** Element ID */\n id?: string | null;\n /** Element name attribute */\n name?: string | null;\n /** Associated label text */\n labelText?: string | null;\n /** Value attribute */\n value?: string | null;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n input: AliasGeneratorInput,\n config: Partial<AliasGeneratorConfig> = {}\n): string[] {\n const finalConfig = { ...DEFAULT_ALIAS_CONFIG, ...config };\n const aliasSet = new Set<string>();\n\n // Helper to add alias with deduplication and length checks\n const addAlias = (alias: string) => {\n const normalized = normalizeAlias(alias);\n if (\n normalized.length >= finalConfig.minLength &&\n normalized.length <= finalConfig.maxLength\n ) {\n aliasSet.add(normalized);\n }\n };\n\n // Helper to add multiple aliases\n const addAliases = (aliases: string[]) => {\n for (const alias of aliases) {\n addAlias(alias);\n }\n };\n\n // Generate from text content\n if (finalConfig.includeText && input.textContent) {\n addAliases(generateTextAliases(input.textContent, finalConfig));\n }\n\n // Generate from ARIA label\n if (finalConfig.includeAriaLabel && input.ariaLabel) {\n addAliases(generateTextAliases(input.ariaLabel, finalConfig));\n }\n\n // Generate from ARIA labelledby\n if (finalConfig.includeAriaLabel && input.ariaLabelledBy) {\n addAliases(generateTextAliases(input.ariaLabelledBy, finalConfig));\n }\n\n // Generate from placeholder\n if (finalConfig.includePlaceholder && input.placeholder) {\n addAliases(generateTextAliases(input.placeholder, finalConfig));\n }\n\n // Generate from title\n if (finalConfig.includeTitle && input.title) {\n addAliases(generateTextAliases(input.title, finalConfig));\n }\n\n // Generate from label text\n if (input.labelText) {\n addAliases(generateTextAliases(input.labelText, finalConfig));\n }\n\n // Generate from element ID (often meaningful)\n if (input.id) {\n addAliases(extractWords(input.id));\n }\n\n // Generate from name attribute\n if (input.name) {\n addAliases(extractWords(input.name));\n }\n\n // Generate from value for buttons/submit inputs\n if (\n input.value &&\n (input.elementType === 'button' || input.inputType === 'submit' || input.inputType === 'button')\n ) {\n addAliases(generateTextAliases(input.value, finalConfig));\n }\n\n // Generate type aliases\n if (input.elementType) {\n addAliases(generateTypeAliases(input.elementType));\n }\n\n // Generate input type aliases\n if (input.inputType) {\n addAlias(input.inputType);\n\n // Common input type patterns\n if (input.inputType === 'email') {\n addAliases(['email', 'e-mail', 'email address']);\n } else if (input.inputType === 'password') {\n addAliases(['password', 'pass', 'pwd']);\n } else if (input.inputType === 'tel') {\n addAliases(['phone', 'telephone', 'mobile']);\n } else if (input.inputType === 'url') {\n addAliases(['url', 'website', 'link', 'address']);\n } else if (input.inputType === 'search') {\n addAliases(['search', 'find', 'query']);\n }\n }\n\n // Generate synonyms for all collected aliases\n if (finalConfig.includeSynonyms) {\n const currentAliases = Array.from(aliasSet);\n addAliases(generateSynonyms(currentAliases, finalConfig));\n }\n\n // Convert to array and limit\n let aliases = Array.from(aliasSet);\n\n // Sort by length (shorter = more likely to be useful)\n aliases.sort((a, b) => a.length - b.length);\n\n // Limit number of aliases\n if (aliases.length > finalConfig.maxAliases) {\n aliases = aliases.slice(0, finalConfig.maxAliases);\n }\n\n return aliases;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nexport function generateDescription(input: AliasGeneratorInput): string {\n const parts: string[] = [];\n\n // Determine the best name for the element\n let name =\n input.ariaLabel ||\n input.labelText ||\n input.textContent ||\n input.placeholder ||\n input.title ||\n input.id ||\n input.name;\n\n if (name) {\n name = name.trim();\n // Truncate if too long\n if (name.length > 30) {\n name = name.substring(0, 27) + '...';\n }\n parts.push(`\"${name}\"`);\n }\n\n // Add element type\n const typeWords = ELEMENT_ACTION_WORDS[input.elementType || ''] || [input.elementType || 'element'];\n parts.push(typeWords[0]);\n\n // Add input type for inputs\n if (input.inputType && input.inputType !== 'text') {\n parts.push(`(${input.inputType})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Generate a purpose statement for an element\n */\nexport function generatePurpose(input: AliasGeneratorInput): string | undefined {\n const text = (input.textContent || input.ariaLabel || input.title || '').toLowerCase();\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n\n // Check for common patterns\n if (type === 'button' || inputType === 'submit') {\n if (text.match(/submit|send|save|confirm|ok|done|finish|apply/)) {\n return 'Submits the form';\n }\n if (text.match(/cancel|close|dismiss|back|exit/)) {\n return 'Cancels or closes the current action';\n }\n if (text.match(/delete|remove|trash|clear/)) {\n return 'Deletes or removes an item';\n }\n if (text.match(/edit|modify|change|update/)) {\n return 'Edits or modifies an item';\n }\n if (text.match(/add|create|new|\\+/)) {\n return 'Creates or adds a new item';\n }\n if (text.match(/search|find|lookup/)) {\n return 'Performs a search';\n }\n if (text.match(/login|sign.?in/)) {\n return 'Signs the user in';\n }\n if (text.match(/logout|sign.?out/)) {\n return 'Signs the user out';\n }\n if (text.match(/register|sign.?up|join/)) {\n return 'Creates a new account';\n }\n if (text.match(/next|continue|proceed/)) {\n return 'Proceeds to the next step';\n }\n if (text.match(/previous|back|return/)) {\n return 'Returns to the previous step';\n }\n }\n\n if (type === 'input' || type === 'textarea') {\n if (inputType === 'email') return 'Accepts email address input';\n if (inputType === 'password') return 'Accepts password input';\n if (inputType === 'search') return 'Accepts search query input';\n if (inputType === 'tel') return 'Accepts phone number input';\n if (inputType === 'url') return 'Accepts URL input';\n if (inputType === 'number') return 'Accepts numeric input';\n if (inputType === 'date') return 'Accepts date input';\n if (inputType === 'file') return 'Accepts file upload';\n }\n\n if (type === 'checkbox') {\n return 'Toggles an option on or off';\n }\n\n if (type === 'radio') {\n return 'Selects one option from a group';\n }\n\n if (type === 'select') {\n return 'Selects an option from a dropdown';\n }\n\n if (type === 'link') {\n return 'Navigates to another page';\n }\n\n return undefined;\n}\n\n/**\n * Generate suggested actions for an element\n */\nexport function generateSuggestedActions(input: AliasGeneratorInput): string[] {\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n const text = (input.textContent || input.ariaLabel || '').toLowerCase();\n const actions: string[] = [];\n\n switch (type) {\n case 'button':\n actions.push(`click \"${text || 'this button'}\"`);\n break;\n case 'input':\n if (inputType === 'checkbox') {\n actions.push('check to enable', 'uncheck to disable');\n } else if (inputType === 'radio') {\n actions.push('select this option');\n } else {\n actions.push(`type into \"${text || 'this field'}\"`);\n actions.push('clear the field');\n }\n break;\n case 'textarea':\n actions.push(`type into \"${text || 'this text area'}\"`);\n actions.push('clear the content');\n break;\n case 'select':\n actions.push(`select an option from \"${text || 'this dropdown'}\"`);\n break;\n case 'checkbox':\n actions.push('check to enable', 'uncheck to disable');\n break;\n case 'radio':\n actions.push('select this option');\n break;\n case 'link':\n actions.push(`click to navigate to \"${text || 'the linked page'}\"`);\n break;\n case 'switch':\n actions.push('toggle on', 'toggle off');\n break;\n default:\n actions.push('click');\n }\n\n return actions;\n}\n\n/**\n * Get synonyms for a word\n */\nexport function getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase().trim();\n return SYNONYMS[normalized] || [];\n}\n\n/**\n * Check if two words are synonyms\n */\nexport function areSynonyms(word1: string, word2: string): boolean {\n const w1 = word1.toLowerCase().trim();\n const w2 = word2.toLowerCase().trim();\n\n if (w1 === w2) return true;\n\n const synonyms1 = SYNONYMS[w1] || [];\n const synonyms2 = SYNONYMS[w2] || [];\n\n return synonyms1.includes(w2) || synonyms2.includes(w1);\n}\n","/**\n * Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge.\n * Provides methods for registration, lookup, and lifecycle management.\n */\n\nimport type {\n RegisteredElement,\n RegisteredComponent,\n Workflow,\n ElementState,\n ElementType,\n StandardAction,\n CustomAction,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n BridgeSnapshot,\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n} from './types';\nimport { createElementIdentifier } from './element-identifier';\nimport { fuzzyMatch, tokenSimilarity } from '../ai/fuzzy-matcher';\nimport { generateAliases, generateDescription, generatePurpose } from '../ai/alias-generator';\nimport type { SearchCriteria, SearchResult, AIDiscoveredElement } from '../ai/types';\n\n/**\n * Get the current state of an element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isElementVisible(element, rect, computedStyle),\n enabled: !isElementDisabled(element),\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 textContent: element.textContent?.trim() || undefined,\n computedStyles: {\n display: computedStyle.display,\n visibility: computedStyle.visibility,\n opacity: computedStyle.opacity,\n pointerEvents: computedStyle.pointerEvents,\n },\n };\n\n // Add input-specific state\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 } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\n/**\n * Check if an element is visible\n */\nfunction isElementVisible(\n element: HTMLElement,\n rect: DOMRect,\n style: CSSStyleDeclaration\n): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n\n // Check if in viewport\n const inViewport =\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0;\n\n return inViewport;\n}\n\n/**\n * Check if an element is disabled\n */\nfunction isElementDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLButtonElement).disabled) {\n return true;\n }\n if (element.getAttribute('aria-disabled') === 'true') {\n return true;\n }\n return false;\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n case 'form':\n return ['focus', 'blur'];\n case 'menu':\n case 'menuitem':\n return [...baseActions, 'click'];\n case 'tab':\n return [...baseActions, 'click'];\n case 'dialog':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click'];\n }\n}\n\n/**\n * Infer element type from HTML element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // Check role first\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n // Check tag name\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const inputType = (element as HTMLInputElement).type;\n if (inputType === 'checkbox') return 'checkbox';\n if (inputType === 'radio') return 'radio';\n if (inputType === 'submit' || inputType === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n}\n\n/**\n * Registry options\n */\nexport interface RegistryOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Callback when an event occurs */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Registry\n *\n * Central registry for managing elements, components, and workflows.\n */\nexport class UIBridgeRegistry {\n private elements = new Map<string, RegisteredElement>();\n private components = new Map<string, RegisteredComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private options: RegistryOptions;\n\n // State management\n private states = new Map<string, UIState>();\n private stateGroups = new Map<string, UIStateGroup>();\n private transitions = new Map<string, UITransition>();\n private activeStates = new Set<string>();\n\n constructor(options: RegistryOptions = {}) {\n this.options = options;\n }\n\n /**\n * Emit an event\n */\n private emit<T>(type: BridgeEventType, data: T): void {\n const event: BridgeEvent<T> = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Call global handler\n this.options.onEvent?.(event);\n\n // Call specific listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`Error in event listener for ${type}:`, error);\n }\n }\n }\n\n if (this.options.verbose) {\n console.log('[UIBridge]', type, data);\n }\n }\n\n /**\n * Register an event listener\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n };\n }\n\n /**\n * Remove an event listener\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Register an element\n */\n registerElement(\n id: string,\n element: HTMLElement,\n options: {\n type?: ElementType;\n label?: string;\n actions?: StandardAction[];\n customActions?: Record<string, CustomAction>;\n } = {}\n ): RegisteredElement {\n const type = options.type ?? inferElementType(element);\n const actions = options.actions ?? inferActions(type);\n\n // Check if element has an explicitly-set data-ui-id attribute (e.g., from React props)\n // If so, use that value as the ID to preserve developer intent\n // This handles timing issues where React may apply props after MutationObserver fires\n const existingUiId = element.getAttribute('data-ui-id');\n const actualId = existingUiId || id;\n\n // Only set data-ui-id if it wasn't already set\n // This preserves explicitly-set IDs from React props\n if (!existingUiId) {\n element.setAttribute('data-ui-id', actualId);\n }\n\n const registered: RegisteredElement = {\n id: actualId,\n element,\n type,\n label: options.label,\n actions,\n customActions: options.customActions,\n getState: () => getElementState(element),\n getIdentifier: () => createElementIdentifier(element),\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.elements.set(actualId, registered);\n this.emit('element:registered', { id: actualId, type, label: options.label });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): boolean {\n const registered = this.elements.get(id);\n if (registered) {\n registered.mounted = false;\n // Remove data-ui-id attribute from DOM element\n registered.element.removeAttribute('data-ui-id');\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Find element by DOM element reference\n */\n findByDOMElement(element: HTMLElement): RegisteredElement | undefined {\n for (const registered of this.elements.values()) {\n if (registered.element === element) {\n return registered;\n }\n }\n return undefined;\n }\n\n /**\n * Search for elements using AI search criteria\n */\n searchElements(criteria: SearchCriteria): SearchResult[] {\n const results: SearchResult[] = [];\n const threshold = criteria.fuzzyThreshold ?? 0.7;\n\n for (const element of this.elements.values()) {\n if (!element.mounted) continue;\n\n const state = element.getState();\n\n // Skip hidden elements if not explicitly requested\n if (!criteria.fuzzy && !state.visible) continue;\n\n // Build searchable text from element\n const aliases = element.aliases ?? this.generateElementAliases(element);\n const textContent = state.textContent?.trim() || '';\n const label = element.label || '';\n\n let maxScore = 0;\n const matchReasons: string[] = [];\n const scores: SearchResult['scores'] = {};\n\n // Text matching\n if (criteria.text) {\n // Exact match\n if (textContent.toLowerCase() === criteria.text.toLowerCase() ||\n label.toLowerCase() === criteria.text.toLowerCase()) {\n maxScore = 1.0;\n matchReasons.push('exact text match');\n scores.text = 1.0;\n } else if (criteria.fuzzy !== false) {\n // Fuzzy match\n const textResult = fuzzyMatch(criteria.text, textContent, { threshold });\n const labelResult = fuzzyMatch(criteria.text, label, { threshold });\n const bestResult = textResult.similarity > labelResult.similarity ? textResult : labelResult;\n\n if (bestResult.isMatch) {\n scores.text = bestResult.similarity;\n if (bestResult.similarity > maxScore) {\n maxScore = bestResult.similarity;\n matchReasons.push(`text similarity: ${(bestResult.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Text contains\n if (criteria.textContains) {\n if (textContent.toLowerCase().includes(criteria.textContains.toLowerCase()) ||\n label.toLowerCase().includes(criteria.textContains.toLowerCase())) {\n const containsScore = 0.85;\n scores.text = Math.max(scores.text ?? 0, containsScore);\n if (containsScore > maxScore) {\n maxScore = containsScore;\n matchReasons.push('text contains');\n }\n }\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const ariaLabel = element.element.getAttribute('aria-label') || '';\n const accessibleName = ariaLabel || label || textContent;\n\n if (accessibleName.toLowerCase() === criteria.accessibleName.toLowerCase()) {\n scores.accessibility = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push('accessible name match');\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(criteria.accessibleName, accessibleName, { threshold });\n if (result.isMatch) {\n scores.accessibility = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Role matching\n if (criteria.role) {\n const role = element.element.getAttribute('role') || this.inferRole(element.type);\n if (role?.toLowerCase() === criteria.role.toLowerCase()) {\n scores.role = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`role: ${criteria.role}`);\n }\n }\n }\n\n // Type matching\n if (criteria.type) {\n if (element.type === criteria.type) {\n const typeScore = 0.9;\n scores.role = Math.max(scores.role ?? 0, typeScore);\n if (typeScore > maxScore) {\n maxScore = typeScore;\n matchReasons.push(`type: ${criteria.type}`);\n }\n }\n }\n\n // Alias matching\n for (const alias of aliases) {\n const searchText = criteria.text || criteria.textContains || criteria.accessibleName;\n if (searchText) {\n if (alias.toLowerCase() === searchText.toLowerCase()) {\n scores.fuzzy = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`alias: \"${alias}\"`);\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(searchText, alias, { threshold });\n if (result.isMatch && result.similarity > (scores.fuzzy ?? 0)) {\n scores.fuzzy = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`fuzzy alias: \"${alias}\"`);\n }\n }\n }\n }\n }\n\n // Add result if above threshold\n if (maxScore >= threshold) {\n const aiElement: AIDiscoveredElement = {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: element.element.tagName.toLowerCase(),\n role: element.element.getAttribute('role') || undefined,\n accessibleName: element.element.getAttribute('aria-label') || element.label,\n actions: element.actions,\n state,\n registered: true,\n description: element.description || generateDescription({\n textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n }),\n aliases,\n purpose: element.purpose,\n suggestedActions: [],\n semanticType: element.semanticType,\n };\n\n results.push({\n element: aiElement,\n confidence: maxScore,\n matchReasons,\n scores,\n });\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n return results;\n }\n\n /**\n * Find element by visible text\n */\n findByText(text: string, fuzzy: boolean = true): RegisteredElement | undefined {\n const results = this.searchElements({ text, fuzzy, fuzzyThreshold: fuzzy ? 0.7 : 1.0 });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Find element by accessible name\n */\n findByAccessibleName(name: string): RegisteredElement | undefined {\n const results = this.searchElements({ accessibleName: name, fuzzy: true });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Generate aliases for an element\n */\n private generateElementAliases(element: RegisteredElement): string[] {\n const state = element.getState();\n return generateAliases({\n textContent: state.textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n placeholder: element.element.getAttribute('placeholder'),\n title: element.element.getAttribute('title'),\n elementType: element.type,\n tagName: element.element.tagName.toLowerCase(),\n id: element.id,\n labelText: element.label,\n });\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: ElementType): string | undefined {\n const roleMap: Record<ElementType, string | undefined> = {\n button: 'button',\n input: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n form: undefined,\n textarea: 'textbox',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n dialog: 'dialog',\n custom: undefined,\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n generic: undefined,\n };\n return roleMap[type];\n }\n\n /**\n * Register a component\n */\n registerComponent(\n id: string,\n options: {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n }\n ): RegisteredComponent {\n const registered: RegisteredComponent = {\n id,\n name: options.name,\n description: options.description,\n actions:\n options.actions?.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })) ?? [],\n elementIds: options.elementIds,\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.components.set(id, registered);\n this.emit('component:registered', { id, name: options.name });\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): boolean {\n const component = this.components.get(id);\n if (component) {\n component.mounted = false;\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredComponent[] {\n return Array.from(this.components.values());\n }\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): Workflow {\n this.workflows.set(workflow.id, workflow);\n return workflow;\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): boolean {\n return this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n /**\n * Register a state\n */\n registerState(state: UIState): UIState {\n this.states.set(state.id, state);\n this.emit('element:registered', { id: state.id, type: 'state', name: state.name });\n return state;\n }\n\n /**\n * Unregister a state\n */\n unregisterState(id: string): boolean {\n const state = this.states.get(id);\n if (state) {\n this.activeStates.delete(id);\n this.states.delete(id);\n this.emit('element:unregistered', { id, type: 'state' });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered state\n */\n getState(id: string): UIState | undefined {\n return this.states.get(id);\n }\n\n /**\n * Get all registered states\n */\n getAllStates(): UIState[] {\n return Array.from(this.states.values());\n }\n\n /**\n * Register a state group\n */\n registerStateGroup(group: UIStateGroup): UIStateGroup {\n this.stateGroups.set(group.id, group);\n return group;\n }\n\n /**\n * Unregister a state group\n */\n unregisterStateGroup(id: string): boolean {\n return this.stateGroups.delete(id);\n }\n\n /**\n * Get a state group\n */\n getStateGroup(id: string): UIStateGroup | undefined {\n return this.stateGroups.get(id);\n }\n\n /**\n * Get all state groups\n */\n getAllStateGroups(): UIStateGroup[] {\n return Array.from(this.stateGroups.values());\n }\n\n /**\n * Register a transition\n */\n registerTransition(transition: UITransition): UITransition {\n this.transitions.set(transition.id, transition);\n return transition;\n }\n\n /**\n * Unregister a transition\n */\n unregisterTransition(id: string): boolean {\n return this.transitions.delete(id);\n }\n\n /**\n * Get a transition\n */\n getTransition(id: string): UITransition | undefined {\n return this.transitions.get(id);\n }\n\n /**\n * Get all transitions\n */\n getAllTransitions(): UITransition[] {\n return Array.from(this.transitions.values());\n }\n\n /**\n * Get currently active states\n */\n getActiveStates(): string[] {\n return Array.from(this.activeStates);\n }\n\n /**\n * Check if a state is active\n */\n isStateActive(id: string): boolean {\n return this.activeStates.has(id);\n }\n\n /**\n * Activate a state\n */\n activateState(id: string): boolean {\n const state = this.states.get(id);\n if (!state) {\n return false;\n }\n\n // Check if blocked by another state\n for (const activeId of this.activeStates) {\n const activeState = this.states.get(activeId);\n if (activeState?.blocking && activeState.id !== id) {\n // Blocked by a modal/blocking state\n return false;\n }\n if (activeState?.blocks?.includes(id)) {\n // Specifically blocked by this state\n return false;\n }\n }\n\n const wasActive = this.activeStates.has(id);\n this.activeStates.add(id);\n\n if (!wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: true,\n activeStates: this.getActiveStates(),\n });\n }\n\n return true;\n }\n\n /**\n * Deactivate a state\n */\n deactivateState(id: string): boolean {\n const wasActive = this.activeStates.has(id);\n this.activeStates.delete(id);\n\n if (wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: false,\n activeStates: this.getActiveStates(),\n });\n }\n\n return wasActive;\n }\n\n /**\n * Activate multiple states\n */\n activateStates(ids: string[]): string[] {\n const activated: string[] = [];\n for (const id of ids) {\n if (this.activateState(id)) {\n activated.push(id);\n }\n }\n return activated;\n }\n\n /**\n * Deactivate multiple states\n */\n deactivateStates(ids: string[]): string[] {\n const deactivated: string[] = [];\n for (const id of ids) {\n if (this.deactivateState(id)) {\n deactivated.push(id);\n }\n }\n return deactivated;\n }\n\n /**\n * Activate a state group (all states in the group)\n */\n activateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.activateStates(group.states);\n }\n\n /**\n * Deactivate a state group (all states in the group)\n */\n deactivateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.deactivateStates(group.states);\n }\n\n /**\n * Check if a transition can be executed from current state\n */\n canExecuteTransition(transitionId: string): boolean {\n const transition = this.transitions.get(transitionId);\n if (!transition) return false;\n\n // At least one fromState must be active\n return transition.fromStates.some((stateId) => this.activeStates.has(stateId));\n }\n\n /**\n * Execute a transition\n */\n async executeTransition(transitionId: string): Promise<TransitionResult> {\n const startTime = performance.now();\n const transition = this.transitions.get(transitionId);\n\n if (!transition) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: `Transition not found: ${transitionId}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n if (!this.canExecuteTransition(transitionId)) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'Precondition not met: none of the fromStates are active',\n failedPhase: 'precondition',\n durationMs: performance.now() - startTime,\n };\n }\n\n try {\n // Phase 1: Deactivate exit states\n const deactivated = this.deactivateStates(transition.exitStates);\n\n // Phase 2: Deactivate exit groups\n if (transition.exitGroups) {\n for (const groupId of transition.exitGroups) {\n deactivated.push(...this.deactivateStateGroup(groupId));\n }\n }\n\n // Phase 3: Execute actions (if any)\n // Note: Actual action execution happens in the workflow engine\n // Here we just track that the transition occurred\n\n // Phase 4: Activate states\n const activated = this.activateStates(transition.activateStates);\n\n // Phase 5: Activate groups\n if (transition.activateGroups) {\n for (const groupId of transition.activateGroups) {\n activated.push(...this.activateStateGroup(groupId));\n }\n }\n\n return {\n success: true,\n activatedStates: activated,\n deactivatedStates: deactivated,\n durationMs: performance.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: error instanceof Error ? error.message : String(error),\n failedPhase: 'execution',\n durationMs: performance.now() - startTime,\n };\n }\n }\n\n /**\n * Find a path from current state to target states\n *\n * Uses a simple BFS algorithm for pathfinding.\n * For more advanced pathfinding (Dijkstra, A*), use the Python state manager service.\n */\n findPath(targetStates: string[]): PathResult {\n // Check if already at target\n if (targetStates.every((t) => this.activeStates.has(t))) {\n return {\n found: true,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n // BFS to find path\n const queue: { activeStates: Set<string>; path: string[]; cost: number }[] = [\n { activeStates: new Set(this.activeStates), path: [], cost: 0 },\n ];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const stateKey = Array.from(current.activeStates).sort().join(',');\n\n if (visited.has(stateKey)) continue;\n visited.add(stateKey);\n\n // Check if target reached\n if (targetStates.every((t) => current.activeStates.has(t))) {\n return {\n found: true,\n transitions: current.path,\n totalCost: current.cost,\n targetStates,\n estimatedSteps: current.path.length,\n };\n }\n\n // Try each transition\n for (const transition of this.transitions.values()) {\n // Check if transition can be executed from current state\n const canExecute = transition.fromStates.some((s) => current.activeStates.has(s));\n if (!canExecute) continue;\n\n // Calculate new state after transition\n const newActive = new Set(current.activeStates);\n for (const s of transition.exitStates) newActive.delete(s);\n for (const s of transition.activateStates) newActive.add(s);\n\n const newCost = current.cost + (transition.pathCost ?? 1);\n\n queue.push({\n activeStates: newActive,\n path: [...current.path, transition.id],\n cost: newCost,\n });\n }\n }\n\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n /**\n * Navigate to target states using pathfinding\n */\n async navigateTo(targetStates: string[]): Promise<NavigationResult> {\n const startTime = performance.now();\n const path = this.findPath(targetStates);\n\n if (!path.found) {\n return {\n success: false,\n path,\n executedTransitions: [],\n finalActiveStates: this.getActiveStates(),\n error: `No path found to target states: ${targetStates.join(', ')}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n const executedTransitions: string[] = [];\n\n for (const transitionId of path.transitions) {\n const result = await this.executeTransition(transitionId);\n if (!result.success) {\n return {\n success: false,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n error: result.error,\n durationMs: performance.now() - startTime,\n };\n }\n executedTransitions.push(transitionId);\n }\n\n return {\n success: true,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n durationMs: performance.now() - startTime,\n };\n }\n\n /**\n * Create a state snapshot\n */\n createStateSnapshot(): StateSnapshot {\n return {\n timestamp: Date.now(),\n activeStates: this.getActiveStates(),\n states: this.getAllStates(),\n groups: this.getAllStateGroups(),\n transitions: this.getAllTransitions(),\n };\n }\n\n /**\n * Create a snapshot of the current state\n */\n createSnapshot(): BridgeSnapshot {\n return {\n timestamp: Date.now(),\n elements: this.getAllElements().map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n identifier: el.getIdentifier(),\n state: el.getState(),\n actions: el.actions,\n customActions: el.customActions ? Object.keys(el.customActions) : undefined,\n })),\n components: this.getAllComponents().map((comp) => ({\n id: comp.id,\n name: comp.name,\n description: comp.description,\n actions: comp.actions.map((a) => a.id),\n elementIds: comp.elementIds,\n })),\n workflows: this.getAllWorkflows().map((wf) => ({\n id: wf.id,\n name: wf.name,\n description: wf.description,\n stepCount: wf.steps.length,\n })),\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n this.eventListeners.clear();\n this.states.clear();\n this.stateGroups.clear();\n this.transitions.clear();\n this.activeStates.clear();\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n elementCount: number;\n componentCount: number;\n workflowCount: number;\n mountedElementCount: number;\n mountedComponentCount: number;\n stateCount: number;\n stateGroupCount: number;\n transitionCount: number;\n activeStateCount: number;\n } {\n const elements = this.getAllElements();\n const components = this.getAllComponents();\n\n return {\n elementCount: elements.length,\n componentCount: components.length,\n workflowCount: this.workflows.size,\n mountedElementCount: elements.filter((e) => e.mounted).length,\n mountedComponentCount: components.filter((c) => c.mounted).length,\n stateCount: this.states.size,\n stateGroupCount: this.stateGroups.size,\n transitionCount: this.transitions.size,\n activeStateCount: this.activeStates.size,\n };\n }\n}\n\n/**\n * Default global registry instance\n */\nlet globalRegistry: UIBridgeRegistry | null = null;\n\n/**\n * Get or create the global registry\n */\nexport function getGlobalRegistry(): UIBridgeRegistry {\n if (!globalRegistry) {\n globalRegistry = new UIBridgeRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: UIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * WebSocket Client for UI Bridge\n *\n * Provides real-time communication with UI Bridge server.\n */\n\nimport type {\n BridgeEvent,\n BridgeEventType,\n BridgeSnapshot,\n WSClientConfig,\n WSClientMessage,\n WSConnectionState,\n WSServerMessage,\n WSSubscriptionOptions,\n ActionRequest,\n ActionResponse,\n} from './types';\n\n/**\n * Generate unique message ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * WebSocket client for UI Bridge\n */\nexport class UIBridgeWSClient {\n private ws: WebSocket | null = null;\n private config: Required<WSClientConfig>;\n private state: WSConnectionState = 'disconnected';\n private clientId: string | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Event listeners\n private connectionListeners = new Set<(state: WSConnectionState) => void>();\n private eventListeners = new Map<BridgeEventType | '*', Set<(event: BridgeEvent) => void>>();\n private errorListeners = new Set<(error: Error) => void>();\n\n // Current subscriptions\n private subscriptions: WSSubscriptionOptions = {};\n\n constructor(config: WSClientConfig) {\n this.config = {\n url: config.url,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n pingInterval: config.pingInterval ?? 30000,\n connectionTimeout: config.connectionTimeout ?? 10000,\n };\n }\n\n /**\n * Get current connection state\n */\n get connectionState(): WSConnectionState {\n return this.state;\n }\n\n /**\n * Get assigned client ID\n */\n get id(): string | null {\n return this.clientId;\n }\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.config.url);\n } catch (error) {\n this.setState('disconnected');\n reject(error);\n return;\n }\n\n const connectionTimeout = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.close();\n this.setState('disconnected');\n reject(new Error('Connection timeout'));\n }\n }, this.config.connectionTimeout);\n\n this.ws.onopen = () => {\n clearTimeout(connectionTimeout);\n // Wait for welcome message before resolving\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSServerMessage;\n this.handleMessage(message);\n\n // Resolve connect promise on welcome message\n if (message.type === 'welcome') {\n clearTimeout(connectionTimeout);\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startPingInterval();\n\n // Re-subscribe if we have active subscriptions\n if (\n this.subscriptions.events?.length ||\n this.subscriptions.elementIds?.length ||\n this.subscriptions.componentIds?.length\n ) {\n this.subscribe(this.subscriptions);\n }\n\n resolve();\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n\n this.ws.onerror = (_event) => {\n clearTimeout(connectionTimeout);\n const error = new Error('WebSocket error');\n this.notifyError(error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onclose = () => {\n clearTimeout(connectionTimeout);\n this.stopPingInterval();\n this.clientId = null;\n\n const wasConnected = this.state === 'connected';\n this.setState('disconnected');\n\n // Reject all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect\n if (\n wasConnected &&\n this.config.autoReconnect &&\n (this.config.maxReconnectAttempts === 0 ||\n this.reconnectAttempts < this.config.maxReconnectAttempts)\n ) {\n this.scheduleReconnect();\n }\n };\n });\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopPingInterval();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n /**\n * Subscribe to events\n */\n async subscribe(options: WSSubscriptionOptions): Promise<BridgeEventType[]> {\n this.subscriptions = { ...this.subscriptions, ...options };\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'subscribe',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.events;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(events?: BridgeEventType[]): Promise<BridgeEventType[]> {\n if (events) {\n this.subscriptions.events = this.subscriptions.events?.filter((e) => !events.includes(e));\n } else {\n this.subscriptions = {};\n }\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'unsubscribe',\n timestamp: Date.now(),\n payload: { events },\n });\n\n return response.events;\n }\n\n /**\n * Find elements\n */\n async find(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n const response = await this.sendRequest<{ elements: BridgeSnapshot['elements'] }>({\n id: generateId(),\n type: 'find',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.elements;\n }\n\n /**\n * Discover elements\n * @deprecated Use find() instead\n */\n async discover(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n return this.find(options);\n }\n\n /**\n * Get element details\n */\n async getElement(\n elementId: string,\n includeState = true\n ): Promise<BridgeSnapshot['elements'][0] | null> {\n const response = await this.sendRequest<{ element: BridgeSnapshot['elements'][0] | null }>({\n id: generateId(),\n type: 'getElement',\n timestamp: Date.now(),\n payload: { elementId, includeState },\n });\n\n return response.element;\n }\n\n /**\n * Get full snapshot\n */\n async getSnapshot(): Promise<BridgeSnapshot> {\n const response = await this.sendRequest<BridgeSnapshot>({\n id: generateId(),\n type: 'getSnapshot',\n timestamp: Date.now(),\n });\n\n return response;\n }\n\n /**\n * Execute action on an element\n */\n async executeAction(elementId: string, action: ActionRequest): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeAction',\n timestamp: Date.now(),\n payload: { elementId, action },\n });\n\n return response;\n }\n\n /**\n * Execute component action\n */\n async executeComponentAction(\n componentId: string,\n action: string,\n params?: Record<string, unknown>\n ): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeComponentAction',\n timestamp: Date.now(),\n payload: { componentId, action, params },\n });\n\n return response;\n }\n\n /**\n * Execute workflow with optional progress streaming\n */\n async executeWorkflow(\n workflowId: string,\n params?: Record<string, unknown>,\n onProgress?: (progress: {\n currentStep: number;\n totalSteps: number;\n step: { id: string; status: string };\n }) => void\n ): Promise<{ success: boolean; results: unknown[] }> {\n const id = generateId();\n\n // Set up progress listener if provided\n const progressHandler: ((message: WSServerMessage) => void) | undefined = onProgress\n ? (message: WSServerMessage) => {\n if (message.type === 'workflowProgress' && message.requestId === id) {\n onProgress({\n currentStep: message.payload.currentStep,\n totalSteps: message.payload.totalSteps,\n step: {\n id: message.payload.step.id,\n status: message.payload.step.status,\n },\n });\n }\n }\n : undefined;\n\n const response = await this.sendRequest<{ success: boolean; results: unknown[] }>(\n {\n id,\n type: 'executeWorkflow',\n timestamp: Date.now(),\n payload: { workflowId, params, streamProgress: !!onProgress },\n },\n progressHandler\n );\n\n return response;\n }\n\n /**\n * Add connection state listener\n */\n onConnectionChange(listener: (state: WSConnectionState) => void): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /**\n * Add event listener\n */\n onEvent(\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ): () => void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(listener);\n return () => this.eventListeners.get(eventType)?.delete(listener);\n }\n\n /**\n * Add error listener\n */\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n // Private methods\n\n private setState(state: WSConnectionState): void {\n this.state = state;\n for (const listener of this.connectionListeners) {\n try {\n listener(state);\n } catch (error) {\n console.error('Connection listener error:', error);\n }\n }\n }\n\n private handleMessage(message: WSServerMessage): void {\n switch (message.type) {\n case 'welcome':\n this.clientId = message.payload.clientId;\n break;\n\n case 'pong':\n // Ping/pong handled automatically\n break;\n\n case 'subscribed':\n case 'unsubscribed':\n // Handled by request/response\n break;\n\n case 'event':\n this.notifyEvent(message.payload);\n break;\n\n case 'response':\n this.handleResponse(message);\n break;\n\n case 'error':\n if (message.requestId) {\n this.handleResponse({\n ...message,\n type: 'response',\n requestId: message.requestId,\n payload: {\n success: false,\n error: message.payload.message,\n },\n });\n } else {\n this.notifyError(new Error(message.payload.message));\n }\n break;\n\n case 'workflowProgress':\n // Handled by progress callback in executeWorkflow\n break;\n }\n }\n\n private handleResponse(message: WSServerMessage & { requestId: string }): void {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n\n if (message.type === 'response') {\n if (message.payload.success) {\n pending.resolve(message.payload.data);\n } else {\n pending.reject(new Error(message.payload.error || 'Request failed'));\n }\n }\n }\n\n private notifyEvent(event: BridgeEvent): void {\n // Notify specific type listeners\n const typeListeners = this.eventListeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n\n // Notify wildcard listeners\n const wildcardListeners = this.eventListeners.get('*');\n if (wildcardListeners) {\n for (const listener of wildcardListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const listener of this.errorListeners) {\n try {\n listener(error);\n } catch (e) {\n console.error('Error listener error:', e);\n }\n }\n }\n\n private sendRequest<T>(\n message: WSClientMessage,\n progressHandler?: (message: WSServerMessage) => void\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.state !== 'connected') {\n reject(new Error('Not connected'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error('Request timeout'));\n }, 30000);\n\n this.pendingRequests.set(message.id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout,\n });\n\n // Handle progress messages during workflow execution\n if (progressHandler && this.ws) {\n const originalHandler = this.ws.onmessage;\n const wsRef = this.ws;\n const wrappedHandler = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as WSServerMessage;\n if (msg.type === 'workflowProgress') {\n progressHandler(msg);\n }\n } catch {\n // Ignore parse errors for progress\n }\n // Call original handler\n if (originalHandler) {\n originalHandler.call(wsRef, event);\n }\n };\n this.ws.onmessage = wrappedHandler;\n }\n\n this.ws.send(JSON.stringify(message));\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n // Will auto-retry if configured\n });\n }, delay);\n }\n\n private startPingInterval(): void {\n if (this.config.pingInterval <= 0) return;\n\n this.pingTimer = setInterval(() => {\n if (this.ws && this.state === 'connected') {\n this.ws.send(\n JSON.stringify({\n id: generateId(),\n type: 'ping',\n timestamp: Date.now(),\n })\n );\n }\n }, this.config.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n}\n\n/**\n * Create a WebSocket client instance\n */\nexport function createWSClient(config: WSClientConfig): UIBridgeWSClient {\n return new UIBridgeWSClient(config);\n}\n","/**\n * Action Executor\n *\n * Executes actions on registered elements and components.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WaitOptions, ElementState, StandardAction } from '../core/types';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n FindRequest,\n FindResponse,\n DiscoveredElement,\n ControlSnapshot,\n ActionExecutor,\n TypeAction,\n SelectAction,\n ScrollAction,\n MouseAction,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Get element state for an HTML element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\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 } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a mouse event\n */\nfunction createMouseEvent(type: string, element: HTMLElement, options?: MouseAction): MouseEvent {\n const rect = element.getBoundingClientRect();\n const x = options?.position?.x ?? rect.width / 2;\n const y = options?.position?.y ?? rect.height / 2;\n\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n button: options?.button === 'right' ? 2 : options?.button === 'middle' ? 1 : 0,\n clientX: rect.left + x,\n clientY: rect.top + y,\n });\n}\n\n/**\n * Default action executor implementation\n */\nexport class DefaultActionExecutor implements ActionExecutor {\n constructor(private registry: UIBridgeRegistry) {}\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = performance.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n // If not registered, try to find by identifier\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n success: false,\n error: `Element not found: ${elementId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElement(element, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n return {\n success: false,\n error: waitResult.error || 'Wait condition not met',\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const result = await this.performAction(element, request.action, request.params);\n\n return {\n success: true,\n elementState: getElementState(element),\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Execute an action on a component\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = performance.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const action = component.actions.find((a) => a.id === request.action);\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Wait for a condition on an element\n */\n async waitFor(elementId: string, options: WaitOptions): Promise<WaitResult> {\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n met: false,\n waitedMs: 0,\n error: `Element not found: ${elementId}`,\n };\n }\n\n return this.waitForElement(element, options);\n }\n\n /**\n * Find controllable elements\n */\n async find(options?: FindRequest): Promise<FindResponse> {\n const startTime = performance.now();\n const elements: DiscoveredElement[] = [];\n\n // Get root element\n let root: HTMLElement = document.body;\n if (options?.root) {\n const rootEl = document.querySelector<HTMLElement>(options.root);\n if (rootEl) root = rootEl;\n }\n\n // Find interactive elements\n const interactiveSelectors = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-id]',\n '[data-testid]',\n ];\n\n const selector = options?.selector || interactiveSelectors.join(', ');\n const foundElements = root.querySelectorAll<HTMLElement>(selector);\n\n for (const el of foundElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = getElementState(el);\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by type\n if (options?.types) {\n const type = this.inferElementType(el);\n if (!options.types.includes(type)) continue;\n }\n\n // Check if registered\n const registered = this.registry.findByDOMElement(el);\n\n elements.push({\n id: registered?.id || this.getElementId(el),\n type: registered?.type || this.inferElementType(el),\n label: registered?.label || this.getElementLabel(el),\n tagName: el.tagName.toLowerCase(),\n role: el.getAttribute('role') || undefined,\n accessibleName: this.getAccessibleName(el),\n actions: registered?.actions || this.inferActions(el),\n state,\n registered: !!registered,\n });\n }\n\n return {\n elements,\n total: elements.length,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n async discover(options?: FindRequest): Promise<FindResponse> {\n return this.find(options);\n }\n\n /**\n * Get control snapshot\n */\n async getSnapshot(): Promise<ControlSnapshot> {\n const elements = this.registry.getAllElements();\n const components = this.registry.getAllComponents();\n const workflows = this.registry.getAllWorkflows();\n\n return {\n timestamp: Date.now(),\n elements: elements.map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n actions: [...el.actions, ...(el.customActions ? Object.keys(el.customActions) : [])],\n state: el.getState(),\n })),\n components: components.map((comp) => ({\n id: comp.id,\n name: comp.name,\n actions: comp.actions.map((a) => a.id),\n })),\n workflows: workflows.map((wf) => ({\n id: wf.id,\n name: wf.name,\n stepCount: wf.steps.length,\n })),\n activeRuns: [], // Workflow engine manages this\n };\n }\n\n /**\n * Wait for element conditions\n */\n private async waitForElement(element: HTMLElement, options: WaitOptions): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = performance.now();\n const deadline = startTime + opts.timeout;\n\n while (Date.now() < deadline) {\n const state = getElementState(element);\n\n // Check conditions\n let allMet = true;\n\n if (opts.visible && !state.visible) allMet = false;\n if (opts.enabled && !state.enabled) allMet = false;\n if (opts.focused && !state.focused) allMet = false;\n\n // Check custom state conditions\n if (opts.state) {\n for (const [key, value] of Object.entries(opts.state)) {\n if (state[key as keyof ElementState] !== value) {\n allMet = false;\n break;\n }\n }\n }\n\n if (allMet) {\n return {\n met: true,\n waitedMs: performance.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: performance.now() - startTime,\n state: getElementState(element),\n error: `Timeout waiting for conditions after ${opts.timeout}ms`,\n };\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: HTMLElement,\n action: string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n switch (action as StandardAction) {\n case 'click':\n return this.performClick(element, params as MouseAction);\n case 'doubleClick':\n return this.performDoubleClick(element, params as MouseAction);\n case 'rightClick':\n return this.performRightClick(element, params as MouseAction);\n case 'type':\n return this.performType(element, params as unknown as TypeAction);\n case 'clear':\n return this.performClear(element);\n case 'select':\n return this.performSelect(element, params as unknown as SelectAction);\n case 'focus':\n return this.performFocus(element);\n case 'blur':\n return this.performBlur(element);\n case 'hover':\n return this.performHover(element);\n case 'scroll':\n return this.performScroll(element, params as ScrollAction);\n case 'check':\n return this.performCheck(element, true);\n case 'uncheck':\n return this.performCheck(element, false);\n case 'toggle':\n return this.performToggle(element);\n default: {\n // Check for custom actions\n const registered = this.registry.findByDOMElement(element);\n if (registered?.customActions?.[action]) {\n return registered.customActions[action].handler(params);\n }\n throw new Error(`Unknown action: ${action}`);\n }\n }\n }\n\n private performClick(element: HTMLElement, options?: MouseAction): void {\n element.dispatchEvent(createMouseEvent('mousedown', element, options));\n element.dispatchEvent(createMouseEvent('mouseup', element, options));\n element.dispatchEvent(createMouseEvent('click', element, options));\n }\n\n private performDoubleClick(element: HTMLElement, options?: MouseAction): void {\n this.performClick(element, options);\n this.performClick(element, options);\n element.dispatchEvent(createMouseEvent('dblclick', element, options));\n }\n\n private performRightClick(element: HTMLElement, options?: MouseAction): void {\n const opts = { ...options, button: 'right' as const };\n element.dispatchEvent(createMouseEvent('mousedown', element, opts));\n element.dispatchEvent(createMouseEvent('mouseup', element, opts));\n element.dispatchEvent(createMouseEvent('contextmenu', element, opts));\n }\n\n private async performType(element: HTMLElement, options?: TypeAction): Promise<void> {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error('Type action requires an input or textarea element');\n }\n\n element.focus();\n\n if (options?.clear) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n const text = options?.text || '';\n const delay = options?.delay || 0;\n\n for (const char of text) {\n element.value += char;\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n if (delay > 0) {\n await sleep(delay);\n }\n }\n\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performClear(element: HTMLElement): void {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSelect(element: HTMLElement, options?: SelectAction): void {\n if (!(element instanceof HTMLSelectElement)) {\n throw new Error('Select action requires a select element');\n }\n\n const values = Array.isArray(options?.value) ? options.value : [options?.value];\n\n if (!options?.additive) {\n // Clear existing selection for single select or when not additive\n for (const option of element.options) {\n option.selected = false;\n }\n }\n\n for (const option of element.options) {\n const matchValue = options?.byLabel ? option.text : option.value;\n if (values.includes(matchValue)) {\n option.selected = true;\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n private performFocus(element: HTMLElement): void {\n element.focus();\n element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n }\n\n private performBlur(element: HTMLElement): void {\n element.blur();\n element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n }\n\n private performHover(element: HTMLElement): void {\n element.dispatchEvent(createMouseEvent('mouseenter', element));\n element.dispatchEvent(createMouseEvent('mouseover', element));\n }\n\n private performScroll(element: HTMLElement, options?: ScrollAction): void {\n if (options?.toElement) {\n const target = document.querySelector<HTMLElement>(options.toElement);\n if (target) {\n target.scrollIntoView({ behavior: options.smooth ? 'smooth' : 'auto' });\n return;\n }\n }\n\n if (options?.position) {\n element.scrollTo({\n left: options.position.x,\n top: options.position.y,\n behavior: options.smooth ? 'smooth' : 'auto',\n });\n return;\n }\n\n const amount = options?.amount || 100;\n const direction = options?.direction || 'down';\n\n switch (direction) {\n case 'up':\n element.scrollBy({ top: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'down':\n element.scrollBy({ top: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'left':\n element.scrollBy({ left: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'right':\n element.scrollBy({ left: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n }\n }\n\n private performCheck(element: HTMLElement, checked: boolean): void {\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n if (element.checked !== checked) {\n element.checked = checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }\n\n private performToggle(element: HTMLElement): void {\n if (element instanceof HTMLInputElement && element.type === 'checkbox') {\n element.checked = !element.checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private getElementId(element: HTMLElement): string {\n return (\n element.getAttribute('data-ui-id') ||\n element.getAttribute('data-testid') ||\n element.id ||\n `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`\n );\n }\n\n private getElementLabel(element: HTMLElement): string | undefined {\n return (\n element.getAttribute('aria-label') ||\n element.getAttribute('title') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined\n );\n }\n\n private getAccessibleName(element: HTMLElement): string | undefined {\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n if (element.id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n return (\n element.getAttribute('title') || element.textContent?.trim().substring(0, 50) || undefined\n );\n }\n\n private inferElementType(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'submit' || type === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n }\n\n private inferActions(element: HTMLElement): string[] {\n const type = this.inferElementType(element);\n const baseActions = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n default:\n return [...baseActions, 'click'];\n }\n }\n}\n\n/**\n * Create an action executor\n */\nexport function createActionExecutor(registry: UIBridgeRegistry): ActionExecutor {\n return new DefaultActionExecutor(registry);\n}\n","/**\n * Workflow Engine\n *\n * Executes multi-step workflows with error handling and state tracking.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WorkflowStep, Workflow } from '../core/types';\nimport type {\n WorkflowRunRequest,\n WorkflowRunResponse,\n WorkflowStepResult,\n WorkflowRunStatus,\n WorkflowEngine,\n ActionExecutor,\n} from './types';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Default workflow engine implementation\n */\nexport class DefaultWorkflowEngine implements WorkflowEngine {\n private activeRuns = new Map<string, WorkflowRunState>();\n\n constructor(\n private registry: UIBridgeRegistry,\n private executor: ActionExecutor\n ) {}\n\n /**\n * Run a workflow\n */\n async run(workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> {\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n return {\n workflowId,\n runId: generateRunId(),\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: `Workflow not found: ${workflowId}`,\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n\n const runId = generateRunId();\n const state: WorkflowRunState = {\n workflowId,\n runId,\n workflow,\n request,\n status: 'running',\n steps: [],\n currentStep: 0,\n startedAt: Date.now(),\n };\n\n this.activeRuns.set(runId, state);\n\n try {\n await this.executeWorkflow(state);\n } catch (error) {\n state.status = 'failed';\n state.error = error instanceof Error ? error.message : String(error);\n }\n\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n\n // Determine overall success\n state.success = state.status === 'completed' && state.steps.every((s) => s.success);\n\n // Clean up after a delay\n setTimeout(() => {\n this.activeRuns.delete(runId);\n }, 60000);\n\n return this.buildResponse(state);\n }\n\n /**\n * Get workflow run status\n */\n async getRunStatus(runId: string): Promise<WorkflowRunResponse | null> {\n const state = this.activeRuns.get(runId);\n if (!state) return null;\n return this.buildResponse(state);\n }\n\n /**\n * Cancel a running workflow\n */\n async cancel(runId: string): Promise<boolean> {\n const state = this.activeRuns.get(runId);\n if (!state || state.status !== 'running') return false;\n\n state.status = 'cancelled';\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n state.error = 'Workflow cancelled by user';\n\n return true;\n }\n\n /**\n * List active runs\n */\n async listActiveRuns(): Promise<WorkflowRunResponse[]> {\n return Array.from(this.activeRuns.values())\n .filter((state) => state.status === 'running')\n .map((state) => this.buildResponse(state));\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(state: WorkflowRunState): Promise<void> {\n const { workflow, request } = state;\n const params = { ...workflow.defaultParams, ...request?.params };\n\n // Find start step index\n let startIndex = 0;\n if (request?.startStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.startStep);\n if (idx >= 0) startIndex = idx;\n }\n\n // Find stop step index\n let stopIndex = workflow.steps.length;\n if (request?.stopStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.stopStep);\n if (idx >= 0) stopIndex = idx + 1;\n }\n\n // Execute steps\n for (let i = startIndex; i < stopIndex; i++) {\n // Check for cancellation\n if (state.status === 'cancelled') break;\n\n state.currentStep = i;\n const step = workflow.steps[i];\n\n const stepResult = await this.executeStep(step, params, request?.stepTimeout);\n state.steps.push(stepResult);\n\n // Stop on failure\n if (!stepResult.success) {\n state.status = 'failed';\n state.error = stepResult.error;\n return;\n }\n }\n\n state.status = 'completed';\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n step: WorkflowStep,\n params: Record<string, unknown>,\n timeout?: number\n ): Promise<WorkflowStepResult> {\n const startTime = performance.now();\n\n try {\n // Apply timeout if specified\n const timeoutPromise = timeout\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Step timeout')), timeout)\n )\n : null;\n\n const executePromise = this.executeStepInternal(step, params);\n\n const result = timeoutPromise\n ? await Promise.race([executePromise, timeoutPromise])\n : await executePromise;\n\n return {\n stepId: step.id,\n stepType: step.type,\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n stepId: step.id,\n stepType: step.type,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Execute step internal logic\n */\n private async executeStepInternal(\n step: WorkflowStep,\n params: Record<string, unknown>\n ): Promise<unknown> {\n // Interpolate params in step\n const resolvedParams = this.interpolateParams(step.params || {}, params);\n\n switch (step.type) {\n case 'element-action':\n if (!step.target || !step.action) {\n throw new Error('Element action requires target and action');\n }\n return this.executor.executeAction(step.target, {\n action: step.action,\n params: resolvedParams,\n waitOptions: step.waitOptions,\n });\n\n case 'component-action':\n if (!step.target || !step.action) {\n throw new Error('Component action requires target and action');\n }\n return this.executor.executeComponentAction(step.target, {\n action: step.action,\n params: resolvedParams,\n });\n\n case 'wait': {\n if (!step.target) {\n throw new Error('Wait step requires target');\n }\n const waitResult = await this.executor.waitFor(step.target, step.waitOptions || {});\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return waitResult;\n }\n\n case 'assert':\n if (!step.target || !step.expectedState) {\n throw new Error('Assert step requires target and expectedState');\n }\n return this.performAssertion(step.target, step.expectedState);\n\n case 'custom':\n if (!step.handler) {\n throw new Error('Custom step requires handler');\n }\n return step.handler();\n\n default:\n throw new Error(`Unknown step type: ${step.type}`);\n }\n }\n\n /**\n * Perform state assertion\n */\n private async performAssertion(\n target: string,\n expectedState: Record<string, unknown>\n ): Promise<{ passed: boolean; differences: string[] }> {\n const snapshot = await this.executor.getSnapshot();\n const element = snapshot.elements.find((e) => e.id === target);\n\n if (!element) {\n throw new Error(`Element not found for assertion: ${target}`);\n }\n\n const differences: string[] = [];\n\n for (const [key, expected] of Object.entries(expectedState)) {\n const actual = (element.state as unknown as Record<string, unknown>)[key];\n if (actual !== expected) {\n differences.push(`${key}: expected ${expected}, got ${actual}`);\n }\n }\n\n if (differences.length > 0) {\n throw new Error(`Assertion failed:\\n${differences.join('\\n')}`);\n }\n\n return { passed: true, differences };\n }\n\n /**\n * Interpolate parameters with {{param}} syntax\n */\n private interpolateParams(\n stepParams: Record<string, unknown>,\n workflowParams: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(stepParams)) {\n if (typeof value === 'string') {\n result[key] = value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n return String(workflowParams[name] ?? '');\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Build response from state\n */\n private buildResponse(state: WorkflowRunState): WorkflowRunResponse {\n return {\n workflowId: state.workflowId,\n runId: state.runId,\n status: state.status,\n steps: [...state.steps],\n currentStep: state.currentStep,\n totalSteps: state.workflow.steps.length,\n success: state.success,\n error: state.error,\n startedAt: state.startedAt,\n completedAt: state.completedAt,\n durationMs: state.durationMs,\n };\n }\n}\n\n/**\n * Internal workflow run state\n */\ninterface WorkflowRunState {\n workflowId: string;\n runId: string;\n workflow: Workflow;\n request?: WorkflowRunRequest;\n status: WorkflowRunStatus;\n steps: WorkflowStepResult[];\n currentStep: number;\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Create a workflow engine\n */\nexport function createWorkflowEngine(\n registry: UIBridgeRegistry,\n executor: ActionExecutor\n): WorkflowEngine {\n return new DefaultWorkflowEngine(registry, executor);\n}\n","/**\n * DOM Capture Module\n *\n * Utilities for capturing DOM snapshots and tracking changes.\n */\n\nimport type { ElementIdentifier, ElementState } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\n\n/**\n * Captured DOM element information\n */\nexport interface CapturedElement {\n /** Element identifier */\n identifier: ElementIdentifier;\n /** Best single identifier string */\n bestId: string;\n /** Tag name */\n tagName: string;\n /** Element role */\n role?: string;\n /** Accessible name */\n accessibleName?: string;\n /** Text content (truncated) */\n textContent?: string;\n /** Element state */\n state: ElementState;\n /** Attributes relevant for automation */\n attributes: Record<string, string>;\n /** Child element count */\n childCount: number;\n /** Depth in the DOM tree */\n depth: number;\n}\n\n/**\n * DOM snapshot\n */\nexport interface DOMSnapshot {\n /** Timestamp when snapshot was taken */\n timestamp: number;\n /** Page URL */\n url: string;\n /** Page title */\n title: string;\n /** Viewport dimensions */\n viewport: {\n width: number;\n height: number;\n scrollX: number;\n scrollY: number;\n };\n /** Captured elements */\n elements: CapturedElement[];\n /** Total DOM node count */\n totalNodeCount: number;\n /** Capture duration in milliseconds */\n captureDurationMs: number;\n}\n\n/**\n * Options for DOM capture\n */\nexport interface CaptureOptions {\n /** Root element to capture from (defaults to document.body) */\n root?: HTMLElement;\n /** Maximum depth to traverse */\n maxDepth?: number;\n /** Maximum number of elements to capture */\n maxElements?: number;\n /** Only capture interactive elements */\n interactiveOnly?: boolean;\n /** Include hidden elements */\n includeHidden?: boolean;\n /** Selectors to include (whitelist) */\n includeSelectors?: string[];\n /** Selectors to exclude (blacklist) */\n excludeSelectors?: string[];\n /** Custom filter function */\n filter?: (element: HTMLElement) => boolean;\n /** Truncate text content to this length */\n maxTextLength?: number;\n}\n\n/**\n * Attributes to capture for automation\n */\nconst CAPTURE_ATTRIBUTES = [\n 'data-ui-id',\n 'data-testid',\n 'data-awas-element',\n 'id',\n 'name',\n 'type',\n 'href',\n 'src',\n 'alt',\n 'title',\n 'placeholder',\n 'value',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'aria-expanded',\n 'aria-selected',\n 'aria-checked',\n 'aria-disabled',\n 'aria-hidden',\n 'role',\n 'tabindex',\n 'disabled',\n 'readonly',\n 'required',\n 'checked',\n];\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n];\n\n/**\n * Check if an element is interactive\n */\nfunction isInteractive(element: HTMLElement): boolean {\n return INTERACTIVE_SELECTORS.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n}\n\n/**\n * Get the accessible name of an element\n */\nfunction getAccessibleName(element: HTMLElement): string | undefined {\n // aria-label takes precedence\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n // Input associated label\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const id = element.id;\n if (id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Alt text for images\n if (element instanceof HTMLImageElement) {\n return element.alt || undefined;\n }\n\n // Button or link text content\n if (element.matches('button, a, [role=\"button\"], [role=\"link\"]')) {\n return element.textContent?.trim() || undefined;\n }\n\n return undefined;\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: isVisible(element, rect, style),\n enabled: !isDisabled(element),\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 // Input-specific state\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 } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n if (element.getAttribute('aria-hidden') === 'true') return false;\n\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Capture attributes from an element\n */\nfunction captureAttributes(element: HTMLElement): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of CAPTURE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value !== null) {\n attrs[attr] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Capture a single element\n */\nfunction captureElement(\n element: HTMLElement,\n depth: number,\n maxTextLength: number\n): CapturedElement {\n const identifier = createElementIdentifier(element);\n let textContent = element.textContent?.trim();\n if (textContent && textContent.length > maxTextLength) {\n textContent = textContent.substring(0, maxTextLength) + '...';\n }\n\n return {\n identifier,\n bestId: getBestIdentifier(element),\n tagName: element.tagName.toLowerCase(),\n role: element.getAttribute('role') || undefined,\n accessibleName: getAccessibleName(element),\n textContent,\n state: getElementState(element),\n attributes: captureAttributes(element),\n childCount: element.children.length,\n depth,\n };\n}\n\n/**\n * Capture DOM snapshot\n */\nexport function captureDOMSnapshot(options: CaptureOptions = {}): DOMSnapshot {\n const startTime = performance.now();\n const {\n root = document.body,\n maxDepth = 50,\n maxElements = 5000,\n interactiveOnly = false,\n includeHidden = false,\n includeSelectors,\n excludeSelectors,\n filter,\n maxTextLength = 200,\n } = options;\n\n const elements: CapturedElement[] = [];\n let totalNodeCount = 0;\n\n function shouldCapture(element: HTMLElement): boolean {\n // Check custom filter\n if (filter && !filter(element)) return false;\n\n // Check exclude selectors\n if (excludeSelectors) {\n for (const selector of excludeSelectors) {\n try {\n if (element.matches(selector)) return false;\n } catch {\n // Invalid selector\n }\n }\n }\n\n // Check include selectors (whitelist)\n if (includeSelectors && includeSelectors.length > 0) {\n let matches = false;\n for (const selector of includeSelectors) {\n try {\n if (element.matches(selector)) {\n matches = true;\n break;\n }\n } catch {\n // Invalid selector\n }\n }\n if (!matches) return false;\n }\n\n // Check interactive only\n if (interactiveOnly && !isInteractive(element)) return false;\n\n // Check visibility\n if (!includeHidden) {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n if (!isVisible(element, rect, style)) return false;\n }\n\n return true;\n }\n\n function traverse(element: HTMLElement, depth: number): void {\n if (depth > maxDepth || elements.length >= maxElements) return;\n\n totalNodeCount++;\n\n if (shouldCapture(element)) {\n elements.push(captureElement(element, depth, maxTextLength));\n }\n\n // Traverse children\n for (const child of element.children) {\n if (child instanceof HTMLElement) {\n traverse(child, depth + 1);\n }\n }\n }\n\n traverse(root, 0);\n\n const endTime = performance.now();\n\n return {\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n },\n elements,\n totalNodeCount,\n captureDurationMs: endTime - startTime,\n };\n}\n\n/**\n * Capture only interactive elements\n */\nexport function captureInteractiveElements(\n options: Omit<CaptureOptions, 'interactiveOnly'> = {}\n): DOMSnapshot {\n return captureDOMSnapshot({ ...options, interactiveOnly: true });\n}\n\n/**\n * Mutation record for tracked changes\n */\nexport interface DOMChange {\n timestamp: number;\n type: 'added' | 'removed' | 'modified' | 'attribute';\n elementId?: string;\n tagName: string;\n details?: {\n attributeName?: string;\n oldValue?: string;\n newValue?: string;\n addedNodes?: number;\n removedNodes?: number;\n };\n}\n\n/**\n * DOM change observer\n */\nexport class DOMChangeObserver {\n private observer: MutationObserver | null = null;\n private changes: DOMChange[] = [];\n private maxChanges: number;\n private callback?: (change: DOMChange) => void;\n\n constructor(options: { maxChanges?: number; callback?: (change: DOMChange) => void } = {}) {\n this.maxChanges = options.maxChanges ?? 1000;\n this.callback = options.callback;\n }\n\n start(root: HTMLElement = document.body): void {\n if (this.observer) return;\n\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n const change = this.processMutation(mutation);\n if (change) {\n this.addChange(change);\n }\n }\n });\n\n this.observer.observe(root, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n attributeOldValue: true,\n });\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n }\n\n private processMutation(mutation: MutationRecord): DOMChange | null {\n const target = mutation.target;\n if (!(target instanceof HTMLElement)) return null;\n\n const elementId = getBestIdentifier(target);\n\n if (mutation.type === 'attributes') {\n return {\n timestamp: Date.now(),\n type: 'attribute',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n attributeName: mutation.attributeName || undefined,\n oldValue: mutation.oldValue || undefined,\n newValue: mutation.attributeName\n ? target.getAttribute(mutation.attributeName) || undefined\n : undefined,\n },\n };\n }\n\n if (mutation.type === 'childList') {\n if (mutation.addedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'added',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n addedNodes: mutation.addedNodes.length,\n },\n };\n }\n if (mutation.removedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'removed',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n removedNodes: mutation.removedNodes.length,\n },\n };\n }\n }\n\n return null;\n }\n\n private addChange(change: DOMChange): void {\n this.changes.push(change);\n if (this.changes.length > this.maxChanges) {\n this.changes.shift();\n }\n this.callback?.(change);\n }\n\n getChanges(): DOMChange[] {\n return [...this.changes];\n }\n\n clearChanges(): void {\n this.changes = [];\n }\n}\n","/**\n * Render Log Snapshot Module\n *\n * Manages render log entries and provides persistence options.\n */\n\nimport type { DOMSnapshot, DOMChange, CaptureOptions } from './dom-capture';\nimport { captureDOMSnapshot, DOMChangeObserver } from './dom-capture';\n\n/**\n * Render log entry types\n */\nexport type RenderLogEntryType =\n | 'snapshot'\n | 'change'\n | 'navigation'\n | 'interaction'\n | 'error'\n | 'custom';\n\n/**\n * Base render log entry\n */\nexport interface RenderLogEntry {\n /** Unique entry ID */\n id: string;\n /** Entry type */\n type: RenderLogEntryType;\n /** Timestamp */\n timestamp: number;\n /** Entry data */\n data: unknown;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Snapshot entry\n */\nexport interface SnapshotEntry extends RenderLogEntry {\n type: 'snapshot';\n data: DOMSnapshot;\n}\n\n/**\n * Change entry\n */\nexport interface ChangeEntry extends RenderLogEntry {\n type: 'change';\n data: DOMChange[];\n}\n\n/**\n * Navigation entry\n */\nexport interface NavigationEntry extends RenderLogEntry {\n type: 'navigation';\n data: {\n from: string;\n to: string;\n navigationType: 'push' | 'replace' | 'pop' | 'reload';\n };\n}\n\n/**\n * Interaction entry\n */\nexport interface InteractionEntry extends RenderLogEntry {\n type: 'interaction';\n data: {\n eventType: string;\n targetId?: string;\n targetTagName?: string;\n coordinates?: { x: number; y: number };\n key?: string;\n modifiers?: {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n };\n };\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry extends RenderLogEntry {\n type: 'error';\n data: {\n message: string;\n stack?: string;\n source?: string;\n lineno?: number;\n colno?: number;\n };\n}\n\n/**\n * Render log storage interface\n */\nexport interface RenderLogStorage {\n /** Append an entry to the log */\n append(entry: RenderLogEntry): Promise<void>;\n /** Get entries by type and/or time range */\n getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]>;\n /** Clear the log */\n clear(): Promise<void>;\n /** Get total entry count */\n count(): Promise<number>;\n}\n\n/**\n * In-memory render log storage\n */\nexport class InMemoryRenderLogStorage implements RenderLogStorage {\n private entries: RenderLogEntry[] = [];\n private maxEntries: number;\n\n constructor(maxEntries = 1000) {\n this.maxEntries = maxEntries;\n }\n\n async append(entry: RenderLogEntry): Promise<void> {\n this.entries.push(entry);\n while (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n let results = [...this.entries];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.until) {\n results = results.filter((e) => e.timestamp <= options.until!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n async clear(): Promise<void> {\n this.entries = [];\n }\n\n async count(): Promise<number> {\n return this.entries.length;\n }\n\n /** Get entries synchronously (for in-memory only) */\n getEntriesSync(): RenderLogEntry[] {\n return [...this.entries];\n }\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Render log manager options\n */\nexport interface RenderLogOptions {\n /** Storage implementation */\n storage?: RenderLogStorage;\n /** Automatically capture snapshots on navigation */\n captureOnNavigation?: boolean;\n /** Automatically capture DOM changes */\n captureChanges?: boolean;\n /** Capture interval for periodic snapshots (ms) */\n snapshotInterval?: number;\n /** Default capture options */\n captureOptions?: CaptureOptions;\n /** Callback when entry is added */\n onEntry?: (entry: RenderLogEntry) => void;\n /** Maximum entries to keep */\n maxEntries?: number;\n}\n\n/**\n * Render Log Manager\n *\n * Central manager for capturing and storing render logs.\n */\nexport class RenderLogManager {\n private storage: RenderLogStorage;\n private changeObserver: DOMChangeObserver | null = null;\n private snapshotTimer: ReturnType<typeof setInterval> | null = null;\n private pendingChanges: DOMChange[] = [];\n private options: RenderLogOptions;\n private started = false;\n\n constructor(options: RenderLogOptions = {}) {\n this.options = options;\n this.storage = options.storage ?? new InMemoryRenderLogStorage(options.maxEntries);\n }\n\n /**\n * Start capturing\n */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n // Set up change observer\n if (this.options.captureChanges !== false) {\n this.changeObserver = new DOMChangeObserver({\n callback: (change) => {\n this.pendingChanges.push(change);\n },\n });\n this.changeObserver.start();\n }\n\n // Set up navigation observer\n if (this.options.captureOnNavigation !== false) {\n this.setupNavigationObserver();\n }\n\n // Set up periodic snapshots\n if (this.options.snapshotInterval) {\n this.snapshotTimer = setInterval(() => {\n this.captureSnapshot();\n }, this.options.snapshotInterval);\n }\n\n // Capture initial snapshot\n this.captureSnapshot();\n }\n\n /**\n * Stop capturing\n */\n stop(): void {\n if (!this.started) return;\n this.started = false;\n\n this.changeObserver?.stop();\n this.changeObserver = null;\n\n if (this.snapshotTimer) {\n clearInterval(this.snapshotTimer);\n this.snapshotTimer = null;\n }\n }\n\n /**\n * Capture a DOM snapshot\n */\n async captureSnapshot(metadata?: Record<string, unknown>): Promise<SnapshotEntry> {\n // Flush pending changes first\n if (this.pendingChanges.length > 0) {\n await this.flushChanges();\n }\n\n const snapshot = captureDOMSnapshot(this.options.captureOptions);\n const entry: SnapshotEntry = {\n id: generateId(),\n type: 'snapshot',\n timestamp: snapshot.timestamp,\n data: snapshot,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Flush pending DOM changes\n */\n async flushChanges(): Promise<ChangeEntry | null> {\n if (this.pendingChanges.length === 0) return null;\n\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n\n const entry: ChangeEntry = {\n id: generateId(),\n type: 'change',\n timestamp: Date.now(),\n data: changes,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an interaction\n */\n async logInteraction(\n eventType: string,\n details: Omit<InteractionEntry['data'], 'eventType'>\n ): Promise<InteractionEntry> {\n const entry: InteractionEntry = {\n id: generateId(),\n type: 'interaction',\n timestamp: Date.now(),\n data: {\n eventType,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an error\n */\n async logError(\n message: string,\n details?: Omit<ErrorEntry['data'], 'message'>\n ): Promise<ErrorEntry> {\n const entry: ErrorEntry = {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n data: {\n message,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log a navigation\n */\n async logNavigation(\n from: string,\n to: string,\n navigationType: NavigationEntry['data']['navigationType']\n ): Promise<NavigationEntry> {\n const entry: NavigationEntry = {\n id: generateId(),\n type: 'navigation',\n timestamp: Date.now(),\n data: {\n from,\n to,\n navigationType,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Add a custom entry\n */\n async logCustom(data: unknown, metadata?: Record<string, unknown>): Promise<RenderLogEntry> {\n const entry: RenderLogEntry = {\n id: generateId(),\n type: 'custom',\n timestamp: Date.now(),\n data,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Get log entries\n */\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n return this.storage.getEntries(options);\n }\n\n /**\n * Clear the log\n */\n async clear(): Promise<void> {\n this.pendingChanges = [];\n await this.storage.clear();\n }\n\n /**\n * Get entry count\n */\n async count(): Promise<number> {\n return this.storage.count();\n }\n\n /**\n * Get the latest snapshot\n */\n async getLatestSnapshot(): Promise<SnapshotEntry | null> {\n const snapshots = await this.storage.getEntries({ type: 'snapshot', limit: 1 });\n return (snapshots[0] as SnapshotEntry) || null;\n }\n\n private async addEntry(entry: RenderLogEntry): Promise<void> {\n await this.storage.append(entry);\n this.options.onEntry?.(entry);\n }\n\n private setupNavigationObserver(): void {\n let lastUrl = window.location.href;\n\n // History API\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'push');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'replace');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n // Popstate (back/forward)\n window.addEventListener('popstate', () => {\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'pop');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n });\n }\n}\n\n/**\n * Create a render log manager with default options\n */\nexport function createRenderLogManager(options?: RenderLogOptions): RenderLogManager {\n return new RenderLogManager(options);\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","/**\n * UI Bridge Provider\n *\n * React context provider for UI Bridge functionality.\n */\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n UIBridgeFeatures,\n UIBridgeConfig,\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n BridgeEvent,\n WSConnectionState,\n WSSubscriptionOptions,\n} from '../core/types';\nimport { UIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } from '../core/registry';\nimport { UIBridgeWSClient, createWSClient } from '../core/websocket-client';\nimport { createActionExecutor } from '../control/action-executor';\nimport { createWorkflowEngine } from '../control/workflow-engine';\nimport { createRenderLogManager, RenderLogManager } from '../render-log/snapshot';\nimport { createMetricsCollector, MetricsCollector } from '../debug/metrics';\nimport type { ActionExecutor, WorkflowEngine } from '../control/types';\n\n/**\n * UI Bridge context value\n */\nexport interface UIBridgeContextValue {\n /** Feature flags */\n features: UIBridgeFeatures;\n /** Configuration */\n config: UIBridgeConfig;\n /** Element registry */\n registry: UIBridgeRegistry;\n /** Action executor */\n executor: ActionExecutor;\n /** Workflow engine */\n workflowEngine: WorkflowEngine;\n /** Render log manager (if enabled) */\n renderLog?: RenderLogManager;\n /** Metrics collector (if debug enabled) */\n metrics?: MetricsCollector;\n /** WebSocket client (if websocket enabled) */\n wsClient?: UIBridgeWSClient;\n /** WebSocket connection state */\n wsConnectionState: WSConnectionState;\n /** Get all registered elements */\n getElements: () => RegisteredElement[];\n /** Get all registered components */\n getComponents: () => RegisteredComponent[];\n /** Create a snapshot */\n createSnapshot: () => BridgeSnapshot;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Connect to WebSocket server */\n wsConnect: () => Promise<void>;\n /** Disconnect from WebSocket server */\n wsDisconnect: () => void;\n /** Subscribe to WebSocket events */\n wsSubscribe: (options: WSSubscriptionOptions) => Promise<BridgeEventType[]>;\n /** Add WebSocket event listener */\n onWsEvent: (\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ) => () => void;\n}\n\n/**\n * UI Bridge context\n */\nconst UIBridgeContext = createContext<UIBridgeContextValue | null>(null);\n\n/**\n * UI Bridge provider props\n */\nexport interface UIBridgeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: UIBridgeFeatures;\n /** Configuration */\n config?: UIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Provider\n *\n * Provides UI Bridge context to child components.\n */\nexport function UIBridgeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n}: UIBridgeProviderProps) {\n const registryRef = useRef<UIBridgeRegistry | null>(null);\n const renderLogRef = useRef<RenderLogManager | null>(null);\n const metricsRef = useRef<MetricsCollector | null>(null);\n const wsClientRef = useRef<UIBridgeWSClient | null>(null);\n const [wsConnectionState, setWsConnectionState] = useState<WSConnectionState>('disconnected');\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new UIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n\n if (features.renderLog) {\n renderLogRef.current = createRenderLogManager({\n maxEntries: config.maxLogEntries,\n });\n }\n\n if (features.debug) {\n metricsRef.current = createMetricsCollector();\n }\n\n // Initialize WebSocket client if enabled\n if (config.websocket) {\n const wsPort = config.websocketPort || config.serverPort || 9876;\n const wsUrl = `ws://localhost:${wsPort}`;\n wsClientRef.current = createWSClient({\n url: wsUrl,\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 10,\n pingInterval: 30000,\n });\n }\n }\n\n const registry = registryRef.current;\n const renderLog = renderLogRef.current || undefined;\n const metrics = metricsRef.current || undefined;\n const wsClient = wsClientRef.current || undefined;\n\n // Create executor and workflow engine\n const executor = useMemo(() => createActionExecutor(registry), [registry]);\n const workflowEngine = useMemo(\n () => createWorkflowEngine(registry, executor),\n [registry, executor]\n );\n\n // Start render log on mount\n useEffect(() => {\n if (features.renderLog && renderLog) {\n renderLog.start();\n return () => renderLog.stop();\n }\n }, [features.renderLog, renderLog]);\n\n // Wire up metrics to events\n useEffect(() => {\n if (!metrics) return;\n\n const unsubCompleted = registry.on('action:completed', (event) => {\n metrics.recordEvent(event);\n });\n const unsubFailed = registry.on('action:failed', (event) => {\n metrics.recordEvent(event);\n });\n\n return () => {\n unsubCompleted();\n unsubFailed();\n };\n }, [registry, metrics]);\n\n // Setup WebSocket connection state listener\n useEffect(() => {\n if (!wsClient) return;\n\n const unsubscribe = wsClient.onConnectionChange((state) => {\n setWsConnectionState(state);\n });\n\n return unsubscribe;\n }, [wsClient]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n renderLog?.stop();\n wsClient?.disconnect();\n resetGlobalRegistry();\n };\n }, [renderLog, wsClient]);\n\n // WebSocket methods\n const wsConnect = useCallback(async () => {\n if (wsClient) {\n await wsClient.connect();\n }\n }, [wsClient]);\n\n const wsDisconnect = useCallback(() => {\n wsClient?.disconnect();\n }, [wsClient]);\n\n const wsSubscribe = useCallback(\n async (options: WSSubscriptionOptions) => {\n if (!wsClient) {\n return [];\n }\n return wsClient.subscribe(options);\n },\n [wsClient]\n );\n\n const onWsEvent = useCallback(\n (eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void) => {\n if (!wsClient) {\n return () => {};\n }\n return wsClient.onEvent(eventType, listener);\n },\n [wsClient]\n );\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n initialized: true,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n }),\n [\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n ]\n );\n\n return <UIBridgeContext.Provider value={contextValue}>{children}</UIBridgeContext.Provider>;\n}\n\n/**\n * useUIBridgeContext hook\n *\n * Access the UI Bridge context. Throws if used outside provider.\n */\nexport function useUIBridgeContext(): UIBridgeContextValue {\n const context = useContext(UIBridgeContext);\n if (!context) {\n throw new Error('useUIBridgeContext must be used within a UIBridgeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeOptional hook\n *\n * Access the UI Bridge context, returning null if outside provider.\n */\nexport function useUIBridgeOptional(): UIBridgeContextValue | null {\n return useContext(UIBridgeContext);\n}\n","/**\n * useUIElement Hook\n *\n * Register a DOM element with UI Bridge for control and observation.\n */\n\nimport { useRef, useEffect, useCallback, useMemo } from 'react';\nimport type {\n ElementType,\n StandardAction,\n CustomAction,\n ElementState,\n ElementIdentifier,\n RegisteredElement,\n} from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIElement options\n */\nexport interface UseUIElementOptions {\n /** Unique identifier for the element */\n id: string;\n /** Element type (auto-detected if not provided) */\n type?: ElementType;\n /** Human-readable label */\n label?: string;\n /** Override available actions */\n actions?: StandardAction[];\n /** Custom actions */\n customActions?: Record<string, CustomAction>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: ElementState) => void;\n}\n\n/**\n * useUIElement return value\n */\nexport interface UseUIElementReturn {\n /** Ref to attach to the element */\n ref: React.RefCallback<HTMLElement>;\n /** Current element reference */\n element: HTMLElement | null;\n /** Whether the element is registered */\n registered: boolean;\n /** Get current state */\n getState: () => ElementState | null;\n /** Get element identifier */\n getIdentifier: () => ElementIdentifier | null;\n /** Trigger an action on this element */\n trigger: (action: StandardAction | string, params?: Record<string, unknown>) => Promise<void>;\n /** Manually register the element */\n register: () => void;\n /** Manually unregister the element */\n unregister: () => void;\n /** The registered element info */\n registeredElement: RegisteredElement | null;\n}\n\n/**\n * useUIElement hook\n *\n * Registers a DOM element with UI Bridge for programmatic control.\n *\n * @example\n * ```tsx\n * function SubmitButton() {\n * const { ref, trigger } = useUIElement({\n * id: 'submit-btn',\n * type: 'button',\n * label: 'Submit Form',\n * });\n *\n * return (\n * <button ref={ref} data-ui-id=\"submit-btn\">\n * Submit\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIElement(options: UseUIElementOptions): UseUIElementReturn {\n const bridge = useUIBridgeOptional();\n const elementRef = useRef<HTMLElement | null>(null);\n const registeredRef = useRef(false);\n\n const { id, type, label, actions, customActions, autoRegister = true } = options;\n\n // Register the element\n const register = useCallback(() => {\n if (!bridge || !elementRef.current || registeredRef.current) return;\n\n bridge.registry.registerElement(id, elementRef.current, {\n type,\n label,\n actions,\n customActions,\n });\n registeredRef.current = true;\n }, [bridge, id, type, label, actions, customActions]);\n\n // Unregister the element\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterElement(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Ref callback\n const ref = useCallback(\n (node: HTMLElement | null) => {\n // Cleanup previous\n if (elementRef.current && elementRef.current !== node) {\n unregister();\n }\n\n elementRef.current = node;\n\n // Register new element\n if (node && autoRegister) {\n register();\n }\n },\n [autoRegister, register, unregister]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregister();\n };\n }, [unregister]);\n\n // Get state\n const getState = useCallback((): ElementState | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getState() || null;\n }, [bridge, id]);\n\n // Get identifier\n const getIdentifier = useCallback((): ElementIdentifier | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getIdentifier() || null;\n }, [bridge, id]);\n\n // Trigger action\n const trigger = useCallback(\n async (action: StandardAction | string, params?: Record<string, unknown>) => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeAction(id, {\n action,\n params,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n },\n [bridge, id]\n );\n\n // Get registered element\n const registeredElement = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getElement(id) || null;\n }, [bridge, id]);\n\n return {\n ref,\n element: elementRef.current,\n registered: registeredRef.current,\n getState,\n getIdentifier,\n trigger,\n register,\n unregister,\n registeredElement,\n };\n}\n\n/**\n * useUIElementRef hook\n *\n * A simpler version that just adds the data-ui-id attribute.\n * Useful when you only need identification without full registration.\n */\nexport function useUIElementRef(id: string): React.RefCallback<HTMLElement> {\n return useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n node.setAttribute('data-ui-id', id);\n }\n },\n [id]\n );\n}\n","/**\n * useUIComponent Hook\n *\n * Register a component with UI Bridge for component-level actions.\n */\n\nimport { useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { RegisteredComponent } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * Action definition for useUIComponent\n */\nexport interface ComponentActionDef<TParams = unknown, TResult = unknown> {\n /** Action identifier */\n id: string;\n /** Human-readable label */\n label?: string;\n /** Description */\n description?: string;\n /** Handler function */\n handler: (params?: TParams) => TResult | Promise<TResult>;\n}\n\n/**\n * useUIComponent options\n */\nexport interface UseUIComponentOptions {\n /** Unique identifier for the component */\n id: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Actions available on this component */\n actions?: ComponentActionDef[];\n /** Child element IDs owned by this component */\n elementIds?: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUIComponent return value\n */\nexport interface UseUIComponentReturn {\n /** Whether the component is registered */\n registered: boolean;\n /** Execute an action on this component */\n executeAction: <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ) => Promise<TResult>;\n /** Manually register the component */\n register: () => void;\n /** Manually unregister the component */\n unregister: () => void;\n /** Update actions dynamically */\n updateActions: (actions: ComponentActionDef[]) => void;\n /** Add an element ID to this component */\n addElement: (elementId: string) => void;\n /** Remove an element ID from this component */\n removeElement: (elementId: string) => void;\n /** The registered component info */\n registeredComponent: RegisteredComponent | null;\n}\n\n/**\n * useUIComponent hook\n *\n * Registers a component with UI Bridge for component-level control.\n * Components can expose high-level actions that may orchestrate multiple element interactions.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const [email, setEmail] = useState('');\n * const [password, setPassword] = useState('');\n *\n * useUIComponent({\n * id: 'login-form',\n * name: 'Login Form',\n * actions: [\n * {\n * id: 'login',\n * label: 'Submit Login',\n * handler: async ({ email, password }) => {\n * setEmail(email);\n * setPassword(password);\n * await submitLogin();\n * },\n * },\n * {\n * id: 'clear',\n * label: 'Clear Form',\n * handler: () => {\n * setEmail('');\n * setPassword('');\n * },\n * },\n * ],\n * });\n *\n * return (\n * <form>\n * <input value={email} onChange={(e) => setEmail(e.target.value)} />\n * <input value={password} onChange={(e) => setPassword(e.target.value)} />\n * <button type=\"submit\">Login</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useUIComponent(options: UseUIComponentOptions): UseUIComponentReturn {\n const bridge = useUIBridgeOptional();\n const registeredRef = useRef(false);\n const actionsRef = useRef(options.actions || []);\n const elementIdsRef = useRef(options.elementIds || []);\n\n const { id, name, description, autoRegister = true } = options;\n\n // Update refs when options change\n useEffect(() => {\n actionsRef.current = options.actions || [];\n elementIdsRef.current = options.elementIds || [];\n }, [options.actions, options.elementIds]);\n\n // Register the component\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerComponent(id, {\n name,\n description,\n actions: actionsRef.current.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds: elementIdsRef.current,\n });\n registeredRef.current = true;\n }, [bridge, id, name, description]);\n\n // Unregister the component\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Execute an action\n const executeAction = useCallback(\n async <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ): Promise<TResult> => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeComponentAction(id, {\n action: actionId,\n params: params as Record<string, unknown>,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return response.result as TResult;\n },\n [bridge, id]\n );\n\n // Update actions dynamically\n const updateActions = useCallback(\n (actions: ComponentActionDef[]) => {\n actionsRef.current = actions;\n\n // Re-register with updated actions if already registered\n if (registeredRef.current && bridge) {\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n register();\n }\n },\n [bridge, id, register]\n );\n\n // Add element ID\n const addElement = useCallback((elementId: string) => {\n if (!elementIdsRef.current.includes(elementId)) {\n elementIdsRef.current = [...elementIdsRef.current, elementId];\n }\n }, []);\n\n // Remove element ID\n const removeElement = useCallback((elementId: string) => {\n elementIdsRef.current = elementIdsRef.current.filter((id) => id !== elementId);\n }, []);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n register();\n }\n\n return () => {\n unregister();\n };\n }, [autoRegister, register, unregister]);\n\n // Get registered component\n const registeredComponent = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getComponent(id) || null;\n }, [bridge, id]);\n\n return {\n registered: registeredRef.current,\n executeAction,\n register,\n unregister,\n updateActions,\n addElement,\n removeElement,\n registeredComponent,\n };\n}\n\n/**\n * useUIComponentAction hook\n *\n * Create a stable action handler that can be used with useUIComponent.\n * Useful for memoizing action handlers.\n */\nexport function useUIComponentAction<TParams = unknown, TResult = unknown>(\n handler: (params?: TParams) => TResult | Promise<TResult>,\n deps: React.DependencyList\n): (params?: TParams) => TResult | Promise<TResult> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(handler, deps);\n}\n","/**\n * useUIBridge Hook\n *\n * Main hook for accessing UI Bridge functionality.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n ElementState,\n Workflow,\n} from '../core/types';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n FindRequest,\n FindResponse,\n WorkflowRunRequest,\n WorkflowRunResponse,\n} from '../control/types';\nimport { useUIBridgeContext, useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIBridge return value\n */\nexport interface UseUIBridgeReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether initialized */\n initialized: boolean;\n /** Get all registered elements */\n elements: RegisteredElement[];\n /** Get all registered components */\n components: RegisteredComponent[];\n /** Get all workflows */\n workflows: Workflow[];\n /** Create a snapshot of the current state */\n createSnapshot: () => BridgeSnapshot;\n /** Execute an action on an element */\n executeAction: (\n elementId: string,\n request: ControlActionRequest\n ) => Promise<ControlActionResponse>;\n /** Execute an action on a component */\n executeComponentAction: (\n componentId: string,\n request: ComponentActionRequest\n ) => Promise<ComponentActionResponse>;\n /** Find controllable elements */\n find: (options?: FindRequest) => Promise<FindResponse>;\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n discover: (options?: FindRequest) => Promise<FindResponse>;\n /** Run a workflow */\n runWorkflow: (workflowId: string, request?: WorkflowRunRequest) => Promise<WorkflowRunResponse>;\n /** Get element by ID */\n getElement: (id: string) => RegisteredElement | undefined;\n /** Get component by ID */\n getComponent: (id: string) => RegisteredComponent | undefined;\n /** Get element state by ID */\n getElementState: (id: string) => ElementState | undefined;\n /** Register a workflow */\n registerWorkflow: (workflow: Workflow) => void;\n /** Unregister a workflow */\n unregisterWorkflow: (id: string) => void;\n /** Capture a render log snapshot (if enabled) */\n captureRenderLog: () => Promise<void>;\n /** Get render log entries (if enabled) */\n getRenderLogEntries: () => Promise<unknown[]>;\n /** Clear render log (if enabled) */\n clearRenderLog: () => Promise<void>;\n /** Get metrics (if debug enabled) */\n getMetrics: () => unknown | undefined;\n /** Get action history (if debug enabled) */\n getActionHistory: () => unknown[] | undefined;\n}\n\n/**\n * useUIBridge hook\n *\n * Main hook for accessing UI Bridge functionality.\n * Use this to interact with registered elements, components, and workflows.\n *\n * @example\n * ```tsx\n * function AutomationController() {\n * const bridge = useUIBridge();\n *\n * const handleSubmit = async () => {\n * // Execute element action\n * await bridge.executeAction('submit-btn', { action: 'click' });\n *\n * // Or use component action\n * await bridge.executeComponentAction('login-form', {\n * action: 'login',\n * params: { email: 'user@example.com', password: 'secret' },\n * });\n * };\n *\n * return (\n * <button onClick={handleSubmit}>\n * Automate Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIBridge(): UseUIBridgeReturn {\n const context = useUIBridgeOptional();\n\n const available = !!context;\n const initialized = context?.initialized ?? false;\n\n // Get collections\n const elements = useMemo(() => context?.getElements() ?? [], [context]);\n\n const components = useMemo(() => context?.getComponents() ?? [], [context]);\n\n const workflows = useMemo(() => context?.registry.getAllWorkflows() ?? [], [context]);\n\n // Create snapshot\n const createSnapshot = useCallback((): BridgeSnapshot => {\n if (!context) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return context.createSnapshot();\n }, [context]);\n\n // Execute element action\n const executeAction = useCallback(\n async (elementId: string, request: ControlActionRequest): Promise<ControlActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeAction(elementId, request);\n },\n [context]\n );\n\n // Execute component action\n const executeComponentAction = useCallback(\n async (\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeComponentAction(componentId, request);\n },\n [context]\n );\n\n // Find elements\n const find = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n if (!context) {\n return {\n elements: [],\n total: 0,\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.find(options);\n },\n [context]\n );\n\n // Discover elements (deprecated - use find instead)\n const discover = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n return find(options);\n },\n [find]\n );\n\n // Run workflow\n const runWorkflow = useCallback(\n async (workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> => {\n if (!context) {\n return {\n workflowId,\n runId: '',\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: 'UI Bridge not available',\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n return context.workflowEngine.run(workflowId, request);\n },\n [context]\n );\n\n // Get element by ID\n const getElement = useCallback(\n (id: string): RegisteredElement | undefined => {\n return context?.registry.getElement(id);\n },\n [context]\n );\n\n // Get component by ID\n const getComponent = useCallback(\n (id: string): RegisteredComponent | undefined => {\n return context?.registry.getComponent(id);\n },\n [context]\n );\n\n // Get element state\n const getElementState = useCallback(\n (id: string): ElementState | undefined => {\n const element = context?.registry.getElement(id);\n return element?.getState();\n },\n [context]\n );\n\n // Register workflow\n const registerWorkflow = useCallback(\n (workflow: Workflow): void => {\n context?.registry.registerWorkflow(workflow);\n },\n [context]\n );\n\n // Unregister workflow\n const unregisterWorkflow = useCallback(\n (id: string): void => {\n context?.registry.unregisterWorkflow(id);\n },\n [context]\n );\n\n // Render log methods\n const captureRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.captureSnapshot();\n }, [context]);\n\n const getRenderLogEntries = useCallback(async (): Promise<unknown[]> => {\n return (await context?.renderLog?.getEntries()) ?? [];\n }, [context]);\n\n const clearRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.clear();\n }, [context]);\n\n // Metrics methods\n const getMetrics = useCallback((): unknown | undefined => {\n return context?.metrics?.getMetrics();\n }, [context]);\n\n const getActionHistory = useCallback((): unknown[] | undefined => {\n return context?.metrics?.getHistory();\n }, [context]);\n\n return {\n available,\n initialized,\n elements,\n components,\n workflows,\n createSnapshot,\n executeAction,\n executeComponentAction,\n find,\n discover, // deprecated - use find\n runWorkflow,\n getElement,\n getComponent,\n getElementState,\n registerWorkflow,\n unregisterWorkflow,\n captureRenderLog,\n getRenderLogEntries,\n clearRenderLog,\n getMetrics,\n getActionHistory,\n };\n}\n\n/**\n * useUIBridgeRequired hook\n *\n * Same as useUIBridge but throws if UI Bridge is not available.\n */\nexport function useUIBridgeRequired(): UseUIBridgeReturn {\n useUIBridgeContext(); // Will throw if not in provider\n return useUIBridge();\n}\n","/**\n * useUIState Hook\n *\n * Register and manage UI states with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UIState, UIStateGroup, StateSnapshot } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIState options\n */\nexport interface UseUIStateOptions {\n /** Unique identifier for the state */\n id: string;\n /** Human-readable name */\n name: string;\n /** Element IDs belonging to this state */\n elements?: string[];\n /** Function to detect if state is active */\n activeWhen?: () => boolean;\n /** If true, blocks other state activations (modal behavior) */\n blocking?: boolean;\n /** Specific state IDs this state blocks */\n blocks?: string[];\n /** State group membership */\n group?: string;\n /** Cost for pathfinding (default: 1.0) */\n pathCost?: number;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Initial active state */\n initialActive?: boolean;\n}\n\n/**\n * useUIState return value\n */\nexport interface UseUIStateReturn {\n /** Whether the state is registered */\n registered: boolean;\n /** Whether the state is currently active */\n isActive: boolean;\n /** Activate this state */\n activate: () => boolean;\n /** Deactivate this state */\n deactivate: () => boolean;\n /** Toggle active state */\n toggle: () => boolean;\n /** Get all currently active states */\n activeStates: string[];\n /** Manually register the state */\n register: () => void;\n /** Manually unregister the state */\n unregister: () => void;\n /** The registered state info */\n state: UIState | undefined;\n}\n\n/**\n * useUIState hook\n *\n * Registers a UI state with UI Bridge for state management.\n *\n * @example\n * ```tsx\n * function LoginModal() {\n * const { isActive, activate, deactivate } = useUIState({\n * id: 'login-modal',\n * name: 'Login Modal',\n * blocking: true,\n * elements: ['login-email', 'login-password', 'login-submit'],\n * });\n *\n * if (!isActive) return null;\n *\n * return (\n * <div className=\"modal\">\n * <button onClick={deactivate}>Close</button>\n * ...\n * </div>\n * );\n * }\n * ```\n */\nexport function useUIState(options: UseUIStateOptions): UseUIStateReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [isActive, setIsActive] = useState(options.initialActive ?? false);\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n const {\n id,\n name,\n elements = [],\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n autoRegister = true,\n initialActive = false,\n } = options;\n\n // Register the state\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const state: UIState = {\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n };\n\n bridge.registry.registerState(state);\n setRegistered(true);\n\n // Set initial active state\n if (initialActive) {\n bridge.registry.activateState(id);\n setIsActive(true);\n }\n\n // Update active states\n setActiveStates(bridge.registry.getActiveStates());\n }, [\n bridge,\n registered,\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n initialActive,\n ]);\n\n // Unregister the state\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterState(id);\n setRegistered(false);\n setIsActive(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes\n useEffect(() => {\n if (!bridge) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { stateId: string; active: boolean; activeStates: string[] };\n if (data.stateId === id) {\n setIsActive(data.active);\n }\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge, id]);\n\n // Activate state\n const activate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.activateState(id);\n if (success) {\n setIsActive(true);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Deactivate state\n const deactivate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.deactivateState(id);\n if (success) {\n setIsActive(false);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Toggle state\n const toggle = useCallback((): boolean => {\n return isActive ? deactivate() : activate();\n }, [isActive, activate, deactivate]);\n\n // Get registered state\n const state = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getState(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n isActive,\n activate,\n deactivate,\n toggle,\n activeStates,\n register,\n unregister,\n state,\n };\n}\n\n/**\n * useUIStateGroup hook\n *\n * Register and manage a state group with UI Bridge.\n *\n * @example\n * ```tsx\n * function NavigationSection() {\n * const { activate, deactivate } = useUIStateGroup({\n * id: 'nav-group',\n * name: 'Navigation',\n * states: ['nav-home', 'nav-about', 'nav-contact'],\n * });\n *\n * // Activating the group activates all its states\n * // Deactivating the group deactivates all its states\n * }\n * ```\n */\nexport interface UseUIStateGroupOptions {\n /** Unique identifier for the group */\n id: string;\n /** Human-readable name */\n name: string;\n /** State IDs belonging to this group */\n states: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\nexport interface UseUIStateGroupReturn {\n /** Whether the group is registered */\n registered: boolean;\n /** Activate all states in this group */\n activate: () => string[];\n /** Deactivate all states in this group */\n deactivate: () => string[];\n /** Manually register the group */\n register: () => void;\n /** Manually unregister the group */\n unregister: () => void;\n /** The registered group info */\n group: UIStateGroup | undefined;\n}\n\nexport function useUIStateGroup(options: UseUIStateGroupOptions): UseUIStateGroupReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n\n const { id, name, states, autoRegister = true } = options;\n\n // Register the group\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const group: UIStateGroup = { id, name, states };\n bridge.registry.registerStateGroup(group);\n setRegistered(true);\n }, [bridge, registered, id, name, states]);\n\n // Unregister the group\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterStateGroup(id);\n setRegistered(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Activate group\n const activate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.activateStateGroup(id);\n }, [bridge, id]);\n\n // Deactivate group\n const deactivate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.deactivateStateGroup(id);\n }, [bridge, id]);\n\n // Get registered group\n const group = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getStateGroup(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n activate,\n deactivate,\n register,\n unregister,\n group,\n };\n}\n\n/**\n * useActiveStates hook\n *\n * Subscribe to active states changes.\n */\nexport function useActiveStates(): string[] {\n const bridge = useUIBridgeOptional();\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n // Get initial active states\n setActiveStates(bridge.registry.getActiveStates());\n\n // Subscribe to changes\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { activeStates: string[] };\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge]);\n\n return activeStates;\n}\n\n/**\n * useStateSnapshot hook\n *\n * Get a snapshot of all state management data.\n */\nexport function useStateSnapshot(): StateSnapshot | null {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.createStateSnapshot();\n }, [bridge]);\n}\n","/**\n * useUITransition Hook\n *\n * Register and execute UI state transitions with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UITransition, TransitionResult, WorkflowStep } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUITransition options\n */\nexport interface UseUITransitionOptions {\n /** Unique identifier for the transition */\n id: string;\n /** Human-readable name */\n name: string;\n /** Precondition: at least one must be active */\n fromStates: string[];\n /** States to activate */\n activateStates: string[];\n /** States to deactivate */\n exitStates: string[];\n /** Groups to activate */\n activateGroups?: string[];\n /** Groups to deactivate */\n exitGroups?: string[];\n /** Actions to execute during transition */\n actions?: WorkflowStep[];\n /** Cost for pathfinding */\n pathCost?: number;\n /** Whether source states remain visible during transition */\n staysVisible?: boolean;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUITransition return value\n */\nexport interface UseUITransitionReturn {\n /** Whether the transition is registered */\n registered: boolean;\n /** Whether this transition can be executed from current state */\n canExecute: boolean;\n /** Execute the transition */\n execute: () => Promise<TransitionResult>;\n /** Manually register the transition */\n register: () => void;\n /** Manually unregister the transition */\n unregister: () => void;\n /** The registered transition info */\n transition: UITransition | undefined;\n}\n\n/**\n * useUITransition hook\n *\n * Registers a state transition with UI Bridge.\n *\n * @example\n * ```tsx\n * function OpenModalButton() {\n * const { canExecute, execute } = useUITransition({\n * id: 'open-login-modal',\n * name: 'Open Login Modal',\n * fromStates: ['dashboard'],\n * activateStates: ['login-modal'],\n * exitStates: [],\n * });\n *\n * return (\n * <button onClick={execute} disabled={!canExecute}>\n * Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUITransition(options: UseUITransitionOptions): UseUITransitionReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [canExecute, setCanExecute] = useState(false);\n\n const {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n autoRegister = true,\n } = options;\n\n // Register the transition\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const transition: UITransition = {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n };\n\n bridge.registry.registerTransition(transition);\n setRegistered(true);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n }, [\n bridge,\n registered,\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n ]);\n\n // Unregister the transition\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterTransition(id);\n setRegistered(false);\n setCanExecute(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes to update canExecute\n useEffect(() => {\n if (!bridge || !registered) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', () => {\n setCanExecute(bridge.registry.canExecuteTransition(id));\n });\n\n return unsubscribe;\n }, [bridge, id, registered]);\n\n // Execute transition\n const execute = useCallback(async (): Promise<TransitionResult> => {\n if (!bridge) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n }\n const result = await bridge.registry.executeTransition(id);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n return result;\n }, [bridge, id]);\n\n // Get registered transition\n const transition = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getTransition(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n canExecute,\n execute,\n register,\n unregister,\n transition,\n };\n}\n\n/**\n * useTransitions hook\n *\n * Get all registered transitions.\n */\nexport function useTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getAllTransitions();\n }, [bridge]);\n}\n\n/**\n * useAvailableTransitions hook\n *\n * Get transitions that can be executed from current state.\n */\nexport function useAvailableTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n const [available, setAvailable] = useState<UITransition[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n const updateAvailable = () => {\n const transitions = bridge.registry.getAllTransitions();\n const availableTransitions = transitions.filter((t) =>\n bridge.registry.canExecuteTransition(t.id)\n );\n setAvailable(availableTransitions);\n };\n\n // Initial check\n updateAvailable();\n\n // Subscribe to state changes\n const unsubscribe = bridge.registry.on('element:stateChanged', updateAvailable);\n\n return unsubscribe;\n }, [bridge]);\n\n return available;\n}\n","/**\n * useUINavigation Hook\n *\n * Navigate between UI states using pathfinding with UI Bridge.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport type { PathResult, NavigationResult } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUINavigation return value\n */\nexport interface UseUINavigationReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether navigation is currently in progress */\n isNavigating: boolean;\n /** Last navigation result */\n lastResult: NavigationResult | null;\n /** Find a path to target states (without executing) */\n findPath: (targetStates: string[]) => PathResult;\n /** Navigate to target states */\n navigateTo: (targetStates: string[]) => Promise<NavigationResult>;\n /** Current active states */\n activeStates: string[];\n}\n\n/**\n * useUINavigation hook\n *\n * Provides state machine navigation capabilities with pathfinding.\n *\n * @example\n * ```tsx\n * function NavigationController() {\n * const { navigateTo, findPath, isNavigating, activeStates } = useUINavigation();\n *\n * const goToDashboard = async () => {\n * // Find path first to check if navigation is possible\n * const path = findPath(['dashboard']);\n * if (!path.found) {\n * console.log('Cannot reach dashboard from current state');\n * return;\n * }\n *\n * console.log(`Will execute ${path.transitions.length} transitions`);\n *\n * // Execute navigation\n * const result = await navigateTo(['dashboard']);\n * if (result.success) {\n * console.log('Successfully navigated to dashboard');\n * }\n * };\n *\n * return (\n * <div>\n * <p>Current states: {activeStates.join(', ')}</p>\n * <button onClick={goToDashboard} disabled={isNavigating}>\n * Go to Dashboard\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useUINavigation(): UseUINavigationReturn {\n const bridge = useUIBridgeOptional();\n const [isNavigating, setIsNavigating] = useState(false);\n const [lastResult, setLastResult] = useState<NavigationResult | null>(null);\n\n const available = !!bridge;\n\n // Get current active states\n const activeStates = useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getActiveStates();\n }, [bridge]);\n\n // Find path to target states\n const findPath = useCallback(\n (targetStates: string[]): PathResult => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n },\n [bridge]\n );\n\n // Navigate to target states\n const navigateTo = useCallback(\n async (targetStates: string[]): Promise<NavigationResult> => {\n if (!bridge) {\n const result: NavigationResult = {\n success: false,\n path: {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n },\n executedTransitions: [],\n finalActiveStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n setLastResult(result);\n return result;\n }\n\n setIsNavigating(true);\n try {\n const result = await bridge.registry.navigateTo(targetStates);\n setLastResult(result);\n return result;\n } finally {\n setIsNavigating(false);\n }\n },\n [bridge]\n );\n\n return {\n available,\n isNavigating,\n lastResult,\n findPath,\n navigateTo,\n activeStates,\n };\n}\n\n/**\n * useCanNavigateTo hook\n *\n * Check if navigation to target states is possible.\n *\n * @example\n * ```tsx\n * function DashboardLink() {\n * const canNavigate = useCanNavigateTo(['dashboard']);\n *\n * return (\n * <button disabled={!canNavigate}>\n * Dashboard\n * </button>\n * );\n * }\n * ```\n */\nexport function useCanNavigateTo(targetStates: string[]): boolean {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return false;\n const path = bridge.registry.findPath(targetStates);\n return path.found;\n }, [bridge, targetStates]);\n}\n\n/**\n * useNavigationPath hook\n *\n * Get the path to target states (updates when active states change).\n *\n * @example\n * ```tsx\n * function PathDisplay() {\n * const path = useNavigationPath(['checkout']);\n *\n * if (!path.found) {\n * return <p>Cannot reach checkout from here</p>;\n * }\n *\n * return (\n * <p>\n * Steps to checkout: {path.transitions.join(' -> ')}\n * (Cost: {path.totalCost})\n * </p>\n * );\n * }\n * ```\n */\nexport function useNavigationPath(targetStates: string[]): PathResult {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n }, [bridge, targetStates]);\n}\n","/**\n * useAutoRegister Hook\n *\n * Enables automatic registration of interactive DOM elements with the UI Bridge.\n * This eliminates the need for manual useUIElement() calls on every component.\n *\n * Features:\n * - Auto-discovers interactive elements (buttons, inputs, links, etc.)\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation (data-testid > data-ui-id > semantic > auto-generated)\n * - Debounced updates for performance\n * - Respects existing manually registered elements\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\nimport type { ElementType, StandardAction } from '../core/types';\n\n/**\n * ID generation strategy\n */\nexport type IdStrategy =\n | 'data-testid' // Use data-testid attribute if present\n | 'data-ui-id' // Use data-ui-id attribute if present\n | 'semantic' // Generate semantic ID based on element content\n | 'auto' // Auto-generate unique ID\n | 'prefer-existing'; // Use existing attributes, fall back to auto\n\n/**\n * Options for auto-registration\n */\nexport interface AutoRegisterOptions {\n /** Enable auto-registration (default: true in dev mode) */\n enabled?: boolean;\n /** Root element to observe (default: document.body) */\n root?: HTMLElement | null;\n /** ID generation strategy (default: 'prefer-existing') */\n idStrategy?: IdStrategy;\n /** Debounce time for mutation handling (ms, default: 100) */\n debounceMs?: number;\n /** Include hidden elements (default: false) */\n includeHidden?: boolean;\n /** Only register elements matching these selectors */\n includeSelectors?: string[];\n /** Exclude elements matching these selectors */\n excludeSelectors?: string[];\n /** Custom ID generator function */\n generateId?: (element: HTMLElement) => string;\n /** Callback when element is registered */\n onRegister?: (id: string, element: HTMLElement) => void;\n /** Callback when element is unregistered */\n onUnregister?: (id: string) => void;\n}\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[role=\"slider\"]',\n '[role=\"spinbutton\"]',\n '[role=\"combobox\"]',\n '[role=\"listbox\"]',\n '[role=\"option\"]',\n '[role=\"textbox\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-element]', // Explicitly marked for registration\n '[data-testid]', // Testing library convention\n];\n\n/**\n * Infer element type from DOM element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const role = element.getAttribute('role');\n if (role) {\n const roleMap: Record<string, ElementType> = {\n button: 'button',\n link: 'link',\n checkbox: 'checkbox',\n radio: 'radio',\n menuitem: 'menuitem',\n tab: 'tab',\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n };\n if (role in roleMap) {\n return roleMap[role];\n }\n }\n\n const tagName = element.tagName.toLowerCase();\n switch (tagName) {\n case 'a':\n return 'link';\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type?.toLowerCase() || 'text';\n switch (type) {\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'range':\n return 'slider';\n case 'submit':\n case 'button':\n return 'button';\n default:\n return 'input';\n }\n }\n case 'select':\n return 'select';\n case 'textarea':\n return 'textarea';\n case 'option':\n return 'option';\n default:\n return 'generic';\n }\n}\n\n/**\n * Infer actions for element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur'];\n\n const typeActions: Record<ElementType, StandardAction[]> = {\n button: [...baseActions, 'click', 'hover'],\n link: [...baseActions, 'click', 'hover'],\n input: [...baseActions, 'type', 'clear', 'click'],\n textarea: [...baseActions, 'type', 'clear', 'click'],\n textbox: [...baseActions, 'type', 'clear', 'click'],\n checkbox: [...baseActions, 'check', 'uncheck', 'toggle', 'click'],\n radio: [...baseActions, 'click', 'select'],\n select: [...baseActions, 'select', 'click'],\n combobox: [...baseActions, 'select', 'type', 'click'],\n listbox: [...baseActions, 'select', 'click'],\n option: [...baseActions, 'select', 'click'],\n switch: [...baseActions, 'toggle', 'click'],\n slider: [...baseActions, 'setValue', 'click', 'drag'],\n tab: [...baseActions, 'click', 'select'],\n menuitem: [...baseActions, 'click'],\n dialog: [...baseActions],\n menu: [...baseActions],\n form: [...baseActions, 'submit', 'reset'],\n custom: [...baseActions, 'click'],\n generic: [...baseActions, 'click'],\n };\n\n return typeActions[type] || baseActions;\n}\n\n/**\n * Get accessible label for element\n */\nfunction getAccessibleLabel(element: HTMLElement): string | undefined {\n // aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labelEl = document.getElementById(labelledBy);\n if (labelEl) return labelEl.textContent?.trim();\n }\n\n // Associated label (for inputs)\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Inner text (limited)\n const text = element.textContent?.trim();\n if (text && text.length <= 50) return text;\n\n // Placeholder for inputs\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const placeholder = element.placeholder;\n if (placeholder) return placeholder;\n }\n\n return undefined;\n}\n\n/**\n * Check if element is visible\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/**\n * Generate semantic ID based on element\n */\nfunction generateSemanticId(element: HTMLElement): string {\n const type = inferElementType(element);\n const label = getAccessibleLabel(element);\n\n if (label) {\n // Convert label to kebab-case ID\n const sanitized = label\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30);\n return `${type}-${sanitized}`;\n }\n\n // Fall back to tag + index\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.querySelectorAll(element.tagName));\n const index = siblings.indexOf(element);\n return `${element.tagName.toLowerCase()}-${index}`;\n }\n\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n}\n\n/**\n * Generate unique auto ID\n */\nfunction generateAutoId(element: HTMLElement): string {\n const type = inferElementType(element);\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Generate ID based on strategy\n */\nfunction generateIdForElement(\n element: HTMLElement,\n strategy: IdStrategy,\n customGenerator?: (element: HTMLElement) => string\n): string {\n if (customGenerator) {\n return customGenerator(element);\n }\n\n switch (strategy) {\n case 'data-testid': {\n const testId = element.getAttribute('data-testid');\n return testId || generateAutoId(element);\n }\n case 'data-ui-id': {\n const uiId = element.getAttribute('data-ui-id');\n return uiId || generateAutoId(element);\n }\n case 'semantic':\n return generateSemanticId(element);\n case 'auto':\n return generateAutoId(element);\n case 'prefer-existing':\n default: {\n // Priority: data-ui-id > data-testid > id > semantic > auto\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 htmlId = element.id;\n if (htmlId) return htmlId;\n\n return generateSemanticId(element);\n }\n }\n}\n\n/**\n * Hook for automatic element registration\n *\n * @example\n * ```tsx\n * function App() {\n * // Enable auto-registration for all interactive elements\n * useAutoRegister({ enabled: true });\n *\n * return (\n * <div>\n * <button data-testid=\"submit-btn\">Submit</button>\n * <input data-testid=\"email-input\" />\n * </div>\n * );\n * }\n * ```\n */\nexport function useAutoRegister(options: AutoRegisterOptions = {}): void {\n const {\n enabled = process.env.NODE_ENV === 'development',\n root = null,\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId: customGenerateId,\n onRegister,\n onUnregister,\n } = options;\n\n const bridge = useUIBridgeOptional();\n const registeredElementsRef = useRef(new Map<HTMLElement, string>());\n const pendingRegistrationsRef = useRef(new Set<HTMLElement>());\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Check if element should be registered\n */\n const shouldRegister = useCallback(\n (element: HTMLElement): boolean => {\n // Check visibility\n if (!includeHidden && !isElementVisible(element)) {\n return false;\n }\n\n // Check exclude selectors\n for (const selector of excludeSelectors) {\n if (element.matches(selector)) {\n return false;\n }\n }\n\n // Check if already registered\n if (registeredElementsRef.current.has(element)) {\n return false;\n }\n\n // Check if matches interactive selectors\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors];\n for (const selector of allSelectors) {\n if (element.matches(selector)) {\n return true;\n }\n }\n\n return false;\n },\n [includeHidden, includeSelectors, excludeSelectors]\n );\n\n /**\n * Register a single element\n */\n const registerElement = useCallback(\n (element: HTMLElement): void => {\n if (!bridge?.registry || registeredElementsRef.current.has(element)) {\n return;\n }\n\n const id = generateIdForElement(element, idStrategy, customGenerateId);\n\n // Check if ID already exists in registry\n const existing = bridge.registry.getElement(id);\n if (existing) {\n // Generate a unique ID to avoid collision\n const uniqueId = `${id}-${Date.now().toString(36)}`;\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(uniqueId, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n } else {\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(id, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n }\n },\n [bridge, idStrategy, customGenerateId, onRegister]\n );\n\n /**\n * Unregister a single element\n */\n const unregisterElement = useCallback(\n (element: HTMLElement): void => {\n const id = registeredElementsRef.current.get(element);\n if (!id || !bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredElementsRef.current.delete(element);\n onUnregister?.(id);\n },\n [bridge, onUnregister]\n );\n\n /**\n * Process pending registrations (debounced)\n */\n const processPendingRegistrations = useCallback(() => {\n pendingRegistrationsRef.current.forEach((element) => {\n if (shouldRegister(element)) {\n registerElement(element);\n }\n });\n pendingRegistrationsRef.current.clear();\n }, [shouldRegister, registerElement]);\n\n /**\n * Queue element for registration (with debounce)\n */\n const queueRegistration = useCallback(\n (element: HTMLElement): void => {\n pendingRegistrationsRef.current.add(element);\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n debounceTimeoutRef.current = setTimeout(processPendingRegistrations, debounceMs);\n },\n [debounceMs, processPendingRegistrations]\n );\n\n /**\n * Scan and register all existing interactive elements\n */\n const scanAndRegister = useCallback(\n (rootElement: HTMLElement): void => {\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const elements = rootElement.querySelectorAll<HTMLElement>(allSelectors);\n\n elements.forEach((element) => {\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n });\n },\n [includeSelectors, shouldRegister, queueRegistration]\n );\n\n /**\n * Handle mutations\n */\n const handleMutations = useCallback(\n (mutations: MutationRecord[]): void => {\n mutations.forEach((mutation) => {\n // Handle added nodes\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Check the element itself\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n\n // Check descendants\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const descendants = element.querySelectorAll<HTMLElement>(allSelectors);\n descendants.forEach((descendant) => {\n if (shouldRegister(descendant)) {\n queueRegistration(descendant);\n }\n });\n }\n });\n\n // Handle removed nodes\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Unregister the element itself\n if (registeredElementsRef.current.has(element)) {\n unregisterElement(element);\n }\n\n // Unregister descendants\n const descendants = element.querySelectorAll<HTMLElement>('*');\n descendants.forEach((descendant) => {\n if (registeredElementsRef.current.has(descendant)) {\n unregisterElement(descendant);\n }\n });\n }\n });\n });\n },\n [shouldRegister, queueRegistration, unregisterElement, includeSelectors]\n );\n\n /**\n * Setup observer and initial scan\n */\n useEffect(() => {\n if (!enabled || !bridge?.registry) return;\n\n const rootElement = root || document.body;\n\n // Initial scan\n scanAndRegister(rootElement);\n\n // Setup mutation observer\n const observer = new MutationObserver(handleMutations);\n observer.observe(rootElement, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n observer.disconnect();\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n // Unregister all elements\n registeredElementsRef.current.forEach((id, _element) => {\n bridge.registry.unregisterElement(id);\n });\n registeredElementsRef.current.clear();\n };\n }, [enabled, bridge, root, scanAndRegister, handleMutations]);\n}\n\nexport default useAutoRegister;\n","/**\n * AutoRegisterProvider\n *\n * A React component that enables automatic UI Bridge element registration\n * for all interactive elements within its subtree.\n *\n * @example\n * ```tsx\n * // Enable auto-registration for the entire app\n * function App() {\n * return (\n * <UIBridgeProvider features={{ control: true }}>\n * <AutoRegisterProvider enabled={process.env.NODE_ENV === 'development'}>\n * <YourApp />\n * </AutoRegisterProvider>\n * </UIBridgeProvider>\n * );\n * }\n *\n * // Enable auto-registration for a specific section\n * function Dashboard() {\n * return (\n * <AutoRegisterProvider\n * idStrategy=\"data-testid\"\n * excludeSelectors={['[data-no-register]']}\n * >\n * <DashboardContent />\n * </AutoRegisterProvider>\n * );\n * }\n * ```\n */\n\nimport React, { type ReactNode, useRef } from 'react';\nimport { useAutoRegister, type AutoRegisterOptions } from './useAutoRegister';\n\nexport interface AutoRegisterProviderProps extends Omit<AutoRegisterOptions, 'root'> {\n /** Children to render */\n children: ReactNode;\n /** Use this element as the observation root instead of document.body */\n scopeToChildren?: boolean;\n}\n\n/**\n * Provider component that enables automatic element registration.\n *\n * Features:\n * - Automatically discovers and registers interactive elements\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation based on data-testid, semantic names, etc.\n * - Configurable selectors and ID strategies\n *\n * Place this component at the root of your app (inside UIBridgeProvider)\n * for comprehensive automatic element registration.\n */\nexport function AutoRegisterProvider({\n children,\n scopeToChildren = false,\n enabled = process.env.NODE_ENV === 'development',\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId,\n onRegister,\n onUnregister,\n}: AutoRegisterProviderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use the auto-register hook\n useAutoRegister({\n enabled,\n root: scopeToChildren ? containerRef.current : null,\n idStrategy,\n debounceMs,\n includeHidden,\n includeSelectors,\n excludeSelectors,\n generateId,\n onRegister,\n onUnregister,\n });\n\n // If scoped to children, wrap in a div\n if (scopeToChildren) {\n return (\n <div ref={containerRef} style={{ display: 'contents' }}>\n {children}\n </div>\n );\n }\n\n // Otherwise, just render children directly\n return <>{children}</>;\n}\n\nexport default AutoRegisterProvider;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/element-identifier.ts","../../src/ai/fuzzy-matcher.ts","../../src/ai/alias-generator.ts","../../src/core/registry.ts","../../src/core/websocket-client.ts","../../src/control/action-executor.ts","../../src/control/workflow-engine.ts","../../src/render-log/dom-capture.ts","../../src/render-log/snapshot.ts","../../src/debug/metrics.ts","../../src/react/UIBridgeProvider.tsx","../../src/react/useUIElement.ts","../../src/react/useUIComponent.ts","../../src/react/useUIBridge.ts","../../src/react/useUIState.ts","../../src/react/useUITransition.ts","../../src/react/useUINavigation.ts","../../src/react/useAutoRegister.ts","../../src/react/AutoRegisterProvider.tsx"],"names":["aliases","getElementState","isVisible","isDisabled","generateId","createContext","useRef","useState","useMemo","useEffect","useCallback","useContext","id","state","group","transition","INTERACTIVE_SELECTORS","inferElementType","inferActions","isElementVisible","jsx","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 * Fuzzy Matcher\n *\n * Provides fuzzy text matching utilities for finding elements by natural language descriptions.\n * Implements multiple matching algorithms with configurable thresholds.\n */\n\n/**\n * Configuration for fuzzy matching\n */\nexport interface FuzzyMatchConfig {\n /** Minimum similarity threshold (0-1) */\n threshold: number;\n /** Weight for Levenshtein distance */\n levenshteinWeight: number;\n /** Weight for Jaro-Winkler similarity */\n jaroWinklerWeight: number;\n /** Weight for N-gram matching */\n ngramWeight: number;\n /** N-gram size */\n ngramSize: number;\n /** Case sensitive matching */\n caseSensitive: boolean;\n /** Ignore whitespace differences */\n ignoreWhitespace: boolean;\n}\n\n/**\n * Default fuzzy match configuration\n */\nexport const DEFAULT_FUZZY_CONFIG: FuzzyMatchConfig = {\n threshold: 0.7,\n levenshteinWeight: 0.3,\n jaroWinklerWeight: 0.4,\n ngramWeight: 0.3,\n ngramSize: 2,\n caseSensitive: false,\n ignoreWhitespace: true,\n};\n\n/**\n * Result from a fuzzy match operation\n */\nexport interface FuzzyMatchResult {\n /** Overall similarity score (0-1) */\n similarity: number;\n /** Whether the match passes the threshold */\n isMatch: boolean;\n /** Individual algorithm scores */\n scores: {\n levenshtein: number;\n jaroWinkler: number;\n ngram: number;\n };\n /** Normalized source string */\n normalizedSource: string;\n /** Normalized target string */\n normalizedTarget: string;\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n */\nexport function levenshteinDistance(s1: string, s2: string): number {\n const len1 = s1.length;\n const len2 = s2.length;\n\n // Create distance matrix\n const matrix: number[][] = Array(len1 + 1)\n .fill(null)\n .map(() => Array(len2 + 1).fill(0));\n\n // Initialize first column and row\n for (let i = 0; i <= len1; i++) matrix[i][0] = i;\n for (let j = 0; j <= len2; j++) matrix[0][j] = j;\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // deletion\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n return matrix[len1][len2];\n}\n\n/**\n * Calculate Levenshtein similarity (0-1)\n */\nexport function levenshteinSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const distance = levenshteinDistance(s1, s2);\n const maxLength = Math.max(s1.length, s2.length);\n\n return 1 - distance / maxLength;\n}\n\n/**\n * Calculate Jaro similarity between two strings\n */\nexport function jaroSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const matchDistance = Math.floor(Math.max(s1.length, s2.length) / 2) - 1;\n const s1Matches = new Array(s1.length).fill(false);\n const s2Matches = new Array(s2.length).fill(false);\n\n let matches = 0;\n let transpositions = 0;\n\n // Find matches\n for (let i = 0; i < s1.length; i++) {\n const start = Math.max(0, i - matchDistance);\n const end = Math.min(i + matchDistance + 1, s2.length);\n\n for (let j = start; j < end; j++) {\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\n s1Matches[i] = true;\n s2Matches[j] = true;\n matches++;\n break;\n }\n }\n\n if (matches === 0) return 0;\n\n // Count transpositions\n let k = 0;\n for (let i = 0; i < s1.length; i++) {\n if (!s1Matches[i]) continue;\n while (!s2Matches[k]) k++;\n if (s1[i] !== s2[k]) transpositions++;\n k++;\n }\n\n return (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\n}\n\n/**\n * Calculate Jaro-Winkler similarity\n * Gives more weight to strings that match from the beginning\n */\nexport function jaroWinklerSimilarity(s1: string, s2: string, prefixScale: number = 0.1): number {\n const jaroSim = jaroSimilarity(s1, s2);\n\n // Find common prefix (up to 4 characters)\n let prefixLength = 0;\n const maxPrefix = Math.min(4, Math.min(s1.length, s2.length));\n\n for (let i = 0; i < maxPrefix; i++) {\n if (s1[i] === s2[i]) {\n prefixLength++;\n } else {\n break;\n }\n }\n\n return jaroSim + prefixLength * prefixScale * (1 - jaroSim);\n}\n\n/**\n * Generate N-grams from a string\n */\nexport function generateNgrams(s: string, n: number): Set<string> {\n const ngrams = new Set<string>();\n\n if (s.length < n) {\n ngrams.add(s);\n return ngrams;\n }\n\n for (let i = 0; i <= s.length - n; i++) {\n ngrams.add(s.substring(i, i + n));\n }\n\n return ngrams;\n}\n\n/**\n * Calculate N-gram similarity (Jaccard coefficient)\n */\nexport function ngramSimilarity(s1: string, s2: string, n: number = 2): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const ngrams1 = generateNgrams(s1, n);\n const ngrams2 = generateNgrams(s2, n);\n\n // Calculate intersection\n let intersection = 0;\n for (const ngram of ngrams1) {\n if (ngrams2.has(ngram)) {\n intersection++;\n }\n }\n\n // Jaccard coefficient: |A ∩ B| / |A ∪ B|\n const union = ngrams1.size + ngrams2.size - intersection;\n\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Normalize a string for comparison\n */\nexport function normalizeString(s: string, config: Partial<FuzzyMatchConfig> = {}): string {\n let normalized = s;\n\n // Handle case sensitivity\n if (!config.caseSensitive) {\n normalized = normalized.toLowerCase();\n }\n\n // Handle whitespace\n if (config.ignoreWhitespace !== false) {\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n }\n\n return normalized;\n}\n\n/**\n * Main fuzzy match function\n * Combines multiple algorithms for robust matching\n */\nexport function fuzzyMatch(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): FuzzyMatchResult {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n\n // Normalize strings\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Calculate individual scores\n const levenshteinScore = levenshteinSimilarity(normalizedSource, normalizedTarget);\n const jaroWinklerScore = jaroWinklerSimilarity(normalizedSource, normalizedTarget);\n const ngramScore = ngramSimilarity(normalizedSource, normalizedTarget, finalConfig.ngramSize);\n\n // Weighted combination\n const similarity =\n levenshteinScore * finalConfig.levenshteinWeight +\n jaroWinklerScore * finalConfig.jaroWinklerWeight +\n ngramScore * finalConfig.ngramWeight;\n\n return {\n similarity,\n isMatch: similarity >= finalConfig.threshold,\n scores: {\n levenshtein: levenshteinScore,\n jaroWinkler: jaroWinklerScore,\n ngram: ngramScore,\n },\n normalizedSource,\n normalizedTarget,\n };\n}\n\n/**\n * Find the best match from a list of candidates\n */\nexport function findBestMatch(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): { match: string | null; index: number; result: FuzzyMatchResult | null } {\n if (candidates.length === 0) {\n return { match: null, index: -1, result: null };\n }\n\n let bestMatch: string | null = null;\n let bestIndex = -1;\n let bestResult: FuzzyMatchResult | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch && (!bestResult || result.similarity > bestResult.similarity)) {\n bestMatch = candidates[i];\n bestIndex = i;\n bestResult = result;\n }\n }\n\n return { match: bestMatch, index: bestIndex, result: bestResult };\n}\n\n/**\n * Find all matches above threshold\n */\nexport function findAllMatches(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): Array<{ candidate: string; index: number; result: FuzzyMatchResult }> {\n const matches: Array<{ candidate: string; index: number; result: FuzzyMatchResult }> = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch) {\n matches.push({ candidate: candidates[i], index: i, result });\n }\n }\n\n // Sort by similarity descending\n matches.sort((a, b) => b.result.similarity - a.result.similarity);\n\n return matches;\n}\n\n/**\n * Check if source contains target (fuzzy)\n */\nexport function fuzzyContains(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): boolean {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Exact contains check\n if (normalizedSource.includes(normalizedTarget)) {\n return true;\n }\n\n // Word-by-word fuzzy check\n const sourceWords = normalizedSource.split(/\\s+/);\n const targetWords = normalizedTarget.split(/\\s+/);\n\n // All target words must have a fuzzy match in source\n for (const targetWord of targetWords) {\n const hasMatch = sourceWords.some((sourceWord) => {\n const result = fuzzyMatch(sourceWord, targetWord, { ...finalConfig, threshold: 0.8 });\n return result.isMatch;\n });\n\n if (!hasMatch) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Calculate word-level similarity\n * Useful for comparing phrases\n */\nexport function wordSimilarity(\n s1: string,\n s2: string,\n config: Partial<FuzzyMatchConfig> = {}\n): number {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const words1 = normalizeString(s1, finalConfig).split(/\\s+/);\n const words2 = normalizeString(s2, finalConfig).split(/\\s+/);\n\n if (words1.length === 0 && words2.length === 0) return 1;\n if (words1.length === 0 || words2.length === 0) return 0;\n\n let totalSimilarity = 0;\n let matchCount = 0;\n\n // For each word in s1, find best match in s2\n for (const word1 of words1) {\n let bestSim = 0;\n for (const word2 of words2) {\n const result = fuzzyMatch(word1, word2, finalConfig);\n if (result.similarity > bestSim) {\n bestSim = result.similarity;\n }\n }\n totalSimilarity += bestSim;\n if (bestSim >= finalConfig.threshold) {\n matchCount++;\n }\n }\n\n // Return combination of average similarity and match ratio\n const avgSimilarity = totalSimilarity / words1.length;\n const matchRatio = matchCount / Math.max(words1.length, words2.length);\n\n return avgSimilarity * 0.5 + matchRatio * 0.5;\n}\n\n/**\n * Tokenize a string for matching\n * Handles camelCase, PascalCase, snake_case, kebab-case\n */\nexport function tokenize(s: string): string[] {\n return s\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n .split(' ')\n .filter((token) => token.length > 0);\n}\n\n/**\n * Calculate token-based similarity\n * Better for matching identifiers and labels\n */\nexport function tokenSimilarity(s1: string, s2: string): number {\n const tokens1 = tokenize(s1);\n const tokens2 = tokenize(s2);\n\n if (tokens1.length === 0 && tokens2.length === 0) return 1;\n if (tokens1.length === 0 || tokens2.length === 0) return 0;\n\n const set1 = new Set(tokens1);\n const set2 = new Set(tokens2);\n\n // Calculate Jaccard similarity on tokens\n let intersection = 0;\n for (const token of set1) {\n if (set2.has(token)) {\n intersection++;\n }\n }\n\n const union = set1.size + set2.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n","/**\n * Alias Generator\n *\n * Auto-generates element aliases from visible text, aria-label, placeholders,\n * titles, and common synonyms for natural language matching.\n */\n\nimport { tokenize } from './fuzzy-matcher';\n\n/**\n * Configuration for alias generation\n */\nexport interface AliasGeneratorConfig {\n /** Include text content as alias */\n includeText: boolean;\n /** Include aria-label as alias */\n includeAriaLabel: boolean;\n /** Include placeholder text as alias */\n includePlaceholder: boolean;\n /** Include title attribute as alias */\n includeTitle: boolean;\n /** Include common synonyms */\n includeSynonyms: boolean;\n /** Maximum number of aliases to generate */\n maxAliases: number;\n /** Minimum alias length */\n minLength: number;\n /** Maximum alias length */\n maxLength: number;\n}\n\n/**\n * Default alias generator configuration\n */\nexport const DEFAULT_ALIAS_CONFIG: AliasGeneratorConfig = {\n includeText: true,\n includeAriaLabel: true,\n includePlaceholder: true,\n includeTitle: true,\n includeSynonyms: true,\n maxAliases: 20,\n minLength: 2,\n maxLength: 50,\n};\n\n/**\n * Common synonyms for UI actions and elements\n */\nconst SYNONYMS: Record<string, string[]> = {\n // Submit-related\n submit: ['send', 'go', 'confirm', 'ok', 'apply', 'save', 'done', 'finish'],\n send: ['submit', 'deliver', 'post'],\n save: ['submit', 'store', 'keep', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit', 'quit', 'nevermind'],\n close: ['cancel', 'dismiss', 'exit', 'x'],\n delete: ['remove', 'trash', 'erase', 'clear', 'destroy'],\n remove: ['delete', 'clear', 'discard'],\n edit: ['modify', 'change', 'update', 'alter'],\n update: ['edit', 'modify', 'save', 'refresh'],\n add: ['create', 'new', 'plus', 'insert'],\n create: ['add', 'new', 'make'],\n search: ['find', 'lookup', 'query', 'filter'],\n find: ['search', 'locate', 'lookup'],\n login: ['signin', 'sign in', 'log in', 'authenticate', 'enter'],\n logout: ['signout', 'sign out', 'log out', 'exit'],\n register: ['signup', 'sign up', 'join', 'create account'],\n next: ['continue', 'forward', 'proceed', 'advance'],\n previous: ['back', 'backward', 'return', 'prior'],\n back: ['previous', 'return', 'backward'],\n start: ['begin', 'launch', 'initiate', 'run', 'execute'],\n stop: ['end', 'halt', 'pause', 'terminate'],\n enable: ['activate', 'turn on', 'switch on'],\n disable: ['deactivate', 'turn off', 'switch off'],\n show: ['display', 'reveal', 'view', 'open'],\n hide: ['conceal', 'collapse', 'close'],\n expand: ['open', 'show', 'unfold', 'reveal'],\n collapse: ['close', 'hide', 'fold', 'minimize'],\n yes: ['ok', 'confirm', 'agree', 'accept'],\n no: ['cancel', 'decline', 'reject', 'deny'],\n help: ['support', 'assistance', 'info', 'information', 'faq'],\n settings: ['preferences', 'options', 'config', 'configuration'],\n profile: ['account', 'user', 'me'],\n download: ['export', 'save', 'get'],\n upload: ['import', 'load', 'attach'],\n refresh: ['reload', 'update', 'sync'],\n copy: ['duplicate', 'clone'],\n paste: ['insert'],\n select: ['choose', 'pick'],\n toggle: ['switch', 'flip'],\n\n // Form fields\n email: ['e-mail', 'mail'],\n password: ['pass', 'pwd', 'secret'],\n username: ['user', 'login', 'account', 'name'],\n firstname: ['first name', 'given name', 'forename'],\n lastname: ['last name', 'surname', 'family name'],\n fullname: ['full name', 'name', 'complete name'],\n phone: ['telephone', 'tel', 'mobile', 'cell'],\n address: ['location', 'street'],\n city: ['town'],\n country: ['nation'],\n zip: ['zipcode', 'postal', 'postal code', 'postcode'],\n\n // Navigation\n home: ['main', 'start', 'dashboard'],\n menu: ['navigation', 'nav'],\n sidebar: ['side bar', 'side panel', 'side menu'],\n};\n\n/**\n * Element type to action word mappings\n */\nconst ELEMENT_ACTION_WORDS: Record<string, string[]> = {\n button: ['button', 'btn', 'click'],\n input: ['input', 'field', 'textbox', 'box'],\n textarea: ['textarea', 'text area', 'text field', 'multiline'],\n select: ['select', 'dropdown', 'combo', 'picker', 'chooser'],\n checkbox: ['checkbox', 'check', 'tick'],\n radio: ['radio', 'option', 'choice'],\n link: ['link', 'anchor', 'href'],\n form: ['form'],\n menu: ['menu'],\n menuitem: ['menu item', 'option'],\n tab: ['tab'],\n dialog: ['dialog', 'modal', 'popup'],\n switch: ['switch', 'toggle'],\n slider: ['slider', 'range'],\n};\n\n/**\n * Normalize text for alias comparison\n */\nfunction normalizeAlias(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract words from text, handling various naming conventions\n */\nfunction extractWords(text: string): string[] {\n const tokens = tokenize(text);\n return tokens.filter((t) => t.length >= 2);\n}\n\n/**\n * Generate aliases from text content\n */\nfunction generateTextAliases(text: string | null | undefined, config: AliasGeneratorConfig): string[] {\n if (!text || !config.includeText) return [];\n\n const aliases: string[] = [];\n const normalized = normalizeAlias(text);\n\n // Add full normalized text\n if (normalized.length >= config.minLength && normalized.length <= config.maxLength) {\n aliases.push(normalized);\n }\n\n // Add individual words\n const words = extractWords(text);\n for (const word of words) {\n if (word.length >= config.minLength) {\n aliases.push(word);\n }\n }\n\n // Add word combinations\n if (words.length >= 2 && words.length <= 4) {\n // First two words\n const twoWords = words.slice(0, 2).join(' ');\n if (twoWords.length <= config.maxLength) {\n aliases.push(twoWords);\n }\n\n // Last two words\n if (words.length > 2) {\n const lastTwo = words.slice(-2).join(' ');\n if (lastTwo.length <= config.maxLength) {\n aliases.push(lastTwo);\n }\n }\n }\n\n return aliases;\n}\n\n/**\n * Generate synonyms for given aliases\n */\nfunction generateSynonyms(aliases: string[], config: AliasGeneratorConfig): string[] {\n if (!config.includeSynonyms) return [];\n\n const synonyms: string[] = [];\n\n for (const alias of aliases) {\n const words = alias.toLowerCase().split(/\\s+/);\n\n for (const word of words) {\n if (SYNONYMS[word]) {\n for (const synonym of SYNONYMS[word]) {\n // Replace word with synonym in the alias\n const newAlias = alias.toLowerCase().replace(word, synonym);\n if (newAlias !== alias.toLowerCase()) {\n synonyms.push(newAlias);\n }\n\n // Also add standalone synonym\n if (synonym.length >= config.minLength) {\n synonyms.push(synonym);\n }\n }\n }\n }\n }\n\n return synonyms;\n}\n\n/**\n * Generate element type aliases\n */\nfunction generateTypeAliases(elementType: string): string[] {\n const type = elementType.toLowerCase();\n return ELEMENT_ACTION_WORDS[type] || [type];\n}\n\n/**\n * Interface for element information used in alias generation\n */\nexport interface AliasGeneratorInput {\n /** Element text content */\n textContent?: string | null;\n /** ARIA label */\n ariaLabel?: string | null;\n /** ARIA labelledby resolved text */\n ariaLabelledBy?: string | null;\n /** Placeholder text */\n placeholder?: string | null;\n /** Title attribute */\n title?: string | null;\n /** Element type */\n elementType?: string;\n /** Element tag name */\n tagName?: string;\n /** Input type */\n inputType?: string;\n /** Element ID */\n id?: string | null;\n /** Element name attribute */\n name?: string | null;\n /** Associated label text */\n labelText?: string | null;\n /** Value attribute */\n value?: string | null;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n input: AliasGeneratorInput,\n config: Partial<AliasGeneratorConfig> = {}\n): string[] {\n const finalConfig = { ...DEFAULT_ALIAS_CONFIG, ...config };\n const aliasSet = new Set<string>();\n\n // Helper to add alias with deduplication and length checks\n const addAlias = (alias: string) => {\n const normalized = normalizeAlias(alias);\n if (\n normalized.length >= finalConfig.minLength &&\n normalized.length <= finalConfig.maxLength\n ) {\n aliasSet.add(normalized);\n }\n };\n\n // Helper to add multiple aliases\n const addAliases = (aliases: string[]) => {\n for (const alias of aliases) {\n addAlias(alias);\n }\n };\n\n // Generate from text content\n if (finalConfig.includeText && input.textContent) {\n addAliases(generateTextAliases(input.textContent, finalConfig));\n }\n\n // Generate from ARIA label\n if (finalConfig.includeAriaLabel && input.ariaLabel) {\n addAliases(generateTextAliases(input.ariaLabel, finalConfig));\n }\n\n // Generate from ARIA labelledby\n if (finalConfig.includeAriaLabel && input.ariaLabelledBy) {\n addAliases(generateTextAliases(input.ariaLabelledBy, finalConfig));\n }\n\n // Generate from placeholder\n if (finalConfig.includePlaceholder && input.placeholder) {\n addAliases(generateTextAliases(input.placeholder, finalConfig));\n }\n\n // Generate from title\n if (finalConfig.includeTitle && input.title) {\n addAliases(generateTextAliases(input.title, finalConfig));\n }\n\n // Generate from label text\n if (input.labelText) {\n addAliases(generateTextAliases(input.labelText, finalConfig));\n }\n\n // Generate from element ID (often meaningful)\n if (input.id) {\n addAliases(extractWords(input.id));\n }\n\n // Generate from name attribute\n if (input.name) {\n addAliases(extractWords(input.name));\n }\n\n // Generate from value for buttons/submit inputs\n if (\n input.value &&\n (input.elementType === 'button' || input.inputType === 'submit' || input.inputType === 'button')\n ) {\n addAliases(generateTextAliases(input.value, finalConfig));\n }\n\n // Generate type aliases\n if (input.elementType) {\n addAliases(generateTypeAliases(input.elementType));\n }\n\n // Generate input type aliases\n if (input.inputType) {\n addAlias(input.inputType);\n\n // Common input type patterns\n if (input.inputType === 'email') {\n addAliases(['email', 'e-mail', 'email address']);\n } else if (input.inputType === 'password') {\n addAliases(['password', 'pass', 'pwd']);\n } else if (input.inputType === 'tel') {\n addAliases(['phone', 'telephone', 'mobile']);\n } else if (input.inputType === 'url') {\n addAliases(['url', 'website', 'link', 'address']);\n } else if (input.inputType === 'search') {\n addAliases(['search', 'find', 'query']);\n }\n }\n\n // Generate synonyms for all collected aliases\n if (finalConfig.includeSynonyms) {\n const currentAliases = Array.from(aliasSet);\n addAliases(generateSynonyms(currentAliases, finalConfig));\n }\n\n // Convert to array and limit\n let aliases = Array.from(aliasSet);\n\n // Sort by length (shorter = more likely to be useful)\n aliases.sort((a, b) => a.length - b.length);\n\n // Limit number of aliases\n if (aliases.length > finalConfig.maxAliases) {\n aliases = aliases.slice(0, finalConfig.maxAliases);\n }\n\n return aliases;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nexport function generateDescription(input: AliasGeneratorInput): string {\n const parts: string[] = [];\n\n // Determine the best name for the element\n let name =\n input.ariaLabel ||\n input.labelText ||\n input.textContent ||\n input.placeholder ||\n input.title ||\n input.id ||\n input.name;\n\n if (name) {\n name = name.trim();\n // Truncate if too long\n if (name.length > 30) {\n name = name.substring(0, 27) + '...';\n }\n parts.push(`\"${name}\"`);\n }\n\n // Add element type\n const typeWords = ELEMENT_ACTION_WORDS[input.elementType || ''] || [input.elementType || 'element'];\n parts.push(typeWords[0]);\n\n // Add input type for inputs\n if (input.inputType && input.inputType !== 'text') {\n parts.push(`(${input.inputType})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Generate a purpose statement for an element\n */\nexport function generatePurpose(input: AliasGeneratorInput): string | undefined {\n const text = (input.textContent || input.ariaLabel || input.title || '').toLowerCase();\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n\n // Check for common patterns\n if (type === 'button' || inputType === 'submit') {\n if (text.match(/submit|send|save|confirm|ok|done|finish|apply/)) {\n return 'Submits the form';\n }\n if (text.match(/cancel|close|dismiss|back|exit/)) {\n return 'Cancels or closes the current action';\n }\n if (text.match(/delete|remove|trash|clear/)) {\n return 'Deletes or removes an item';\n }\n if (text.match(/edit|modify|change|update/)) {\n return 'Edits or modifies an item';\n }\n if (text.match(/add|create|new|\\+/)) {\n return 'Creates or adds a new item';\n }\n if (text.match(/search|find|lookup/)) {\n return 'Performs a search';\n }\n if (text.match(/login|sign.?in/)) {\n return 'Signs the user in';\n }\n if (text.match(/logout|sign.?out/)) {\n return 'Signs the user out';\n }\n if (text.match(/register|sign.?up|join/)) {\n return 'Creates a new account';\n }\n if (text.match(/next|continue|proceed/)) {\n return 'Proceeds to the next step';\n }\n if (text.match(/previous|back|return/)) {\n return 'Returns to the previous step';\n }\n }\n\n if (type === 'input' || type === 'textarea') {\n if (inputType === 'email') return 'Accepts email address input';\n if (inputType === 'password') return 'Accepts password input';\n if (inputType === 'search') return 'Accepts search query input';\n if (inputType === 'tel') return 'Accepts phone number input';\n if (inputType === 'url') return 'Accepts URL input';\n if (inputType === 'number') return 'Accepts numeric input';\n if (inputType === 'date') return 'Accepts date input';\n if (inputType === 'file') return 'Accepts file upload';\n }\n\n if (type === 'checkbox') {\n return 'Toggles an option on or off';\n }\n\n if (type === 'radio') {\n return 'Selects one option from a group';\n }\n\n if (type === 'select') {\n return 'Selects an option from a dropdown';\n }\n\n if (type === 'link') {\n return 'Navigates to another page';\n }\n\n return undefined;\n}\n\n/**\n * Generate suggested actions for an element\n */\nexport function generateSuggestedActions(input: AliasGeneratorInput): string[] {\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n const text = (input.textContent || input.ariaLabel || '').toLowerCase();\n const actions: string[] = [];\n\n switch (type) {\n case 'button':\n actions.push(`click \"${text || 'this button'}\"`);\n break;\n case 'input':\n if (inputType === 'checkbox') {\n actions.push('check to enable', 'uncheck to disable');\n } else if (inputType === 'radio') {\n actions.push('select this option');\n } else {\n actions.push(`type into \"${text || 'this field'}\"`);\n actions.push('clear the field');\n }\n break;\n case 'textarea':\n actions.push(`type into \"${text || 'this text area'}\"`);\n actions.push('clear the content');\n break;\n case 'select':\n actions.push(`select an option from \"${text || 'this dropdown'}\"`);\n break;\n case 'checkbox':\n actions.push('check to enable', 'uncheck to disable');\n break;\n case 'radio':\n actions.push('select this option');\n break;\n case 'link':\n actions.push(`click to navigate to \"${text || 'the linked page'}\"`);\n break;\n case 'switch':\n actions.push('toggle on', 'toggle off');\n break;\n default:\n actions.push('click');\n }\n\n return actions;\n}\n\n/**\n * Get synonyms for a word\n */\nexport function getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase().trim();\n return SYNONYMS[normalized] || [];\n}\n\n/**\n * Check if two words are synonyms\n */\nexport function areSynonyms(word1: string, word2: string): boolean {\n const w1 = word1.toLowerCase().trim();\n const w2 = word2.toLowerCase().trim();\n\n if (w1 === w2) return true;\n\n const synonyms1 = SYNONYMS[w1] || [];\n const synonyms2 = SYNONYMS[w2] || [];\n\n return synonyms1.includes(w2) || synonyms2.includes(w1);\n}\n","/**\n * Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge.\n * Provides methods for registration, lookup, and lifecycle management.\n */\n\nimport type {\n RegisteredElement,\n RegisteredComponent,\n Workflow,\n ElementState,\n ElementType,\n StandardAction,\n CustomAction,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n BridgeSnapshot,\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n ComponentStateResponse,\n StateGetter,\n} from './types';\nimport { createElementIdentifier } from './element-identifier';\nimport { fuzzyMatch, tokenSimilarity } from '../ai/fuzzy-matcher';\nimport { generateAliases, generateDescription, generatePurpose } from '../ai/alias-generator';\nimport type { SearchCriteria, SearchResult, AIDiscoveredElement } from '../ai/types';\n\n/**\n * Get the current state of an element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isElementVisible(element, rect, computedStyle),\n enabled: !isElementDisabled(element),\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 textContent: element.textContent?.trim() || undefined,\n computedStyles: {\n display: computedStyle.display,\n visibility: computedStyle.visibility,\n opacity: computedStyle.opacity,\n pointerEvents: computedStyle.pointerEvents,\n },\n };\n\n // Add input-specific state\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 } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\n/**\n * Check if an element is visible\n */\nfunction isElementVisible(\n element: HTMLElement,\n rect: DOMRect,\n style: CSSStyleDeclaration\n): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n\n // Check if in viewport\n const inViewport =\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0;\n\n return inViewport;\n}\n\n/**\n * Check if an element is disabled\n */\nfunction isElementDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLButtonElement).disabled) {\n return true;\n }\n if (element.getAttribute('aria-disabled') === 'true') {\n return true;\n }\n return false;\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n case 'form':\n return ['focus', 'blur'];\n case 'menu':\n case 'menuitem':\n return [...baseActions, 'click'];\n case 'tab':\n return [...baseActions, 'click'];\n case 'dialog':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click'];\n }\n}\n\n/**\n * Infer element type from HTML element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // Check role first\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n // Check tag name\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const inputType = (element as HTMLInputElement).type;\n if (inputType === 'checkbox') return 'checkbox';\n if (inputType === 'radio') return 'radio';\n if (inputType === 'submit' || inputType === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n}\n\n/**\n * Registry options\n */\nexport interface RegistryOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Callback when an event occurs */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Registry\n *\n * Central registry for managing elements, components, and workflows.\n */\nexport class UIBridgeRegistry {\n private elements = new Map<string, RegisteredElement>();\n private components = new Map<string, RegisteredComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private options: RegistryOptions;\n\n // State management\n private states = new Map<string, UIState>();\n private stateGroups = new Map<string, UIStateGroup>();\n private transitions = new Map<string, UITransition>();\n private activeStates = new Set<string>();\n\n constructor(options: RegistryOptions = {}) {\n this.options = options;\n }\n\n /**\n * Emit an event\n */\n private emit<T>(type: BridgeEventType, data: T): void {\n const event: BridgeEvent<T> = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Call global handler\n this.options.onEvent?.(event);\n\n // Call specific listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`Error in event listener for ${type}:`, error);\n }\n }\n }\n\n if (this.options.verbose) {\n console.log('[UIBridge]', type, data);\n }\n }\n\n /**\n * Register an event listener\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n };\n }\n\n /**\n * Remove an event listener\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Register an element\n */\n registerElement(\n id: string,\n element: HTMLElement,\n options: {\n type?: ElementType;\n label?: string;\n actions?: StandardAction[];\n customActions?: Record<string, CustomAction>;\n } = {}\n ): RegisteredElement {\n const type = options.type ?? inferElementType(element);\n const actions = options.actions ?? inferActions(type);\n\n // Check if element has an explicitly-set data-ui-id attribute (e.g., from React props)\n // If so, use that value as the ID to preserve developer intent\n // This handles timing issues where React may apply props after MutationObserver fires\n const existingUiId = element.getAttribute('data-ui-id');\n const actualId = existingUiId || id;\n\n // Only set data-ui-id if it wasn't already set\n // This preserves explicitly-set IDs from React props\n if (!existingUiId) {\n element.setAttribute('data-ui-id', actualId);\n }\n\n const registered: RegisteredElement = {\n id: actualId,\n element,\n type,\n label: options.label,\n actions,\n customActions: options.customActions,\n getState: () => getElementState(element),\n getIdentifier: () => createElementIdentifier(element),\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.elements.set(actualId, registered);\n this.emit('element:registered', { id: actualId, type, label: options.label });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): boolean {\n const registered = this.elements.get(id);\n if (registered) {\n registered.mounted = false;\n // Remove data-ui-id attribute from DOM element\n registered.element.removeAttribute('data-ui-id');\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Find element by DOM element reference\n */\n findByDOMElement(element: HTMLElement): RegisteredElement | undefined {\n for (const registered of this.elements.values()) {\n if (registered.element === element) {\n return registered;\n }\n }\n return undefined;\n }\n\n /**\n * Search for elements using AI search criteria\n */\n searchElements(criteria: SearchCriteria): SearchResult[] {\n const results: SearchResult[] = [];\n const threshold = criteria.fuzzyThreshold ?? 0.7;\n\n for (const element of this.elements.values()) {\n if (!element.mounted) continue;\n\n const state = element.getState();\n\n // Skip hidden elements if not explicitly requested\n if (!criteria.fuzzy && !state.visible) continue;\n\n // Build searchable text from element\n const aliases = element.aliases ?? this.generateElementAliases(element);\n const textContent = state.textContent?.trim() || '';\n const label = element.label || '';\n\n let maxScore = 0;\n const matchReasons: string[] = [];\n const scores: SearchResult['scores'] = {};\n\n // Text matching\n if (criteria.text) {\n // Exact match\n if (textContent.toLowerCase() === criteria.text.toLowerCase() ||\n label.toLowerCase() === criteria.text.toLowerCase()) {\n maxScore = 1.0;\n matchReasons.push('exact text match');\n scores.text = 1.0;\n } else if (criteria.fuzzy !== false) {\n // Fuzzy match\n const textResult = fuzzyMatch(criteria.text, textContent, { threshold });\n const labelResult = fuzzyMatch(criteria.text, label, { threshold });\n const bestResult = textResult.similarity > labelResult.similarity ? textResult : labelResult;\n\n if (bestResult.isMatch) {\n scores.text = bestResult.similarity;\n if (bestResult.similarity > maxScore) {\n maxScore = bestResult.similarity;\n matchReasons.push(`text similarity: ${(bestResult.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Text contains\n if (criteria.textContains) {\n if (textContent.toLowerCase().includes(criteria.textContains.toLowerCase()) ||\n label.toLowerCase().includes(criteria.textContains.toLowerCase())) {\n const containsScore = 0.85;\n scores.text = Math.max(scores.text ?? 0, containsScore);\n if (containsScore > maxScore) {\n maxScore = containsScore;\n matchReasons.push('text contains');\n }\n }\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const ariaLabel = element.element.getAttribute('aria-label') || '';\n const accessibleName = ariaLabel || label || textContent;\n\n if (accessibleName.toLowerCase() === criteria.accessibleName.toLowerCase()) {\n scores.accessibility = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push('accessible name match');\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(criteria.accessibleName, accessibleName, { threshold });\n if (result.isMatch) {\n scores.accessibility = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Role matching\n if (criteria.role) {\n const role = element.element.getAttribute('role') || this.inferRole(element.type);\n if (role?.toLowerCase() === criteria.role.toLowerCase()) {\n scores.role = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`role: ${criteria.role}`);\n }\n }\n }\n\n // Type matching\n if (criteria.type) {\n if (element.type === criteria.type) {\n const typeScore = 0.9;\n scores.role = Math.max(scores.role ?? 0, typeScore);\n if (typeScore > maxScore) {\n maxScore = typeScore;\n matchReasons.push(`type: ${criteria.type}`);\n }\n }\n }\n\n // Alias matching\n for (const alias of aliases) {\n const searchText = criteria.text || criteria.textContains || criteria.accessibleName;\n if (searchText) {\n if (alias.toLowerCase() === searchText.toLowerCase()) {\n scores.fuzzy = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`alias: \"${alias}\"`);\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(searchText, alias, { threshold });\n if (result.isMatch && result.similarity > (scores.fuzzy ?? 0)) {\n scores.fuzzy = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`fuzzy alias: \"${alias}\"`);\n }\n }\n }\n }\n }\n\n // Add result if above threshold\n if (maxScore >= threshold) {\n const aiElement: AIDiscoveredElement = {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: element.element.tagName.toLowerCase(),\n role: element.element.getAttribute('role') || undefined,\n accessibleName: element.element.getAttribute('aria-label') || element.label,\n actions: element.actions,\n state,\n registered: true,\n description: element.description || generateDescription({\n textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n }),\n aliases,\n purpose: element.purpose,\n suggestedActions: [],\n semanticType: element.semanticType,\n };\n\n results.push({\n element: aiElement,\n confidence: maxScore,\n matchReasons,\n scores,\n });\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n return results;\n }\n\n /**\n * Find element by visible text\n */\n findByText(text: string, fuzzy: boolean = true): RegisteredElement | undefined {\n const results = this.searchElements({ text, fuzzy, fuzzyThreshold: fuzzy ? 0.7 : 1.0 });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Find element by accessible name\n */\n findByAccessibleName(name: string): RegisteredElement | undefined {\n const results = this.searchElements({ accessibleName: name, fuzzy: true });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Generate aliases for an element\n */\n private generateElementAliases(element: RegisteredElement): string[] {\n const state = element.getState();\n return generateAliases({\n textContent: state.textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n placeholder: element.element.getAttribute('placeholder'),\n title: element.element.getAttribute('title'),\n elementType: element.type,\n tagName: element.element.tagName.toLowerCase(),\n id: element.id,\n labelText: element.label,\n });\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: ElementType): string | undefined {\n const roleMap: Record<ElementType, string | undefined> = {\n button: 'button',\n input: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n form: undefined,\n textarea: 'textbox',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n dialog: 'dialog',\n custom: undefined,\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n generic: undefined,\n };\n return roleMap[type];\n }\n\n /**\n * Register a component\n */\n registerComponent(\n id: string,\n options: {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n getState?: StateGetter<Record<string, unknown>>;\n getComputed?: () => Record<string, unknown>;\n }\n ): RegisteredComponent {\n const registered: RegisteredComponent = {\n id,\n name: options.name,\n description: options.description,\n actions:\n options.actions?.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })) ?? [],\n elementIds: options.elementIds,\n registeredAt: Date.now(),\n mounted: true,\n getState: options.getState,\n getComputed: options.getComputed,\n };\n\n this.components.set(id, registered);\n this.emit('component:registered', { id, name: options.name });\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): boolean {\n const component = this.components.get(id);\n if (component) {\n component.mounted = false;\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredComponent[] {\n return Array.from(this.components.values());\n }\n\n /**\n * Get the current state and computed properties of a component\n */\n getComponentState(id: string): ComponentStateResponse | null {\n const component = this.components.get(id);\n if (!component || !component.mounted) {\n return null;\n }\n\n return {\n state: component.getState?.() ?? {},\n computed: component.getComputed?.() ?? {},\n timestamp: Date.now(),\n };\n }\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): Workflow {\n this.workflows.set(workflow.id, workflow);\n return workflow;\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): boolean {\n return this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n /**\n * Register a state\n */\n registerState(state: UIState): UIState {\n this.states.set(state.id, state);\n this.emit('element:registered', { id: state.id, type: 'state', name: state.name });\n return state;\n }\n\n /**\n * Unregister a state\n */\n unregisterState(id: string): boolean {\n const state = this.states.get(id);\n if (state) {\n this.activeStates.delete(id);\n this.states.delete(id);\n this.emit('element:unregistered', { id, type: 'state' });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered state\n */\n getState(id: string): UIState | undefined {\n return this.states.get(id);\n }\n\n /**\n * Get all registered states\n */\n getAllStates(): UIState[] {\n return Array.from(this.states.values());\n }\n\n /**\n * Register a state group\n */\n registerStateGroup(group: UIStateGroup): UIStateGroup {\n this.stateGroups.set(group.id, group);\n return group;\n }\n\n /**\n * Unregister a state group\n */\n unregisterStateGroup(id: string): boolean {\n return this.stateGroups.delete(id);\n }\n\n /**\n * Get a state group\n */\n getStateGroup(id: string): UIStateGroup | undefined {\n return this.stateGroups.get(id);\n }\n\n /**\n * Get all state groups\n */\n getAllStateGroups(): UIStateGroup[] {\n return Array.from(this.stateGroups.values());\n }\n\n /**\n * Register a transition\n */\n registerTransition(transition: UITransition): UITransition {\n this.transitions.set(transition.id, transition);\n return transition;\n }\n\n /**\n * Unregister a transition\n */\n unregisterTransition(id: string): boolean {\n return this.transitions.delete(id);\n }\n\n /**\n * Get a transition\n */\n getTransition(id: string): UITransition | undefined {\n return this.transitions.get(id);\n }\n\n /**\n * Get all transitions\n */\n getAllTransitions(): UITransition[] {\n return Array.from(this.transitions.values());\n }\n\n /**\n * Get currently active states\n */\n getActiveStates(): string[] {\n return Array.from(this.activeStates);\n }\n\n /**\n * Check if a state is active\n */\n isStateActive(id: string): boolean {\n return this.activeStates.has(id);\n }\n\n /**\n * Activate a state\n */\n activateState(id: string): boolean {\n const state = this.states.get(id);\n if (!state) {\n return false;\n }\n\n // Check if blocked by another state\n for (const activeId of this.activeStates) {\n const activeState = this.states.get(activeId);\n if (activeState?.blocking && activeState.id !== id) {\n // Blocked by a modal/blocking state\n return false;\n }\n if (activeState?.blocks?.includes(id)) {\n // Specifically blocked by this state\n return false;\n }\n }\n\n const wasActive = this.activeStates.has(id);\n this.activeStates.add(id);\n\n if (!wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: true,\n activeStates: this.getActiveStates(),\n });\n }\n\n return true;\n }\n\n /**\n * Deactivate a state\n */\n deactivateState(id: string): boolean {\n const wasActive = this.activeStates.has(id);\n this.activeStates.delete(id);\n\n if (wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: false,\n activeStates: this.getActiveStates(),\n });\n }\n\n return wasActive;\n }\n\n /**\n * Activate multiple states\n */\n activateStates(ids: string[]): string[] {\n const activated: string[] = [];\n for (const id of ids) {\n if (this.activateState(id)) {\n activated.push(id);\n }\n }\n return activated;\n }\n\n /**\n * Deactivate multiple states\n */\n deactivateStates(ids: string[]): string[] {\n const deactivated: string[] = [];\n for (const id of ids) {\n if (this.deactivateState(id)) {\n deactivated.push(id);\n }\n }\n return deactivated;\n }\n\n /**\n * Activate a state group (all states in the group)\n */\n activateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.activateStates(group.states);\n }\n\n /**\n * Deactivate a state group (all states in the group)\n */\n deactivateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.deactivateStates(group.states);\n }\n\n /**\n * Check if a transition can be executed from current state\n */\n canExecuteTransition(transitionId: string): boolean {\n const transition = this.transitions.get(transitionId);\n if (!transition) return false;\n\n // At least one fromState must be active\n return transition.fromStates.some((stateId) => this.activeStates.has(stateId));\n }\n\n /**\n * Execute a transition\n */\n async executeTransition(transitionId: string): Promise<TransitionResult> {\n const startTime = performance.now();\n const transition = this.transitions.get(transitionId);\n\n if (!transition) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: `Transition not found: ${transitionId}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n if (!this.canExecuteTransition(transitionId)) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'Precondition not met: none of the fromStates are active',\n failedPhase: 'precondition',\n durationMs: performance.now() - startTime,\n };\n }\n\n try {\n // Phase 1: Deactivate exit states\n const deactivated = this.deactivateStates(transition.exitStates);\n\n // Phase 2: Deactivate exit groups\n if (transition.exitGroups) {\n for (const groupId of transition.exitGroups) {\n deactivated.push(...this.deactivateStateGroup(groupId));\n }\n }\n\n // Phase 3: Execute actions (if any)\n // Note: Actual action execution happens in the workflow engine\n // Here we just track that the transition occurred\n\n // Phase 4: Activate states\n const activated = this.activateStates(transition.activateStates);\n\n // Phase 5: Activate groups\n if (transition.activateGroups) {\n for (const groupId of transition.activateGroups) {\n activated.push(...this.activateStateGroup(groupId));\n }\n }\n\n return {\n success: true,\n activatedStates: activated,\n deactivatedStates: deactivated,\n durationMs: performance.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: error instanceof Error ? error.message : String(error),\n failedPhase: 'execution',\n durationMs: performance.now() - startTime,\n };\n }\n }\n\n /**\n * Find a path from current state to target states\n *\n * Uses a simple BFS algorithm for pathfinding.\n * For more advanced pathfinding (Dijkstra, A*), use the Python state manager service.\n */\n findPath(targetStates: string[]): PathResult {\n // Check if already at target\n if (targetStates.every((t) => this.activeStates.has(t))) {\n return {\n found: true,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n // BFS to find path\n const queue: { activeStates: Set<string>; path: string[]; cost: number }[] = [\n { activeStates: new Set(this.activeStates), path: [], cost: 0 },\n ];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const stateKey = Array.from(current.activeStates).sort().join(',');\n\n if (visited.has(stateKey)) continue;\n visited.add(stateKey);\n\n // Check if target reached\n if (targetStates.every((t) => current.activeStates.has(t))) {\n return {\n found: true,\n transitions: current.path,\n totalCost: current.cost,\n targetStates,\n estimatedSteps: current.path.length,\n };\n }\n\n // Try each transition\n for (const transition of this.transitions.values()) {\n // Check if transition can be executed from current state\n const canExecute = transition.fromStates.some((s) => current.activeStates.has(s));\n if (!canExecute) continue;\n\n // Calculate new state after transition\n const newActive = new Set(current.activeStates);\n for (const s of transition.exitStates) newActive.delete(s);\n for (const s of transition.activateStates) newActive.add(s);\n\n const newCost = current.cost + (transition.pathCost ?? 1);\n\n queue.push({\n activeStates: newActive,\n path: [...current.path, transition.id],\n cost: newCost,\n });\n }\n }\n\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n /**\n * Navigate to target states using pathfinding\n */\n async navigateTo(targetStates: string[]): Promise<NavigationResult> {\n const startTime = performance.now();\n const path = this.findPath(targetStates);\n\n if (!path.found) {\n return {\n success: false,\n path,\n executedTransitions: [],\n finalActiveStates: this.getActiveStates(),\n error: `No path found to target states: ${targetStates.join(', ')}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n const executedTransitions: string[] = [];\n\n for (const transitionId of path.transitions) {\n const result = await this.executeTransition(transitionId);\n if (!result.success) {\n return {\n success: false,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n error: result.error,\n durationMs: performance.now() - startTime,\n };\n }\n executedTransitions.push(transitionId);\n }\n\n return {\n success: true,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n durationMs: performance.now() - startTime,\n };\n }\n\n /**\n * Create a state snapshot\n */\n createStateSnapshot(): StateSnapshot {\n return {\n timestamp: Date.now(),\n activeStates: this.getActiveStates(),\n states: this.getAllStates(),\n groups: this.getAllStateGroups(),\n transitions: this.getAllTransitions(),\n };\n }\n\n /**\n * Create a snapshot of the current state\n */\n createSnapshot(): BridgeSnapshot {\n return {\n timestamp: Date.now(),\n elements: this.getAllElements().map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n identifier: el.getIdentifier(),\n state: el.getState(),\n actions: el.actions,\n customActions: el.customActions ? Object.keys(el.customActions) : undefined,\n })),\n components: this.getAllComponents().map((comp) => ({\n id: comp.id,\n name: comp.name,\n description: comp.description,\n actions: comp.actions.map((a) => a.id),\n elementIds: comp.elementIds,\n })),\n workflows: this.getAllWorkflows().map((wf) => ({\n id: wf.id,\n name: wf.name,\n description: wf.description,\n stepCount: wf.steps.length,\n })),\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n this.eventListeners.clear();\n this.states.clear();\n this.stateGroups.clear();\n this.transitions.clear();\n this.activeStates.clear();\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n elementCount: number;\n componentCount: number;\n workflowCount: number;\n mountedElementCount: number;\n mountedComponentCount: number;\n stateCount: number;\n stateGroupCount: number;\n transitionCount: number;\n activeStateCount: number;\n } {\n const elements = this.getAllElements();\n const components = this.getAllComponents();\n\n return {\n elementCount: elements.length,\n componentCount: components.length,\n workflowCount: this.workflows.size,\n mountedElementCount: elements.filter((e) => e.mounted).length,\n mountedComponentCount: components.filter((c) => c.mounted).length,\n stateCount: this.states.size,\n stateGroupCount: this.stateGroups.size,\n transitionCount: this.transitions.size,\n activeStateCount: this.activeStates.size,\n };\n }\n}\n\n/**\n * Default global registry instance\n */\nlet globalRegistry: UIBridgeRegistry | null = null;\n\n/**\n * Get or create the global registry\n */\nexport function getGlobalRegistry(): UIBridgeRegistry {\n if (!globalRegistry) {\n globalRegistry = new UIBridgeRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: UIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * WebSocket Client for UI Bridge\n *\n * Provides real-time communication with UI Bridge server.\n */\n\nimport type {\n BridgeEvent,\n BridgeEventType,\n BridgeSnapshot,\n WSClientConfig,\n WSClientMessage,\n WSConnectionState,\n WSServerMessage,\n WSSubscriptionOptions,\n ActionRequest,\n ActionResponse,\n} from './types';\n\n/**\n * Generate unique message ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * WebSocket client for UI Bridge\n */\nexport class UIBridgeWSClient {\n private ws: WebSocket | null = null;\n private config: Required<WSClientConfig>;\n private state: WSConnectionState = 'disconnected';\n private clientId: string | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Event listeners\n private connectionListeners = new Set<(state: WSConnectionState) => void>();\n private eventListeners = new Map<BridgeEventType | '*', Set<(event: BridgeEvent) => void>>();\n private errorListeners = new Set<(error: Error) => void>();\n\n // Current subscriptions\n private subscriptions: WSSubscriptionOptions = {};\n\n constructor(config: WSClientConfig) {\n this.config = {\n url: config.url,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n pingInterval: config.pingInterval ?? 30000,\n connectionTimeout: config.connectionTimeout ?? 10000,\n };\n }\n\n /**\n * Get current connection state\n */\n get connectionState(): WSConnectionState {\n return this.state;\n }\n\n /**\n * Get assigned client ID\n */\n get id(): string | null {\n return this.clientId;\n }\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.config.url);\n } catch (error) {\n this.setState('disconnected');\n reject(error);\n return;\n }\n\n const connectionTimeout = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.close();\n this.setState('disconnected');\n reject(new Error('Connection timeout'));\n }\n }, this.config.connectionTimeout);\n\n this.ws.onopen = () => {\n clearTimeout(connectionTimeout);\n // Wait for welcome message before resolving\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSServerMessage;\n this.handleMessage(message);\n\n // Resolve connect promise on welcome message\n if (message.type === 'welcome') {\n clearTimeout(connectionTimeout);\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startPingInterval();\n\n // Re-subscribe if we have active subscriptions\n if (\n this.subscriptions.events?.length ||\n this.subscriptions.elementIds?.length ||\n this.subscriptions.componentIds?.length\n ) {\n this.subscribe(this.subscriptions);\n }\n\n resolve();\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n\n this.ws.onerror = (_event) => {\n clearTimeout(connectionTimeout);\n const error = new Error('WebSocket error');\n this.notifyError(error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onclose = () => {\n clearTimeout(connectionTimeout);\n this.stopPingInterval();\n this.clientId = null;\n\n const wasConnected = this.state === 'connected';\n this.setState('disconnected');\n\n // Reject all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect\n if (\n wasConnected &&\n this.config.autoReconnect &&\n (this.config.maxReconnectAttempts === 0 ||\n this.reconnectAttempts < this.config.maxReconnectAttempts)\n ) {\n this.scheduleReconnect();\n }\n };\n });\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopPingInterval();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n /**\n * Subscribe to events\n */\n async subscribe(options: WSSubscriptionOptions): Promise<BridgeEventType[]> {\n this.subscriptions = { ...this.subscriptions, ...options };\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'subscribe',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.events;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(events?: BridgeEventType[]): Promise<BridgeEventType[]> {\n if (events) {\n this.subscriptions.events = this.subscriptions.events?.filter((e) => !events.includes(e));\n } else {\n this.subscriptions = {};\n }\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'unsubscribe',\n timestamp: Date.now(),\n payload: { events },\n });\n\n return response.events;\n }\n\n /**\n * Find elements\n */\n async find(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n const response = await this.sendRequest<{ elements: BridgeSnapshot['elements'] }>({\n id: generateId(),\n type: 'find',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.elements;\n }\n\n /**\n * Discover elements\n * @deprecated Use find() instead\n */\n async discover(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n return this.find(options);\n }\n\n /**\n * Get element details\n */\n async getElement(\n elementId: string,\n includeState = true\n ): Promise<BridgeSnapshot['elements'][0] | null> {\n const response = await this.sendRequest<{ element: BridgeSnapshot['elements'][0] | null }>({\n id: generateId(),\n type: 'getElement',\n timestamp: Date.now(),\n payload: { elementId, includeState },\n });\n\n return response.element;\n }\n\n /**\n * Get full snapshot\n */\n async getSnapshot(): Promise<BridgeSnapshot> {\n const response = await this.sendRequest<BridgeSnapshot>({\n id: generateId(),\n type: 'getSnapshot',\n timestamp: Date.now(),\n });\n\n return response;\n }\n\n /**\n * Execute action on an element\n */\n async executeAction(elementId: string, action: ActionRequest): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeAction',\n timestamp: Date.now(),\n payload: { elementId, action },\n });\n\n return response;\n }\n\n /**\n * Execute component action\n */\n async executeComponentAction(\n componentId: string,\n action: string,\n params?: Record<string, unknown>\n ): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeComponentAction',\n timestamp: Date.now(),\n payload: { componentId, action, params },\n });\n\n return response;\n }\n\n /**\n * Execute workflow with optional progress streaming\n */\n async executeWorkflow(\n workflowId: string,\n params?: Record<string, unknown>,\n onProgress?: (progress: {\n currentStep: number;\n totalSteps: number;\n step: { id: string; status: string };\n }) => void\n ): Promise<{ success: boolean; results: unknown[] }> {\n const id = generateId();\n\n // Set up progress listener if provided\n const progressHandler: ((message: WSServerMessage) => void) | undefined = onProgress\n ? (message: WSServerMessage) => {\n if (message.type === 'workflowProgress' && message.requestId === id) {\n onProgress({\n currentStep: message.payload.currentStep,\n totalSteps: message.payload.totalSteps,\n step: {\n id: message.payload.step.id,\n status: message.payload.step.status,\n },\n });\n }\n }\n : undefined;\n\n const response = await this.sendRequest<{ success: boolean; results: unknown[] }>(\n {\n id,\n type: 'executeWorkflow',\n timestamp: Date.now(),\n payload: { workflowId, params, streamProgress: !!onProgress },\n },\n progressHandler\n );\n\n return response;\n }\n\n /**\n * Add connection state listener\n */\n onConnectionChange(listener: (state: WSConnectionState) => void): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /**\n * Add event listener\n */\n onEvent(\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ): () => void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(listener);\n return () => this.eventListeners.get(eventType)?.delete(listener);\n }\n\n /**\n * Add error listener\n */\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n // Private methods\n\n private setState(state: WSConnectionState): void {\n this.state = state;\n for (const listener of this.connectionListeners) {\n try {\n listener(state);\n } catch (error) {\n console.error('Connection listener error:', error);\n }\n }\n }\n\n private handleMessage(message: WSServerMessage): void {\n switch (message.type) {\n case 'welcome':\n this.clientId = message.payload.clientId;\n break;\n\n case 'pong':\n // Ping/pong handled automatically\n break;\n\n case 'subscribed':\n case 'unsubscribed':\n // Handled by request/response\n break;\n\n case 'event':\n this.notifyEvent(message.payload);\n break;\n\n case 'response':\n this.handleResponse(message);\n break;\n\n case 'error':\n if (message.requestId) {\n this.handleResponse({\n ...message,\n type: 'response',\n requestId: message.requestId,\n payload: {\n success: false,\n error: message.payload.message,\n },\n });\n } else {\n this.notifyError(new Error(message.payload.message));\n }\n break;\n\n case 'workflowProgress':\n // Handled by progress callback in executeWorkflow\n break;\n }\n }\n\n private handleResponse(message: WSServerMessage & { requestId: string }): void {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n\n if (message.type === 'response') {\n if (message.payload.success) {\n pending.resolve(message.payload.data);\n } else {\n pending.reject(new Error(message.payload.error || 'Request failed'));\n }\n }\n }\n\n private notifyEvent(event: BridgeEvent): void {\n // Notify specific type listeners\n const typeListeners = this.eventListeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n\n // Notify wildcard listeners\n const wildcardListeners = this.eventListeners.get('*');\n if (wildcardListeners) {\n for (const listener of wildcardListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const listener of this.errorListeners) {\n try {\n listener(error);\n } catch (e) {\n console.error('Error listener error:', e);\n }\n }\n }\n\n private sendRequest<T>(\n message: WSClientMessage,\n progressHandler?: (message: WSServerMessage) => void\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.state !== 'connected') {\n reject(new Error('Not connected'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error('Request timeout'));\n }, 30000);\n\n this.pendingRequests.set(message.id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout,\n });\n\n // Handle progress messages during workflow execution\n if (progressHandler && this.ws) {\n const originalHandler = this.ws.onmessage;\n const wsRef = this.ws;\n const wrappedHandler = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as WSServerMessage;\n if (msg.type === 'workflowProgress') {\n progressHandler(msg);\n }\n } catch {\n // Ignore parse errors for progress\n }\n // Call original handler\n if (originalHandler) {\n originalHandler.call(wsRef, event);\n }\n };\n this.ws.onmessage = wrappedHandler;\n }\n\n this.ws.send(JSON.stringify(message));\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n // Will auto-retry if configured\n });\n }, delay);\n }\n\n private startPingInterval(): void {\n if (this.config.pingInterval <= 0) return;\n\n this.pingTimer = setInterval(() => {\n if (this.ws && this.state === 'connected') {\n this.ws.send(\n JSON.stringify({\n id: generateId(),\n type: 'ping',\n timestamp: Date.now(),\n })\n );\n }\n }, this.config.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n}\n\n/**\n * Create a WebSocket client instance\n */\nexport function createWSClient(config: WSClientConfig): UIBridgeWSClient {\n return new UIBridgeWSClient(config);\n}\n","/**\n * Action Executor\n *\n * Executes actions on registered elements and components.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WaitOptions, ElementState, StandardAction } from '../core/types';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n FindRequest,\n FindResponse,\n DiscoveredElement,\n ControlSnapshot,\n ActionExecutor,\n TypeAction,\n SelectAction,\n ScrollAction,\n MouseAction,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Get element state for an HTML element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\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 } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a mouse event\n */\nfunction createMouseEvent(type: string, element: HTMLElement, options?: MouseAction): MouseEvent {\n const rect = element.getBoundingClientRect();\n const x = options?.position?.x ?? rect.width / 2;\n const y = options?.position?.y ?? rect.height / 2;\n\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n button: options?.button === 'right' ? 2 : options?.button === 'middle' ? 1 : 0,\n clientX: rect.left + x,\n clientY: rect.top + y,\n });\n}\n\n/**\n * Default action executor implementation\n */\nexport class DefaultActionExecutor implements ActionExecutor {\n constructor(private registry: UIBridgeRegistry) {}\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = performance.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n // If not registered, try to find by identifier\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n success: false,\n error: `Element not found: ${elementId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElement(element, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n return {\n success: false,\n error: waitResult.error || 'Wait condition not met',\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const result = await this.performAction(element, request.action, request.params);\n\n return {\n success: true,\n elementState: getElementState(element),\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Execute an action on a component\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = performance.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const action = component.actions.find((a) => a.id === request.action);\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Wait for a condition on an element\n */\n async waitFor(elementId: string, options: WaitOptions): Promise<WaitResult> {\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n met: false,\n waitedMs: 0,\n error: `Element not found: ${elementId}`,\n };\n }\n\n return this.waitForElement(element, options);\n }\n\n /**\n * Find controllable elements\n */\n async find(options?: FindRequest): Promise<FindResponse> {\n const startTime = performance.now();\n const elements: DiscoveredElement[] = [];\n\n // Get root element\n let root: HTMLElement = document.body;\n if (options?.root) {\n const rootEl = document.querySelector<HTMLElement>(options.root);\n if (rootEl) root = rootEl;\n }\n\n // Find interactive elements\n const interactiveSelectors = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-id]',\n '[data-testid]',\n ];\n\n const selector = options?.selector || interactiveSelectors.join(', ');\n const foundElements = root.querySelectorAll<HTMLElement>(selector);\n\n for (const el of foundElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = getElementState(el);\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by type\n if (options?.types) {\n const type = this.inferElementType(el);\n if (!options.types.includes(type)) continue;\n }\n\n // Check if registered\n const registered = this.registry.findByDOMElement(el);\n\n elements.push({\n id: registered?.id || this.getElementId(el),\n type: registered?.type || this.inferElementType(el),\n label: registered?.label || this.getElementLabel(el),\n tagName: el.tagName.toLowerCase(),\n role: el.getAttribute('role') || undefined,\n accessibleName: this.getAccessibleName(el),\n actions: registered?.actions || this.inferActions(el),\n state,\n registered: !!registered,\n });\n }\n\n return {\n elements,\n total: elements.length,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n async discover(options?: FindRequest): Promise<FindResponse> {\n return this.find(options);\n }\n\n /**\n * Get control snapshot\n */\n async getSnapshot(): Promise<ControlSnapshot> {\n const elements = this.registry.getAllElements();\n const components = this.registry.getAllComponents();\n const workflows = this.registry.getAllWorkflows();\n\n return {\n timestamp: Date.now(),\n elements: elements.map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n actions: [...el.actions, ...(el.customActions ? Object.keys(el.customActions) : [])],\n state: el.getState(),\n })),\n components: components.map((comp) => ({\n id: comp.id,\n name: comp.name,\n actions: comp.actions.map((a) => a.id),\n })),\n workflows: workflows.map((wf) => ({\n id: wf.id,\n name: wf.name,\n stepCount: wf.steps.length,\n })),\n activeRuns: [], // Workflow engine manages this\n };\n }\n\n /**\n * Wait for element conditions\n */\n private async waitForElement(element: HTMLElement, options: WaitOptions): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = performance.now();\n const deadline = startTime + opts.timeout;\n\n while (Date.now() < deadline) {\n const state = getElementState(element);\n\n // Check conditions\n let allMet = true;\n\n if (opts.visible && !state.visible) allMet = false;\n if (opts.enabled && !state.enabled) allMet = false;\n if (opts.focused && !state.focused) allMet = false;\n\n // Check custom state conditions\n if (opts.state) {\n for (const [key, value] of Object.entries(opts.state)) {\n if (state[key as keyof ElementState] !== value) {\n allMet = false;\n break;\n }\n }\n }\n\n if (allMet) {\n return {\n met: true,\n waitedMs: performance.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: performance.now() - startTime,\n state: getElementState(element),\n error: `Timeout waiting for conditions after ${opts.timeout}ms`,\n };\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: HTMLElement,\n action: string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n switch (action as StandardAction) {\n case 'click':\n return this.performClick(element, params as MouseAction);\n case 'doubleClick':\n return this.performDoubleClick(element, params as MouseAction);\n case 'rightClick':\n return this.performRightClick(element, params as MouseAction);\n case 'type':\n return this.performType(element, params as unknown as TypeAction);\n case 'clear':\n return this.performClear(element);\n case 'select':\n return this.performSelect(element, params as unknown as SelectAction);\n case 'focus':\n return this.performFocus(element);\n case 'blur':\n return this.performBlur(element);\n case 'hover':\n return this.performHover(element);\n case 'scroll':\n return this.performScroll(element, params as ScrollAction);\n case 'check':\n return this.performCheck(element, true);\n case 'uncheck':\n return this.performCheck(element, false);\n case 'toggle':\n return this.performToggle(element);\n default: {\n // Check for custom actions\n const registered = this.registry.findByDOMElement(element);\n if (registered?.customActions?.[action]) {\n return registered.customActions[action].handler(params);\n }\n throw new Error(`Unknown action: ${action}`);\n }\n }\n }\n\n private performClick(element: HTMLElement, options?: MouseAction): void {\n element.dispatchEvent(createMouseEvent('mousedown', element, options));\n element.dispatchEvent(createMouseEvent('mouseup', element, options));\n element.dispatchEvent(createMouseEvent('click', element, options));\n }\n\n private performDoubleClick(element: HTMLElement, options?: MouseAction): void {\n this.performClick(element, options);\n this.performClick(element, options);\n element.dispatchEvent(createMouseEvent('dblclick', element, options));\n }\n\n private performRightClick(element: HTMLElement, options?: MouseAction): void {\n const opts = { ...options, button: 'right' as const };\n element.dispatchEvent(createMouseEvent('mousedown', element, opts));\n element.dispatchEvent(createMouseEvent('mouseup', element, opts));\n element.dispatchEvent(createMouseEvent('contextmenu', element, opts));\n }\n\n private async performType(element: HTMLElement, options?: TypeAction): Promise<void> {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error('Type action requires an input or textarea element');\n }\n\n element.focus();\n\n if (options?.clear) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n const text = options?.text || '';\n const delay = options?.delay || 0;\n\n for (const char of text) {\n element.value += char;\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n if (delay > 0) {\n await sleep(delay);\n }\n }\n\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performClear(element: HTMLElement): void {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSelect(element: HTMLElement, options?: SelectAction): void {\n if (!(element instanceof HTMLSelectElement)) {\n throw new Error('Select action requires a select element');\n }\n\n const values = Array.isArray(options?.value) ? options.value : [options?.value];\n\n if (!options?.additive) {\n // Clear existing selection for single select or when not additive\n for (const option of element.options) {\n option.selected = false;\n }\n }\n\n for (const option of element.options) {\n const matchValue = options?.byLabel ? option.text : option.value;\n if (values.includes(matchValue)) {\n option.selected = true;\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n private performFocus(element: HTMLElement): void {\n element.focus();\n element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n }\n\n private performBlur(element: HTMLElement): void {\n element.blur();\n element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n }\n\n private performHover(element: HTMLElement): void {\n element.dispatchEvent(createMouseEvent('mouseenter', element));\n element.dispatchEvent(createMouseEvent('mouseover', element));\n }\n\n private performScroll(element: HTMLElement, options?: ScrollAction): void {\n if (options?.toElement) {\n const target = document.querySelector<HTMLElement>(options.toElement);\n if (target) {\n target.scrollIntoView({ behavior: options.smooth ? 'smooth' : 'auto' });\n return;\n }\n }\n\n if (options?.position) {\n element.scrollTo({\n left: options.position.x,\n top: options.position.y,\n behavior: options.smooth ? 'smooth' : 'auto',\n });\n return;\n }\n\n const amount = options?.amount || 100;\n const direction = options?.direction || 'down';\n\n switch (direction) {\n case 'up':\n element.scrollBy({ top: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'down':\n element.scrollBy({ top: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'left':\n element.scrollBy({ left: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'right':\n element.scrollBy({ left: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n }\n }\n\n private performCheck(element: HTMLElement, checked: boolean): void {\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n if (element.checked !== checked) {\n element.checked = checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }\n\n private performToggle(element: HTMLElement): void {\n if (element instanceof HTMLInputElement && element.type === 'checkbox') {\n element.checked = !element.checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private getElementId(element: HTMLElement): string {\n return (\n element.getAttribute('data-ui-id') ||\n element.getAttribute('data-testid') ||\n element.id ||\n `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`\n );\n }\n\n private getElementLabel(element: HTMLElement): string | undefined {\n return (\n element.getAttribute('aria-label') ||\n element.getAttribute('title') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined\n );\n }\n\n private getAccessibleName(element: HTMLElement): string | undefined {\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n if (element.id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n return (\n element.getAttribute('title') || element.textContent?.trim().substring(0, 50) || undefined\n );\n }\n\n private inferElementType(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'submit' || type === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n }\n\n private inferActions(element: HTMLElement): string[] {\n const type = this.inferElementType(element);\n const baseActions = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n default:\n return [...baseActions, 'click'];\n }\n }\n}\n\n/**\n * Create an action executor\n */\nexport function createActionExecutor(registry: UIBridgeRegistry): ActionExecutor {\n return new DefaultActionExecutor(registry);\n}\n","/**\n * Workflow Engine\n *\n * Executes multi-step workflows with error handling and state tracking.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WorkflowStep, Workflow } from '../core/types';\nimport type {\n WorkflowRunRequest,\n WorkflowRunResponse,\n WorkflowStepResult,\n WorkflowRunStatus,\n WorkflowEngine,\n ActionExecutor,\n} from './types';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Default workflow engine implementation\n */\nexport class DefaultWorkflowEngine implements WorkflowEngine {\n private activeRuns = new Map<string, WorkflowRunState>();\n\n constructor(\n private registry: UIBridgeRegistry,\n private executor: ActionExecutor\n ) {}\n\n /**\n * Run a workflow\n */\n async run(workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> {\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n return {\n workflowId,\n runId: generateRunId(),\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: `Workflow not found: ${workflowId}`,\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n\n const runId = generateRunId();\n const state: WorkflowRunState = {\n workflowId,\n runId,\n workflow,\n request,\n status: 'running',\n steps: [],\n currentStep: 0,\n startedAt: Date.now(),\n };\n\n this.activeRuns.set(runId, state);\n\n try {\n await this.executeWorkflow(state);\n } catch (error) {\n state.status = 'failed';\n state.error = error instanceof Error ? error.message : String(error);\n }\n\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n\n // Determine overall success\n state.success = state.status === 'completed' && state.steps.every((s) => s.success);\n\n // Clean up after a delay\n setTimeout(() => {\n this.activeRuns.delete(runId);\n }, 60000);\n\n return this.buildResponse(state);\n }\n\n /**\n * Get workflow run status\n */\n async getRunStatus(runId: string): Promise<WorkflowRunResponse | null> {\n const state = this.activeRuns.get(runId);\n if (!state) return null;\n return this.buildResponse(state);\n }\n\n /**\n * Cancel a running workflow\n */\n async cancel(runId: string): Promise<boolean> {\n const state = this.activeRuns.get(runId);\n if (!state || state.status !== 'running') return false;\n\n state.status = 'cancelled';\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n state.error = 'Workflow cancelled by user';\n\n return true;\n }\n\n /**\n * List active runs\n */\n async listActiveRuns(): Promise<WorkflowRunResponse[]> {\n return Array.from(this.activeRuns.values())\n .filter((state) => state.status === 'running')\n .map((state) => this.buildResponse(state));\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(state: WorkflowRunState): Promise<void> {\n const { workflow, request } = state;\n const params = { ...workflow.defaultParams, ...request?.params };\n\n // Find start step index\n let startIndex = 0;\n if (request?.startStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.startStep);\n if (idx >= 0) startIndex = idx;\n }\n\n // Find stop step index\n let stopIndex = workflow.steps.length;\n if (request?.stopStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.stopStep);\n if (idx >= 0) stopIndex = idx + 1;\n }\n\n // Execute steps\n for (let i = startIndex; i < stopIndex; i++) {\n // Check for cancellation\n if (state.status === 'cancelled') break;\n\n state.currentStep = i;\n const step = workflow.steps[i];\n\n const stepResult = await this.executeStep(step, params, request?.stepTimeout);\n state.steps.push(stepResult);\n\n // Stop on failure\n if (!stepResult.success) {\n state.status = 'failed';\n state.error = stepResult.error;\n return;\n }\n }\n\n state.status = 'completed';\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n step: WorkflowStep,\n params: Record<string, unknown>,\n timeout?: number\n ): Promise<WorkflowStepResult> {\n const startTime = performance.now();\n\n try {\n // Apply timeout if specified\n const timeoutPromise = timeout\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Step timeout')), timeout)\n )\n : null;\n\n const executePromise = this.executeStepInternal(step, params);\n\n const result = timeoutPromise\n ? await Promise.race([executePromise, timeoutPromise])\n : await executePromise;\n\n return {\n stepId: step.id,\n stepType: step.type,\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n stepId: step.id,\n stepType: step.type,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Execute step internal logic\n */\n private async executeStepInternal(\n step: WorkflowStep,\n params: Record<string, unknown>\n ): Promise<unknown> {\n // Interpolate params in step\n const resolvedParams = this.interpolateParams(step.params || {}, params);\n\n switch (step.type) {\n case 'element-action':\n if (!step.target || !step.action) {\n throw new Error('Element action requires target and action');\n }\n return this.executor.executeAction(step.target, {\n action: step.action,\n params: resolvedParams,\n waitOptions: step.waitOptions,\n });\n\n case 'component-action':\n if (!step.target || !step.action) {\n throw new Error('Component action requires target and action');\n }\n return this.executor.executeComponentAction(step.target, {\n action: step.action,\n params: resolvedParams,\n });\n\n case 'wait': {\n if (!step.target) {\n throw new Error('Wait step requires target');\n }\n const waitResult = await this.executor.waitFor(step.target, step.waitOptions || {});\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return waitResult;\n }\n\n case 'assert':\n if (!step.target || !step.expectedState) {\n throw new Error('Assert step requires target and expectedState');\n }\n return this.performAssertion(step.target, step.expectedState);\n\n case 'custom':\n if (!step.handler) {\n throw new Error('Custom step requires handler');\n }\n return step.handler();\n\n default:\n throw new Error(`Unknown step type: ${step.type}`);\n }\n }\n\n /**\n * Perform state assertion\n */\n private async performAssertion(\n target: string,\n expectedState: Record<string, unknown>\n ): Promise<{ passed: boolean; differences: string[] }> {\n const snapshot = await this.executor.getSnapshot();\n const element = snapshot.elements.find((e) => e.id === target);\n\n if (!element) {\n throw new Error(`Element not found for assertion: ${target}`);\n }\n\n const differences: string[] = [];\n\n for (const [key, expected] of Object.entries(expectedState)) {\n const actual = (element.state as unknown as Record<string, unknown>)[key];\n if (actual !== expected) {\n differences.push(`${key}: expected ${expected}, got ${actual}`);\n }\n }\n\n if (differences.length > 0) {\n throw new Error(`Assertion failed:\\n${differences.join('\\n')}`);\n }\n\n return { passed: true, differences };\n }\n\n /**\n * Interpolate parameters with {{param}} syntax\n */\n private interpolateParams(\n stepParams: Record<string, unknown>,\n workflowParams: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(stepParams)) {\n if (typeof value === 'string') {\n result[key] = value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n return String(workflowParams[name] ?? '');\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Build response from state\n */\n private buildResponse(state: WorkflowRunState): WorkflowRunResponse {\n return {\n workflowId: state.workflowId,\n runId: state.runId,\n status: state.status,\n steps: [...state.steps],\n currentStep: state.currentStep,\n totalSteps: state.workflow.steps.length,\n success: state.success,\n error: state.error,\n startedAt: state.startedAt,\n completedAt: state.completedAt,\n durationMs: state.durationMs,\n };\n }\n}\n\n/**\n * Internal workflow run state\n */\ninterface WorkflowRunState {\n workflowId: string;\n runId: string;\n workflow: Workflow;\n request?: WorkflowRunRequest;\n status: WorkflowRunStatus;\n steps: WorkflowStepResult[];\n currentStep: number;\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Create a workflow engine\n */\nexport function createWorkflowEngine(\n registry: UIBridgeRegistry,\n executor: ActionExecutor\n): WorkflowEngine {\n return new DefaultWorkflowEngine(registry, executor);\n}\n","/**\n * DOM Capture Module\n *\n * Utilities for capturing DOM snapshots and tracking changes.\n */\n\nimport type { ElementIdentifier, ElementState } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\n\n/**\n * Captured DOM element information\n */\nexport interface CapturedElement {\n /** Element identifier */\n identifier: ElementIdentifier;\n /** Best single identifier string */\n bestId: string;\n /** Tag name */\n tagName: string;\n /** Element role */\n role?: string;\n /** Accessible name */\n accessibleName?: string;\n /** Text content (truncated) */\n textContent?: string;\n /** Element state */\n state: ElementState;\n /** Attributes relevant for automation */\n attributes: Record<string, string>;\n /** Child element count */\n childCount: number;\n /** Depth in the DOM tree */\n depth: number;\n}\n\n/**\n * DOM snapshot\n */\nexport interface DOMSnapshot {\n /** Timestamp when snapshot was taken */\n timestamp: number;\n /** Page URL */\n url: string;\n /** Page title */\n title: string;\n /** Viewport dimensions */\n viewport: {\n width: number;\n height: number;\n scrollX: number;\n scrollY: number;\n };\n /** Captured elements */\n elements: CapturedElement[];\n /** Total DOM node count */\n totalNodeCount: number;\n /** Capture duration in milliseconds */\n captureDurationMs: number;\n}\n\n/**\n * Options for DOM capture\n */\nexport interface CaptureOptions {\n /** Root element to capture from (defaults to document.body) */\n root?: HTMLElement;\n /** Maximum depth to traverse */\n maxDepth?: number;\n /** Maximum number of elements to capture */\n maxElements?: number;\n /** Only capture interactive elements */\n interactiveOnly?: boolean;\n /** Include hidden elements */\n includeHidden?: boolean;\n /** Selectors to include (whitelist) */\n includeSelectors?: string[];\n /** Selectors to exclude (blacklist) */\n excludeSelectors?: string[];\n /** Custom filter function */\n filter?: (element: HTMLElement) => boolean;\n /** Truncate text content to this length */\n maxTextLength?: number;\n}\n\n/**\n * Attributes to capture for automation\n */\nconst CAPTURE_ATTRIBUTES = [\n 'data-ui-id',\n 'data-testid',\n 'data-awas-element',\n 'id',\n 'name',\n 'type',\n 'href',\n 'src',\n 'alt',\n 'title',\n 'placeholder',\n 'value',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'aria-expanded',\n 'aria-selected',\n 'aria-checked',\n 'aria-disabled',\n 'aria-hidden',\n 'role',\n 'tabindex',\n 'disabled',\n 'readonly',\n 'required',\n 'checked',\n];\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n];\n\n/**\n * Check if an element is interactive\n */\nfunction isInteractive(element: HTMLElement): boolean {\n return INTERACTIVE_SELECTORS.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n}\n\n/**\n * Get the accessible name of an element\n */\nfunction getAccessibleName(element: HTMLElement): string | undefined {\n // aria-label takes precedence\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n // Input associated label\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const id = element.id;\n if (id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Alt text for images\n if (element instanceof HTMLImageElement) {\n return element.alt || undefined;\n }\n\n // Button or link text content\n if (element.matches('button, a, [role=\"button\"], [role=\"link\"]')) {\n return element.textContent?.trim() || undefined;\n }\n\n return undefined;\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: isVisible(element, rect, style),\n enabled: !isDisabled(element),\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 // Input-specific state\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 } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n if (element.getAttribute('aria-hidden') === 'true') return false;\n\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Capture attributes from an element\n */\nfunction captureAttributes(element: HTMLElement): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of CAPTURE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value !== null) {\n attrs[attr] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Capture a single element\n */\nfunction captureElement(\n element: HTMLElement,\n depth: number,\n maxTextLength: number\n): CapturedElement {\n const identifier = createElementIdentifier(element);\n let textContent = element.textContent?.trim();\n if (textContent && textContent.length > maxTextLength) {\n textContent = textContent.substring(0, maxTextLength) + '...';\n }\n\n return {\n identifier,\n bestId: getBestIdentifier(element),\n tagName: element.tagName.toLowerCase(),\n role: element.getAttribute('role') || undefined,\n accessibleName: getAccessibleName(element),\n textContent,\n state: getElementState(element),\n attributes: captureAttributes(element),\n childCount: element.children.length,\n depth,\n };\n}\n\n/**\n * Capture DOM snapshot\n */\nexport function captureDOMSnapshot(options: CaptureOptions = {}): DOMSnapshot {\n const startTime = performance.now();\n const {\n root = document.body,\n maxDepth = 50,\n maxElements = 5000,\n interactiveOnly = false,\n includeHidden = false,\n includeSelectors,\n excludeSelectors,\n filter,\n maxTextLength = 200,\n } = options;\n\n const elements: CapturedElement[] = [];\n let totalNodeCount = 0;\n\n function shouldCapture(element: HTMLElement): boolean {\n // Check custom filter\n if (filter && !filter(element)) return false;\n\n // Check exclude selectors\n if (excludeSelectors) {\n for (const selector of excludeSelectors) {\n try {\n if (element.matches(selector)) return false;\n } catch {\n // Invalid selector\n }\n }\n }\n\n // Check include selectors (whitelist)\n if (includeSelectors && includeSelectors.length > 0) {\n let matches = false;\n for (const selector of includeSelectors) {\n try {\n if (element.matches(selector)) {\n matches = true;\n break;\n }\n } catch {\n // Invalid selector\n }\n }\n if (!matches) return false;\n }\n\n // Check interactive only\n if (interactiveOnly && !isInteractive(element)) return false;\n\n // Check visibility\n if (!includeHidden) {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n if (!isVisible(element, rect, style)) return false;\n }\n\n return true;\n }\n\n function traverse(element: HTMLElement, depth: number): void {\n if (depth > maxDepth || elements.length >= maxElements) return;\n\n totalNodeCount++;\n\n if (shouldCapture(element)) {\n elements.push(captureElement(element, depth, maxTextLength));\n }\n\n // Traverse children\n for (const child of element.children) {\n if (child instanceof HTMLElement) {\n traverse(child, depth + 1);\n }\n }\n }\n\n traverse(root, 0);\n\n const endTime = performance.now();\n\n return {\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n },\n elements,\n totalNodeCount,\n captureDurationMs: endTime - startTime,\n };\n}\n\n/**\n * Capture only interactive elements\n */\nexport function captureInteractiveElements(\n options: Omit<CaptureOptions, 'interactiveOnly'> = {}\n): DOMSnapshot {\n return captureDOMSnapshot({ ...options, interactiveOnly: true });\n}\n\n/**\n * Mutation record for tracked changes\n */\nexport interface DOMChange {\n timestamp: number;\n type: 'added' | 'removed' | 'modified' | 'attribute';\n elementId?: string;\n tagName: string;\n details?: {\n attributeName?: string;\n oldValue?: string;\n newValue?: string;\n addedNodes?: number;\n removedNodes?: number;\n };\n}\n\n/**\n * DOM change observer\n */\nexport class DOMChangeObserver {\n private observer: MutationObserver | null = null;\n private changes: DOMChange[] = [];\n private maxChanges: number;\n private callback?: (change: DOMChange) => void;\n\n constructor(options: { maxChanges?: number; callback?: (change: DOMChange) => void } = {}) {\n this.maxChanges = options.maxChanges ?? 1000;\n this.callback = options.callback;\n }\n\n start(root: HTMLElement = document.body): void {\n if (this.observer) return;\n\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n const change = this.processMutation(mutation);\n if (change) {\n this.addChange(change);\n }\n }\n });\n\n this.observer.observe(root, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n attributeOldValue: true,\n });\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n }\n\n private processMutation(mutation: MutationRecord): DOMChange | null {\n const target = mutation.target;\n if (!(target instanceof HTMLElement)) return null;\n\n const elementId = getBestIdentifier(target);\n\n if (mutation.type === 'attributes') {\n return {\n timestamp: Date.now(),\n type: 'attribute',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n attributeName: mutation.attributeName || undefined,\n oldValue: mutation.oldValue || undefined,\n newValue: mutation.attributeName\n ? target.getAttribute(mutation.attributeName) || undefined\n : undefined,\n },\n };\n }\n\n if (mutation.type === 'childList') {\n if (mutation.addedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'added',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n addedNodes: mutation.addedNodes.length,\n },\n };\n }\n if (mutation.removedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'removed',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n removedNodes: mutation.removedNodes.length,\n },\n };\n }\n }\n\n return null;\n }\n\n private addChange(change: DOMChange): void {\n this.changes.push(change);\n if (this.changes.length > this.maxChanges) {\n this.changes.shift();\n }\n this.callback?.(change);\n }\n\n getChanges(): DOMChange[] {\n return [...this.changes];\n }\n\n clearChanges(): void {\n this.changes = [];\n }\n}\n","/**\n * Render Log Snapshot Module\n *\n * Manages render log entries and provides persistence options.\n */\n\nimport type { DOMSnapshot, DOMChange, CaptureOptions } from './dom-capture';\nimport { captureDOMSnapshot, DOMChangeObserver } from './dom-capture';\n\n/**\n * Render log entry types\n */\nexport type RenderLogEntryType =\n | 'snapshot'\n | 'change'\n | 'navigation'\n | 'interaction'\n | 'error'\n | 'custom';\n\n/**\n * Base render log entry\n */\nexport interface RenderLogEntry {\n /** Unique entry ID */\n id: string;\n /** Entry type */\n type: RenderLogEntryType;\n /** Timestamp */\n timestamp: number;\n /** Entry data */\n data: unknown;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Snapshot entry\n */\nexport interface SnapshotEntry extends RenderLogEntry {\n type: 'snapshot';\n data: DOMSnapshot;\n}\n\n/**\n * Change entry\n */\nexport interface ChangeEntry extends RenderLogEntry {\n type: 'change';\n data: DOMChange[];\n}\n\n/**\n * Navigation entry\n */\nexport interface NavigationEntry extends RenderLogEntry {\n type: 'navigation';\n data: {\n from: string;\n to: string;\n navigationType: 'push' | 'replace' | 'pop' | 'reload';\n };\n}\n\n/**\n * Interaction entry\n */\nexport interface InteractionEntry extends RenderLogEntry {\n type: 'interaction';\n data: {\n eventType: string;\n targetId?: string;\n targetTagName?: string;\n coordinates?: { x: number; y: number };\n key?: string;\n modifiers?: {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n };\n };\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry extends RenderLogEntry {\n type: 'error';\n data: {\n message: string;\n stack?: string;\n source?: string;\n lineno?: number;\n colno?: number;\n };\n}\n\n/**\n * Render log storage interface\n */\nexport interface RenderLogStorage {\n /** Append an entry to the log */\n append(entry: RenderLogEntry): Promise<void>;\n /** Get entries by type and/or time range */\n getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]>;\n /** Clear the log */\n clear(): Promise<void>;\n /** Get total entry count */\n count(): Promise<number>;\n}\n\n/**\n * In-memory render log storage\n */\nexport class InMemoryRenderLogStorage implements RenderLogStorage {\n private entries: RenderLogEntry[] = [];\n private maxEntries: number;\n\n constructor(maxEntries = 1000) {\n this.maxEntries = maxEntries;\n }\n\n async append(entry: RenderLogEntry): Promise<void> {\n this.entries.push(entry);\n while (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n let results = [...this.entries];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.until) {\n results = results.filter((e) => e.timestamp <= options.until!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n async clear(): Promise<void> {\n this.entries = [];\n }\n\n async count(): Promise<number> {\n return this.entries.length;\n }\n\n /** Get entries synchronously (for in-memory only) */\n getEntriesSync(): RenderLogEntry[] {\n return [...this.entries];\n }\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Render log manager options\n */\nexport interface RenderLogOptions {\n /** Storage implementation */\n storage?: RenderLogStorage;\n /** Automatically capture snapshots on navigation */\n captureOnNavigation?: boolean;\n /** Automatically capture DOM changes */\n captureChanges?: boolean;\n /** Capture interval for periodic snapshots (ms) */\n snapshotInterval?: number;\n /** Default capture options */\n captureOptions?: CaptureOptions;\n /** Callback when entry is added */\n onEntry?: (entry: RenderLogEntry) => void;\n /** Maximum entries to keep */\n maxEntries?: number;\n}\n\n/**\n * Render Log Manager\n *\n * Central manager for capturing and storing render logs.\n */\nexport class RenderLogManager {\n private storage: RenderLogStorage;\n private changeObserver: DOMChangeObserver | null = null;\n private snapshotTimer: ReturnType<typeof setInterval> | null = null;\n private pendingChanges: DOMChange[] = [];\n private options: RenderLogOptions;\n private started = false;\n\n constructor(options: RenderLogOptions = {}) {\n this.options = options;\n this.storage = options.storage ?? new InMemoryRenderLogStorage(options.maxEntries);\n }\n\n /**\n * Start capturing\n */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n // Set up change observer\n if (this.options.captureChanges !== false) {\n this.changeObserver = new DOMChangeObserver({\n callback: (change) => {\n this.pendingChanges.push(change);\n },\n });\n this.changeObserver.start();\n }\n\n // Set up navigation observer\n if (this.options.captureOnNavigation !== false) {\n this.setupNavigationObserver();\n }\n\n // Set up periodic snapshots\n if (this.options.snapshotInterval) {\n this.snapshotTimer = setInterval(() => {\n this.captureSnapshot();\n }, this.options.snapshotInterval);\n }\n\n // Capture initial snapshot\n this.captureSnapshot();\n }\n\n /**\n * Stop capturing\n */\n stop(): void {\n if (!this.started) return;\n this.started = false;\n\n this.changeObserver?.stop();\n this.changeObserver = null;\n\n if (this.snapshotTimer) {\n clearInterval(this.snapshotTimer);\n this.snapshotTimer = null;\n }\n }\n\n /**\n * Capture a DOM snapshot\n */\n async captureSnapshot(metadata?: Record<string, unknown>): Promise<SnapshotEntry> {\n // Flush pending changes first\n if (this.pendingChanges.length > 0) {\n await this.flushChanges();\n }\n\n const snapshot = captureDOMSnapshot(this.options.captureOptions);\n const entry: SnapshotEntry = {\n id: generateId(),\n type: 'snapshot',\n timestamp: snapshot.timestamp,\n data: snapshot,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Flush pending DOM changes\n */\n async flushChanges(): Promise<ChangeEntry | null> {\n if (this.pendingChanges.length === 0) return null;\n\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n\n const entry: ChangeEntry = {\n id: generateId(),\n type: 'change',\n timestamp: Date.now(),\n data: changes,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an interaction\n */\n async logInteraction(\n eventType: string,\n details: Omit<InteractionEntry['data'], 'eventType'>\n ): Promise<InteractionEntry> {\n const entry: InteractionEntry = {\n id: generateId(),\n type: 'interaction',\n timestamp: Date.now(),\n data: {\n eventType,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an error\n */\n async logError(\n message: string,\n details?: Omit<ErrorEntry['data'], 'message'>\n ): Promise<ErrorEntry> {\n const entry: ErrorEntry = {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n data: {\n message,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log a navigation\n */\n async logNavigation(\n from: string,\n to: string,\n navigationType: NavigationEntry['data']['navigationType']\n ): Promise<NavigationEntry> {\n const entry: NavigationEntry = {\n id: generateId(),\n type: 'navigation',\n timestamp: Date.now(),\n data: {\n from,\n to,\n navigationType,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Add a custom entry\n */\n async logCustom(data: unknown, metadata?: Record<string, unknown>): Promise<RenderLogEntry> {\n const entry: RenderLogEntry = {\n id: generateId(),\n type: 'custom',\n timestamp: Date.now(),\n data,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Get log entries\n */\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n return this.storage.getEntries(options);\n }\n\n /**\n * Clear the log\n */\n async clear(): Promise<void> {\n this.pendingChanges = [];\n await this.storage.clear();\n }\n\n /**\n * Get entry count\n */\n async count(): Promise<number> {\n return this.storage.count();\n }\n\n /**\n * Get the latest snapshot\n */\n async getLatestSnapshot(): Promise<SnapshotEntry | null> {\n const snapshots = await this.storage.getEntries({ type: 'snapshot', limit: 1 });\n return (snapshots[0] as SnapshotEntry) || null;\n }\n\n private async addEntry(entry: RenderLogEntry): Promise<void> {\n await this.storage.append(entry);\n this.options.onEntry?.(entry);\n }\n\n private setupNavigationObserver(): void {\n let lastUrl = window.location.href;\n\n // History API\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'push');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'replace');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n // Popstate (back/forward)\n window.addEventListener('popstate', () => {\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'pop');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n });\n }\n}\n\n/**\n * Create a render log manager with default options\n */\nexport function createRenderLogManager(options?: RenderLogOptions): RenderLogManager {\n return new RenderLogManager(options);\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","/**\n * UI Bridge Provider\n *\n * React context provider for UI Bridge functionality.\n */\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n UIBridgeFeatures,\n UIBridgeConfig,\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n BridgeEvent,\n WSConnectionState,\n WSSubscriptionOptions,\n} from '../core/types';\nimport { UIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } from '../core/registry';\nimport { UIBridgeWSClient, createWSClient } from '../core/websocket-client';\nimport { createActionExecutor } from '../control/action-executor';\nimport { createWorkflowEngine } from '../control/workflow-engine';\nimport { createRenderLogManager, RenderLogManager } from '../render-log/snapshot';\nimport { createMetricsCollector, MetricsCollector } from '../debug/metrics';\nimport type { ActionExecutor, WorkflowEngine } from '../control/types';\n\n/**\n * UI Bridge context value\n */\nexport interface UIBridgeContextValue {\n /** Feature flags */\n features: UIBridgeFeatures;\n /** Configuration */\n config: UIBridgeConfig;\n /** Element registry */\n registry: UIBridgeRegistry;\n /** Action executor */\n executor: ActionExecutor;\n /** Workflow engine */\n workflowEngine: WorkflowEngine;\n /** Render log manager (if enabled) */\n renderLog?: RenderLogManager;\n /** Metrics collector (if debug enabled) */\n metrics?: MetricsCollector;\n /** WebSocket client (if websocket enabled) */\n wsClient?: UIBridgeWSClient;\n /** WebSocket connection state */\n wsConnectionState: WSConnectionState;\n /** Get all registered elements */\n getElements: () => RegisteredElement[];\n /** Get all registered components */\n getComponents: () => RegisteredComponent[];\n /** Create a snapshot */\n createSnapshot: () => BridgeSnapshot;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Connect to WebSocket server */\n wsConnect: () => Promise<void>;\n /** Disconnect from WebSocket server */\n wsDisconnect: () => void;\n /** Subscribe to WebSocket events */\n wsSubscribe: (options: WSSubscriptionOptions) => Promise<BridgeEventType[]>;\n /** Add WebSocket event listener */\n onWsEvent: (\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ) => () => void;\n}\n\n/**\n * UI Bridge context\n */\nconst UIBridgeContext = createContext<UIBridgeContextValue | null>(null);\n\n/**\n * UI Bridge provider props\n */\nexport interface UIBridgeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: UIBridgeFeatures;\n /** Configuration */\n config?: UIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Provider\n *\n * Provides UI Bridge context to child components.\n */\nexport function UIBridgeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n}: UIBridgeProviderProps) {\n const registryRef = useRef<UIBridgeRegistry | null>(null);\n const renderLogRef = useRef<RenderLogManager | null>(null);\n const metricsRef = useRef<MetricsCollector | null>(null);\n const wsClientRef = useRef<UIBridgeWSClient | null>(null);\n const [wsConnectionState, setWsConnectionState] = useState<WSConnectionState>('disconnected');\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new UIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n\n if (features.renderLog) {\n renderLogRef.current = createRenderLogManager({\n maxEntries: config.maxLogEntries,\n });\n }\n\n if (features.debug) {\n metricsRef.current = createMetricsCollector();\n }\n\n // Initialize WebSocket client if enabled\n if (config.websocket) {\n const wsPort = config.websocketPort || config.serverPort || 9876;\n const wsUrl = `ws://localhost:${wsPort}`;\n wsClientRef.current = createWSClient({\n url: wsUrl,\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 10,\n pingInterval: 30000,\n });\n }\n }\n\n const registry = registryRef.current;\n const renderLog = renderLogRef.current || undefined;\n const metrics = metricsRef.current || undefined;\n const wsClient = wsClientRef.current || undefined;\n\n // Create executor and workflow engine\n const executor = useMemo(() => createActionExecutor(registry), [registry]);\n const workflowEngine = useMemo(\n () => createWorkflowEngine(registry, executor),\n [registry, executor]\n );\n\n // Start render log on mount\n useEffect(() => {\n if (features.renderLog && renderLog) {\n renderLog.start();\n return () => renderLog.stop();\n }\n }, [features.renderLog, renderLog]);\n\n // Wire up metrics to events\n useEffect(() => {\n if (!metrics) return;\n\n const unsubCompleted = registry.on('action:completed', (event) => {\n metrics.recordEvent(event);\n });\n const unsubFailed = registry.on('action:failed', (event) => {\n metrics.recordEvent(event);\n });\n\n return () => {\n unsubCompleted();\n unsubFailed();\n };\n }, [registry, metrics]);\n\n // Setup WebSocket connection state listener\n useEffect(() => {\n if (!wsClient) return;\n\n const unsubscribe = wsClient.onConnectionChange((state) => {\n setWsConnectionState(state);\n });\n\n return unsubscribe;\n }, [wsClient]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n renderLog?.stop();\n wsClient?.disconnect();\n resetGlobalRegistry();\n };\n }, [renderLog, wsClient]);\n\n // WebSocket methods\n const wsConnect = useCallback(async () => {\n if (wsClient) {\n await wsClient.connect();\n }\n }, [wsClient]);\n\n const wsDisconnect = useCallback(() => {\n wsClient?.disconnect();\n }, [wsClient]);\n\n const wsSubscribe = useCallback(\n async (options: WSSubscriptionOptions) => {\n if (!wsClient) {\n return [];\n }\n return wsClient.subscribe(options);\n },\n [wsClient]\n );\n\n const onWsEvent = useCallback(\n (eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void) => {\n if (!wsClient) {\n return () => {};\n }\n return wsClient.onEvent(eventType, listener);\n },\n [wsClient]\n );\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n initialized: true,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n }),\n [\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n ]\n );\n\n return <UIBridgeContext.Provider value={contextValue}>{children}</UIBridgeContext.Provider>;\n}\n\n/**\n * useUIBridgeContext hook\n *\n * Access the UI Bridge context. Throws if used outside provider.\n */\nexport function useUIBridgeContext(): UIBridgeContextValue {\n const context = useContext(UIBridgeContext);\n if (!context) {\n throw new Error('useUIBridgeContext must be used within a UIBridgeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeOptional hook\n *\n * Access the UI Bridge context, returning null if outside provider.\n */\nexport function useUIBridgeOptional(): UIBridgeContextValue | null {\n return useContext(UIBridgeContext);\n}\n","/**\n * useUIElement Hook\n *\n * Register a DOM element with UI Bridge for control and observation.\n */\n\nimport { useRef, useEffect, useCallback, useMemo } from 'react';\nimport type {\n ElementType,\n StandardAction,\n CustomAction,\n ElementState,\n ElementIdentifier,\n RegisteredElement,\n} from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIElement options\n */\nexport interface UseUIElementOptions {\n /** Unique identifier for the element */\n id: string;\n /** Element type (auto-detected if not provided) */\n type?: ElementType;\n /** Human-readable label */\n label?: string;\n /** Override available actions */\n actions?: StandardAction[];\n /** Custom actions */\n customActions?: Record<string, CustomAction>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: ElementState) => void;\n}\n\n/**\n * useUIElement return value\n */\nexport interface UseUIElementReturn {\n /** Ref to attach to the element */\n ref: React.RefCallback<HTMLElement>;\n /** Current element reference */\n element: HTMLElement | null;\n /** Whether the element is registered */\n registered: boolean;\n /** Get current state */\n getState: () => ElementState | null;\n /** Get element identifier */\n getIdentifier: () => ElementIdentifier | null;\n /** Trigger an action on this element */\n trigger: (action: StandardAction | string, params?: Record<string, unknown>) => Promise<void>;\n /** Manually register the element */\n register: () => void;\n /** Manually unregister the element */\n unregister: () => void;\n /** The registered element info */\n registeredElement: RegisteredElement | null;\n}\n\n/**\n * useUIElement hook\n *\n * Registers a DOM element with UI Bridge for programmatic control.\n *\n * @example\n * ```tsx\n * function SubmitButton() {\n * const { ref, trigger } = useUIElement({\n * id: 'submit-btn',\n * type: 'button',\n * label: 'Submit Form',\n * });\n *\n * return (\n * <button ref={ref} data-ui-id=\"submit-btn\">\n * Submit\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIElement(options: UseUIElementOptions): UseUIElementReturn {\n const bridge = useUIBridgeOptional();\n const elementRef = useRef<HTMLElement | null>(null);\n const registeredRef = useRef(false);\n\n const { id, type, label, actions, customActions, autoRegister = true } = options;\n\n // Register the element\n const register = useCallback(() => {\n if (!bridge || !elementRef.current || registeredRef.current) return;\n\n bridge.registry.registerElement(id, elementRef.current, {\n type,\n label,\n actions,\n customActions,\n });\n registeredRef.current = true;\n }, [bridge, id, type, label, actions, customActions]);\n\n // Unregister the element\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterElement(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Ref callback\n const ref = useCallback(\n (node: HTMLElement | null) => {\n // Cleanup previous\n if (elementRef.current && elementRef.current !== node) {\n unregister();\n }\n\n elementRef.current = node;\n\n // Register new element\n if (node && autoRegister) {\n register();\n }\n },\n [autoRegister, register, unregister]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregister();\n };\n }, [unregister]);\n\n // Get state\n const getState = useCallback((): ElementState | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getState() || null;\n }, [bridge, id]);\n\n // Get identifier\n const getIdentifier = useCallback((): ElementIdentifier | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getIdentifier() || null;\n }, [bridge, id]);\n\n // Trigger action\n const trigger = useCallback(\n async (action: StandardAction | string, params?: Record<string, unknown>) => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeAction(id, {\n action,\n params,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n },\n [bridge, id]\n );\n\n // Get registered element\n const registeredElement = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getElement(id) || null;\n }, [bridge, id]);\n\n return {\n ref,\n element: elementRef.current,\n registered: registeredRef.current,\n getState,\n getIdentifier,\n trigger,\n register,\n unregister,\n registeredElement,\n };\n}\n\n/**\n * useUIElementRef hook\n *\n * A simpler version that just adds the data-ui-id attribute.\n * Useful when you only need identification without full registration.\n */\nexport function useUIElementRef(id: string): React.RefCallback<HTMLElement> {\n return useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n node.setAttribute('data-ui-id', id);\n }\n },\n [id]\n );\n}\n","/**\n * useUIComponent Hook\n *\n * Register a component with UI Bridge for component-level actions.\n */\n\nimport { useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { RegisteredComponent } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * Action definition for useUIComponent\n */\nexport interface ComponentActionDef<TParams = unknown, TResult = unknown> {\n /** Action identifier */\n id: string;\n /** Human-readable label */\n label?: string;\n /** Description */\n description?: string;\n /** Handler function */\n handler: (params?: TParams) => TResult | Promise<TResult>;\n}\n\n/**\n * Computed property definition for useUIComponent\n */\nexport interface ComputedPropertyDef<T = unknown> {\n /** Getter function for the computed value */\n getter: () => T;\n /** Description of what the computed property represents */\n description?: string;\n}\n\n/**\n * useUIComponent options\n */\nexport interface UseUIComponentOptions {\n /** Unique identifier for the component */\n id: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Actions available on this component */\n actions?: ComponentActionDef[];\n /** Child element IDs owned by this component */\n elementIds?: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Function to get the current component state */\n state?: () => Record<string, unknown>;\n /** Computed properties exposed by the component */\n computed?: Record<string, ComputedPropertyDef | (() => unknown)>;\n}\n\n/**\n * useUIComponent return value\n */\nexport interface UseUIComponentReturn {\n /** Whether the component is registered */\n registered: boolean;\n /** Execute an action on this component */\n executeAction: <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ) => Promise<TResult>;\n /** Manually register the component */\n register: () => void;\n /** Manually unregister the component */\n unregister: () => void;\n /** Update actions dynamically */\n updateActions: (actions: ComponentActionDef[]) => void;\n /** Add an element ID to this component */\n addElement: (elementId: string) => void;\n /** Remove an element ID from this component */\n removeElement: (elementId: string) => void;\n /** The registered component info */\n registeredComponent: RegisteredComponent | null;\n}\n\n/**\n * useUIComponent hook\n *\n * Registers a component with UI Bridge for component-level control.\n * Components can expose high-level actions that may orchestrate multiple element interactions.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const [email, setEmail] = useState('');\n * const [password, setPassword] = useState('');\n *\n * useUIComponent({\n * id: 'login-form',\n * name: 'Login Form',\n * actions: [\n * {\n * id: 'login',\n * label: 'Submit Login',\n * handler: async ({ email, password }) => {\n * setEmail(email);\n * setPassword(password);\n * await submitLogin();\n * },\n * },\n * {\n * id: 'clear',\n * label: 'Clear Form',\n * handler: () => {\n * setEmail('');\n * setPassword('');\n * },\n * },\n * ],\n * });\n *\n * return (\n * <form>\n * <input value={email} onChange={(e) => setEmail(e.target.value)} />\n * <input value={password} onChange={(e) => setPassword(e.target.value)} />\n * <button type=\"submit\">Login</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useUIComponent(options: UseUIComponentOptions): UseUIComponentReturn {\n const bridge = useUIBridgeOptional();\n const registeredRef = useRef(false);\n const actionsRef = useRef(options.actions || []);\n const elementIdsRef = useRef(options.elementIds || []);\n const stateRef = useRef(options.state);\n const computedRef = useRef(options.computed);\n\n const { id, name, description, autoRegister = true } = options;\n\n // Update refs when options change\n useEffect(() => {\n actionsRef.current = options.actions || [];\n elementIdsRef.current = options.elementIds || [];\n stateRef.current = options.state;\n computedRef.current = options.computed;\n }, [options.actions, options.elementIds, options.state, options.computed]);\n\n // Create getComputed function from computed definitions\n const createGetComputed = useCallback(() => {\n return () => {\n const computed = computedRef.current;\n if (!computed) return {};\n\n const result: Record<string, unknown> = {};\n for (const [key, def] of Object.entries(computed)) {\n try {\n // Support both ComputedPropertyDef and plain getter functions\n const getter = typeof def === 'function' ? def : def.getter;\n result[key] = getter();\n } catch {\n result[key] = undefined;\n }\n }\n return result;\n };\n }, []);\n\n // Register the component\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerComponent(id, {\n name,\n description,\n actions: actionsRef.current.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds: elementIdsRef.current,\n getState: stateRef.current,\n getComputed: createGetComputed(),\n });\n registeredRef.current = true;\n }, [bridge, id, name, description, createGetComputed]);\n\n // Unregister the component\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Execute an action\n const executeAction = useCallback(\n async <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ): Promise<TResult> => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeComponentAction(id, {\n action: actionId,\n params: params as Record<string, unknown>,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return response.result as TResult;\n },\n [bridge, id]\n );\n\n // Update actions dynamically\n const updateActions = useCallback(\n (actions: ComponentActionDef[]) => {\n actionsRef.current = actions;\n\n // Re-register with updated actions if already registered\n if (registeredRef.current && bridge) {\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n register();\n }\n },\n [bridge, id, register]\n );\n\n // Add element ID\n const addElement = useCallback((elementId: string) => {\n if (!elementIdsRef.current.includes(elementId)) {\n elementIdsRef.current = [...elementIdsRef.current, elementId];\n }\n }, []);\n\n // Remove element ID\n const removeElement = useCallback((elementId: string) => {\n elementIdsRef.current = elementIdsRef.current.filter((id) => id !== elementId);\n }, []);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n register();\n }\n\n return () => {\n unregister();\n };\n }, [autoRegister, register, unregister]);\n\n // Get registered component\n const registeredComponent = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getComponent(id) || null;\n }, [bridge, id]);\n\n return {\n registered: registeredRef.current,\n executeAction,\n register,\n unregister,\n updateActions,\n addElement,\n removeElement,\n registeredComponent,\n };\n}\n\n/**\n * useUIComponentAction hook\n *\n * Create a stable action handler that can be used with useUIComponent.\n * Useful for memoizing action handlers.\n */\nexport function useUIComponentAction<TParams = unknown, TResult = unknown>(\n handler: (params?: TParams) => TResult | Promise<TResult>,\n deps: React.DependencyList\n): (params?: TParams) => TResult | Promise<TResult> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(handler, deps);\n}\n","/**\n * useUIBridge Hook\n *\n * Main hook for accessing UI Bridge functionality.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n ElementState,\n Workflow,\n} from '../core/types';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n FindRequest,\n FindResponse,\n WorkflowRunRequest,\n WorkflowRunResponse,\n} from '../control/types';\nimport { useUIBridgeContext, useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIBridge return value\n */\nexport interface UseUIBridgeReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether initialized */\n initialized: boolean;\n /** Get all registered elements */\n elements: RegisteredElement[];\n /** Get all registered components */\n components: RegisteredComponent[];\n /** Get all workflows */\n workflows: Workflow[];\n /** Create a snapshot of the current state */\n createSnapshot: () => BridgeSnapshot;\n /** Execute an action on an element */\n executeAction: (\n elementId: string,\n request: ControlActionRequest\n ) => Promise<ControlActionResponse>;\n /** Execute an action on a component */\n executeComponentAction: (\n componentId: string,\n request: ComponentActionRequest\n ) => Promise<ComponentActionResponse>;\n /** Find controllable elements */\n find: (options?: FindRequest) => Promise<FindResponse>;\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n discover: (options?: FindRequest) => Promise<FindResponse>;\n /** Run a workflow */\n runWorkflow: (workflowId: string, request?: WorkflowRunRequest) => Promise<WorkflowRunResponse>;\n /** Get element by ID */\n getElement: (id: string) => RegisteredElement | undefined;\n /** Get component by ID */\n getComponent: (id: string) => RegisteredComponent | undefined;\n /** Get element state by ID */\n getElementState: (id: string) => ElementState | undefined;\n /** Register a workflow */\n registerWorkflow: (workflow: Workflow) => void;\n /** Unregister a workflow */\n unregisterWorkflow: (id: string) => void;\n /** Capture a render log snapshot (if enabled) */\n captureRenderLog: () => Promise<void>;\n /** Get render log entries (if enabled) */\n getRenderLogEntries: () => Promise<unknown[]>;\n /** Clear render log (if enabled) */\n clearRenderLog: () => Promise<void>;\n /** Get metrics (if debug enabled) */\n getMetrics: () => unknown | undefined;\n /** Get action history (if debug enabled) */\n getActionHistory: () => unknown[] | undefined;\n}\n\n/**\n * useUIBridge hook\n *\n * Main hook for accessing UI Bridge functionality.\n * Use this to interact with registered elements, components, and workflows.\n *\n * @example\n * ```tsx\n * function AutomationController() {\n * const bridge = useUIBridge();\n *\n * const handleSubmit = async () => {\n * // Execute element action\n * await bridge.executeAction('submit-btn', { action: 'click' });\n *\n * // Or use component action\n * await bridge.executeComponentAction('login-form', {\n * action: 'login',\n * params: { email: 'user@example.com', password: 'secret' },\n * });\n * };\n *\n * return (\n * <button onClick={handleSubmit}>\n * Automate Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIBridge(): UseUIBridgeReturn {\n const context = useUIBridgeOptional();\n\n const available = !!context;\n const initialized = context?.initialized ?? false;\n\n // Get collections\n const elements = useMemo(() => context?.getElements() ?? [], [context]);\n\n const components = useMemo(() => context?.getComponents() ?? [], [context]);\n\n const workflows = useMemo(() => context?.registry.getAllWorkflows() ?? [], [context]);\n\n // Create snapshot\n const createSnapshot = useCallback((): BridgeSnapshot => {\n if (!context) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return context.createSnapshot();\n }, [context]);\n\n // Execute element action\n const executeAction = useCallback(\n async (elementId: string, request: ControlActionRequest): Promise<ControlActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeAction(elementId, request);\n },\n [context]\n );\n\n // Execute component action\n const executeComponentAction = useCallback(\n async (\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeComponentAction(componentId, request);\n },\n [context]\n );\n\n // Find elements\n const find = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n if (!context) {\n return {\n elements: [],\n total: 0,\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.find(options);\n },\n [context]\n );\n\n // Discover elements (deprecated - use find instead)\n const discover = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n return find(options);\n },\n [find]\n );\n\n // Run workflow\n const runWorkflow = useCallback(\n async (workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> => {\n if (!context) {\n return {\n workflowId,\n runId: '',\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: 'UI Bridge not available',\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n return context.workflowEngine.run(workflowId, request);\n },\n [context]\n );\n\n // Get element by ID\n const getElement = useCallback(\n (id: string): RegisteredElement | undefined => {\n return context?.registry.getElement(id);\n },\n [context]\n );\n\n // Get component by ID\n const getComponent = useCallback(\n (id: string): RegisteredComponent | undefined => {\n return context?.registry.getComponent(id);\n },\n [context]\n );\n\n // Get element state\n const getElementState = useCallback(\n (id: string): ElementState | undefined => {\n const element = context?.registry.getElement(id);\n return element?.getState();\n },\n [context]\n );\n\n // Register workflow\n const registerWorkflow = useCallback(\n (workflow: Workflow): void => {\n context?.registry.registerWorkflow(workflow);\n },\n [context]\n );\n\n // Unregister workflow\n const unregisterWorkflow = useCallback(\n (id: string): void => {\n context?.registry.unregisterWorkflow(id);\n },\n [context]\n );\n\n // Render log methods\n const captureRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.captureSnapshot();\n }, [context]);\n\n const getRenderLogEntries = useCallback(async (): Promise<unknown[]> => {\n return (await context?.renderLog?.getEntries()) ?? [];\n }, [context]);\n\n const clearRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.clear();\n }, [context]);\n\n // Metrics methods\n const getMetrics = useCallback((): unknown | undefined => {\n return context?.metrics?.getMetrics();\n }, [context]);\n\n const getActionHistory = useCallback((): unknown[] | undefined => {\n return context?.metrics?.getHistory();\n }, [context]);\n\n return {\n available,\n initialized,\n elements,\n components,\n workflows,\n createSnapshot,\n executeAction,\n executeComponentAction,\n find,\n discover, // deprecated - use find\n runWorkflow,\n getElement,\n getComponent,\n getElementState,\n registerWorkflow,\n unregisterWorkflow,\n captureRenderLog,\n getRenderLogEntries,\n clearRenderLog,\n getMetrics,\n getActionHistory,\n };\n}\n\n/**\n * useUIBridgeRequired hook\n *\n * Same as useUIBridge but throws if UI Bridge is not available.\n */\nexport function useUIBridgeRequired(): UseUIBridgeReturn {\n useUIBridgeContext(); // Will throw if not in provider\n return useUIBridge();\n}\n","/**\n * useUIState Hook\n *\n * Register and manage UI states with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UIState, UIStateGroup, StateSnapshot } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIState options\n */\nexport interface UseUIStateOptions {\n /** Unique identifier for the state */\n id: string;\n /** Human-readable name */\n name: string;\n /** Element IDs belonging to this state */\n elements?: string[];\n /** Function to detect if state is active */\n activeWhen?: () => boolean;\n /** If true, blocks other state activations (modal behavior) */\n blocking?: boolean;\n /** Specific state IDs this state blocks */\n blocks?: string[];\n /** State group membership */\n group?: string;\n /** Cost for pathfinding (default: 1.0) */\n pathCost?: number;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Initial active state */\n initialActive?: boolean;\n}\n\n/**\n * useUIState return value\n */\nexport interface UseUIStateReturn {\n /** Whether the state is registered */\n registered: boolean;\n /** Whether the state is currently active */\n isActive: boolean;\n /** Activate this state */\n activate: () => boolean;\n /** Deactivate this state */\n deactivate: () => boolean;\n /** Toggle active state */\n toggle: () => boolean;\n /** Get all currently active states */\n activeStates: string[];\n /** Manually register the state */\n register: () => void;\n /** Manually unregister the state */\n unregister: () => void;\n /** The registered state info */\n state: UIState | undefined;\n}\n\n/**\n * useUIState hook\n *\n * Registers a UI state with UI Bridge for state management.\n *\n * @example\n * ```tsx\n * function LoginModal() {\n * const { isActive, activate, deactivate } = useUIState({\n * id: 'login-modal',\n * name: 'Login Modal',\n * blocking: true,\n * elements: ['login-email', 'login-password', 'login-submit'],\n * });\n *\n * if (!isActive) return null;\n *\n * return (\n * <div className=\"modal\">\n * <button onClick={deactivate}>Close</button>\n * ...\n * </div>\n * );\n * }\n * ```\n */\nexport function useUIState(options: UseUIStateOptions): UseUIStateReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [isActive, setIsActive] = useState(options.initialActive ?? false);\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n const {\n id,\n name,\n elements = [],\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n autoRegister = true,\n initialActive = false,\n } = options;\n\n // Register the state\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const state: UIState = {\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n };\n\n bridge.registry.registerState(state);\n setRegistered(true);\n\n // Set initial active state\n if (initialActive) {\n bridge.registry.activateState(id);\n setIsActive(true);\n }\n\n // Update active states\n setActiveStates(bridge.registry.getActiveStates());\n }, [\n bridge,\n registered,\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n initialActive,\n ]);\n\n // Unregister the state\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterState(id);\n setRegistered(false);\n setIsActive(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes\n useEffect(() => {\n if (!bridge) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { stateId: string; active: boolean; activeStates: string[] };\n if (data.stateId === id) {\n setIsActive(data.active);\n }\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge, id]);\n\n // Activate state\n const activate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.activateState(id);\n if (success) {\n setIsActive(true);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Deactivate state\n const deactivate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.deactivateState(id);\n if (success) {\n setIsActive(false);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Toggle state\n const toggle = useCallback((): boolean => {\n return isActive ? deactivate() : activate();\n }, [isActive, activate, deactivate]);\n\n // Get registered state\n const state = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getState(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n isActive,\n activate,\n deactivate,\n toggle,\n activeStates,\n register,\n unregister,\n state,\n };\n}\n\n/**\n * useUIStateGroup hook\n *\n * Register and manage a state group with UI Bridge.\n *\n * @example\n * ```tsx\n * function NavigationSection() {\n * const { activate, deactivate } = useUIStateGroup({\n * id: 'nav-group',\n * name: 'Navigation',\n * states: ['nav-home', 'nav-about', 'nav-contact'],\n * });\n *\n * // Activating the group activates all its states\n * // Deactivating the group deactivates all its states\n * }\n * ```\n */\nexport interface UseUIStateGroupOptions {\n /** Unique identifier for the group */\n id: string;\n /** Human-readable name */\n name: string;\n /** State IDs belonging to this group */\n states: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\nexport interface UseUIStateGroupReturn {\n /** Whether the group is registered */\n registered: boolean;\n /** Activate all states in this group */\n activate: () => string[];\n /** Deactivate all states in this group */\n deactivate: () => string[];\n /** Manually register the group */\n register: () => void;\n /** Manually unregister the group */\n unregister: () => void;\n /** The registered group info */\n group: UIStateGroup | undefined;\n}\n\nexport function useUIStateGroup(options: UseUIStateGroupOptions): UseUIStateGroupReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n\n const { id, name, states, autoRegister = true } = options;\n\n // Register the group\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const group: UIStateGroup = { id, name, states };\n bridge.registry.registerStateGroup(group);\n setRegistered(true);\n }, [bridge, registered, id, name, states]);\n\n // Unregister the group\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterStateGroup(id);\n setRegistered(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Activate group\n const activate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.activateStateGroup(id);\n }, [bridge, id]);\n\n // Deactivate group\n const deactivate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.deactivateStateGroup(id);\n }, [bridge, id]);\n\n // Get registered group\n const group = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getStateGroup(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n activate,\n deactivate,\n register,\n unregister,\n group,\n };\n}\n\n/**\n * useActiveStates hook\n *\n * Subscribe to active states changes.\n */\nexport function useActiveStates(): string[] {\n const bridge = useUIBridgeOptional();\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n // Get initial active states\n setActiveStates(bridge.registry.getActiveStates());\n\n // Subscribe to changes\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { activeStates: string[] };\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge]);\n\n return activeStates;\n}\n\n/**\n * useStateSnapshot hook\n *\n * Get a snapshot of all state management data.\n */\nexport function useStateSnapshot(): StateSnapshot | null {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.createStateSnapshot();\n }, [bridge]);\n}\n","/**\n * useUITransition Hook\n *\n * Register and execute UI state transitions with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UITransition, TransitionResult, WorkflowStep } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUITransition options\n */\nexport interface UseUITransitionOptions {\n /** Unique identifier for the transition */\n id: string;\n /** Human-readable name */\n name: string;\n /** Precondition: at least one must be active */\n fromStates: string[];\n /** States to activate */\n activateStates: string[];\n /** States to deactivate */\n exitStates: string[];\n /** Groups to activate */\n activateGroups?: string[];\n /** Groups to deactivate */\n exitGroups?: string[];\n /** Actions to execute during transition */\n actions?: WorkflowStep[];\n /** Cost for pathfinding */\n pathCost?: number;\n /** Whether source states remain visible during transition */\n staysVisible?: boolean;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUITransition return value\n */\nexport interface UseUITransitionReturn {\n /** Whether the transition is registered */\n registered: boolean;\n /** Whether this transition can be executed from current state */\n canExecute: boolean;\n /** Execute the transition */\n execute: () => Promise<TransitionResult>;\n /** Manually register the transition */\n register: () => void;\n /** Manually unregister the transition */\n unregister: () => void;\n /** The registered transition info */\n transition: UITransition | undefined;\n}\n\n/**\n * useUITransition hook\n *\n * Registers a state transition with UI Bridge.\n *\n * @example\n * ```tsx\n * function OpenModalButton() {\n * const { canExecute, execute } = useUITransition({\n * id: 'open-login-modal',\n * name: 'Open Login Modal',\n * fromStates: ['dashboard'],\n * activateStates: ['login-modal'],\n * exitStates: [],\n * });\n *\n * return (\n * <button onClick={execute} disabled={!canExecute}>\n * Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUITransition(options: UseUITransitionOptions): UseUITransitionReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [canExecute, setCanExecute] = useState(false);\n\n const {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n autoRegister = true,\n } = options;\n\n // Register the transition\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const transition: UITransition = {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n };\n\n bridge.registry.registerTransition(transition);\n setRegistered(true);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n }, [\n bridge,\n registered,\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n ]);\n\n // Unregister the transition\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterTransition(id);\n setRegistered(false);\n setCanExecute(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes to update canExecute\n useEffect(() => {\n if (!bridge || !registered) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', () => {\n setCanExecute(bridge.registry.canExecuteTransition(id));\n });\n\n return unsubscribe;\n }, [bridge, id, registered]);\n\n // Execute transition\n const execute = useCallback(async (): Promise<TransitionResult> => {\n if (!bridge) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n }\n const result = await bridge.registry.executeTransition(id);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n return result;\n }, [bridge, id]);\n\n // Get registered transition\n const transition = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getTransition(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n canExecute,\n execute,\n register,\n unregister,\n transition,\n };\n}\n\n/**\n * useTransitions hook\n *\n * Get all registered transitions.\n */\nexport function useTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getAllTransitions();\n }, [bridge]);\n}\n\n/**\n * useAvailableTransitions hook\n *\n * Get transitions that can be executed from current state.\n */\nexport function useAvailableTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n const [available, setAvailable] = useState<UITransition[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n const updateAvailable = () => {\n const transitions = bridge.registry.getAllTransitions();\n const availableTransitions = transitions.filter((t) =>\n bridge.registry.canExecuteTransition(t.id)\n );\n setAvailable(availableTransitions);\n };\n\n // Initial check\n updateAvailable();\n\n // Subscribe to state changes\n const unsubscribe = bridge.registry.on('element:stateChanged', updateAvailable);\n\n return unsubscribe;\n }, [bridge]);\n\n return available;\n}\n","/**\n * useUINavigation Hook\n *\n * Navigate between UI states using pathfinding with UI Bridge.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport type { PathResult, NavigationResult } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUINavigation return value\n */\nexport interface UseUINavigationReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether navigation is currently in progress */\n isNavigating: boolean;\n /** Last navigation result */\n lastResult: NavigationResult | null;\n /** Find a path to target states (without executing) */\n findPath: (targetStates: string[]) => PathResult;\n /** Navigate to target states */\n navigateTo: (targetStates: string[]) => Promise<NavigationResult>;\n /** Current active states */\n activeStates: string[];\n}\n\n/**\n * useUINavigation hook\n *\n * Provides state machine navigation capabilities with pathfinding.\n *\n * @example\n * ```tsx\n * function NavigationController() {\n * const { navigateTo, findPath, isNavigating, activeStates } = useUINavigation();\n *\n * const goToDashboard = async () => {\n * // Find path first to check if navigation is possible\n * const path = findPath(['dashboard']);\n * if (!path.found) {\n * console.log('Cannot reach dashboard from current state');\n * return;\n * }\n *\n * console.log(`Will execute ${path.transitions.length} transitions`);\n *\n * // Execute navigation\n * const result = await navigateTo(['dashboard']);\n * if (result.success) {\n * console.log('Successfully navigated to dashboard');\n * }\n * };\n *\n * return (\n * <div>\n * <p>Current states: {activeStates.join(', ')}</p>\n * <button onClick={goToDashboard} disabled={isNavigating}>\n * Go to Dashboard\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useUINavigation(): UseUINavigationReturn {\n const bridge = useUIBridgeOptional();\n const [isNavigating, setIsNavigating] = useState(false);\n const [lastResult, setLastResult] = useState<NavigationResult | null>(null);\n\n const available = !!bridge;\n\n // Get current active states\n const activeStates = useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getActiveStates();\n }, [bridge]);\n\n // Find path to target states\n const findPath = useCallback(\n (targetStates: string[]): PathResult => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n },\n [bridge]\n );\n\n // Navigate to target states\n const navigateTo = useCallback(\n async (targetStates: string[]): Promise<NavigationResult> => {\n if (!bridge) {\n const result: NavigationResult = {\n success: false,\n path: {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n },\n executedTransitions: [],\n finalActiveStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n setLastResult(result);\n return result;\n }\n\n setIsNavigating(true);\n try {\n const result = await bridge.registry.navigateTo(targetStates);\n setLastResult(result);\n return result;\n } finally {\n setIsNavigating(false);\n }\n },\n [bridge]\n );\n\n return {\n available,\n isNavigating,\n lastResult,\n findPath,\n navigateTo,\n activeStates,\n };\n}\n\n/**\n * useCanNavigateTo hook\n *\n * Check if navigation to target states is possible.\n *\n * @example\n * ```tsx\n * function DashboardLink() {\n * const canNavigate = useCanNavigateTo(['dashboard']);\n *\n * return (\n * <button disabled={!canNavigate}>\n * Dashboard\n * </button>\n * );\n * }\n * ```\n */\nexport function useCanNavigateTo(targetStates: string[]): boolean {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return false;\n const path = bridge.registry.findPath(targetStates);\n return path.found;\n }, [bridge, targetStates]);\n}\n\n/**\n * useNavigationPath hook\n *\n * Get the path to target states (updates when active states change).\n *\n * @example\n * ```tsx\n * function PathDisplay() {\n * const path = useNavigationPath(['checkout']);\n *\n * if (!path.found) {\n * return <p>Cannot reach checkout from here</p>;\n * }\n *\n * return (\n * <p>\n * Steps to checkout: {path.transitions.join(' -> ')}\n * (Cost: {path.totalCost})\n * </p>\n * );\n * }\n * ```\n */\nexport function useNavigationPath(targetStates: string[]): PathResult {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n }, [bridge, targetStates]);\n}\n","/**\n * useAutoRegister Hook\n *\n * Enables automatic registration of interactive DOM elements with the UI Bridge.\n * This eliminates the need for manual useUIElement() calls on every component.\n *\n * Features:\n * - Auto-discovers interactive elements (buttons, inputs, links, etc.)\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation (data-testid > data-ui-id > semantic > auto-generated)\n * - Debounced updates for performance\n * - Respects existing manually registered elements\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\nimport type { ElementType, StandardAction } from '../core/types';\n\n/**\n * ID generation strategy\n */\nexport type IdStrategy =\n | 'data-testid' // Use data-testid attribute if present\n | 'data-ui-id' // Use data-ui-id attribute if present\n | 'semantic' // Generate semantic ID based on element content\n | 'auto' // Auto-generate unique ID\n | 'prefer-existing'; // Use existing attributes, fall back to auto\n\n/**\n * Options for auto-registration\n */\nexport interface AutoRegisterOptions {\n /** Enable auto-registration (default: true in dev mode) */\n enabled?: boolean;\n /** Root element to observe (default: document.body) */\n root?: HTMLElement | null;\n /** ID generation strategy (default: 'prefer-existing') */\n idStrategy?: IdStrategy;\n /** Debounce time for mutation handling (ms, default: 100) */\n debounceMs?: number;\n /** Include hidden elements (default: false) */\n includeHidden?: boolean;\n /** Only register elements matching these selectors */\n includeSelectors?: string[];\n /** Exclude elements matching these selectors */\n excludeSelectors?: string[];\n /** Custom ID generator function */\n generateId?: (element: HTMLElement) => string;\n /** Callback when element is registered */\n onRegister?: (id: string, element: HTMLElement) => void;\n /** Callback when element is unregistered */\n onUnregister?: (id: string) => void;\n}\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[role=\"slider\"]',\n '[role=\"spinbutton\"]',\n '[role=\"combobox\"]',\n '[role=\"listbox\"]',\n '[role=\"option\"]',\n '[role=\"textbox\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-element]', // Explicitly marked for registration\n '[data-testid]', // Testing library convention\n];\n\n/**\n * Infer element type from DOM element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const role = element.getAttribute('role');\n if (role) {\n const roleMap: Record<string, ElementType> = {\n button: 'button',\n link: 'link',\n checkbox: 'checkbox',\n radio: 'radio',\n menuitem: 'menuitem',\n tab: 'tab',\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n };\n if (role in roleMap) {\n return roleMap[role];\n }\n }\n\n const tagName = element.tagName.toLowerCase();\n switch (tagName) {\n case 'a':\n return 'link';\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type?.toLowerCase() || 'text';\n switch (type) {\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'range':\n return 'slider';\n case 'submit':\n case 'button':\n return 'button';\n default:\n return 'input';\n }\n }\n case 'select':\n return 'select';\n case 'textarea':\n return 'textarea';\n case 'option':\n return 'option';\n default:\n return 'generic';\n }\n}\n\n/**\n * Infer actions for element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur'];\n\n const typeActions: Record<ElementType, StandardAction[]> = {\n button: [...baseActions, 'click', 'hover'],\n link: [...baseActions, 'click', 'hover'],\n input: [...baseActions, 'type', 'clear', 'click'],\n textarea: [...baseActions, 'type', 'clear', 'click'],\n textbox: [...baseActions, 'type', 'clear', 'click'],\n checkbox: [...baseActions, 'check', 'uncheck', 'toggle', 'click'],\n radio: [...baseActions, 'click', 'select'],\n select: [...baseActions, 'select', 'click'],\n combobox: [...baseActions, 'select', 'type', 'click'],\n listbox: [...baseActions, 'select', 'click'],\n option: [...baseActions, 'select', 'click'],\n switch: [...baseActions, 'toggle', 'click'],\n slider: [...baseActions, 'setValue', 'click', 'drag'],\n tab: [...baseActions, 'click', 'select'],\n menuitem: [...baseActions, 'click'],\n dialog: [...baseActions],\n menu: [...baseActions],\n form: [...baseActions, 'submit', 'reset'],\n custom: [...baseActions, 'click'],\n generic: [...baseActions, 'click'],\n };\n\n return typeActions[type] || baseActions;\n}\n\n/**\n * Get accessible label for element\n */\nfunction getAccessibleLabel(element: HTMLElement): string | undefined {\n // aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labelEl = document.getElementById(labelledBy);\n if (labelEl) return labelEl.textContent?.trim();\n }\n\n // Associated label (for inputs)\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Inner text (limited)\n const text = element.textContent?.trim();\n if (text && text.length <= 50) return text;\n\n // Placeholder for inputs\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const placeholder = element.placeholder;\n if (placeholder) return placeholder;\n }\n\n return undefined;\n}\n\n/**\n * Check if element is visible\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/**\n * Generate semantic ID based on element\n */\nfunction generateSemanticId(element: HTMLElement): string {\n const type = inferElementType(element);\n const label = getAccessibleLabel(element);\n\n if (label) {\n // Convert label to kebab-case ID\n const sanitized = label\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30);\n return `${type}-${sanitized}`;\n }\n\n // Fall back to tag + index\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.querySelectorAll(element.tagName));\n const index = siblings.indexOf(element);\n return `${element.tagName.toLowerCase()}-${index}`;\n }\n\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n}\n\n/**\n * Generate unique auto ID\n */\nfunction generateAutoId(element: HTMLElement): string {\n const type = inferElementType(element);\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Generate ID based on strategy\n */\nfunction generateIdForElement(\n element: HTMLElement,\n strategy: IdStrategy,\n customGenerator?: (element: HTMLElement) => string\n): string {\n if (customGenerator) {\n return customGenerator(element);\n }\n\n switch (strategy) {\n case 'data-testid': {\n const testId = element.getAttribute('data-testid');\n return testId || generateAutoId(element);\n }\n case 'data-ui-id': {\n const uiId = element.getAttribute('data-ui-id');\n return uiId || generateAutoId(element);\n }\n case 'semantic':\n return generateSemanticId(element);\n case 'auto':\n return generateAutoId(element);\n case 'prefer-existing':\n default: {\n // Priority: data-ui-id > data-testid > id > semantic > auto\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 htmlId = element.id;\n if (htmlId) return htmlId;\n\n return generateSemanticId(element);\n }\n }\n}\n\n/**\n * Hook for automatic element registration\n *\n * @example\n * ```tsx\n * function App() {\n * // Enable auto-registration for all interactive elements\n * useAutoRegister({ enabled: true });\n *\n * return (\n * <div>\n * <button data-testid=\"submit-btn\">Submit</button>\n * <input data-testid=\"email-input\" />\n * </div>\n * );\n * }\n * ```\n */\nexport function useAutoRegister(options: AutoRegisterOptions = {}): void {\n const {\n enabled = process.env.NODE_ENV === 'development',\n root = null,\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId: customGenerateId,\n onRegister,\n onUnregister,\n } = options;\n\n const bridge = useUIBridgeOptional();\n const registeredElementsRef = useRef(new Map<HTMLElement, string>());\n const pendingRegistrationsRef = useRef(new Set<HTMLElement>());\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Check if element should be registered\n */\n const shouldRegister = useCallback(\n (element: HTMLElement): boolean => {\n // Check visibility\n if (!includeHidden && !isElementVisible(element)) {\n return false;\n }\n\n // Check exclude selectors\n for (const selector of excludeSelectors) {\n if (element.matches(selector)) {\n return false;\n }\n }\n\n // Check if already registered\n if (registeredElementsRef.current.has(element)) {\n return false;\n }\n\n // Check if matches interactive selectors\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors];\n for (const selector of allSelectors) {\n if (element.matches(selector)) {\n return true;\n }\n }\n\n return false;\n },\n [includeHidden, includeSelectors, excludeSelectors]\n );\n\n /**\n * Register a single element\n */\n const registerElement = useCallback(\n (element: HTMLElement): void => {\n if (!bridge?.registry || registeredElementsRef.current.has(element)) {\n return;\n }\n\n const id = generateIdForElement(element, idStrategy, customGenerateId);\n\n // Check if ID already exists in registry\n const existing = bridge.registry.getElement(id);\n if (existing) {\n // Generate a unique ID to avoid collision\n const uniqueId = `${id}-${Date.now().toString(36)}`;\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(uniqueId, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n } else {\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(id, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n }\n },\n [bridge, idStrategy, customGenerateId, onRegister]\n );\n\n /**\n * Unregister a single element\n */\n const unregisterElement = useCallback(\n (element: HTMLElement): void => {\n const id = registeredElementsRef.current.get(element);\n if (!id || !bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredElementsRef.current.delete(element);\n onUnregister?.(id);\n },\n [bridge, onUnregister]\n );\n\n /**\n * Process pending registrations (debounced)\n */\n const processPendingRegistrations = useCallback(() => {\n pendingRegistrationsRef.current.forEach((element) => {\n if (shouldRegister(element)) {\n registerElement(element);\n }\n });\n pendingRegistrationsRef.current.clear();\n }, [shouldRegister, registerElement]);\n\n /**\n * Queue element for registration (with debounce)\n */\n const queueRegistration = useCallback(\n (element: HTMLElement): void => {\n pendingRegistrationsRef.current.add(element);\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n debounceTimeoutRef.current = setTimeout(processPendingRegistrations, debounceMs);\n },\n [debounceMs, processPendingRegistrations]\n );\n\n /**\n * Scan and register all existing interactive elements\n */\n const scanAndRegister = useCallback(\n (rootElement: HTMLElement): void => {\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const elements = rootElement.querySelectorAll<HTMLElement>(allSelectors);\n\n elements.forEach((element) => {\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n });\n },\n [includeSelectors, shouldRegister, queueRegistration]\n );\n\n /**\n * Handle mutations\n */\n const handleMutations = useCallback(\n (mutations: MutationRecord[]): void => {\n mutations.forEach((mutation) => {\n // Handle added nodes\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Check the element itself\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n\n // Check descendants\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const descendants = element.querySelectorAll<HTMLElement>(allSelectors);\n descendants.forEach((descendant) => {\n if (shouldRegister(descendant)) {\n queueRegistration(descendant);\n }\n });\n }\n });\n\n // Handle removed nodes\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Unregister the element itself\n if (registeredElementsRef.current.has(element)) {\n unregisterElement(element);\n }\n\n // Unregister descendants\n const descendants = element.querySelectorAll<HTMLElement>('*');\n descendants.forEach((descendant) => {\n if (registeredElementsRef.current.has(descendant)) {\n unregisterElement(descendant);\n }\n });\n }\n });\n });\n },\n [shouldRegister, queueRegistration, unregisterElement, includeSelectors]\n );\n\n /**\n * Setup observer and initial scan\n */\n useEffect(() => {\n if (!enabled || !bridge?.registry) return;\n\n const rootElement = root || document.body;\n\n // Initial scan\n scanAndRegister(rootElement);\n\n // Setup mutation observer\n const observer = new MutationObserver(handleMutations);\n observer.observe(rootElement, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n observer.disconnect();\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n // Unregister all elements\n registeredElementsRef.current.forEach((id, _element) => {\n bridge.registry.unregisterElement(id);\n });\n registeredElementsRef.current.clear();\n };\n }, [enabled, bridge, root, scanAndRegister, handleMutations]);\n}\n\nexport default useAutoRegister;\n","/**\n * AutoRegisterProvider\n *\n * A React component that enables automatic UI Bridge element registration\n * for all interactive elements within its subtree.\n *\n * @example\n * ```tsx\n * // Enable auto-registration for the entire app\n * function App() {\n * return (\n * <UIBridgeProvider features={{ control: true }}>\n * <AutoRegisterProvider enabled={process.env.NODE_ENV === 'development'}>\n * <YourApp />\n * </AutoRegisterProvider>\n * </UIBridgeProvider>\n * );\n * }\n *\n * // Enable auto-registration for a specific section\n * function Dashboard() {\n * return (\n * <AutoRegisterProvider\n * idStrategy=\"data-testid\"\n * excludeSelectors={['[data-no-register]']}\n * >\n * <DashboardContent />\n * </AutoRegisterProvider>\n * );\n * }\n * ```\n */\n\nimport React, { type ReactNode, useRef } from 'react';\nimport { useAutoRegister, type AutoRegisterOptions } from './useAutoRegister';\n\nexport interface AutoRegisterProviderProps extends Omit<AutoRegisterOptions, 'root'> {\n /** Children to render */\n children: ReactNode;\n /** Use this element as the observation root instead of document.body */\n scopeToChildren?: boolean;\n}\n\n/**\n * Provider component that enables automatic element registration.\n *\n * Features:\n * - Automatically discovers and registers interactive elements\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation based on data-testid, semantic names, etc.\n * - Configurable selectors and ID strategies\n *\n * Place this component at the root of your app (inside UIBridgeProvider)\n * for comprehensive automatic element registration.\n */\nexport function AutoRegisterProvider({\n children,\n scopeToChildren = false,\n enabled = process.env.NODE_ENV === 'development',\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId,\n onRegister,\n onUnregister,\n}: AutoRegisterProviderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use the auto-register hook\n useAutoRegister({\n enabled,\n root: scopeToChildren ? containerRef.current : null,\n idStrategy,\n debounceMs,\n includeHidden,\n includeSelectors,\n excludeSelectors,\n generateId,\n onRegister,\n onUnregister,\n });\n\n // If scoped to children, wrap in a div\n if (scopeToChildren) {\n return (\n <div ref={containerRef} style={{ display: 'contents' }}>\n {children}\n </div>\n );\n }\n\n // Otherwise, just render children directly\n return <>{children}</>;\n}\n\nexport default AutoRegisterProvider;\n"]}
|