@qontinui/ui-bridge 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.d.mts +312 -155
- package/dist/ai/index.d.ts +312 -155
- package/dist/ai/index.js +2363 -67
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +2328 -68
- package/dist/ai/index.mjs.map +1 -1
- package/dist/annotations/index.d.mts +218 -0
- package/dist/annotations/index.d.ts +218 -0
- package/dist/annotations/index.js +246 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/index.mjs +241 -0
- package/dist/annotations/index.mjs.map +1 -0
- package/dist/assertions-BSR3afVr.d.ts +161 -0
- package/dist/assertions-CTw1hfOx.d.mts +161 -0
- package/dist/babel-plugin/index.js +504 -0
- package/dist/babel-plugin/index.js.map +1 -0
- package/dist/babel-plugin/index.mjs +488 -0
- package/dist/babel-plugin/index.mjs.map +1 -0
- package/dist/browser-capture-Bms60T6f.d.mts +47 -0
- package/dist/browser-capture-CsTU29mb.d.ts +47 -0
- package/dist/control/index.d.mts +26 -7
- package/dist/control/index.d.ts +26 -7
- package/dist/control/index.js +276 -48
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +276 -48
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.d.mts +115 -44
- package/dist/core/index.d.ts +115 -44
- package/dist/core/index.js +0 -1560
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +1 -1549
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +5 -3
- package/dist/debug/index.d.ts +5 -3
- package/dist/debug/index.js +925 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +924 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.mts +13 -9
- package/dist/index.d.ts +13 -9
- package/dist/index.js +8310 -3777
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8246 -3766
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-NC3csD0R.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
- package/dist/{metrics-C9XRi_mL.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
- package/dist/native/control/index.js +448 -0
- package/dist/native/control/index.js.map +1 -0
- package/dist/native/control/index.mjs +445 -0
- package/dist/native/control/index.mjs.map +1 -0
- package/dist/native/core/index.js +486 -0
- package/dist/native/core/index.js.map +1 -0
- package/dist/native/core/index.mjs +475 -0
- package/dist/native/core/index.mjs.map +1 -0
- package/dist/native/debug/index.js +408 -0
- package/dist/native/debug/index.js.map +1 -0
- package/dist/native/debug/index.mjs +406 -0
- package/dist/native/debug/index.mjs.map +1 -0
- package/dist/native/index.js +2232 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/index.mjs +2204 -0
- package/dist/native/index.mjs.map +1 -0
- package/dist/native/react/index.js +1377 -0
- package/dist/native/react/index.js.map +1 -0
- package/dist/native/react/index.mjs +1365 -0
- package/dist/native/react/index.mjs.map +1 -0
- package/dist/native/server/index.js +440 -0
- package/dist/native/server/index.js.map +1 -0
- package/dist/native/server/index.mjs +435 -0
- package/dist/native/server/index.mjs.map +1 -0
- package/dist/react/index.d.mts +121 -9
- package/dist/react/index.d.ts +121 -9
- package/dist/react/index.js +2239 -91
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +2239 -92
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-CIEDjbQ9.d.ts → registry-C6dDtn1v.d.ts} +34 -15
- package/dist/{registry-SsSDq46X.d.mts → registry-POtcxnal.d.mts} +34 -15
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +37 -0
- package/dist/server/express.d.ts +37 -0
- package/dist/server/express.js +298 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.mjs +294 -0
- package/dist/server/express.mjs.map +1 -0
- package/dist/server/handlers.d.mts +124 -0
- package/dist/server/handlers.d.ts +124 -0
- package/dist/server/handlers.js +7183 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/handlers.mjs +7180 -0
- package/dist/server/handlers.mjs.map +1 -0
- package/dist/server/index.d.mts +12 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.js +8384 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +8369 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/nextjs.d.mts +128 -0
- package/dist/server/nextjs.d.ts +128 -0
- package/dist/server/nextjs.js +390 -0
- package/dist/server/nextjs.js.map +1 -0
- package/dist/server/nextjs.mjs +385 -0
- package/dist/server/nextjs.mjs.map +1 -0
- package/dist/server/standalone.d.mts +7 -0
- package/dist/server/standalone.d.ts +7 -0
- package/dist/server/standalone.js +845 -0
- package/dist/server/standalone.js.map +1 -0
- package/dist/server/standalone.mjs +841 -0
- package/dist/server/standalone.mjs.map +1 -0
- package/dist/specs/index.d.mts +365 -0
- package/dist/specs/index.d.ts +365 -0
- package/dist/specs/index.js +2809 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/index.mjs +2786 -0
- package/dist/specs/index.mjs.map +1 -0
- package/dist/standalone-B6GLIEmR.d.ts +216 -0
- package/dist/standalone-CjdYqj3P.d.mts +216 -0
- package/dist/swc-plugin/index.d.mts +79 -0
- package/dist/swc-plugin/index.d.ts +79 -0
- package/dist/swc-plugin/index.js +15 -0
- package/dist/swc-plugin/index.js.map +1 -0
- package/dist/swc-plugin/index.mjs +9 -0
- package/dist/swc-plugin/index.mjs.map +1 -0
- package/dist/types-B2EfvEaq.d.ts +236 -0
- package/dist/{types-Dr6tH-bm.d.mts → types-C7gVYRnF.d.ts} +72 -2
- package/dist/{types-oCTrRxSw.d.ts → types-CJGrBEhC.d.mts} +72 -2
- package/dist/types-CebMQj76.d.ts +1275 -0
- package/dist/types-D_ypYl3T.d.mts +1275 -0
- package/dist/types-UBtp7R0u.d.mts +132 -0
- package/dist/types-UBtp7R0u.d.ts +132 -0
- package/dist/types-gO696T_t.d.mts +236 -0
- package/dist/{types-CPMbN_Iw.d.mts → types-suaYwWWg.d.mts} +519 -152
- package/dist/{types-CPMbN_Iw.d.ts → types-suaYwWWg.d.ts} +519 -152
- package/package.json +123 -4
- package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
- package/dist/types-BvCfFuEV.d.ts +0 -534
- package/dist/types-CFT3Dnx4.d.mts +0 -534
- package/dist/websocket-client-CX4QJesI.d.ts +0 -124
- package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
package/dist/core/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"],"names":["aliases"],"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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/websocket-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\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(eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void): () => 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"]}
|