@qontinui/ui-bridge 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/ai/index.d.mts +4 -4
  2. package/dist/ai/index.d.ts +4 -4
  3. package/dist/babel-plugin/index.js +515 -0
  4. package/dist/babel-plugin/index.js.map +1 -0
  5. package/dist/babel-plugin/index.mjs +499 -0
  6. package/dist/babel-plugin/index.mjs.map +1 -0
  7. package/dist/control/index.d.mts +5 -5
  8. package/dist/control/index.d.ts +5 -5
  9. package/dist/core/index.d.mts +115 -44
  10. package/dist/core/index.d.ts +115 -44
  11. package/dist/core/index.js +0 -1560
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/index.mjs +1 -1549
  14. package/dist/core/index.mjs.map +1 -1
  15. package/dist/debug/index.d.mts +3 -3
  16. package/dist/debug/index.d.ts +3 -3
  17. package/dist/index.d.mts +7 -8
  18. package/dist/index.d.ts +7 -8
  19. package/dist/index.js +859 -873
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +860 -862
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/{metrics-C9XRi_mL.d.ts → metrics-BfiT_rhZ.d.ts} +2 -2
  24. package/dist/{metrics-NC3csD0R.d.mts → metrics-DTA2bwG7.d.mts} +2 -2
  25. package/dist/native/control/index.js +453 -0
  26. package/dist/native/control/index.js.map +1 -0
  27. package/dist/native/control/index.mjs +450 -0
  28. package/dist/native/control/index.mjs.map +1 -0
  29. package/dist/native/core/index.js +486 -0
  30. package/dist/native/core/index.js.map +1 -0
  31. package/dist/native/core/index.mjs +475 -0
  32. package/dist/native/core/index.mjs.map +1 -0
  33. package/dist/native/debug/index.js +451 -0
  34. package/dist/native/debug/index.js.map +1 -0
  35. package/dist/native/debug/index.mjs +449 -0
  36. package/dist/native/debug/index.mjs.map +1 -0
  37. package/dist/native/index.js +2274 -0
  38. package/dist/native/index.js.map +1 -0
  39. package/dist/native/index.mjs +2246 -0
  40. package/dist/native/index.mjs.map +1 -0
  41. package/dist/native/react/index.js +1401 -0
  42. package/dist/native/react/index.js.map +1 -0
  43. package/dist/native/react/index.mjs +1389 -0
  44. package/dist/native/react/index.mjs.map +1 -0
  45. package/dist/native/server/index.js +415 -0
  46. package/dist/native/server/index.js.map +1 -0
  47. package/dist/native/server/index.mjs +410 -0
  48. package/dist/native/server/index.mjs.map +1 -0
  49. package/dist/react/index.d.mts +20 -7
  50. package/dist/react/index.d.ts +20 -7
  51. package/dist/react/index.js +42 -4
  52. package/dist/react/index.js.map +1 -1
  53. package/dist/react/index.mjs +42 -4
  54. package/dist/react/index.mjs.map +1 -1
  55. package/dist/{registry-CIEDjbQ9.d.ts → registry-BKLEm-yk.d.ts} +9 -15
  56. package/dist/{registry-SsSDq46X.d.mts → registry-BmZgyCz8.d.mts} +9 -15
  57. package/dist/render-log/index.d.mts +1 -1
  58. package/dist/render-log/index.d.ts +1 -1
  59. package/dist/server/express.d.mts +36 -0
  60. package/dist/server/express.d.ts +36 -0
  61. package/dist/server/express.js +196 -0
  62. package/dist/server/express.js.map +1 -0
  63. package/dist/server/express.mjs +192 -0
  64. package/dist/server/express.mjs.map +1 -0
  65. package/dist/server/handlers.d.mts +93 -0
  66. package/dist/server/handlers.d.ts +93 -0
  67. package/dist/server/handlers.js +4278 -0
  68. package/dist/server/handlers.js.map +1 -0
  69. package/dist/server/handlers.mjs +4275 -0
  70. package/dist/server/handlers.mjs.map +1 -0
  71. package/dist/server/index.d.mts +10 -0
  72. package/dist/server/index.d.ts +10 -0
  73. package/dist/server/index.js +5352 -0
  74. package/dist/server/index.js.map +1 -0
  75. package/dist/server/index.mjs +5337 -0
  76. package/dist/server/index.mjs.map +1 -0
  77. package/dist/server/nextjs.d.mts +126 -0
  78. package/dist/server/nextjs.d.ts +126 -0
  79. package/dist/server/nextjs.js +287 -0
  80. package/dist/server/nextjs.js.map +1 -0
  81. package/dist/server/nextjs.mjs +282 -0
  82. package/dist/server/nextjs.mjs.map +1 -0
  83. package/dist/server/standalone.d.mts +6 -0
  84. package/dist/server/standalone.d.ts +6 -0
  85. package/dist/server/standalone.js +719 -0
  86. package/dist/server/standalone.js.map +1 -0
  87. package/dist/server/standalone.mjs +715 -0
  88. package/dist/server/standalone.mjs.map +1 -0
  89. package/dist/standalone-BURj8J3G.d.ts +212 -0
  90. package/dist/standalone-Dwmel29d.d.mts +212 -0
  91. package/dist/swc-plugin/index.d.mts +79 -0
  92. package/dist/swc-plugin/index.d.ts +79 -0
  93. package/dist/swc-plugin/index.js +15 -0
  94. package/dist/swc-plugin/index.js.map +1 -0
  95. package/dist/swc-plugin/index.mjs +9 -0
  96. package/dist/swc-plugin/index.mjs.map +1 -0
  97. package/dist/{types-CFT3Dnx4.d.mts → types-B5Q0GVo0.d.mts} +115 -3
  98. package/dist/{types-Dr6tH-bm.d.mts → types-B7J7noLK.d.mts} +1 -1
  99. package/dist/{types-oCTrRxSw.d.ts → types-BkNRILUa.d.ts} +1 -1
  100. package/dist/types-CEQLnFMv.d.mts +156 -0
  101. package/dist/types-CHnlwiTK.d.ts +156 -0
  102. package/dist/{types-BvCfFuEV.d.ts → types-DfPqwU-i.d.ts} +115 -3
  103. package/dist/{types-CPMbN_Iw.d.mts → types-jKVgTI6_.d.mts} +356 -160
  104. package/dist/{types-CPMbN_Iw.d.ts → types-jKVgTI6_.d.ts} +356 -160
  105. package/package.json +106 -3
  106. package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
  107. package/dist/websocket-client-CX4QJesI.d.ts +0 -124
  108. package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/types.ts","../../src/ai/fuzzy-matcher.ts","../../src/ai/alias-generator.ts","../../src/ai/search-engine.ts","../../src/ai/summary-generator.ts","../../src/ai/nl-action-parser.ts","../../src/ai/error-context.ts","../../src/ai/nl-action-executor.ts","../../src/ai/assertions.ts","../../src/ai/semantic-snapshot.ts","../../src/ai/semantic-diff.ts","../../src/server/handlers.ts","../../src/server/express.ts","../../src/server/nextjs.ts","../../src/server/websocket-handler.ts","../../src/server/standalone.ts"],"names":["aliases","error","wrapError","success"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * UI Bridge Server Types\n *\n * Shared types for server adapters.\n */\n\nimport type { UIBridgeConfig } from '../core';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n FindRequest,\n FindResponse,\n ControlSnapshot,\n WorkflowRunRequest,\n WorkflowRunResponse,\n} from '../control';\nimport type { RenderLogEntry, RenderLogEntryType } from '../render-log';\nimport type {\n SearchCriteria,\n SearchResponse,\n NLActionRequest,\n NLActionResponse,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SemanticSnapshot,\n SemanticDiff,\n SemanticSearchCriteria,\n SemanticSearchResponse,\n} from '../ai';\n\n/**\n * Server configuration\n */\nexport interface UIBridgeServerConfig extends UIBridgeConfig {\n /** Base path for API routes */\n basePath?: string;\n /** Enable CORS */\n cors?: boolean | CORSOptions;\n /** Authentication middleware */\n authenticate?: (req: unknown) => boolean | Promise<boolean>;\n /** Rate limiting */\n rateLimit?: RateLimitOptions;\n}\n\n/**\n * CORS options\n */\nexport interface CORSOptions {\n /** Allowed origins */\n origin?: string | string[] | boolean;\n /** Allowed methods */\n methods?: string[];\n /** Allowed headers */\n headers?: string[];\n /** Expose headers */\n exposeHeaders?: string[];\n /** Allow credentials */\n credentials?: boolean;\n /** Max age for preflight cache */\n maxAge?: number;\n}\n\n/**\n * Rate limit options\n */\nexport interface RateLimitOptions {\n /** Time window in milliseconds */\n windowMs?: number;\n /** Max requests per window */\n max?: number;\n /** Message when rate limited */\n message?: string;\n}\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n /** Whether the request succeeded */\n success: boolean;\n /** Response data */\n data?: T;\n /** Error message if failed */\n error?: string;\n /** Error code */\n code?: string;\n /** Request timestamp */\n timestamp: number;\n}\n\n/**\n * Render log query parameters\n */\nexport interface RenderLogQuery {\n /** Filter by entry type */\n type?: RenderLogEntryType;\n /** Filter entries since timestamp */\n since?: number;\n /** Filter entries until timestamp */\n until?: number;\n /** Limit number of results */\n limit?: number;\n}\n\n/**\n * Server handler interface\n *\n * Implementations provide these handlers for different frameworks.\n */\nexport interface UIBridgeServerHandlers {\n // Render log endpoints\n getRenderLog: (query?: RenderLogQuery) => Promise<APIResponse<RenderLogEntry[]>>;\n clearRenderLog: () => Promise<APIResponse<void>>;\n captureSnapshot: () => Promise<APIResponse<unknown>>;\n getRenderLogPath: () => Promise<APIResponse<{ path: string }>>;\n\n // Control endpoints\n getElements: () => Promise<APIResponse<ControlSnapshot['elements']>>;\n getElement: (id: string) => Promise<APIResponse<ControlSnapshot['elements'][0]>>;\n getElementState: (id: string) => Promise<APIResponse<unknown>>;\n executeElementAction: (\n id: string,\n request: ControlActionRequest\n ) => Promise<APIResponse<ControlActionResponse>>;\n\n // Component endpoints\n getComponents: () => Promise<APIResponse<ControlSnapshot['components']>>;\n getComponent: (id: string) => Promise<APIResponse<ControlSnapshot['components'][0]>>;\n getComponentState: (id: string) => Promise<APIResponse<{ state: Record<string, unknown>; computed: Record<string, unknown>; timestamp: number }>>;\n executeComponentAction: (\n id: string,\n request: ComponentActionRequest\n ) => Promise<APIResponse<ComponentActionResponse>>;\n\n // Find endpoints\n find: (request?: FindRequest) => Promise<APIResponse<FindResponse>>;\n /**\n * @deprecated Use find() instead\n */\n discover: (request?: FindRequest) => Promise<APIResponse<FindResponse>>;\n getControlSnapshot: () => Promise<APIResponse<ControlSnapshot>>;\n\n // Workflow endpoints\n getWorkflows: () => Promise<APIResponse<ControlSnapshot['workflows']>>;\n runWorkflow: (\n id: string,\n request?: WorkflowRunRequest\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n getWorkflowStatus: (runId: string) => Promise<APIResponse<WorkflowRunResponse>>;\n\n // Debug endpoints\n getActionHistory: (limit?: number) => Promise<APIResponse<unknown[]>>;\n getMetrics: () => Promise<APIResponse<unknown>>;\n highlightElement: (id: string) => Promise<APIResponse<void>>;\n getElementTree: () => Promise<APIResponse<unknown>>;\n\n // AI-native endpoints\n aiSearch: (criteria: SearchCriteria) => Promise<APIResponse<SearchResponse>>;\n aiExecute: (request: NLActionRequest) => Promise<APIResponse<NLActionResponse>>;\n aiAssert: (request: AssertionRequest) => Promise<APIResponse<AssertionResult>>;\n aiAssertBatch: (request: BatchAssertionRequest) => Promise<APIResponse<BatchAssertionResult>>;\n getSemanticSnapshot: () => Promise<APIResponse<SemanticSnapshot>>;\n getSemanticDiff: (since?: number) => Promise<APIResponse<SemanticDiff | null>>;\n getPageSummary: () => Promise<APIResponse<string>>;\n\n // Semantic search (embedding-based)\n aiSemanticSearch: (criteria: SemanticSearchCriteria) => Promise<APIResponse<SemanticSearchResponse>>;\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n handler: string; // Key in UIBridgeServerHandlers\n params?: string[]; // URL params to extract\n bodyRequired?: boolean;\n}\n\n/**\n * All UI Bridge routes\n */\nexport const UI_BRIDGE_ROUTES: RouteDefinition[] = [\n // Render log\n { method: 'GET', path: '/render-log', handler: 'getRenderLog' },\n { method: 'DELETE', path: '/render-log', handler: 'clearRenderLog' },\n { method: 'POST', path: '/render-log/snapshot', handler: 'captureSnapshot' },\n { method: 'GET', path: '/render-log/path', handler: 'getRenderLogPath' },\n\n // Control - Elements\n { method: 'GET', path: '/control/elements', handler: 'getElements' },\n { method: 'GET', path: '/control/element/:id', handler: 'getElement', params: ['id'] },\n { method: 'GET', path: '/control/element/:id/state', handler: 'getElementState', params: ['id'] },\n {\n method: 'POST',\n path: '/control/element/:id/action',\n handler: 'executeElementAction',\n params: ['id'],\n bodyRequired: true,\n },\n\n // Control - Components\n { method: 'GET', path: '/control/components', handler: 'getComponents' },\n { method: 'GET', path: '/control/component/:id', handler: 'getComponent', params: ['id'] },\n { method: 'GET', path: '/control/component/:id/state', handler: 'getComponentState', params: ['id'] },\n {\n method: 'POST',\n path: '/control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n params: ['id', 'actionId'],\n bodyRequired: true,\n },\n\n // Find (formerly Discovery)\n { method: 'POST', path: '/control/find', handler: 'find' },\n { method: 'POST', path: '/control/discover', handler: 'discover' }, // @deprecated Use /control/find\n { method: 'GET', path: '/control/snapshot', handler: 'getControlSnapshot' },\n\n // Workflows\n { method: 'GET', path: '/control/workflows', handler: 'getWorkflows' },\n { method: 'POST', path: '/control/workflow/:id/run', handler: 'runWorkflow', params: ['id'] },\n {\n method: 'GET',\n path: '/control/workflow/:runId/status',\n handler: 'getWorkflowStatus',\n params: ['runId'],\n },\n\n // Debug\n { method: 'GET', path: '/debug/action-history', handler: 'getActionHistory' },\n { method: 'GET', path: '/debug/metrics', handler: 'getMetrics' },\n { method: 'POST', path: '/debug/highlight/:id', handler: 'highlightElement', params: ['id'] },\n { method: 'GET', path: '/debug/element-tree', handler: 'getElementTree' },\n\n // AI-native endpoints\n { method: 'POST', path: '/ai/search', handler: 'aiSearch', bodyRequired: true },\n { method: 'POST', path: '/ai/execute', handler: 'aiExecute', bodyRequired: true },\n { method: 'POST', path: '/ai/assert', handler: 'aiAssert', bodyRequired: true },\n { method: 'POST', path: '/ai/assert/batch', handler: 'aiAssertBatch', bodyRequired: true },\n { method: 'GET', path: '/ai/snapshot', handler: 'getSemanticSnapshot' },\n { method: 'GET', path: '/ai/diff', handler: 'getSemanticDiff' },\n { method: 'GET', path: '/ai/summary', handler: 'getPageSummary' },\n { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n];\n\n/**\n * WebSocket message types\n */\nexport type WebSocketMessageType =\n | 'subscribe'\n | 'unsubscribe'\n | 'event'\n | 'snapshot'\n | 'action'\n | 'error';\n\n/**\n * WebSocket message\n */\nexport interface WebSocketMessage<T = unknown> {\n type: WebSocketMessageType;\n channel?: string;\n data?: T;\n error?: string;\n timestamp: number;\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 * Search Engine\n *\n * Multi-strategy element search using text, role, accessibility,\n * spatial proximity, and fuzzy matching.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n SearchCriteria,\n SearchResult,\n SearchResponse,\n AIDiscoveredElement,\n} from './types';\nimport {\n fuzzyMatch,\n fuzzyContains,\n wordSimilarity,\n tokenSimilarity,\n DEFAULT_FUZZY_CONFIG,\n} from './fuzzy-matcher';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n areSynonyms,\n} from './alias-generator';\n\n/**\n * Configuration for the search engine\n */\nexport interface SearchEngineConfig {\n /** Default fuzzy threshold */\n fuzzyThreshold: number;\n /** Weight for text matching */\n textWeight: number;\n /** Weight for accessibility matching */\n accessibilityWeight: number;\n /** Weight for role matching */\n roleWeight: number;\n /** Weight for spatial matching */\n spatialWeight: number;\n /** Weight for alias matching */\n aliasWeight: number;\n /** Maximum results to return */\n maxResults: number;\n /** Include hidden elements */\n includeHidden: boolean;\n}\n\n/**\n * Default search engine configuration\n */\nexport const DEFAULT_SEARCH_CONFIG: SearchEngineConfig = {\n fuzzyThreshold: 0.7,\n textWeight: 0.35,\n accessibilityWeight: 0.25,\n roleWeight: 0.15,\n spatialWeight: 0.1,\n aliasWeight: 0.15,\n maxResults: 20,\n includeHidden: false,\n};\n\n/**\n * Internal element representation for search\n */\ninterface SearchableElement {\n id: string;\n element: DiscoveredElement | RegisteredElement;\n state: ElementState;\n textContent?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n placeholder?: string;\n title?: string;\n role?: string;\n tagName: string;\n type: string;\n aliases: string[];\n description: string;\n rect: ElementState['rect'];\n labelText?: string;\n value?: string;\n}\n\n/**\n * Search Engine class\n */\nexport class SearchEngine {\n private config: SearchEngineConfig;\n private cachedElements: SearchableElement[] = [];\n private cacheTimestamp: number = 0;\n private readonly cacheValidityMs = 100; // Cache valid for 100ms\n\n constructor(config: Partial<SearchEngineConfig> = {}) {\n this.config = { ...DEFAULT_SEARCH_CONFIG, ...config };\n }\n\n /**\n * Update cached elements from various sources\n */\n updateElements(\n elements: Array<DiscoveredElement | RegisteredElement>,\n getState?: (el: RegisteredElement) => ElementState\n ): void {\n this.cachedElements = elements.map((el) => this.toSearchable(el, getState));\n this.cacheTimestamp = Date.now();\n }\n\n /**\n * Convert an element to searchable format\n */\n private toSearchable(\n element: DiscoveredElement | RegisteredElement,\n getState?: (el: RegisteredElement) => ElementState\n ): SearchableElement {\n // Get state depending on element type\n let state: ElementState;\n let textContent: string | undefined;\n let tagName: string;\n let role: string | undefined;\n let ariaLabel: string | undefined;\n let placeholder: string | undefined;\n let title: string | undefined;\n let labelText: string | undefined;\n let value: string | undefined;\n\n if ('getState' in element && typeof element.getState === 'function') {\n // RegisteredElement\n state = getState ? getState(element) : element.getState();\n textContent = state.textContent || undefined;\n tagName = element.element.tagName.toLowerCase();\n role = element.element.getAttribute('role') || undefined;\n ariaLabel = element.element.getAttribute('aria-label') || undefined;\n placeholder = element.element.getAttribute('placeholder') || undefined;\n title = element.element.getAttribute('title') || undefined;\n\n // Get associated label\n if (element.element.id) {\n const labelEl = document.querySelector(`label[for=\"${element.element.id}\"]`);\n labelText = labelEl?.textContent?.trim() || undefined;\n }\n\n // Get value for inputs\n if (element.element instanceof HTMLInputElement ||\n element.element instanceof HTMLTextAreaElement ||\n element.element instanceof HTMLSelectElement) {\n value = (element.element as HTMLInputElement).value || undefined;\n }\n } else {\n // DiscoveredElement\n const discovered = element as DiscoveredElement;\n state = discovered.state;\n textContent = state.textContent || undefined;\n tagName = discovered.tagName;\n role = discovered.role || undefined;\n ariaLabel = discovered.accessibleName || undefined;\n }\n\n // Generate aliases and description\n const aliases = generateAliases({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n value,\n });\n\n const description = generateDescription({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n });\n\n return {\n id: element.id,\n element,\n state,\n textContent,\n ariaLabel,\n placeholder,\n title,\n role,\n tagName,\n type: element.type,\n aliases,\n description,\n rect: state.rect,\n labelText,\n value,\n };\n }\n\n /**\n * Search for elements matching the criteria\n */\n search(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResponse {\n const startTime = performance.now();\n\n // Update cache if elements provided or cache expired\n if (elements) {\n this.updateElements(elements);\n }\n\n // Filter visible elements if needed\n let searchableElements = this.cachedElements;\n if (!this.config.includeHidden && !criteria.fuzzy) {\n searchableElements = searchableElements.filter((el) => el.state.visible);\n }\n\n // Score each element\n const results: SearchResult[] = [];\n\n for (const searchable of searchableElements) {\n const result = this.scoreElement(searchable, criteria);\n if (result.confidence >= (criteria.fuzzyThreshold ?? this.config.fuzzyThreshold)) {\n results.push(result);\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n // Limit results\n const limitedResults = results.slice(0, this.config.maxResults);\n\n return {\n results: limitedResults,\n bestMatch: limitedResults.length > 0 ? limitedResults[0] : null,\n scannedCount: searchableElements.length,\n durationMs: performance.now() - startTime,\n criteria,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find the best matching element\n */\n findBest(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult | null {\n const response = this.search(criteria, elements);\n return response.bestMatch;\n }\n\n /**\n * Find elements by text content\n */\n findByText(\n text: string,\n fuzzy: boolean = true,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ text, fuzzy }, elements).results;\n }\n\n /**\n * Find elements by role\n */\n findByRole(\n role: string,\n name?: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n const criteria: SearchCriteria = { role };\n if (name) {\n criteria.accessibleName = name;\n }\n return this.search(criteria, elements).results;\n }\n\n /**\n * Find elements by accessible name\n */\n findByAccessibleName(\n name: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ accessibleName: name, fuzzy: true }, elements).results;\n }\n\n /**\n * Find elements near another element\n */\n findNear(\n referenceId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, near: referenceId }, elements).results;\n }\n\n /**\n * Find elements within a container\n */\n findWithin(\n containerId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, within: containerId }, elements).results;\n }\n\n /**\n * Score an element against search criteria\n */\n private scoreElement(\n searchable: SearchableElement,\n criteria: SearchCriteria\n ): SearchResult {\n const scores: SearchResult['scores'] = {};\n const matchReasons: string[] = [];\n let totalWeight = 0;\n let weightedScore = 0;\n\n const fuzzyConfig = {\n ...DEFAULT_FUZZY_CONFIG,\n threshold: criteria.fuzzyThreshold ?? this.config.fuzzyThreshold,\n };\n\n // Text matching\n if (criteria.text) {\n const textScore = this.scoreTextMatch(searchable, criteria.text, criteria.fuzzy !== false, fuzzyConfig.threshold);\n scores.text = textScore.score;\n if (textScore.score > 0) {\n matchReasons.push(...textScore.reasons);\n }\n weightedScore += textScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Partial text matching (contains)\n if (criteria.textContains) {\n const containsScore = this.scoreContainsMatch(searchable, criteria.textContains, criteria.fuzzy !== false);\n scores.text = Math.max(scores.text || 0, containsScore.score);\n if (containsScore.score > 0 && containsScore.reasons.length > 0) {\n matchReasons.push(...containsScore.reasons);\n }\n weightedScore += containsScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const accessibilityScore = this.scoreAccessibilityMatch(\n searchable,\n criteria.accessibleName,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n scores.accessibility = accessibilityScore.score;\n if (accessibilityScore.score > 0) {\n matchReasons.push(...accessibilityScore.reasons);\n }\n weightedScore += accessibilityScore.score * this.config.accessibilityWeight;\n totalWeight += this.config.accessibilityWeight;\n }\n\n // Role matching\n if (criteria.role) {\n const roleScore = this.scoreRoleMatch(searchable, criteria.role);\n scores.role = roleScore.score;\n if (roleScore.score > 0) {\n matchReasons.push(...roleScore.reasons);\n }\n weightedScore += roleScore.score * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n\n // Type matching\n if (criteria.type) {\n const typeMatch = searchable.type.toLowerCase() === criteria.type.toLowerCase();\n if (typeMatch) {\n matchReasons.push(`type: ${criteria.type}`);\n weightedScore += 1.0 * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n }\n\n // Spatial matching (near)\n if (criteria.near) {\n const spatialScore = this.scoreSpatialMatch(searchable, criteria.near);\n scores.spatial = spatialScore.score;\n if (spatialScore.score > 0) {\n matchReasons.push(...spatialScore.reasons);\n }\n weightedScore += spatialScore.score * this.config.spatialWeight;\n totalWeight += this.config.spatialWeight;\n }\n\n // Placeholder matching\n if (criteria.placeholder && searchable.placeholder) {\n const placeholderResult = fuzzyMatch(searchable.placeholder, criteria.placeholder, fuzzyConfig);\n if (placeholderResult.isMatch) {\n matchReasons.push(`placeholder matches`);\n weightedScore += placeholderResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Title matching\n if (criteria.title && searchable.title) {\n const titleResult = fuzzyMatch(searchable.title, criteria.title, fuzzyConfig);\n if (titleResult.isMatch) {\n matchReasons.push(`title matches`);\n weightedScore += titleResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // ID pattern matching\n if (criteria.idPattern) {\n const idMatch = this.matchPattern(searchable.id, criteria.idPattern);\n if (idMatch) {\n matchReasons.push(`id matches pattern`);\n weightedScore += 1.0 * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Alias matching (always applied as a bonus)\n const aliasScore = this.scoreAliasMatch(searchable, criteria, fuzzyConfig.threshold);\n if (aliasScore.score > 0) {\n scores.fuzzy = aliasScore.score;\n matchReasons.push(...aliasScore.reasons);\n weightedScore += aliasScore.score * this.config.aliasWeight;\n totalWeight += this.config.aliasWeight;\n }\n\n // Calculate final confidence\n const confidence = totalWeight > 0 ? weightedScore / totalWeight : 0;\n\n // Convert to AIDiscoveredElement\n const aiElement = this.toAIDiscoveredElement(searchable);\n\n return {\n element: aiElement,\n confidence,\n matchReasons,\n scores,\n };\n }\n\n /**\n * Score text match\n */\n private scoreTextMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [\n searchable.textContent,\n searchable.labelText,\n searchable.value,\n ].filter(Boolean) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact match\n if (targetText.toLowerCase() === text.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact text match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(targetText, text, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`text similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n\n // Word-level match\n const wordSim = wordSimilarity(targetText, text, { threshold });\n if (wordSim > maxScore && wordSim >= threshold) {\n maxScore = wordSim;\n reasons.push(`word match: ${(wordSim * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score contains match\n */\n private scoreContainsMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [\n searchable.textContent,\n searchable.labelText,\n searchable.ariaLabel,\n ].filter(Boolean) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact contains\n if (targetText.toLowerCase().includes(text.toLowerCase())) {\n maxScore = Math.max(maxScore, 0.9);\n reasons.push('text contains match');\n continue;\n }\n\n // Fuzzy contains\n if (fuzzy && fuzzyContains(targetText, text)) {\n maxScore = Math.max(maxScore, 0.7);\n reasons.push('fuzzy contains match');\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score accessibility match\n */\n private scoreAccessibilityMatch(\n searchable: SearchableElement,\n name: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const accessibleNames = [\n searchable.ariaLabel,\n searchable.ariaLabelledBy,\n searchable.labelText,\n searchable.title,\n ].filter(Boolean) as string[];\n\n for (const accessibleName of accessibleNames) {\n // Exact match\n if (accessibleName.toLowerCase() === name.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact accessible name match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(accessibleName, name, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score role match\n */\n private scoreRoleMatch(\n searchable: SearchableElement,\n role: string\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n const normalizedRole = role.toLowerCase();\n\n // Direct role match\n if (searchable.role?.toLowerCase() === normalizedRole) {\n return { score: 1.0, reasons: [`role: ${role}`] };\n }\n\n // Tag-based role inference\n const tagRoleMap: Record<string, string[]> = {\n button: ['button', 'input[type=button]', 'input[type=submit]'],\n textbox: ['input', 'textarea'],\n checkbox: ['input[type=checkbox]'],\n radio: ['input[type=radio]'],\n link: ['a'],\n listbox: ['select'],\n combobox: ['select', 'input[list]'],\n navigation: ['nav'],\n main: ['main'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n };\n\n const inferredRoles = tagRoleMap[normalizedRole] || [];\n if (inferredRoles.some((r) => searchable.tagName === r || searchable.type.toLowerCase() === normalizedRole)) {\n return { score: 0.8, reasons: [`inferred role: ${role}`] };\n }\n\n return { score: 0, reasons };\n }\n\n /**\n * Score spatial match (proximity to another element)\n */\n private scoreSpatialMatch(\n searchable: SearchableElement,\n nearId: string\n ): { score: number; reasons: string[] } {\n // Find the reference element\n const reference = this.cachedElements.find((el) => el.id === nearId);\n if (!reference) {\n return { score: 0, reasons: [] };\n }\n\n // Calculate distance between elements\n const distance = this.calculateDistance(searchable.rect, reference.rect);\n\n // Score based on distance (closer = higher score)\n // Assuming 200px as \"near\" threshold\n const nearThreshold = 200;\n if (distance > nearThreshold * 3) {\n return { score: 0, reasons: [] };\n }\n\n const score = Math.max(0, 1 - distance / (nearThreshold * 3));\n return {\n score,\n reasons: [`${distance.toFixed(0)}px from ${nearId}`],\n };\n }\n\n /**\n * Calculate distance between two element rectangles\n */\n private calculateDistance(rect1: ElementState['rect'], rect2: ElementState['rect']): number {\n const center1 = {\n x: rect1.x + rect1.width / 2,\n y: rect1.y + rect1.height / 2,\n };\n const center2 = {\n x: rect2.x + rect2.width / 2,\n y: rect2.y + rect2.height / 2,\n };\n\n return Math.sqrt(Math.pow(center1.x - center2.x, 2) + Math.pow(center1.y - center2.y, 2));\n }\n\n /**\n * Score alias match\n */\n private scoreAliasMatch(\n searchable: SearchableElement,\n criteria: SearchCriteria,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n // Build search terms from criteria\n const searchTerms: string[] = [];\n if (criteria.text) searchTerms.push(criteria.text);\n if (criteria.textContains) searchTerms.push(criteria.textContains);\n if (criteria.accessibleName) searchTerms.push(criteria.accessibleName);\n\n for (const searchTerm of searchTerms) {\n const termLower = searchTerm.toLowerCase();\n\n for (const alias of searchable.aliases) {\n // Exact alias match\n if (alias === termLower) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push(`alias match: \"${alias}\"`);\n continue;\n }\n\n // Synonym match\n const searchWords = termLower.split(/\\s+/);\n const aliasWords = alias.split(/\\s+/);\n\n for (const searchWord of searchWords) {\n for (const aliasWord of aliasWords) {\n if (areSynonyms(searchWord, aliasWord)) {\n maxScore = Math.max(maxScore, 0.85);\n reasons.push(`synonym match: \"${searchWord}\" ~ \"${aliasWord}\"`);\n }\n }\n }\n\n // Fuzzy alias match\n const result = fuzzyMatch(alias, termLower, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`fuzzy alias: \"${alias}\" (${(result.similarity * 100).toFixed(0)}%)`);\n }\n\n // Token similarity\n const tokenSim = tokenSimilarity(alias, termLower);\n if (tokenSim > maxScore && tokenSim >= threshold) {\n maxScore = tokenSim;\n reasons.push(`token match: \"${alias}\"`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Match a string against a pattern (supports * wildcard)\n */\n private matchPattern(str: string, pattern: string): boolean {\n const regexPattern = pattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\*/g, '.*');\n return new RegExp(`^${regexPattern}$`, 'i').test(str);\n }\n\n /**\n * Convert searchable element to AI discovered element\n */\n private toAIDiscoveredElement(searchable: SearchableElement): AIDiscoveredElement {\n const discoveredBase: DiscoveredElement =\n 'getState' in searchable.element\n ? {\n id: searchable.id,\n type: searchable.type,\n label: (searchable.element as RegisteredElement).label,\n tagName: searchable.tagName,\n role: searchable.role,\n accessibleName: searchable.ariaLabel,\n actions: (searchable.element as RegisteredElement).actions,\n state: searchable.state,\n registered: true,\n }\n : (searchable.element as DiscoveredElement);\n\n return {\n ...discoveredBase,\n description: searchable.description,\n aliases: searchable.aliases,\n purpose: generatePurpose({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n parentContext: undefined, // Would need DOM traversal\n suggestedActions: generateSuggestedActions({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n semanticType: this.inferSemanticType(searchable),\n labelText: searchable.labelText,\n placeholder: searchable.placeholder,\n title: searchable.title,\n };\n }\n\n /**\n * Infer a semantic type for the element\n */\n private inferSemanticType(searchable: SearchableElement): string {\n const text = (searchable.textContent || searchable.ariaLabel || '').toLowerCase();\n const type = searchable.type.toLowerCase();\n\n // Form-related\n if (type === 'input' || type === 'textarea') {\n if (searchable.placeholder?.toLowerCase().includes('email') || text.includes('email')) {\n return 'email-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('password') || text.includes('password')) {\n return 'password-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('search') || text.includes('search')) {\n return 'search-input';\n }\n return 'text-input';\n }\n\n // Button types\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n // Navigation\n if (type === 'link') {\n if (text.match(/home|dashboard/)) return 'home-link';\n if (text.match(/login|sign.?in/)) return 'login-link';\n if (text.match(/logout|sign.?out/)) return 'logout-link';\n return 'navigation-link';\n }\n\n return type;\n }\n}\n\n/**\n * Create a default search engine instance\n */\nexport function createSearchEngine(config?: Partial<SearchEngineConfig>): SearchEngine {\n return new SearchEngine(config);\n}\n","/**\n * Summary Generator\n *\n * Generates LLM-friendly text summaries of pages and elements\n * for AI agents to understand the current UI state.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { ControlSnapshot } from '../control/types';\nimport type {\n AIDiscoveredElement,\n FormAnalysis,\n FormState,\n PageContext,\n SemanticSnapshot,\n ModalState,\n} from './types';\n\n/**\n * Configuration for summary generation\n */\nexport interface SummaryConfig {\n /** Maximum summary length in characters */\n maxLength: number;\n /** Include form details */\n includeForms: boolean;\n /** Include element counts */\n includeElementCounts: boolean;\n /** Include active modals */\n includeModals: boolean;\n /** Include focused element */\n includeFocused: boolean;\n /** Verbosity level */\n verbosity: 'brief' | 'normal' | 'detailed';\n}\n\n/**\n * Default summary configuration\n */\nexport const DEFAULT_SUMMARY_CONFIG: SummaryConfig = {\n maxLength: 2000,\n includeForms: true,\n includeElementCounts: true,\n includeModals: true,\n includeFocused: true,\n verbosity: 'normal',\n};\n\n/**\n * Generate a page summary from elements\n */\nexport function generatePageSummary(\n elements: AIDiscoveredElement[],\n pageContext?: Partial<PageContext>,\n config: Partial<SummaryConfig> = {}\n): string {\n const finalConfig = { ...DEFAULT_SUMMARY_CONFIG, ...config };\n const lines: string[] = [];\n\n // Page context\n if (pageContext) {\n if (pageContext.title) {\n lines.push(`Page: \"${pageContext.title}\"`);\n }\n if (pageContext.pageType && pageContext.pageType !== 'unknown') {\n lines.push(`Type: ${formatPageType(pageContext.pageType)}`);\n }\n }\n\n // Element counts\n if (finalConfig.includeElementCounts) {\n const counts = countElementTypes(elements);\n const countParts: string[] = [];\n\n if (counts.button > 0) countParts.push(`${counts.button} button${counts.button > 1 ? 's' : ''}`);\n if (counts.input > 0) countParts.push(`${counts.input} input${counts.input > 1 ? 's' : ''}`);\n if (counts.link > 0) countParts.push(`${counts.link} link${counts.link > 1 ? 's' : ''}`);\n if (counts.select > 0) countParts.push(`${counts.select} dropdown${counts.select > 1 ? 's' : ''}`);\n if (counts.checkbox > 0) countParts.push(`${counts.checkbox} checkbox${counts.checkbox > 1 ? 'es' : ''}`);\n\n if (countParts.length > 0) {\n lines.push(`Contains: ${countParts.join(', ')}`);\n }\n }\n\n // Forms\n if (finalConfig.includeForms) {\n const forms = detectForms(elements);\n if (forms.length > 0) {\n lines.push('');\n lines.push('Forms:');\n for (const form of forms) {\n lines.push(generateFormSummary(form, finalConfig.verbosity));\n }\n }\n }\n\n // Active modals\n if (finalConfig.includeModals && pageContext?.activeModals && pageContext.activeModals.length > 0) {\n lines.push('');\n lines.push(`Active modals: ${pageContext.activeModals.join(', ')}`);\n }\n\n // Focused element\n if (finalConfig.includeFocused && pageContext?.focusedElement) {\n lines.push(`Focus: ${pageContext.focusedElement}`);\n }\n\n // Key interactive elements\n const keyElements = getKeyElements(elements);\n if (keyElements.length > 0) {\n lines.push('');\n lines.push('Key elements:');\n for (const el of keyElements) {\n lines.push(` - ${el.description}${el.state.enabled ? '' : ' (disabled)'}`);\n }\n }\n\n // Build final summary\n let summary = lines.join('\\n');\n\n // Truncate if needed\n if (summary.length > finalConfig.maxLength) {\n summary = summary.substring(0, finalConfig.maxLength - 3) + '...';\n }\n\n return summary;\n}\n\n/**\n * Generate an element description\n */\nexport function generateElementDescription(element: AIDiscoveredElement): string {\n const parts: string[] = [];\n\n // Element type and name\n const name = element.accessibleName || element.label || element.state.textContent?.trim();\n if (name) {\n parts.push(`\"${truncate(name, 30)}\"`);\n }\n\n // Type\n parts.push(formatElementType(element.type));\n\n // State indicators\n const stateIndicators: string[] = [];\n if (!element.state.visible) stateIndicators.push('hidden');\n if (!element.state.enabled) stateIndicators.push('disabled');\n if (element.state.focused) stateIndicators.push('focused');\n if (element.state.checked) stateIndicators.push('checked');\n\n if (stateIndicators.length > 0) {\n parts.push(`(${stateIndicators.join(', ')})`);\n }\n\n // Value for inputs\n if (element.state.value && element.type !== 'button') {\n const valuePreview = truncate(element.state.value, 20);\n parts.push(`value: \"${valuePreview}\"`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Generate a form summary\n */\nfunction generateFormSummary(form: FormAnalysis, verbosity: SummaryConfig['verbosity']): string {\n const lines: string[] = [];\n const formName = form.name || form.purpose || form.id;\n\n lines.push(` ${formName}:`);\n\n if (verbosity === 'brief') {\n const fieldCount = form.fields.length;\n const filledCount = form.fields.filter((f) => f.value).length;\n lines.push(` ${filledCount}/${fieldCount} fields filled, ${form.isValid ? 'valid' : 'has errors'}`);\n } else {\n // List fields\n for (const field of form.fields) {\n let fieldLine = ` - ${field.label || field.id}`;\n\n if (field.value) {\n fieldLine += ` = \"${truncate(field.value, 15)}\"`;\n } else if (field.placeholder) {\n fieldLine += ` (${field.placeholder})`;\n } else {\n fieldLine += ' (empty)';\n }\n\n if (!field.valid && field.error) {\n fieldLine += ` [ERROR: ${field.error}]`;\n } else if (field.required && !field.value) {\n fieldLine += ' [required]';\n }\n\n lines.push(fieldLine);\n }\n\n // Submit button\n if (form.submitButton) {\n lines.push(` Submit: ${form.submitButton}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a snapshot summary\n */\nexport function generateSnapshotSummary(\n snapshot: SemanticSnapshot,\n config: Partial<SummaryConfig> = {}\n): string {\n const finalConfig = { ...DEFAULT_SUMMARY_CONFIG, ...config };\n const lines: string[] = [];\n\n // Page info\n lines.push(`Page: \"${snapshot.page.title}\"`);\n lines.push(`URL: ${snapshot.page.url}`);\n if (snapshot.page.pageType) {\n lines.push(`Type: ${formatPageType(snapshot.page.pageType)}`);\n }\n\n // Element counts\n if (finalConfig.includeElementCounts) {\n const countParts: string[] = [];\n for (const [type, count] of Object.entries(snapshot.elementCounts)) {\n if (count > 0) {\n countParts.push(`${count} ${type}${count > 1 ? 's' : ''}`);\n }\n }\n if (countParts.length > 0) {\n lines.push(`Elements: ${countParts.join(', ')}`);\n }\n }\n\n // Forms\n if (finalConfig.includeForms && snapshot.forms.length > 0) {\n lines.push('');\n lines.push('Forms:');\n for (const form of snapshot.forms) {\n lines.push(generateFormStateSummary(form));\n }\n }\n\n // Modals\n if (finalConfig.includeModals && snapshot.activeModals.length > 0) {\n lines.push('');\n lines.push('Active dialogs:');\n for (const modal of snapshot.activeModals) {\n lines.push(` - ${modal.title || modal.id} (${modal.type})`);\n }\n }\n\n // Focused element\n if (finalConfig.includeFocused && snapshot.focusedElement) {\n const focused = snapshot.elements.find((e) => e.id === snapshot.focusedElement);\n if (focused) {\n lines.push(`Focused: ${generateElementDescription(focused)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate form state summary\n */\nfunction generateFormStateSummary(form: FormState): string {\n const lines: string[] = [];\n const formName = form.name || form.purpose || form.id;\n\n const filledCount = form.fields.filter((f) => f.value).length;\n const errorCount = form.fields.filter((f) => !f.valid).length;\n\n let statusLine = ` ${formName}: ${filledCount}/${form.fields.length} filled`;\n if (errorCount > 0) {\n statusLine += `, ${errorCount} error${errorCount > 1 ? 's' : ''}`;\n }\n if (form.isDirty) {\n statusLine += ' (modified)';\n }\n\n lines.push(statusLine);\n\n // List errors\n for (const field of form.fields) {\n if (!field.valid && field.error) {\n lines.push(` ERROR: ${field.label}: ${field.error}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate diff summary\n */\nexport function generateDiffSummary(\n appeared: string[],\n disappeared: string[],\n modified: Array<{ description: string; property: string; from: string; to: string }>\n): string {\n const lines: string[] = [];\n\n if (appeared.length > 0) {\n lines.push(`Appeared: ${appeared.join(', ')}`);\n }\n\n if (disappeared.length > 0) {\n lines.push(`Disappeared: ${disappeared.join(', ')}`);\n }\n\n if (modified.length > 0) {\n lines.push('Changed:');\n for (const mod of modified.slice(0, 5)) {\n lines.push(` - ${mod.description}: ${mod.property} changed from \"${mod.from}\" to \"${mod.to}\"`);\n }\n if (modified.length > 5) {\n lines.push(` ... and ${modified.length - 5} more changes`);\n }\n }\n\n if (lines.length === 0) {\n return 'No changes detected';\n }\n\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Count elements by type\n */\nfunction countElementTypes(elements: AIDiscoveredElement[]): Record<string, number> {\n const counts: Record<string, number> = {};\n\n for (const el of elements) {\n const type = el.type.toLowerCase();\n counts[type] = (counts[type] || 0) + 1;\n }\n\n return counts;\n}\n\n/**\n * Detect forms from elements\n */\nfunction detectForms(elements: AIDiscoveredElement[]): FormAnalysis[] {\n // Group inputs by common patterns (this is a simplified heuristic)\n const formElements = elements.filter(\n (el) => el.type === 'input' || el.type === 'textarea' || el.type === 'select' || el.type === 'checkbox'\n );\n\n if (formElements.length === 0) return [];\n\n // For simplicity, treat all inputs as one form if no explicit forms\n const forms: FormAnalysis[] = [];\n\n // Find submit buttons\n const submitButtons = elements.filter(\n (el) =>\n el.type === 'button' &&\n (el.state.textContent?.toLowerCase().includes('submit') ||\n el.state.textContent?.toLowerCase().includes('save') ||\n el.state.textContent?.toLowerCase().includes('send') ||\n el.semanticType === 'submit-button')\n );\n\n // Create a default form\n const defaultForm: FormAnalysis = {\n id: 'detected-form',\n purpose: inferFormPurpose(formElements),\n fields: formElements.map((el) => ({\n id: el.id,\n label: el.labelText || el.accessibleName || el.placeholder || el.id,\n type: el.type,\n value: el.state.value || '',\n valid: true, // Can't determine without validation state\n required: false, // Can't determine without DOM access\n placeholder: el.placeholder,\n })),\n isValid: true,\n submitButton: submitButtons[0]?.id,\n };\n\n if (defaultForm.fields.length > 0) {\n forms.push(defaultForm);\n }\n\n return forms;\n}\n\n/**\n * Infer form purpose from fields\n */\nfunction inferFormPurpose(fields: AIDiscoveredElement[]): string {\n const labels = fields.map((f) =>\n (f.labelText || f.accessibleName || f.placeholder || '').toLowerCase()\n );\n const allLabels = labels.join(' ');\n\n if (allLabels.includes('email') && allLabels.includes('password')) {\n if (allLabels.includes('confirm') || allLabels.includes('name')) {\n return 'Registration form';\n }\n return 'Login form';\n }\n\n if (allLabels.includes('search')) {\n return 'Search form';\n }\n\n if (allLabels.includes('address') || allLabels.includes('city') || allLabels.includes('zip')) {\n return 'Address form';\n }\n\n if (allLabels.includes('card') || allLabels.includes('cvv') || allLabels.includes('expir')) {\n return 'Payment form';\n }\n\n if (allLabels.includes('contact') || allLabels.includes('message')) {\n return 'Contact form';\n }\n\n return 'Form';\n}\n\n/**\n * Get key interactive elements for summary\n */\nfunction getKeyElements(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n const keyElements: AIDiscoveredElement[] = [];\n\n // Prioritize submit/action buttons\n const actionButtons = elements.filter(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType?.includes('submit') ||\n el.semanticType?.includes('action') ||\n el.semanticType?.includes('next'))\n );\n keyElements.push(...actionButtons.slice(0, 2));\n\n // Add primary inputs\n const primaryInputs = elements.filter(\n (el) => (el.type === 'input' || el.type === 'textarea') && el.state.visible\n );\n keyElements.push(...primaryInputs.slice(0, 3));\n\n // Add visible links\n const links = elements.filter((el) => el.type === 'link' && el.state.visible);\n keyElements.push(...links.slice(0, 2));\n\n // Deduplicate and limit\n const unique = [...new Map(keyElements.map((e) => [e.id, e])).values()];\n return unique.slice(0, 8);\n}\n\n/**\n * Format page type for display\n */\nfunction formatPageType(\n pageType: PageContext['pageType']\n): string {\n const typeLabels: Record<NonNullable<PageContext['pageType']>, string> = {\n login: 'Login page',\n dashboard: 'Dashboard',\n form: 'Form page',\n list: 'List/table page',\n detail: 'Detail page',\n search: 'Search page',\n checkout: 'Checkout page',\n settings: 'Settings page',\n unknown: 'Unknown',\n };\n\n return typeLabels[pageType || 'unknown'] || 'Page';\n}\n\n/**\n * Format element type for display\n */\nfunction formatElementType(type: string): string {\n const typeLabels: Record<string, string> = {\n button: 'button',\n input: 'input field',\n textarea: 'text area',\n select: 'dropdown',\n checkbox: 'checkbox',\n radio: 'radio button',\n link: 'link',\n form: 'form',\n menu: 'menu',\n menuitem: 'menu item',\n tab: 'tab',\n dialog: 'dialog',\n switch: 'switch',\n slider: 'slider',\n };\n\n return typeLabels[type.toLowerCase()] || type;\n}\n\n/**\n * Truncate string with ellipsis\n */\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Infer page type from URL and elements\n */\nexport function inferPageType(\n url: string,\n title: string,\n elements: AIDiscoveredElement[]\n): PageContext['pageType'] {\n const urlLower = url.toLowerCase();\n const titleLower = title.toLowerCase();\n\n // URL-based detection\n if (urlLower.includes('login') || urlLower.includes('signin')) return 'login';\n if (urlLower.includes('dashboard')) return 'dashboard';\n if (urlLower.includes('search')) return 'search';\n if (urlLower.includes('checkout') || urlLower.includes('payment')) return 'checkout';\n if (urlLower.includes('settings') || urlLower.includes('preferences')) return 'settings';\n\n // Title-based detection\n if (titleLower.includes('login') || titleLower.includes('sign in')) return 'login';\n if (titleLower.includes('dashboard')) return 'dashboard';\n if (titleLower.includes('search')) return 'search';\n\n // Element-based detection\n const hasLoginForm =\n elements.some((el) => el.type === 'input' && el.semanticType === 'email-input') &&\n elements.some((el) => el.type === 'input' && el.semanticType === 'password-input');\n if (hasLoginForm) return 'login';\n\n const hasSearchInput = elements.some(\n (el) => el.type === 'input' && el.semanticType === 'search-input'\n );\n if (hasSearchInput) return 'search';\n\n // Check for form presence\n const inputCount = elements.filter(\n (el) => el.type === 'input' || el.type === 'textarea' || el.type === 'select'\n ).length;\n if (inputCount >= 3) return 'form';\n\n // Check for list/table\n const hasTable = elements.some((el) => el.tagName === 'table');\n const hasMany = elements.length > 20;\n if (hasTable || hasMany) return 'list';\n\n return 'unknown';\n}\n","/**\n * Natural Language Action Parser\n *\n * Parses natural language instructions into structured action requests.\n * Handles patterns like \"click the Submit button\" or \"type 'hello' in the search box\".\n */\n\nimport type { ParsedAction, AssertionType } from './types';\n\n/**\n * Action pattern definition\n */\ninterface ActionPattern {\n /** Regex pattern to match */\n regex: RegExp;\n /** Action type */\n action: ParsedAction['action'];\n /** Capture group index for target */\n targetGroup: number;\n /** Capture group index for value (optional) */\n valueGroup?: number;\n /** Extract modifiers from match */\n modifierExtractor?: (match: RegExpMatchArray) => ParsedAction['modifiers'];\n /** Confidence level for this pattern */\n confidence: number;\n}\n\n/**\n * Action patterns for natural language parsing\n */\nconst ACTION_PATTERNS: ActionPattern[] = [\n // Click patterns\n {\n regex: /^click\\s+(?:on\\s+)?(?:the\\s+)?(.+?)(?:\\s+button)?$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^press\\s+(?:the\\s+)?(.+?)(?:\\s+button)?$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^tap\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^activate\\s+(?:the\\s+)?(.+)$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.8,\n },\n\n // Double click patterns\n {\n regex: /^double[\\s-]?click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'doubleClick',\n targetGroup: 1,\n confidence: 0.95,\n },\n\n // Right click patterns\n {\n regex: /^right[\\s-]?click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'rightClick',\n targetGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^context\\s+click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'rightClick',\n targetGroup: 1,\n confidence: 0.9,\n },\n\n // Type patterns - \"type X in Y\"\n {\n regex: /^type\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^type\\s+(.+?)\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Type patterns - \"enter X in Y\"\n {\n regex: /^enter\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^enter\\s+(.+?)\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Type patterns - \"input X into Y\"\n {\n regex: /^input\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.9,\n },\n\n // Type patterns - \"fill Y with X\"\n {\n regex: /^fill\\s+(?:in\\s+)?(?:the\\s+)?(.+?)\\s+with\\s+[\"'](.+?)[\"']$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.95,\n },\n {\n regex: /^fill\\s+(?:in\\s+)?(?:the\\s+)?(.+?)\\s+with\\s+(.+)$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.85,\n },\n\n // Type patterns - \"set Y to X\"\n {\n regex: /^set\\s+(?:the\\s+)?(.+?)\\s+to\\s+[\"'](.+?)[\"']$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.9,\n },\n\n // Select patterns\n {\n regex: /^select\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^choose\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^pick\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Check patterns\n {\n regex: /^check\\s+(?:the\\s+)?(.+?)(?:\\s+checkbox)?$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^enable\\s+(?:the\\s+)?(.+)$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.8,\n },\n {\n regex: /^tick\\s+(?:the\\s+)?(.+)$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Uncheck patterns\n {\n regex: /^uncheck\\s+(?:the\\s+)?(.+?)(?:\\s+checkbox)?$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^disable\\s+(?:the\\s+)?(.+)$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.8,\n },\n {\n regex: /^untick\\s+(?:the\\s+)?(.+)$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Clear patterns\n {\n regex: /^clear\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^erase\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^empty\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.8,\n },\n\n // Hover patterns\n {\n regex: /^hover\\s+(?:over\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'hover',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^mouse\\s+over\\s+(?:the\\s+)?(.+)$/i,\n action: 'hover',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Focus patterns\n {\n regex: /^focus\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'focus',\n targetGroup: 1,\n confidence: 0.9,\n },\n\n // Scroll patterns\n {\n regex: /^scroll\\s+(up|down|left|right)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^scroll\\s+(?:the\\s+)?(.+?)\\s+(up|down|left|right)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^scroll\\s+to\\s+(?:the\\s+)?(.+)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Wait patterns\n {\n regex: /^wait\\s+(?:for\\s+)?(?:the\\s+)?(.+?)(?:\\s+to\\s+(?:be\\s+)?(.+))?$/i,\n action: 'wait',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^wait\\s+until\\s+(?:the\\s+)?(.+?)(?:\\s+(?:is|becomes)\\s+(.+))?$/i,\n action: 'wait',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Assert patterns\n {\n regex: /^(?:assert|verify|check)\\s+(?:that\\s+)?(?:the\\s+)?(.+?)\\s+(?:is\\s+)?(visible|hidden|enabled|disabled|checked|unchecked|focused)$/i,\n action: 'assert',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^(?:assert|verify|check)\\s+(?:that\\s+)?(?:the\\s+)?(.+?)\\s+(?:contains|has)\\s+[\"'](.+?)[\"']$/i,\n action: 'assert',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.9,\n },\n {\n regex: /^(?:the\\s+)?(.+?)\\s+should\\s+(?:be\\s+)?(visible|hidden|enabled|disabled|checked|unchecked|focused)$/i,\n action: 'assert',\n targetGroup: 1,\n confidence: 0.85,\n },\n];\n\n/**\n * Assertion type mappings\n */\nconst ASSERTION_TYPE_MAP: Record<string, AssertionType> = {\n visible: 'visible',\n hidden: 'hidden',\n enabled: 'enabled',\n disabled: 'disabled',\n checked: 'checked',\n unchecked: 'unchecked',\n focused: 'focused',\n contains: 'containsText',\n has: 'hasText',\n};\n\n/**\n * Parse a natural language instruction into a structured action\n */\nexport function parseNLInstruction(instruction: string): ParsedAction | null {\n const trimmed = instruction.trim();\n if (!trimmed) return null;\n\n // Try each pattern\n for (const pattern of ACTION_PATTERNS) {\n const match = trimmed.match(pattern.regex);\n if (match) {\n const parsed: ParsedAction = {\n action: pattern.action,\n targetDescription: cleanTargetDescription(match[pattern.targetGroup] || ''),\n rawInstruction: instruction,\n parseConfidence: pattern.confidence,\n };\n\n // Extract value if present\n if (pattern.valueGroup && match[pattern.valueGroup]) {\n parsed.value = match[pattern.valueGroup];\n }\n\n // Extract modifiers if extractor provided\n if (pattern.modifierExtractor) {\n parsed.modifiers = pattern.modifierExtractor(match);\n }\n\n // Handle scroll direction\n if (pattern.action === 'scroll') {\n const directionMatch = trimmed.match(/(up|down|left|right)/i);\n if (directionMatch) {\n parsed.scrollDirection = directionMatch[1].toLowerCase() as ParsedAction['scrollDirection'];\n }\n }\n\n // Handle assertion type\n if (pattern.action === 'assert') {\n const assertMatch = trimmed.match(/(visible|hidden|enabled|disabled|checked|unchecked|focused|contains|has)/i);\n if (assertMatch) {\n parsed.assertionType = ASSERTION_TYPE_MAP[assertMatch[1].toLowerCase()];\n }\n }\n\n // Handle wait condition\n if (pattern.action === 'wait') {\n const waitCondition = match[2];\n if (waitCondition) {\n parsed.waitCondition = waitCondition;\n }\n }\n\n return parsed;\n }\n }\n\n // Try to infer action from common words as fallback\n return inferAction(trimmed);\n}\n\n/**\n * Clean up target description\n */\nfunction cleanTargetDescription(target: string): string {\n return target\n .trim()\n // Remove leading articles\n .replace(/^(the|a|an)\\s+/i, '')\n // Remove trailing type indicators\n .replace(/\\s+(button|field|input|link|dropdown|checkbox|radio)$/i, '')\n .trim();\n}\n\n/**\n * Infer action from instruction as fallback\n */\nfunction inferAction(instruction: string): ParsedAction | null {\n const lower = instruction.toLowerCase();\n\n // Simple click inference\n if (lower.includes('click') || lower.includes('press') || lower.includes('tap')) {\n const target = instruction\n .replace(/click|press|tap|on|the/gi, '')\n .trim();\n if (target) {\n return {\n action: 'click',\n targetDescription: cleanTargetDescription(target),\n rawInstruction: instruction,\n parseConfidence: 0.6,\n };\n }\n }\n\n // Simple type inference\n if (lower.includes('type') || lower.includes('enter') || lower.includes('input')) {\n // Try to extract quoted value\n const quotedMatch = instruction.match(/[\"'](.+?)[\"']/);\n if (quotedMatch) {\n const target = instruction\n .replace(/type|enter|input|into|in|the|[\"'].*?[\"']/gi, '')\n .trim();\n return {\n action: 'type',\n targetDescription: cleanTargetDescription(target),\n value: quotedMatch[1],\n rawInstruction: instruction,\n parseConfidence: 0.5,\n };\n }\n }\n\n // Could not parse\n return null;\n}\n\n/**\n * Parse multiple instructions\n */\nexport function parseNLInstructions(instructions: string[]): ParsedAction[] {\n const parsed: ParsedAction[] = [];\n\n for (const instruction of instructions) {\n const result = parseNLInstruction(instruction);\n if (result) {\n parsed.push(result);\n }\n }\n\n return parsed;\n}\n\n/**\n * Split a complex instruction into simple ones\n * e.g., \"click Login and type 'admin' in username\" -> [\"click Login\", \"type 'admin' in username\"]\n */\nexport function splitCompoundInstruction(instruction: string): string[] {\n // Split on common conjunctions\n const parts = instruction.split(/\\s+(?:and|then|,\\s*then|,\\s*and|,)\\s+/i);\n\n return parts.map((p) => p.trim()).filter((p) => p.length > 0);\n}\n\n/**\n * Extract modifiers from instruction\n */\nexport function extractModifiers(instruction: string): ParsedAction['modifiers'] {\n const modifiers: ParsedAction['modifiers'] = [];\n const lower = instruction.toLowerCase();\n\n if (lower.includes('shift') || lower.includes('with shift')) {\n modifiers.push('shift');\n }\n if (lower.includes('ctrl') || lower.includes('control') || lower.includes('with ctrl')) {\n modifiers.push('ctrl');\n }\n if (lower.includes('alt') || lower.includes('with alt') || lower.includes('option')) {\n modifiers.push('alt');\n }\n if (lower.includes('meta') || lower.includes('command') || lower.includes('cmd') || lower.includes('windows')) {\n modifiers.push('meta');\n }\n\n return modifiers.length > 0 ? modifiers : undefined;\n}\n\n/**\n * Validate a parsed action\n */\nexport function validateParsedAction(action: ParsedAction): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!action.targetDescription && action.action !== 'scroll') {\n errors.push('No target element specified');\n }\n\n if ((action.action === 'type' || action.action === 'select') && !action.value) {\n errors.push(`No value specified for ${action.action} action`);\n }\n\n if (action.parseConfidence < 0.5) {\n errors.push('Low confidence parsing - instruction may be ambiguous');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Generate a human-readable description of a parsed action\n */\nexport function describeAction(action: ParsedAction): string {\n switch (action.action) {\n case 'click':\n return `Click on \"${action.targetDescription}\"`;\n case 'doubleClick':\n return `Double-click on \"${action.targetDescription}\"`;\n case 'rightClick':\n return `Right-click on \"${action.targetDescription}\"`;\n case 'type':\n return `Type \"${action.value}\" into \"${action.targetDescription}\"`;\n case 'select':\n return `Select \"${action.value}\" from \"${action.targetDescription}\"`;\n case 'check':\n return `Check \"${action.targetDescription}\"`;\n case 'uncheck':\n return `Uncheck \"${action.targetDescription}\"`;\n case 'clear':\n return `Clear \"${action.targetDescription}\"`;\n case 'hover':\n return `Hover over \"${action.targetDescription}\"`;\n case 'focus':\n return `Focus on \"${action.targetDescription}\"`;\n case 'scroll':\n if (action.scrollDirection) {\n return `Scroll ${action.scrollDirection}`;\n }\n return `Scroll to \"${action.targetDescription}\"`;\n case 'wait':\n return `Wait for \"${action.targetDescription}\"${action.waitCondition ? ` to be ${action.waitCondition}` : ''}`;\n case 'assert':\n return `Assert \"${action.targetDescription}\" is ${action.assertionType || 'valid'}`;\n default:\n return `${action.action} on \"${action.targetDescription}\"`;\n }\n}\n","/**\n * Error Context\n *\n * Creates rich error context for AI agents to understand and recover\n * from failures during UI automation.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AIErrorContext,\n RecoverySuggestion,\n SearchCriteria,\n SearchResult,\n AIDiscoveredElement,\n} from './types';\n\n/**\n * Any element type that can be used with error context\n */\ntype AnyElement = DiscoveredElement | AIDiscoveredElement | RegisteredElement;\n\n/**\n * Helper to get element state from any element type\n * DiscoveredElement has a `state` property, RegisteredElement has a `getState()` method\n */\nfunction getElementState(el: AnyElement): ElementState | undefined {\n if ('state' in el && el.state) {\n return el.state;\n }\n if ('getState' in el && typeof el.getState === 'function') {\n try {\n return el.getState();\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\n/**\n * Standard error codes\n */\nexport const ErrorCodes = {\n // Parsing errors\n PARSE_ERROR: 'PARSE_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n\n // Element errors\n ELEMENT_NOT_FOUND: 'ELEMENT_NOT_FOUND',\n ELEMENT_NOT_VISIBLE: 'ELEMENT_NOT_VISIBLE',\n ELEMENT_DISABLED: 'ELEMENT_DISABLED',\n ELEMENT_BLOCKED: 'ELEMENT_BLOCKED',\n MULTIPLE_ELEMENTS: 'MULTIPLE_ELEMENTS',\n\n // Search errors\n LOW_CONFIDENCE: 'LOW_CONFIDENCE',\n AMBIGUOUS_MATCH: 'AMBIGUOUS_MATCH',\n\n // Action errors\n ACTION_FAILED: 'ACTION_FAILED',\n ACTION_TIMEOUT: 'ACTION_TIMEOUT',\n UNSUPPORTED_ACTION: 'UNSUPPORTED_ACTION',\n\n // State errors\n UNEXPECTED_STATE: 'UNEXPECTED_STATE',\n STALE_ELEMENT: 'STALE_ELEMENT',\n\n // Page errors\n PAGE_LOAD_ERROR: 'PAGE_LOAD_ERROR',\n NAVIGATION_ERROR: 'NAVIGATION_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Error messages for each error code\n */\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n PARSE_ERROR: 'Could not parse the natural language instruction',\n VALIDATION_ERROR: 'The parsed action failed validation',\n ELEMENT_NOT_FOUND: 'No element matching the description could be found',\n ELEMENT_NOT_VISIBLE: 'The element exists but is not visible',\n ELEMENT_DISABLED: 'The element is disabled and cannot be interacted with',\n ELEMENT_BLOCKED: 'The element is blocked by another element',\n MULTIPLE_ELEMENTS: 'Multiple elements match the description',\n LOW_CONFIDENCE: 'The best match has low confidence',\n AMBIGUOUS_MATCH: 'Multiple elements match with similar confidence',\n ACTION_FAILED: 'The action could not be completed',\n ACTION_TIMEOUT: 'The action timed out waiting for a condition',\n UNSUPPORTED_ACTION: 'The requested action is not supported',\n UNEXPECTED_STATE: 'The element is in an unexpected state',\n STALE_ELEMENT: 'The element is no longer attached to the DOM',\n PAGE_LOAD_ERROR: 'The page failed to load correctly',\n NAVIGATION_ERROR: 'Navigation to the target page failed',\n};\n\n/**\n * Recovery suggestions for each error code\n */\nconst ERROR_SUGGESTIONS: Record<ErrorCode, RecoverySuggestion[]> = {\n PARSE_ERROR: [\n {\n action: 'Use a simpler instruction format like \"click Submit button\"',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Use specific element names visible on the page',\n confidence: 0.7,\n priority: 2,\n },\n ],\n VALIDATION_ERROR: [\n {\n action: 'Provide required parameters for the action',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Check the instruction format',\n confidence: 0.7,\n priority: 2,\n },\n ],\n ELEMENT_NOT_FOUND: [\n {\n action: 'Wait for the page to fully load',\n command: 'wait for page to load',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Use a different description for the element',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Scroll the page to reveal the element',\n command: 'scroll down',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_NOT_VISIBLE: [\n {\n action: 'Scroll to make the element visible',\n command: 'scroll to element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Close any overlaying elements',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Wait for loading to complete',\n command: 'wait for loading',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_DISABLED: [\n {\n action: 'Fill in required fields first',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Complete prerequisite steps',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Wait for the element to become enabled',\n command: 'wait for element to be enabled',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_BLOCKED: [\n {\n action: 'Close the modal or popup',\n command: 'click close button',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Dismiss the overlay',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Wait for the blocking element to disappear',\n confidence: 0.6,\n priority: 3,\n },\n ],\n MULTIPLE_ELEMENTS: [\n {\n action: 'Use a more specific description',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Include the element position (first, second, etc.)',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Use the element ID directly',\n confidence: 0.7,\n priority: 3,\n },\n ],\n LOW_CONFIDENCE: [\n {\n action: 'Use the exact text shown on the element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Lower the confidence threshold if the match is correct',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Try a different way to describe the element',\n confidence: 0.6,\n priority: 3,\n },\n ],\n AMBIGUOUS_MATCH: [\n {\n action: 'Be more specific about which element you mean',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Include the section or form name',\n confidence: 0.8,\n priority: 2,\n },\n ],\n ACTION_FAILED: [\n {\n action: 'Check if the element is interactable',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Wait and retry the action',\n command: 'wait 1 second then retry',\n confidence: 0.6,\n priority: 2,\n },\n ],\n ACTION_TIMEOUT: [\n {\n action: 'Increase the timeout duration',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Check if the condition can ever be met',\n confidence: 0.7,\n priority: 2,\n },\n ],\n UNSUPPORTED_ACTION: [\n {\n action: 'Use a different action type',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Break down into simpler actions',\n confidence: 0.7,\n priority: 2,\n },\n ],\n UNEXPECTED_STATE: [\n {\n action: 'Refresh the page state',\n command: 'refresh',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Wait for state to stabilize',\n command: 'wait 2 seconds',\n confidence: 0.6,\n priority: 2,\n },\n ],\n STALE_ELEMENT: [\n {\n action: 'Re-find the element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Wait for page to stabilize',\n command: 'wait 1 second',\n confidence: 0.7,\n priority: 2,\n },\n ],\n PAGE_LOAD_ERROR: [\n {\n action: 'Refresh the page',\n command: 'refresh page',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Check network connectivity',\n confidence: 0.6,\n priority: 2,\n },\n ],\n NAVIGATION_ERROR: [\n {\n action: 'Try the navigation again',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Check if the URL is correct',\n confidence: 0.6,\n priority: 2,\n },\n ],\n};\n\n/**\n * Create a rich error context\n */\nexport function createErrorContext(\n errorCode: ErrorCode,\n attemptedAction: string,\n availableElements: AnyElement[],\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n): AIErrorContext {\n // Get base message and suggestions\n const message = ERROR_MESSAGES[errorCode] || 'An unknown error occurred';\n const baseSuggestions = ERROR_SUGGESTIONS[errorCode] || [];\n\n // Detect possible blockers\n const possibleBlockers = detectPossibleBlockers(availableElements);\n\n // Count visible elements\n const visibleElements = availableElements.filter((el) => {\n const state = getElementState(el);\n return state?.visible ?? false;\n }).length;\n\n // Build enhanced suggestions\n const suggestions = enhanceSuggestions(\n baseSuggestions,\n errorCode,\n nearestMatch,\n possibleBlockers\n );\n\n return {\n code: errorCode,\n message,\n attemptedAction,\n searchCriteria,\n searchResults: {\n candidatesFound: availableElements.length,\n nearestMatch: nearestMatch\n ? {\n element: nearestMatch.element,\n confidence: nearestMatch.confidence,\n whyNotSelected: determineWhyNotSelected(errorCode, nearestMatch),\n }\n : undefined,\n },\n pageContext: {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title : '',\n visibleElements,\n possibleBlockers,\n },\n suggestions,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Detect possible blocking elements\n */\nfunction detectPossibleBlockers(\n elements: AnyElement[]\n): string[] {\n const blockers: string[] = [];\n\n for (const el of elements) {\n const state = getElementState(el);\n if (!state) continue;\n\n // Check for modals\n if (el.type === 'dialog' && state.visible) {\n blockers.push(`Modal dialog: ${el.id}`);\n }\n\n // Check for overlays (heuristic based on computed styles)\n if (state.computedStyles?.pointerEvents === 'none') {\n continue; // Non-blocking overlay\n }\n\n // Check for full-screen elements (would need rect comparison)\n }\n\n return blockers;\n}\n\n/**\n * Enhance suggestions based on context\n */\nfunction enhanceSuggestions(\n baseSuggestions: RecoverySuggestion[],\n errorCode: ErrorCode,\n nearestMatch?: SearchResult,\n possibleBlockers?: string[]\n): RecoverySuggestion[] {\n const suggestions = [...baseSuggestions];\n\n // Add blocker-specific suggestions\n if (possibleBlockers && possibleBlockers.length > 0) {\n suggestions.unshift({\n action: `Close the blocking element: ${possibleBlockers[0]}`,\n command: 'click close button',\n confidence: 0.85,\n priority: 0,\n });\n }\n\n // Add nearest match suggestion\n if (nearestMatch && errorCode === 'LOW_CONFIDENCE') {\n suggestions.unshift({\n action: `Did you mean: \"${nearestMatch.element.description}\"?`,\n command: `click \"${nearestMatch.element.description}\"`,\n confidence: nearestMatch.confidence,\n priority: 0,\n });\n }\n\n // Sort by priority\n suggestions.sort((a, b) => a.priority - b.priority);\n\n return suggestions;\n}\n\n/**\n * Determine why the nearest match was not selected\n */\nfunction determineWhyNotSelected(\n errorCode: ErrorCode,\n nearestMatch: SearchResult\n): string {\n switch (errorCode) {\n case 'LOW_CONFIDENCE':\n return `Confidence (${(nearestMatch.confidence * 100).toFixed(0)}%) below threshold`;\n\n case 'ELEMENT_NOT_VISIBLE':\n return 'Element is not visible';\n\n case 'ELEMENT_DISABLED':\n return 'Element is disabled';\n\n case 'AMBIGUOUS_MATCH':\n return 'Multiple elements with similar confidence';\n\n default:\n return 'Did not meet selection criteria';\n }\n}\n\n/**\n * Format error context for display\n */\nexport function formatErrorContext(context: AIErrorContext): string {\n const lines: string[] = [];\n\n lines.push(`Error: ${context.code}`);\n lines.push(`Message: ${context.message}`);\n lines.push(`Attempted: ${context.attemptedAction}`);\n lines.push('');\n\n if (context.searchResults.nearestMatch) {\n const match = context.searchResults.nearestMatch;\n lines.push(`Nearest match: \"${match.element.description}\" (${(match.confidence * 100).toFixed(0)}% confidence)`);\n lines.push(`Why not used: ${match.whyNotSelected}`);\n lines.push('');\n }\n\n lines.push(`Page: ${context.pageContext.title || context.pageContext.url}`);\n lines.push(`Visible elements: ${context.pageContext.visibleElements}`);\n\n if (context.pageContext.possibleBlockers.length > 0) {\n lines.push(`Possible blockers: ${context.pageContext.possibleBlockers.join(', ')}`);\n }\n\n lines.push('');\n lines.push('Suggestions:');\n for (const suggestion of context.suggestions.slice(0, 3)) {\n lines.push(` - ${suggestion.action}`);\n if (suggestion.command) {\n lines.push(` Command: ${suggestion.command}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a simple error response\n */\nexport function createSimpleError(\n code: ErrorCode,\n message?: string\n): { code: string; message: string } {\n return {\n code,\n message: message || ERROR_MESSAGES[code] || 'Unknown error',\n };\n}\n\n/**\n * Check if an error is recoverable\n */\nexport function isRecoverableError(code: ErrorCode): boolean {\n const unrecoverableErrors: ErrorCode[] = [\n 'UNSUPPORTED_ACTION',\n 'PAGE_LOAD_ERROR',\n 'NAVIGATION_ERROR',\n ];\n\n return !unrecoverableErrors.includes(code);\n}\n\n/**\n * Get the best recovery suggestion for an error\n */\nexport function getBestRecoverySuggestion(\n context: AIErrorContext\n): RecoverySuggestion | null {\n if (context.suggestions.length === 0) return null;\n\n // Return highest confidence suggestion\n const sorted = [...context.suggestions].sort((a, b) => b.confidence - a.confidence);\n return sorted[0];\n}\n","/**\n * Natural Language Action Executor\n *\n * Executes parsed natural language actions by searching for elements\n * and performing the requested actions with confidence scoring.\n */\n\nimport type { RegisteredElement, ElementState, StandardAction } from '../core/types';\nimport type { DiscoveredElement, ActionExecutor } from '../control/types';\nimport type {\n NLActionRequest,\n NLActionResponse,\n ParsedAction,\n SearchCriteria,\n AIDiscoveredElement,\n AIErrorContext,\n SearchResult,\n} from './types';\nimport { parseNLInstruction, describeAction, validateParsedAction } from './nl-action-parser';\nimport { SearchEngine, type SearchEngineConfig } from './search-engine';\nimport { createErrorContext, ErrorCodes } from './error-context';\n\n/**\n * Configuration for the NL action executor\n */\nexport interface NLActionExecutorConfig {\n /** Default confidence threshold for element matching */\n defaultConfidenceThreshold: number;\n /** Default timeout for actions */\n defaultTimeout: number;\n /** Maximum alternatives to return on failure */\n maxAlternatives: number;\n /** Search engine configuration */\n searchConfig?: Partial<SearchEngineConfig>;\n /** Enable verbose logging */\n verbose: boolean;\n}\n\n/**\n * Default executor configuration\n */\nexport const DEFAULT_EXECUTOR_CONFIG: NLActionExecutorConfig = {\n defaultConfidenceThreshold: 0.7,\n defaultTimeout: 5000,\n maxAlternatives: 3,\n verbose: false,\n};\n\n/**\n * Natural Language Action Executor\n */\nexport class NLActionExecutor {\n private config: NLActionExecutorConfig;\n private searchEngine: SearchEngine;\n private actionExecutor: ActionExecutor | null = null;\n private elements: Array<DiscoveredElement | RegisteredElement> = [];\n\n constructor(config: Partial<NLActionExecutorConfig> = {}) {\n this.config = { ...DEFAULT_EXECUTOR_CONFIG, ...config };\n this.searchEngine = new SearchEngine(this.config.searchConfig);\n }\n\n /**\n * Set the action executor for performing DOM actions\n */\n setActionExecutor(executor: ActionExecutor): void {\n this.actionExecutor = executor;\n }\n\n /**\n * Update available elements for search\n */\n updateElements(elements: Array<DiscoveredElement | RegisteredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a natural language instruction\n */\n async execute(request: NLActionRequest): Promise<NLActionResponse> {\n const startTime = performance.now();\n const threshold = request.confidenceThreshold ?? this.config.defaultConfidenceThreshold;\n\n // Parse the instruction\n const parsed = parseNLInstruction(request.instruction);\n\n if (!parsed) {\n return this.createFailureResponse(\n startTime,\n 'PARSE_ERROR',\n `Could not parse instruction: \"${request.instruction}\"`,\n request.instruction,\n [],\n threshold\n );\n }\n\n // Validate the parsed action\n const validation = validateParsedAction(parsed);\n if (!validation.valid) {\n return this.createFailureResponse(\n startTime,\n 'VALIDATION_ERROR',\n validation.errors.join('; '),\n request.instruction,\n [],\n threshold\n );\n }\n\n // Build search criteria from parsed action\n const searchCriteria = this.buildSearchCriteria(parsed);\n\n // Search for the target element\n const searchResponse = this.searchEngine.search(searchCriteria);\n\n if (!searchResponse.bestMatch) {\n return this.createFailureResponse(\n startTime,\n 'ELEMENT_NOT_FOUND',\n `Could not find element matching: \"${parsed.targetDescription}\"`,\n request.instruction,\n searchResponse.results,\n threshold,\n searchCriteria\n );\n }\n\n // Check confidence threshold\n if (searchResponse.bestMatch.confidence < threshold) {\n const alternatives = searchResponse.results.slice(0, this.config.maxAlternatives);\n return this.createFailureResponse(\n startTime,\n 'LOW_CONFIDENCE',\n `Best match confidence (${(searchResponse.bestMatch.confidence * 100).toFixed(0)}%) is below threshold (${(threshold * 100).toFixed(0)}%)`,\n request.instruction,\n alternatives,\n threshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n\n // Execute the action\n try {\n const result = await this.performAction(\n parsed,\n searchResponse.bestMatch.element,\n request.timeout ?? this.config.defaultTimeout\n );\n\n return {\n success: true,\n executedAction: describeAction(parsed),\n elementUsed: searchResponse.bestMatch.element,\n confidence: searchResponse.bestMatch.confidence,\n elementState: result.elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const alternatives = searchResponse.results\n .filter((r) => r !== searchResponse.bestMatch)\n .slice(0, this.config.maxAlternatives);\n\n return this.createFailureResponse(\n startTime,\n 'ACTION_FAILED',\n errorMessage,\n request.instruction,\n alternatives,\n threshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n }\n\n /**\n * Execute a parsed action directly (skip parsing)\n */\n async executeParsed(parsed: ParsedAction, threshold?: number): Promise<NLActionResponse> {\n const startTime = performance.now();\n const confidenceThreshold = threshold ?? this.config.defaultConfidenceThreshold;\n\n // Build search criteria\n const searchCriteria = this.buildSearchCriteria(parsed);\n\n // Search for element\n const searchResponse = this.searchEngine.search(searchCriteria);\n\n if (!searchResponse.bestMatch) {\n return this.createFailureResponse(\n startTime,\n 'ELEMENT_NOT_FOUND',\n `Could not find element: \"${parsed.targetDescription}\"`,\n parsed.rawInstruction,\n [],\n confidenceThreshold,\n searchCriteria\n );\n }\n\n if (searchResponse.bestMatch.confidence < confidenceThreshold) {\n return this.createFailureResponse(\n startTime,\n 'LOW_CONFIDENCE',\n `Best match confidence too low`,\n parsed.rawInstruction,\n searchResponse.results.slice(0, this.config.maxAlternatives),\n confidenceThreshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n\n // Execute\n try {\n const result = await this.performAction(\n parsed,\n searchResponse.bestMatch.element,\n this.config.defaultTimeout\n );\n\n return {\n success: true,\n executedAction: describeAction(parsed),\n elementUsed: searchResponse.bestMatch.element,\n confidence: searchResponse.bestMatch.confidence,\n elementState: result.elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return this.createFailureResponse(\n startTime,\n 'ACTION_FAILED',\n error instanceof Error ? error.message : String(error),\n parsed.rawInstruction,\n searchResponse.results\n .filter((r) => r !== searchResponse.bestMatch)\n .slice(0, this.config.maxAlternatives),\n confidenceThreshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n }\n\n /**\n * Build search criteria from a parsed action\n */\n private buildSearchCriteria(parsed: ParsedAction): SearchCriteria {\n const criteria: SearchCriteria = {\n text: parsed.targetDescription,\n fuzzy: true,\n fuzzyThreshold: this.config.defaultConfidenceThreshold,\n };\n\n // Add type hints based on action\n switch (parsed.action) {\n case 'click':\n case 'doubleClick':\n case 'rightClick':\n // Could be button or link\n break;\n case 'type':\n case 'clear':\n // Should be an input\n criteria.type = 'input';\n break;\n case 'select':\n criteria.type = 'select';\n break;\n case 'check':\n case 'uncheck':\n criteria.type = 'checkbox';\n break;\n }\n\n return criteria;\n }\n\n /**\n * Perform the actual action on an element\n */\n private async performAction(\n parsed: ParsedAction,\n element: AIDiscoveredElement,\n timeout: number\n ): Promise<{ elementState: ElementState }> {\n if (!this.actionExecutor) {\n throw new Error('No action executor configured');\n }\n\n // Map parsed action to standard action\n const actionMap: Record<ParsedAction['action'], StandardAction | null> = {\n click: 'click',\n doubleClick: 'doubleClick',\n rightClick: 'rightClick',\n type: 'type',\n select: 'select',\n check: 'check',\n uncheck: 'uncheck',\n scroll: 'scroll',\n wait: null, // Special handling\n assert: null, // Special handling\n hover: 'hover',\n focus: 'focus',\n clear: 'clear',\n };\n\n const standardAction = actionMap[parsed.action];\n\n if (!standardAction) {\n // Handle special actions\n if (parsed.action === 'wait') {\n const waitResult = await this.actionExecutor.waitFor(element.id, {\n visible: true,\n timeout,\n });\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return { elementState: waitResult.state! };\n }\n\n if (parsed.action === 'assert') {\n // Assertions are handled by the assertions module\n throw new Error('Use the assertions module for assert actions');\n }\n\n throw new Error(`Unsupported action: ${parsed.action}`);\n }\n\n // Build action request\n const actionRequest: {\n action: StandardAction;\n params?: Record<string, unknown>;\n waitOptions?: { visible?: boolean; enabled?: boolean; timeout?: number };\n } = {\n action: standardAction,\n waitOptions: {\n visible: true,\n enabled: true,\n timeout,\n },\n };\n\n // Add action-specific params\n if (standardAction === 'type' && parsed.value) {\n actionRequest.params = { text: parsed.value };\n } else if (standardAction === 'select' && parsed.value) {\n actionRequest.params = { value: parsed.value };\n } else if (standardAction === 'scroll' && parsed.scrollDirection) {\n actionRequest.params = { direction: parsed.scrollDirection };\n }\n\n // Execute the action\n const response = await this.actionExecutor.executeAction(element.id, actionRequest);\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return { elementState: response.elementState! };\n }\n\n /**\n * Create a failure response with suggestions\n */\n private createFailureResponse(\n startTime: number,\n errorCode: string,\n errorMessage: string,\n instruction: string,\n alternatives: SearchResult[],\n threshold: number,\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n ): NLActionResponse {\n // Generate suggestions\n const suggestions = this.generateSuggestions(\n errorCode,\n instruction,\n alternatives,\n nearestMatch\n );\n\n // Create a dummy element for the response\n const dummyElement: AIDiscoveredElement = nearestMatch?.element || {\n id: 'not-found',\n type: 'unknown',\n tagName: 'unknown',\n actions: [],\n state: {\n visible: false,\n enabled: false,\n focused: false,\n rect: { x: 0, y: 0, width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 },\n },\n registered: false,\n description: 'Element not found',\n aliases: [],\n suggestedActions: [],\n };\n\n return {\n success: false,\n executedAction: instruction,\n elementUsed: dummyElement,\n confidence: nearestMatch?.confidence || 0,\n elementState: dummyElement.state,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n error: errorMessage,\n errorCode,\n suggestions,\n alternatives: alternatives.slice(0, this.config.maxAlternatives),\n };\n }\n\n /**\n * Generate recovery suggestions\n */\n private generateSuggestions(\n errorCode: string,\n instruction: string,\n alternatives: SearchResult[],\n nearestMatch?: SearchResult\n ): string[] {\n const suggestions: string[] = [];\n\n switch (errorCode) {\n case 'PARSE_ERROR':\n suggestions.push('Try using a simpler phrase like \"click Submit button\"');\n suggestions.push('Ensure the instruction follows patterns like \"click X\" or \"type Y into X\"');\n break;\n\n case 'ELEMENT_NOT_FOUND':\n if (alternatives.length > 0) {\n suggestions.push(`Did you mean: \"${alternatives[0].element.description}\"?`);\n }\n suggestions.push('Check if the element is visible on the page');\n suggestions.push('Try using a more specific description');\n break;\n\n case 'LOW_CONFIDENCE':\n if (nearestMatch) {\n suggestions.push(\n `Found \"${nearestMatch.element.description}\" with ${(nearestMatch.confidence * 100).toFixed(0)}% confidence`\n );\n }\n suggestions.push('Try using the exact text shown on the element');\n suggestions.push('Lower the confidence threshold if this match is correct');\n break;\n\n case 'ACTION_FAILED':\n suggestions.push('Check if the element is enabled');\n suggestions.push('Wait for any loading to complete');\n suggestions.push('Ensure no modal or overlay is blocking the element');\n break;\n\n default:\n suggestions.push('Try a different approach or check the page state');\n }\n\n return suggestions;\n }\n\n /**\n * Get rich error context for debugging\n */\n getErrorContext(\n errorCode: string,\n instruction: string,\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n ): AIErrorContext {\n return createErrorContext(\n errorCode as keyof typeof ErrorCodes,\n instruction,\n this.elements,\n searchCriteria,\n nearestMatch\n );\n }\n}\n\n/**\n * Create a default NL action executor\n */\nexport function createNLActionExecutor(\n config?: Partial<NLActionExecutorConfig>\n): NLActionExecutor {\n return new NLActionExecutor(config);\n}\n","/**\n * Assertions Module\n *\n * Provides verification/assertion API for AI agents to validate\n * page state without writing Playwright tests.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AssertionType,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SearchCriteria,\n AIDiscoveredElement,\n} from './types';\nimport { SearchEngine } from './search-engine';\n\n/**\n * Configuration for assertions\n */\nexport interface AssertionConfig {\n /** Default timeout for wait-based assertions */\n defaultTimeout: number;\n /** Polling interval for wait-based assertions */\n pollInterval: number;\n /** Default fuzzy threshold for element search */\n fuzzyThreshold: number;\n /** Include suggestions in failure messages */\n includeSuggestions: boolean;\n}\n\n/**\n * Default assertion configuration\n */\nexport const DEFAULT_ASSERTION_CONFIG: AssertionConfig = {\n defaultTimeout: 5000,\n pollInterval: 100,\n fuzzyThreshold: 0.7,\n includeSuggestions: true,\n};\n\n/**\n * Assertion executor class\n */\nexport class AssertionExecutor {\n private config: AssertionConfig;\n private searchEngine: SearchEngine;\n private elements: Array<DiscoveredElement | AIDiscoveredElement> = [];\n\n constructor(config: Partial<AssertionConfig> = {}) {\n this.config = { ...DEFAULT_ASSERTION_CONFIG, ...config };\n this.searchEngine = new SearchEngine({ fuzzyThreshold: this.config.fuzzyThreshold });\n }\n\n /**\n * Update available elements for assertions\n */\n updateElements(elements: Array<DiscoveredElement | AIDiscoveredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a single assertion\n */\n async assert(request: AssertionRequest): Promise<AssertionResult> {\n const startTime = performance.now();\n const timeout = request.timeout ?? this.config.defaultTimeout;\n\n // Find the target element\n const element = await this.findElement(request.target, request.fuzzy !== false);\n\n if (!element && request.type !== 'notExists') {\n return this.createResult(\n false,\n typeof request.target === 'string' ? request.target : JSON.stringify(request.target),\n 'element not found',\n request.type === 'exists' ? true : request.expected,\n null,\n 'Element could not be found',\n this.config.includeSuggestions ? 'Check if the element exists and is properly labeled' : undefined,\n startTime\n );\n }\n\n // Execute the assertion based on type\n return this.executeAssertion(request, element, timeout, startTime);\n }\n\n /**\n * Execute multiple assertions\n */\n async assertBatch(request: BatchAssertionRequest): Promise<BatchAssertionResult> {\n const startTime = performance.now();\n const results: AssertionResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n\n for (const assertion of request.assertions) {\n const result = await this.assert(assertion);\n results.push(result);\n\n if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n\n // Stop on first failure if configured\n if (request.stopOnFailure) {\n // Mark remaining assertions as skipped\n break;\n }\n }\n }\n\n // Determine overall pass/fail\n const passed = request.mode === 'all'\n ? failedCount === 0\n : passedCount > 0;\n\n return {\n passed,\n results,\n passedCount,\n failedCount,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Convenience method: assert element is visible\n */\n async assertVisible(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'visible', timeout });\n }\n\n /**\n * Convenience method: assert element is hidden\n */\n async assertHidden(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'hidden', timeout });\n }\n\n /**\n * Convenience method: assert element is enabled\n */\n async assertEnabled(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'enabled', timeout });\n }\n\n /**\n * Convenience method: assert element is disabled\n */\n async assertDisabled(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'disabled', timeout });\n }\n\n /**\n * Convenience method: assert element has text\n */\n async assertHasText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element contains text\n */\n async assertContainsText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'containsText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element has value\n */\n async assertHasValue(\n target: string | SearchCriteria,\n value: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasValue', expected: value, timeout });\n }\n\n /**\n * Convenience method: assert element exists\n */\n async assertExists(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'exists', timeout });\n }\n\n /**\n * Convenience method: assert element does not exist\n */\n async assertNotExists(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'notExists', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is checked\n */\n async assertChecked(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'checked', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is unchecked\n */\n async assertUnchecked(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'unchecked', timeout });\n }\n\n /**\n * Convenience method: assert element count\n */\n async assertCount(\n target: SearchCriteria,\n expectedCount: number,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'count', expected: expectedCount, timeout });\n }\n\n /**\n * Find element by target (string or criteria)\n */\n private async findElement(\n target: string | SearchCriteria,\n fuzzy: boolean = true\n ): Promise<AIDiscoveredElement | null> {\n const criteria: SearchCriteria =\n typeof target === 'string' ? { text: target, fuzzy } : { ...target, fuzzy };\n\n const searchResult = this.searchEngine.findBest(criteria);\n\n if (searchResult && searchResult.confidence >= this.config.fuzzyThreshold) {\n return searchResult.element;\n }\n\n return null;\n }\n\n /**\n * Execute the actual assertion\n */\n private async executeAssertion(\n request: AssertionRequest,\n element: AIDiscoveredElement | null,\n timeout: number,\n startTime: number\n ): Promise<AssertionResult> {\n const targetStr = typeof request.target === 'string'\n ? request.target\n : JSON.stringify(request.target);\n\n const elementDescription = element?.description || targetStr;\n\n switch (request.type) {\n case 'visible':\n return this.assertVisibility(element!, true, elementDescription, request.message, startTime);\n\n case 'hidden':\n return this.assertVisibility(element!, false, elementDescription, request.message, startTime);\n\n case 'enabled':\n return this.assertEnabledState(element!, true, elementDescription, request.message, startTime);\n\n case 'disabled':\n return this.assertEnabledState(element!, false, elementDescription, request.message, startTime);\n\n case 'focused':\n return this.assertFocused(element!, elementDescription, request.message, startTime);\n\n case 'checked':\n return this.assertCheckedState(element!, true, elementDescription, request.message, startTime);\n\n case 'unchecked':\n return this.assertCheckedState(element!, false, elementDescription, request.message, startTime);\n\n case 'hasText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'containsText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasValue':\n return this.assertValue(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'exists':\n return this.createResult(\n element !== null,\n targetStr,\n elementDescription,\n true,\n element !== null,\n element === null ? 'Element does not exist' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'notExists':\n return this.createResult(\n element === null,\n targetStr,\n elementDescription,\n false,\n element === null,\n element !== null ? 'Element exists but should not' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'count':\n return this.assertElementCount(\n request.target as SearchCriteria,\n request.expected as number,\n targetStr,\n request.message,\n startTime\n );\n\n case 'attribute':\n return this.assertAttribute(\n element!,\n request.attributeName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasClass':\n return this.assertHasClass(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'cssProperty':\n return this.assertCssProperty(\n element!,\n request.propertyName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n default:\n return this.createResult(\n false,\n targetStr,\n elementDescription,\n undefined,\n undefined,\n `Unknown assertion type: ${request.type}`,\n undefined,\n startTime\n );\n }\n }\n\n /**\n * Assert visibility state\n */\n private assertVisibility(\n element: AIDiscoveredElement,\n expectedVisible: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isVisible = element.state.visible;\n const passed = isVisible === expectedVisible;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedVisible,\n isVisible,\n passed ? undefined : message || `Element is ${isVisible ? 'visible' : 'hidden'} but expected ${expectedVisible ? 'visible' : 'hidden'}`,\n passed ? undefined : 'Check if element is covered by another element or has display:none',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert enabled state\n */\n private assertEnabledState(\n element: AIDiscoveredElement,\n expectedEnabled: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isEnabled = element.state.enabled;\n const passed = isEnabled === expectedEnabled;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedEnabled,\n isEnabled,\n passed ? undefined : message || `Element is ${isEnabled ? 'enabled' : 'disabled'} but expected ${expectedEnabled ? 'enabled' : 'disabled'}`,\n passed ? undefined : 'Check if the element has a disabled attribute or aria-disabled',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert focused state\n */\n private assertFocused(\n element: AIDiscoveredElement,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isFocused = element.state.focused;\n\n return this.createResult(\n isFocused,\n element.id,\n description,\n true,\n isFocused,\n isFocused ? undefined : message || 'Element is not focused',\n isFocused ? undefined : 'Click or focus the element first',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert checked state\n */\n private assertCheckedState(\n element: AIDiscoveredElement,\n expectedChecked: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isChecked = element.state.checked ?? false;\n const passed = isChecked === expectedChecked;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedChecked,\n isChecked,\n passed ? undefined : message || `Element is ${isChecked ? 'checked' : 'unchecked'} but expected ${expectedChecked ? 'checked' : 'unchecked'}`,\n passed ? undefined : 'Click the checkbox to change its state',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert text content\n */\n private assertTextMatch(\n element: AIDiscoveredElement,\n expectedText: string,\n exact: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualText = element.state.textContent || '';\n const passed = exact\n ? actualText === expectedText\n : actualText.includes(expectedText);\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedText,\n actualText,\n passed\n ? undefined\n : message || (exact\n ? `Text \"${actualText}\" does not match expected \"${expectedText}\"`\n : `Text \"${actualText}\" does not contain \"${expectedText}\"`),\n passed ? undefined : 'Verify the element contains the expected text',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert input value\n */\n private assertValue(\n element: AIDiscoveredElement,\n expectedValue: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualValue = element.state.value || '';\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed ? undefined : message || `Value \"${actualValue}\" does not match expected \"${expectedValue}\"`,\n passed ? undefined : 'Type the expected value into the input',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element count\n */\n private assertElementCount(\n criteria: SearchCriteria,\n expectedCount: number,\n targetStr: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const searchResponse = this.searchEngine.search(criteria);\n const actualCount = searchResponse.results.length;\n const passed = actualCount === expectedCount;\n\n return this.createResult(\n passed,\n targetStr,\n `${actualCount} elements matching criteria`,\n expectedCount,\n actualCount,\n passed ? undefined : message || `Found ${actualCount} elements but expected ${expectedCount}`,\n passed ? undefined : 'Adjust search criteria or wait for elements to load',\n startTime\n );\n }\n\n /**\n * Assert attribute value (placeholder for DOM attribute assertions)\n */\n private assertAttribute(\n element: AIDiscoveredElement,\n attributeName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual attribute checking\n // For now, handle known attributes from state\n let actualValue: unknown;\n\n switch (attributeName.toLowerCase()) {\n case 'placeholder':\n actualValue = element.placeholder;\n break;\n case 'title':\n actualValue = element.title;\n break;\n default:\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n `Cannot check attribute \"${attributeName}\" without DOM access`,\n 'Use the server API to check element attributes',\n startTime,\n element.state\n );\n }\n\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed ? undefined : message || `Attribute \"${attributeName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element has CSS class\n */\n private assertHasClass(\n element: AIDiscoveredElement,\n className: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual class checking\n return this.createResult(\n false,\n element.id,\n description,\n className,\n undefined,\n 'Cannot check CSS classes without DOM access',\n 'Use the server API to check element classes',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert CSS property value\n */\n private assertCssProperty(\n element: AIDiscoveredElement,\n propertyName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const computedStyles = element.state.computedStyles;\n if (!computedStyles) {\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n 'Computed styles not available',\n 'Request element state with computed styles',\n startTime,\n element.state\n );\n }\n\n const styleKey = propertyName as keyof typeof computedStyles;\n const actualValue = computedStyles[styleKey];\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed ? undefined : message || `CSS property \"${propertyName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Create an assertion result\n */\n private createResult(\n passed: boolean,\n target: string,\n targetDescription: string,\n expected: unknown,\n actual: unknown,\n failureReason?: string,\n suggestion?: string,\n startTime: number = performance.now(),\n elementState?: ElementState\n ): AssertionResult {\n return {\n passed,\n target,\n targetDescription,\n expected,\n actual,\n failureReason,\n suggestion: this.config.includeSuggestions ? suggestion : undefined,\n elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a default assertion executor\n */\nexport function createAssertionExecutor(config?: Partial<AssertionConfig>): AssertionExecutor {\n return new AssertionExecutor(config);\n}\n","/**\n * Semantic Snapshot\n *\n * Creates enhanced state snapshots with AI-friendly element descriptions,\n * form analysis, and modal detection.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { ControlSnapshot, DiscoveredElement } from '../control/types';\nimport type {\n SemanticSnapshot,\n AIDiscoveredElement,\n PageContext,\n FormState,\n FormFieldState,\n ModalState,\n FormAnalysis,\n FormFieldAnalysis,\n} from './types';\nimport { SearchEngine } from './search-engine';\nimport {\n generatePageSummary,\n generateElementDescription,\n inferPageType,\n} from './summary-generator';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n} from './alias-generator';\n\n/**\n * Configuration for semantic snapshots\n */\nexport interface SemanticSnapshotConfig {\n /** Include form analysis */\n analyzeForms: boolean;\n /** Include modal detection */\n detectModals: boolean;\n /** Include page type inference */\n inferPageType: boolean;\n /** Generate element descriptions */\n generateDescriptions: boolean;\n /** Maximum elements to include */\n maxElements: number;\n}\n\n/**\n * Default snapshot configuration\n */\nexport const DEFAULT_SNAPSHOT_CONFIG: SemanticSnapshotConfig = {\n analyzeForms: true,\n detectModals: true,\n inferPageType: true,\n generateDescriptions: true,\n maxElements: 500,\n};\n\n/**\n * Snapshot history for diffing\n */\ninterface SnapshotHistory {\n snapshot: SemanticSnapshot;\n timestamp: number;\n}\n\n/**\n * Semantic Snapshot Manager\n */\nexport class SemanticSnapshotManager {\n private config: SemanticSnapshotConfig;\n private searchEngine: SearchEngine;\n private history: SnapshotHistory[] = [];\n private readonly maxHistorySize = 10;\n private snapshotCounter = 0;\n\n constructor(config: Partial<SemanticSnapshotConfig> = {}) {\n this.config = { ...DEFAULT_SNAPSHOT_CONFIG, ...config };\n this.searchEngine = new SearchEngine();\n }\n\n /**\n * Create a semantic snapshot from a control snapshot\n */\n createSnapshot(\n controlSnapshot: ControlSnapshot,\n pageContext?: Partial<PageContext>\n ): SemanticSnapshot {\n const snapshotId = `snapshot-${++this.snapshotCounter}-${Date.now()}`;\n\n // Convert elements to AI elements\n const aiElements = this.convertElements(controlSnapshot.elements);\n\n // Update search engine\n this.searchEngine.updateElements(aiElements);\n\n // Build page context\n const fullPageContext = this.buildPageContext(aiElements, pageContext);\n\n // Analyze forms\n const forms = this.config.analyzeForms\n ? this.analyzeForms(aiElements)\n : [];\n\n // Detect modals\n const modals = this.config.detectModals\n ? this.detectModals(aiElements)\n : [];\n\n // Count elements by type\n const elementCounts = this.countElementTypes(aiElements);\n\n // Generate summary\n const summary = generatePageSummary(aiElements, fullPageContext);\n\n // Find focused element\n const focusedElement = aiElements.find((el) => el.state.focused)?.id;\n\n const snapshot: SemanticSnapshot = {\n timestamp: Date.now(),\n snapshotId,\n page: fullPageContext,\n elements: aiElements.slice(0, this.config.maxElements),\n forms,\n activeModals: modals,\n focusedElement,\n summary,\n elementCounts,\n };\n\n // Add to history\n this.addToHistory(snapshot);\n\n return snapshot;\n }\n\n /**\n * Get the last snapshot\n */\n getLastSnapshot(): SemanticSnapshot | null {\n if (this.history.length === 0) return null;\n return this.history[this.history.length - 1].snapshot;\n }\n\n /**\n * Get snapshot by ID\n */\n getSnapshot(snapshotId: string): SemanticSnapshot | null {\n const entry = this.history.find((h) => h.snapshot.snapshotId === snapshotId);\n return entry?.snapshot || null;\n }\n\n /**\n * Get snapshot history\n */\n getHistory(): SemanticSnapshot[] {\n return this.history.map((h) => h.snapshot);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Convert control snapshot elements to AI elements\n */\n private convertElements(\n elements: ControlSnapshot['elements']\n ): AIDiscoveredElement[] {\n return elements.map((el) => this.convertElement(el));\n }\n\n /**\n * Convert a single element to AI element\n */\n private convertElement(\n element: ControlSnapshot['elements'][0]\n ): AIDiscoveredElement {\n const aliases = generateAliases({\n textContent: element.state.textContent,\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n });\n\n const description = this.config.generateDescriptions\n ? generateDescription({\n textContent: element.state.textContent,\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n })\n : element.label || element.id;\n\n const purpose = generatePurpose({\n textContent: element.state.textContent,\n elementType: element.type,\n });\n\n const suggestedActions = generateSuggestedActions({\n textContent: element.state.textContent,\n elementType: element.type,\n });\n\n return {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: this.inferTagName(element.type),\n role: this.inferRole(element.type),\n accessibleName: element.label || element.state.textContent?.trim(),\n actions: element.actions,\n state: element.state,\n registered: true,\n description,\n aliases,\n purpose,\n suggestedActions,\n semanticType: this.inferSemanticType(element),\n };\n }\n\n /**\n * Build full page context\n */\n private buildPageContext(\n elements: AIDiscoveredElement[],\n partial?: Partial<PageContext>\n ): PageContext {\n const url = partial?.url || (typeof window !== 'undefined' ? window.location.href : '');\n const title = partial?.title || (typeof document !== 'undefined' ? document.title : '');\n\n const pageType = this.config.inferPageType\n ? inferPageType(url, title, elements)\n : partial?.pageType || 'unknown';\n\n // Detect active modals from elements\n const activeModals = elements\n .filter((el) => el.type === 'dialog' && el.state.visible)\n .map((el) => el.id);\n\n return {\n url,\n title,\n pageType,\n activeModals: partial?.activeModals || activeModals,\n focusedElement: partial?.focusedElement || elements.find((el) => el.state.focused)?.id,\n navigation: partial?.navigation,\n };\n }\n\n /**\n * Analyze forms in the snapshot\n */\n private analyzeForms(elements: AIDiscoveredElement[]): FormState[] {\n const forms: FormState[] = [];\n\n // Find form elements\n const formElements = elements.filter((el) => el.type === 'form');\n\n // If no explicit forms, try to detect implicit forms\n if (formElements.length === 0) {\n const implicitForm = this.detectImplicitForm(elements);\n if (implicitForm) {\n forms.push(implicitForm);\n }\n } else {\n for (const form of formElements) {\n const formState = this.analyzeForm(form, elements);\n if (formState) {\n forms.push(formState);\n }\n }\n }\n\n return forms;\n }\n\n /**\n * Detect implicit form from inputs\n */\n private detectImplicitForm(elements: AIDiscoveredElement[]): FormState | null {\n const inputs = elements.filter(\n (el) =>\n el.type === 'input' ||\n el.type === 'textarea' ||\n el.type === 'select' ||\n el.type === 'checkbox'\n );\n\n if (inputs.length === 0) return null;\n\n // Find potential submit button\n const submitButton = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType === 'submit-button' ||\n el.state.textContent?.toLowerCase().match(/submit|save|send|continue/))\n );\n\n const fields = this.analyzeFormFields(inputs);\n const hasErrors = fields.some((f) => !f.valid);\n\n return {\n id: 'implicit-form',\n purpose: this.inferFormPurpose(inputs),\n fields,\n isValid: !hasErrors,\n submitButton: submitButton?.id,\n isDirty: fields.some((f) => f.value !== '' && f.touched),\n };\n }\n\n /**\n * Analyze a specific form\n */\n private analyzeForm(\n form: AIDiscoveredElement,\n allElements: AIDiscoveredElement[]\n ): FormState | null {\n // Find form fields (simplified - would need DOM relationship data)\n const inputs = allElements.filter(\n (el) =>\n (el.type === 'input' || el.type === 'textarea' || el.type === 'select') &&\n el.state.visible\n );\n\n const fields = this.analyzeFormFields(inputs);\n const hasErrors = fields.some((f) => !f.valid);\n\n // Find submit button\n const submitButton = allElements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n el.semanticType === 'submit-button'\n );\n\n return {\n id: form.id,\n name: form.label,\n purpose: form.purpose,\n fields,\n isValid: !hasErrors,\n submitButton: submitButton?.id,\n isDirty: fields.some((f) => f.value !== ''),\n };\n }\n\n /**\n * Analyze form fields\n */\n private analyzeFormFields(inputs: AIDiscoveredElement[]): FormFieldState[] {\n return inputs.map((input) => ({\n id: input.id,\n label: input.accessibleName || input.label || input.id,\n type: input.type,\n value: input.state.value || '',\n valid: true, // Would need validation state\n required: false, // Would need DOM access\n touched: input.state.focused || (input.state.value?.length || 0) > 0,\n }));\n }\n\n /**\n * Detect modal dialogs\n */\n private detectModals(elements: AIDiscoveredElement[]): ModalState[] {\n const modals: ModalState[] = [];\n\n // Find dialog elements\n const dialogElements = elements.filter(\n (el) => el.type === 'dialog' && el.state.visible\n );\n\n for (const dialog of dialogElements) {\n // Try to find close button within dialog context\n const closeButton = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType === 'cancel-button' ||\n el.state.textContent?.toLowerCase().match(/close|cancel|x|dismiss/))\n );\n\n // Try to find primary action\n const primaryAction = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n el.semanticType === 'submit-button'\n );\n\n modals.push({\n id: dialog.id,\n title: dialog.accessibleName || dialog.label,\n type: this.inferModalType(dialog),\n blocking: true, // Assume dialogs are blocking\n closeButton: closeButton?.id,\n primaryAction: primaryAction?.id,\n });\n }\n\n return modals;\n }\n\n /**\n * Infer modal type\n */\n private inferModalType(dialog: AIDiscoveredElement): ModalState['type'] {\n const text = (dialog.accessibleName || dialog.state.textContent || '').toLowerCase();\n\n if (text.includes('alert') || text.includes('warning') || text.includes('error')) {\n return 'alert';\n }\n if (text.includes('confirm') || text.includes('are you sure')) {\n return 'confirm';\n }\n if (text.includes('prompt') || text.includes('enter')) {\n return 'prompt';\n }\n\n return 'dialog';\n }\n\n /**\n * Count elements by type\n */\n private countElementTypes(elements: AIDiscoveredElement[]): Record<string, number> {\n const counts: Record<string, number> = {};\n\n for (const el of elements) {\n const type = el.type.toLowerCase();\n counts[type] = (counts[type] || 0) + 1;\n }\n\n return counts;\n }\n\n /**\n * Infer form purpose from fields\n */\n private inferFormPurpose(fields: AIDiscoveredElement[]): string {\n const labels = fields.map((f) =>\n (f.accessibleName || f.label || '').toLowerCase()\n );\n const allLabels = labels.join(' ');\n\n if (allLabels.includes('email') && allLabels.includes('password')) {\n if (allLabels.includes('confirm') || allLabels.includes('name')) {\n return 'Registration';\n }\n return 'Login';\n }\n\n if (allLabels.includes('search')) return 'Search';\n if (allLabels.includes('address') || allLabels.includes('city')) return 'Address';\n if (allLabels.includes('card') || allLabels.includes('payment')) return 'Payment';\n if (allLabels.includes('contact') || allLabels.includes('message')) return 'Contact';\n\n return 'Form';\n }\n\n /**\n * Infer tag name from element type\n */\n private inferTagName(type: string): string {\n const typeMap: Record<string, string> = {\n button: 'button',\n input: 'input',\n textarea: 'textarea',\n select: 'select',\n checkbox: 'input',\n radio: 'input',\n link: 'a',\n form: 'form',\n dialog: 'dialog',\n };\n return typeMap[type] || 'div';\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: string): string | undefined {\n const roleMap: Record<string, string> = {\n button: 'button',\n input: 'textbox',\n textarea: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n dialog: 'dialog',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n };\n return roleMap[type];\n }\n\n /**\n * Infer semantic type\n */\n private inferSemanticType(element: ControlSnapshot['elements'][0]): string {\n const text = (element.state.textContent || element.label || '').toLowerCase();\n const type = element.type.toLowerCase();\n\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n if (type === 'input') {\n if (text.includes('email') || element.id.includes('email')) return 'email-input';\n if (text.includes('password') || element.id.includes('password')) return 'password-input';\n if (text.includes('search') || element.id.includes('search')) return 'search-input';\n return 'text-input';\n }\n\n return type;\n }\n\n /**\n * Add snapshot to history\n */\n private addToHistory(snapshot: SemanticSnapshot): void {\n this.history.push({\n snapshot,\n timestamp: Date.now(),\n });\n\n // Trim history if needed\n if (this.history.length > this.maxHistorySize) {\n this.history = this.history.slice(-this.maxHistorySize);\n }\n }\n}\n\n/**\n * Create a semantic snapshot manager\n */\nexport function createSnapshotManager(\n config?: Partial<SemanticSnapshotConfig>\n): SemanticSnapshotManager {\n return new SemanticSnapshotManager(config);\n}\n","/**\n * Semantic Diff\n *\n * Tracks and describes semantic changes between snapshots\n * with LLM-friendly summaries and suggested actions.\n */\n\nimport type {\n SemanticSnapshot,\n SemanticDiff,\n ElementChange,\n ElementModification,\n AIDiscoveredElement,\n} from './types';\nimport { generateDiffSummary } from './summary-generator';\n\n/**\n * Configuration for semantic diff\n */\nexport interface SemanticDiffConfig {\n /** Ignore insignificant changes */\n ignoreInsignificant: boolean;\n /** Properties to track for modifications */\n trackedProperties: string[];\n /** Generate suggested actions */\n generateSuggestions: boolean;\n /** Maximum modifications to report */\n maxModifications: number;\n}\n\n/**\n * Default diff configuration\n */\nexport const DEFAULT_DIFF_CONFIG: SemanticDiffConfig = {\n ignoreInsignificant: true,\n trackedProperties: ['visible', 'enabled', 'focused', 'checked', 'value', 'textContent'],\n generateSuggestions: true,\n maxModifications: 20,\n};\n\n/**\n * Properties that are considered insignificant\n */\nconst INSIGNIFICANT_PROPERTIES = new Set(['rect', 'computedStyles', 'innerHTML']);\n\n/**\n * Compute semantic diff between two snapshots\n */\nexport function computeDiff(\n fromSnapshot: SemanticSnapshot,\n toSnapshot: SemanticSnapshot,\n config: Partial<SemanticDiffConfig> = {}\n): SemanticDiff {\n const startTime = performance.now();\n const finalConfig = { ...DEFAULT_DIFF_CONFIG, ...config };\n\n // Build element maps for comparison\n const fromElements = new Map(fromSnapshot.elements.map((el) => [el.id, el]));\n const toElements = new Map(toSnapshot.elements.map((el) => [el.id, el]));\n\n // Find appeared elements\n const appeared: ElementChange[] = [];\n for (const [id, element] of toElements) {\n if (!fromElements.has(id)) {\n appeared.push({\n elementId: id,\n description: element.description,\n type: element.type,\n semanticType: element.semanticType,\n });\n }\n }\n\n // Find disappeared elements\n const disappeared: ElementChange[] = [];\n for (const [id, element] of fromElements) {\n if (!toElements.has(id)) {\n disappeared.push({\n elementId: id,\n description: element.description,\n type: element.type,\n semanticType: element.semanticType,\n });\n }\n }\n\n // Find modified elements\n const modified: ElementModification[] = [];\n for (const [id, toElement] of toElements) {\n const fromElement = fromElements.get(id);\n if (fromElement) {\n const modifications = compareElements(fromElement, toElement, finalConfig);\n modified.push(...modifications);\n }\n }\n\n // Limit modifications\n const limitedModifications = modified.slice(0, finalConfig.maxModifications);\n\n // Detect probable trigger\n const probableTrigger = detectTrigger(appeared, disappeared, limitedModifications);\n\n // Generate suggested actions\n const suggestedActions = finalConfig.generateSuggestions\n ? generateSuggestedActionsFromDiff(appeared, disappeared, limitedModifications, probableTrigger)\n : undefined;\n\n // Detect page changes\n const pageChanges = detectPageChanges(fromSnapshot, toSnapshot);\n\n // Generate summary\n const summary = generateDiffSummary(\n appeared.map((e) => e.description),\n disappeared.map((e) => e.description),\n limitedModifications\n );\n\n return {\n summary,\n fromSnapshotId: fromSnapshot.snapshotId,\n toSnapshotId: toSnapshot.snapshotId,\n changes: {\n appeared,\n disappeared,\n modified: limitedModifications,\n },\n probableTrigger,\n suggestedActions,\n pageChanges,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Compare two elements and return modifications\n */\nfunction compareElements(\n fromElement: AIDiscoveredElement,\n toElement: AIDiscoveredElement,\n config: SemanticDiffConfig\n): ElementModification[] {\n const modifications: ElementModification[] = [];\n\n for (const property of config.trackedProperties) {\n const fromValue = getPropertyValue(fromElement, property);\n const toValue = getPropertyValue(toElement, property);\n\n if (fromValue !== toValue) {\n // Check significance\n const isSignificant = isSignificantChange(property, fromValue, toValue);\n\n if (!config.ignoreInsignificant || isSignificant) {\n modifications.push({\n elementId: toElement.id,\n description: toElement.description,\n property,\n from: formatValue(fromValue),\n to: formatValue(toValue),\n significant: isSignificant,\n });\n }\n }\n }\n\n return modifications;\n}\n\n/**\n * Get a property value from an element\n */\nfunction getPropertyValue(element: AIDiscoveredElement, property: string): unknown {\n if (property in element.state) {\n return element.state[property as keyof typeof element.state];\n }\n return element[property as keyof AIDiscoveredElement];\n}\n\n/**\n * Check if a change is significant\n */\nfunction isSignificantChange(property: string, fromValue: unknown, toValue: unknown): boolean {\n // Insignificant properties\n if (INSIGNIFICANT_PROPERTIES.has(property)) {\n return false;\n }\n\n // Visibility changes are always significant\n if (property === 'visible') {\n return true;\n }\n\n // Enabled state changes are significant\n if (property === 'enabled') {\n return true;\n }\n\n // Focus changes are significant\n if (property === 'focused') {\n return true;\n }\n\n // Checked state changes are significant\n if (property === 'checked') {\n return true;\n }\n\n // Value changes are significant if non-empty\n if (property === 'value') {\n return Boolean(fromValue) || Boolean(toValue);\n }\n\n // Text content changes are significant if substantial\n if (property === 'textContent') {\n const fromText = String(fromValue || '');\n const toText = String(toValue || '');\n // Significant if more than whitespace changes\n return fromText.trim() !== toText.trim();\n }\n\n return true;\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'string') {\n // Truncate long strings\n if (value.length > 50) {\n return value.substring(0, 47) + '...';\n }\n return value;\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Detect the probable trigger for the changes\n */\nfunction detectTrigger(\n appeared: ElementChange[],\n disappeared: ElementChange[],\n modified: ElementModification[]\n): string | undefined {\n // Check for form validation\n const hasNewErrors = appeared.some(\n (e) => e.description.toLowerCase().includes('error') || e.type === 'error'\n );\n if (hasNewErrors) {\n return 'Form validation';\n }\n\n // Check for modal appearance\n const hasNewModal = appeared.some(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (hasNewModal) {\n return 'Modal opened';\n }\n\n // Check for modal dismissal\n const hasModalDismissed = disappeared.some(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (hasModalDismissed) {\n return 'Modal closed';\n }\n\n // Check for loading state\n const hasLoading = modified.some((m) => m.description.toLowerCase().includes('loading'));\n if (hasLoading) {\n return 'Loading state change';\n }\n\n // Check for focus change\n const hasFocusChange = modified.some((m) => m.property === 'focused');\n if (hasFocusChange && modified.length <= 2) {\n return 'Focus changed';\n }\n\n // Check for value change (user input)\n const hasValueChange = modified.some((m) => m.property === 'value');\n if (hasValueChange && modified.length <= 2) {\n return 'User input';\n }\n\n // Check for visibility changes (dropdown, accordion)\n const visibilityChanges = modified.filter((m) => m.property === 'visible');\n if (visibilityChanges.length > 0 && visibilityChanges.length <= 5) {\n return 'UI expansion/collapse';\n }\n\n // Multiple elements appeared (navigation)\n if (appeared.length > 5) {\n return 'Page navigation';\n }\n\n return undefined;\n}\n\n/**\n * Detect page-level changes\n */\nfunction detectPageChanges(\n fromSnapshot: SemanticSnapshot,\n toSnapshot: SemanticSnapshot\n): SemanticDiff['pageChanges'] | undefined {\n const urlChanged = fromSnapshot.page.url !== toSnapshot.page.url;\n const titleChanged = fromSnapshot.page.title !== toSnapshot.page.title;\n\n if (!urlChanged && !titleChanged) {\n return undefined;\n }\n\n return {\n urlChanged,\n titleChanged,\n newUrl: urlChanged ? toSnapshot.page.url : undefined,\n newTitle: titleChanged ? toSnapshot.page.title : undefined,\n };\n}\n\n/**\n * Generate suggested actions based on the diff\n */\nfunction generateSuggestedActionsFromDiff(\n appeared: ElementChange[],\n disappeared: ElementChange[],\n modified: ElementModification[],\n trigger?: string\n): string[] {\n const suggestions: string[] = [];\n\n // Suggestions based on trigger\n if (trigger === 'Form validation') {\n suggestions.push('Fix the validation errors before submitting');\n }\n\n if (trigger === 'Modal opened') {\n const modal = appeared.find(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (modal) {\n suggestions.push(`Interact with the \"${modal.description}\" dialog`);\n }\n }\n\n if (trigger === 'Modal closed') {\n suggestions.push('Continue with the main page interaction');\n }\n\n // Suggestions based on appeared elements\n for (const element of appeared.slice(0, 3)) {\n if (element.type === 'button' && element.semanticType === 'submit-button') {\n suggestions.push(`Click the \"${element.description}\" to proceed`);\n }\n if (element.description.toLowerCase().includes('error')) {\n suggestions.push(`Address the error: ${element.description}`);\n }\n }\n\n // Suggestions based on modifications\n for (const mod of modified.slice(0, 3)) {\n if (mod.property === 'enabled' && mod.to === 'true') {\n suggestions.push(`\"${mod.description}\" is now enabled`);\n }\n if (mod.property === 'visible' && mod.to === 'true') {\n suggestions.push(`\"${mod.description}\" is now visible`);\n }\n }\n\n return suggestions.slice(0, 5);\n}\n\n/**\n * Create a diff manager for tracking changes over time\n */\nexport class SemanticDiffManager {\n private config: SemanticDiffConfig;\n private lastSnapshot: SemanticSnapshot | null = null;\n\n constructor(config: Partial<SemanticDiffConfig> = {}) {\n this.config = { ...DEFAULT_DIFF_CONFIG, ...config };\n }\n\n /**\n * Update with new snapshot and get diff\n */\n update(newSnapshot: SemanticSnapshot): SemanticDiff | null {\n if (!this.lastSnapshot) {\n this.lastSnapshot = newSnapshot;\n return null;\n }\n\n const diff = computeDiff(this.lastSnapshot, newSnapshot, this.config);\n this.lastSnapshot = newSnapshot;\n return diff;\n }\n\n /**\n * Get diff from a specific snapshot to current\n */\n diffFrom(fromSnapshot: SemanticSnapshot): SemanticDiff | null {\n if (!this.lastSnapshot) return null;\n return computeDiff(fromSnapshot, this.lastSnapshot, this.config);\n }\n\n /**\n * Reset the manager\n */\n reset(): void {\n this.lastSnapshot = null;\n }\n\n /**\n * Get the last known snapshot\n */\n getLastSnapshot(): SemanticSnapshot | null {\n return this.lastSnapshot;\n }\n}\n\n/**\n * Create a semantic diff manager\n */\nexport function createDiffManager(config?: Partial<SemanticDiffConfig>): SemanticDiffManager {\n return new SemanticDiffManager(config);\n}\n\n/**\n * Utility: Check if any significant changes occurred\n */\nexport function hasSignificantChanges(diff: SemanticDiff): boolean {\n if (diff.changes.appeared.length > 0) return true;\n if (diff.changes.disappeared.length > 0) return true;\n if (diff.changes.modified.some((m) => m.significant)) return true;\n if (diff.pageChanges?.urlChanged) return true;\n return false;\n}\n\n/**\n * Utility: Get a brief description of what changed\n */\nexport function describeDiff(diff: SemanticDiff): string {\n const parts: string[] = [];\n\n if (diff.changes.appeared.length > 0) {\n parts.push(`${diff.changes.appeared.length} elements appeared`);\n }\n\n if (diff.changes.disappeared.length > 0) {\n parts.push(`${diff.changes.disappeared.length} elements disappeared`);\n }\n\n const significantMods = diff.changes.modified.filter((m) => m.significant);\n if (significantMods.length > 0) {\n parts.push(`${significantMods.length} elements modified`);\n }\n\n if (diff.pageChanges?.urlChanged) {\n parts.push('URL changed');\n }\n\n if (parts.length === 0) {\n return 'No significant changes';\n }\n\n return parts.join(', ');\n}\n","/**\n * UI Bridge Server Handlers\n *\n * Factory function to create handler implementations for all UI Bridge endpoints.\n */\n\nimport type {\n UIBridgeServerHandlers,\n APIResponse,\n RenderLogQuery,\n} from './types';\nimport type {\n ControlSnapshot,\n} from '../control';\nimport type { RenderLogEntry } from '../render-log';\nimport type {\n ActionFailureDetails,\n ActionErrorCode,\n} from '../core';\nimport type {\n SearchCriteria,\n SearchResponse,\n NLActionRequest,\n NLActionResponse,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SemanticSnapshot,\n SemanticDiff,\n SemanticSearchCriteria,\n SemanticSearchResponse,\n SemanticSearchResult,\n AIDiscoveredElement,\n} from '../ai';\nimport {\n SearchEngine,\n NLActionExecutor,\n AssertionExecutor,\n SemanticSnapshotManager,\n SemanticDiffManager,\n generatePageSummary,\n} from '../ai';\n\n/**\n * Registry interface - minimal contract for handler usage\n */\nexport interface RegistryLike {\n getAllElements(): unknown[];\n getElement(id: string): unknown | undefined;\n getAllComponents(): unknown[];\n getComponent(id: string): unknown | undefined;\n getComponentState?(id: string): { state: Record<string, unknown>; computed: Record<string, unknown>; timestamp: number } | null;\n createSnapshot(): ControlSnapshot;\n getRenderLog?(): RenderLogEntry[];\n clearRenderLog?(): void;\n captureSnapshot?(): unknown;\n findElements?(request?: unknown): unknown[];\n getAllWorkflows?(): unknown[];\n getWorkflow?(id: string): unknown;\n getActionHistory?(): unknown[];\n getMetrics?(): unknown;\n highlightElement?(id: string): void;\n getElementTree?(): unknown;\n}\n\n/**\n * Action executor interface - minimal contract for handler usage\n */\nexport interface ActionExecutorLike {\n executeAction(\n elementId: string,\n request: { action: string; params?: Record<string, unknown>; waitOptions?: unknown }\n ): Promise<unknown>;\n executeComponentAction(\n componentId: string,\n request: { action: string; params?: Record<string, unknown> }\n ): Promise<unknown>;\n}\n\n/**\n * Configuration for creating handlers\n */\nexport interface CreateHandlersConfig {\n /** Optional render log path */\n renderLogPath?: string;\n /** Verbose logging */\n verbose?: boolean;\n}\n\n/**\n * Create a success response\n */\nfunction success<T>(data: T): APIResponse<T> {\n return {\n success: true,\n data,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create an error response\n */\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n return {\n success: false,\n error: message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Generate recovery suggestions based on error code\n */\nfunction getRecoverySuggestions(errorCode: ActionErrorCode): Array<{\n suggestion: string;\n command?: string;\n confidence: number;\n retryable: boolean;\n}> {\n switch (errorCode) {\n case 'ELEMENT_NOT_FOUND':\n return [\n { suggestion: 'Wait for the page to fully load', command: 'wait for page to load', confidence: 0.7, retryable: true },\n { suggestion: 'Use a different description for the element', confidence: 0.8, retryable: false },\n { suggestion: 'Scroll the page to reveal the element', command: 'scroll down', confidence: 0.6, retryable: true },\n ];\n case 'ELEMENT_NOT_VISIBLE':\n return [\n { suggestion: 'Scroll to make the element visible', command: 'scroll to element', confidence: 0.9, retryable: true },\n { suggestion: 'Wait for any loading overlays to disappear', confidence: 0.7, retryable: true },\n { suggestion: 'Close any blocking modals or popups', command: 'click close button', confidence: 0.8, retryable: true },\n ];\n case 'ELEMENT_NOT_ENABLED':\n return [\n { suggestion: 'Fill in required fields first', confidence: 0.8, retryable: false },\n { suggestion: 'Complete prerequisite steps in the form', confidence: 0.7, retryable: false },\n { suggestion: 'Wait for the element to become enabled', command: 'wait for element to be enabled', confidence: 0.6, retryable: true },\n ];\n case 'ELEMENT_NOT_INTERACTABLE':\n return [\n { suggestion: 'Close any modal or popup blocking the element', command: 'click close button', confidence: 0.9, retryable: true },\n { suggestion: 'Wait for animations to complete', confidence: 0.7, retryable: true },\n { suggestion: 'Scroll the element into the viewport', command: 'scroll to element', confidence: 0.8, retryable: true },\n ];\n case 'ACTION_TIMEOUT':\n return [\n { suggestion: 'Increase the timeout duration', confidence: 0.8, retryable: true },\n { suggestion: 'Check if the condition can ever be met', confidence: 0.7, retryable: false },\n { suggestion: 'Verify the page is responding', command: 'check page status', confidence: 0.6, retryable: true },\n ];\n case 'LOW_CONFIDENCE':\n return [\n { suggestion: 'Use the exact text shown on the element', confidence: 0.9, retryable: false },\n { suggestion: 'Try a different description that more closely matches the element', confidence: 0.8, retryable: false },\n { suggestion: 'Lower the confidence threshold if the match is correct', confidence: 0.7, retryable: true },\n ];\n case 'AMBIGUOUS_MATCH':\n return [\n { suggestion: 'Be more specific about which element you mean', confidence: 0.9, retryable: false },\n { suggestion: 'Include the section or form name in the description', confidence: 0.8, retryable: false },\n { suggestion: 'Use the element ID directly', confidence: 0.7, retryable: false },\n ];\n default:\n return [\n { suggestion: 'Try a different approach or check the page state', confidence: 0.5, retryable: false },\n ];\n }\n}\n\n/**\n * Create structured failure details\n */\nfunction createFailureDetails(\n errorCode: ActionErrorCode,\n message: string,\n options: {\n elementId?: string;\n selectorsTried?: string[];\n durationMs?: number;\n timeoutMs?: number;\n } = {}\n): ActionFailureDetails {\n const retryableErrors: ActionErrorCode[] = [\n 'ELEMENT_NOT_VISIBLE',\n 'ACTION_TIMEOUT',\n 'LOW_CONFIDENCE',\n 'NETWORK_ERROR',\n 'STATE_NOT_REACHED',\n ];\n\n return {\n errorCode,\n message,\n elementId: options.elementId,\n selectorsTried: options.selectorsTried,\n suggestedActions: getRecoverySuggestions(errorCode),\n retryRecommended: retryableErrors.includes(errorCode),\n durationMs: options.durationMs,\n timeoutMs: options.timeoutMs,\n };\n}\n\n/**\n * Create server handlers for UI Bridge\n *\n * @param registry - The UI Bridge registry instance\n * @param actionExecutor - The action executor instance\n * @param config - Optional configuration\n * @returns Handler implementations for all endpoints\n *\n * @example\n * ```ts\n * import { createHandlers } from '@qontinui/ui-bridge/server';\n * import { getGlobalRegistry, createActionExecutor } from '@qontinui/ui-bridge';\n *\n * const registry = getGlobalRegistry();\n * const executor = createActionExecutor(registry);\n * const handlers = createHandlers(registry, executor);\n *\n * // Use with Express\n * const router = createExpressRouter(handlers);\n *\n * // Use with standalone server\n * const server = new StandaloneServer(handlers);\n * ```\n */\nexport function createHandlers(\n registry: RegistryLike,\n actionExecutor: ActionExecutorLike,\n config: CreateHandlersConfig = {}\n): UIBridgeServerHandlers {\n // Create AI module instances\n const searchEngine = new SearchEngine();\n const nlExecutor = new NLActionExecutor();\n const assertionExecutor = new AssertionExecutor();\n const snapshotManager = new SemanticSnapshotManager();\n const diffManager = new SemanticDiffManager();\n\n // Helper to get fresh elements and update AI modules\n function refreshElements(): void {\n const elements = registry.getAllElements();\n searchEngine.updateElements(elements as any[]);\n nlExecutor.updateElements(elements as any[]);\n nlExecutor.setActionExecutor(actionExecutor as any);\n assertionExecutor.updateElements(elements as any[]);\n }\n\n return {\n // =========================================================================\n // Render Log Handlers\n // =========================================================================\n\n getRenderLog: async (query?: RenderLogQuery): Promise<APIResponse<RenderLogEntry[]>> => {\n try {\n const entries = registry.getRenderLog?.() ?? [];\n\n let filtered = entries;\n\n if (query?.type) {\n filtered = filtered.filter((e) => e.type === query.type);\n }\n if (query?.since) {\n filtered = filtered.filter((e) => e.timestamp >= query.since!);\n }\n if (query?.until) {\n filtered = filtered.filter((e) => e.timestamp <= query.until!);\n }\n if (query?.limit) {\n filtered = filtered.slice(0, query.limit);\n }\n\n return success(filtered);\n } catch (err) {\n return error((err as Error).message, 'RENDER_LOG_ERROR');\n }\n },\n\n clearRenderLog: async (): Promise<APIResponse<void>> => {\n try {\n registry.clearRenderLog?.();\n return success(undefined);\n } catch (err) {\n return error((err as Error).message, 'RENDER_LOG_ERROR');\n }\n },\n\n captureSnapshot: async (): Promise<APIResponse<unknown>> => {\n try {\n const snapshot = registry.captureSnapshot?.();\n return success(snapshot);\n } catch (err) {\n return error((err as Error).message, 'SNAPSHOT_ERROR');\n }\n },\n\n getRenderLogPath: async (): Promise<APIResponse<{ path: string }>> => {\n return success({ path: config.renderLogPath || '' });\n },\n\n // =========================================================================\n // Element Handlers\n // =========================================================================\n\n getElements: async (): Promise<APIResponse<ControlSnapshot['elements']>> => {\n try {\n const elements = registry.getAllElements();\n return success(elements as ControlSnapshot['elements']);\n } catch (err) {\n return error((err as Error).message, 'ELEMENTS_ERROR');\n }\n },\n\n getElement: async (id: string): Promise<APIResponse<ControlSnapshot['elements'][0]>> => {\n try {\n const element = registry.getElement(id);\n if (!element) {\n const failureDetails = createFailureDetails('ELEMENT_NOT_FOUND', `Element not found: ${id}`, {\n elementId: id,\n selectorsTried: [id],\n });\n return {\n success: false,\n error: `Element not found: ${id}`,\n code: 'ELEMENT_NOT_FOUND',\n data: { failureDetails } as any,\n timestamp: Date.now(),\n };\n }\n return success(element as ControlSnapshot['elements'][0]);\n } catch (err) {\n return error((err as Error).message, 'ELEMENT_ERROR');\n }\n },\n\n getElementState: async (id: string): Promise<APIResponse<unknown>> => {\n try {\n const element = registry.getElement(id) as { state?: unknown } | undefined;\n if (!element) {\n return error(`Element not found: ${id}`, 'NOT_FOUND');\n }\n return success(element.state);\n } catch (err) {\n return error((err as Error).message, 'ELEMENT_STATE_ERROR');\n }\n },\n\n executeElementAction: async (\n id: string,\n request: { action: string; params?: Record<string, unknown>; waitOptions?: unknown }\n ) => {\n const startTime = Date.now();\n try {\n // Check if element exists first\n const element = registry.getElement(id);\n if (!element) {\n const failureDetails = createFailureDetails('ELEMENT_NOT_FOUND', `Element not found: ${id}`, {\n elementId: id,\n selectorsTried: [id],\n durationMs: Date.now() - startTime,\n });\n return {\n success: false,\n error: `Element not found: ${id}`,\n code: 'ELEMENT_NOT_FOUND',\n data: {\n success: false,\n error: `Element not found: ${id}`,\n failureDetails,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n },\n timestamp: Date.now(),\n } as APIResponse<any>;\n }\n\n const result = await actionExecutor.executeAction(id, {\n action: request.action,\n params: request.params,\n waitOptions: request.waitOptions,\n });\n\n // If the action executor returned a failure, enhance with structured details\n if (result && typeof result === 'object' && 'success' in result && !result.success) {\n const actionResult = result as { success: boolean; error?: string; elementState?: unknown };\n // Determine error code based on error message\n let errorCode: ActionErrorCode = 'UNKNOWN_ERROR';\n const errorMsg = actionResult.error?.toLowerCase() || '';\n\n if (errorMsg.includes('not found')) {\n errorCode = 'ELEMENT_NOT_FOUND';\n } else if (errorMsg.includes('not visible') || errorMsg.includes('hidden')) {\n errorCode = 'ELEMENT_NOT_VISIBLE';\n } else if (errorMsg.includes('disabled') || errorMsg.includes('not enabled')) {\n errorCode = 'ELEMENT_NOT_ENABLED';\n } else if (errorMsg.includes('timeout')) {\n errorCode = 'ACTION_TIMEOUT';\n } else if (errorMsg.includes('blocked') || errorMsg.includes('interactable')) {\n errorCode = 'ELEMENT_NOT_INTERACTABLE';\n }\n\n const failureDetails = createFailureDetails(errorCode, actionResult.error || 'Action failed', {\n elementId: id,\n durationMs: Date.now() - startTime,\n });\n\n return success({\n ...actionResult,\n failureDetails,\n }) as APIResponse<any>;\n }\n\n return success(result) as APIResponse<any>;\n } catch (err) {\n const errorMessage = (err as Error).message;\n let errorCode: ActionErrorCode = 'UNKNOWN_ERROR';\n\n if (errorMessage.includes('not found')) {\n errorCode = 'ELEMENT_NOT_FOUND';\n } else if (errorMessage.includes('timeout')) {\n errorCode = 'ACTION_TIMEOUT';\n } else if (errorMessage.includes('network') || errorMessage.includes('fetch')) {\n errorCode = 'NETWORK_ERROR';\n }\n\n const failureDetails = createFailureDetails(errorCode, errorMessage, {\n elementId: id,\n durationMs: Date.now() - startTime,\n });\n\n return {\n success: false,\n error: errorMessage,\n code: errorCode,\n data: {\n success: false,\n error: errorMessage,\n failureDetails,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n },\n timestamp: Date.now(),\n } as APIResponse<any>;\n }\n },\n\n // =========================================================================\n // Component Handlers\n // =========================================================================\n\n getComponents: async (): Promise<APIResponse<ControlSnapshot['components']>> => {\n try {\n const components = registry.getAllComponents();\n return success(components as ControlSnapshot['components']);\n } catch (err) {\n return error((err as Error).message, 'COMPONENTS_ERROR');\n }\n },\n\n getComponent: async (id: string): Promise<APIResponse<ControlSnapshot['components'][0]>> => {\n try {\n const component = registry.getComponent(id);\n if (!component) {\n return error(`Component not found: ${id}`, 'NOT_FOUND');\n }\n return success(component as ControlSnapshot['components'][0]);\n } catch (err) {\n return error((err as Error).message, 'COMPONENT_ERROR');\n }\n },\n\n getComponentState: async (id: string): Promise<APIResponse<{ state: Record<string, unknown>; computed: Record<string, unknown>; timestamp: number }>> => {\n try {\n // First check if the component exists\n const component = registry.getComponent(id);\n if (!component) {\n return error(`Component not found: ${id}`, 'NOT_FOUND');\n }\n\n // Use registry's getComponentState if available\n if (registry.getComponentState) {\n const stateResponse = registry.getComponentState(id);\n if (!stateResponse) {\n return error(`Component not found or not mounted: ${id}`, 'NOT_FOUND');\n }\n return success(stateResponse);\n }\n\n // Fallback: component exists but doesn't expose state\n const comp = component as { getState?: () => Record<string, unknown>; getComputed?: () => Record<string, unknown> };\n return success({\n state: comp.getState?.() ?? {},\n computed: comp.getComputed?.() ?? {},\n timestamp: Date.now(),\n });\n } catch (err) {\n return error((err as Error).message, 'COMPONENT_STATE_ERROR');\n }\n },\n\n executeComponentAction: async (\n id: string,\n request: { action: string; params?: Record<string, unknown> }\n ) => {\n try {\n const result = await actionExecutor.executeComponentAction(id, {\n action: request.action,\n params: request.params,\n });\n return success(result) as APIResponse<any>;\n } catch (err) {\n return error((err as Error).message, 'COMPONENT_ACTION_ERROR');\n }\n },\n\n // =========================================================================\n // Find/Discovery Handlers\n // =========================================================================\n\n find: async (request?: unknown) => {\n try {\n const findRequest = request as { types?: string[]; selector?: string; limit?: number } | undefined;\n const elements = registry.findElements?.(findRequest) ?? registry.getAllElements();\n return success({ elements, timestamp: Date.now(), total: (elements as unknown[]).length, durationMs: 0 }) as APIResponse<any>;\n } catch (err) {\n return error((err as Error).message, 'FIND_ERROR');\n }\n },\n\n discover: async (request?: unknown) => {\n // Deprecated, delegates to find\n try {\n const findRequest = request as { types?: string[]; selector?: string; limit?: number } | undefined;\n const elements = registry.findElements?.(findRequest) ?? registry.getAllElements();\n return success({ elements, timestamp: Date.now(), total: (elements as unknown[]).length, durationMs: 0 }) as APIResponse<any>;\n } catch (err) {\n return error((err as Error).message, 'DISCOVER_ERROR');\n }\n },\n\n getControlSnapshot: async (): Promise<APIResponse<ControlSnapshot>> => {\n try {\n const snapshot = registry.createSnapshot();\n return success(snapshot);\n } catch (err) {\n return error((err as Error).message, 'SNAPSHOT_ERROR');\n }\n },\n\n // =========================================================================\n // Workflow Handlers\n // =========================================================================\n\n getWorkflows: async (): Promise<APIResponse<ControlSnapshot['workflows']>> => {\n try {\n const workflows = registry.getAllWorkflows?.() ?? [];\n return success(workflows as ControlSnapshot['workflows']);\n } catch (err) {\n return error((err as Error).message, 'WORKFLOWS_ERROR');\n }\n },\n\n runWorkflow: async (\n id: string,\n _request?: unknown\n ) => {\n try {\n const workflow = registry.getWorkflow?.(id);\n if (!workflow) {\n return error(`Workflow not found: ${id}`, 'NOT_FOUND');\n }\n // TODO: Implement actual workflow execution\n const runId = `run-${Date.now()}`;\n return success({\n runId,\n workflowId: id,\n status: 'pending',\n startedAt: Date.now(),\n steps: [],\n totalSteps: 0,\n }) as APIResponse<any>;\n } catch (err) {\n return error((err as Error).message, 'WORKFLOW_ERROR');\n }\n },\n\n getWorkflowStatus: async (runId: string) => {\n try {\n // TODO: Implement workflow status tracking\n return success({\n runId,\n workflowId: '',\n status: 'completed',\n completedAt: Date.now(),\n startedAt: Date.now(),\n steps: [],\n totalSteps: 0,\n }) as APIResponse<any>;\n } catch (err) {\n return error((err as Error).message, 'WORKFLOW_STATUS_ERROR');\n }\n },\n\n // =========================================================================\n // Debug Handlers\n // =========================================================================\n\n getActionHistory: async (limit?: number): Promise<APIResponse<unknown[]>> => {\n try {\n const history = registry.getActionHistory?.() ?? [];\n const limited = limit ? history.slice(-limit) : history;\n return success(limited);\n } catch (err) {\n return error((err as Error).message, 'ACTION_HISTORY_ERROR');\n }\n },\n\n getMetrics: async (): Promise<APIResponse<unknown>> => {\n try {\n const metrics = registry.getMetrics?.() ?? {\n elementCount: registry.getAllElements().length,\n componentCount: registry.getAllComponents().length,\n };\n return success(metrics);\n } catch (err) {\n return error((err as Error).message, 'METRICS_ERROR');\n }\n },\n\n highlightElement: async (id: string): Promise<APIResponse<void>> => {\n try {\n registry.highlightElement?.(id);\n return success(undefined);\n } catch (err) {\n return error((err as Error).message, 'HIGHLIGHT_ERROR');\n }\n },\n\n getElementTree: async (): Promise<APIResponse<unknown>> => {\n try {\n const tree = registry.getElementTree?.() ?? { root: null, elements: [] };\n return success(tree);\n } catch (err) {\n return error((err as Error).message, 'ELEMENT_TREE_ERROR');\n }\n },\n\n // =========================================================================\n // AI-Native Handlers\n // =========================================================================\n\n aiSearch: async (criteria: SearchCriteria): Promise<APIResponse<SearchResponse>> => {\n try {\n // Refresh elements before search\n refreshElements();\n const response = searchEngine.search(criteria);\n return success(response);\n } catch (err) {\n return error((err as Error).message, 'AI_SEARCH_ERROR');\n }\n },\n\n aiExecute: async (request: NLActionRequest): Promise<APIResponse<NLActionResponse>> => {\n try {\n // Refresh elements before execution\n refreshElements();\n const response = await nlExecutor.execute(request);\n return success(response);\n } catch (err) {\n return error((err as Error).message, 'AI_EXECUTE_ERROR');\n }\n },\n\n aiAssert: async (request: AssertionRequest): Promise<APIResponse<AssertionResult>> => {\n try {\n // Refresh elements before assertion\n refreshElements();\n const result = await assertionExecutor.assert(request);\n return success(result);\n } catch (err) {\n return error((err as Error).message, 'AI_ASSERT_ERROR');\n }\n },\n\n aiAssertBatch: async (request: BatchAssertionRequest): Promise<APIResponse<BatchAssertionResult>> => {\n try {\n // Refresh elements before batch assertion\n refreshElements();\n const result = await assertionExecutor.assertBatch(request);\n return success(result);\n } catch (err) {\n return error((err as Error).message, 'AI_ASSERT_BATCH_ERROR');\n }\n },\n\n getSemanticSnapshot: async (): Promise<APIResponse<SemanticSnapshot>> => {\n try {\n const controlSnapshot = registry.createSnapshot();\n const snapshot = snapshotManager.createSnapshot(controlSnapshot);\n return success(snapshot);\n } catch (err) {\n return error((err as Error).message, 'SEMANTIC_SNAPSHOT_ERROR');\n }\n },\n\n getSemanticDiff: async (_since?: number): Promise<APIResponse<SemanticDiff | null>> => {\n try {\n // Create current snapshot\n const controlSnapshot = registry.createSnapshot();\n const currentSnapshot = snapshotManager.createSnapshot(controlSnapshot);\n\n // Update the diff manager and get the diff from previous state\n const diff = diffManager.update(currentSnapshot);\n return success(diff);\n } catch (err) {\n return error((err as Error).message, 'SEMANTIC_DIFF_ERROR');\n }\n },\n\n getPageSummary: async (): Promise<APIResponse<string>> => {\n try {\n const snapshot = registry.createSnapshot();\n // Convert snapshot elements to AI elements format for summary\n const elements = snapshot.elements.map(el => ({\n ...el,\n description: el.label || el.id,\n aliases: [],\n suggestedActions: [],\n tagName: el.type,\n accessibleName: el.label,\n registered: true,\n })) as any[];\n const summary = generatePageSummary(elements);\n return success(summary);\n } catch (err) {\n return error((err as Error).message, 'PAGE_SUMMARY_ERROR');\n }\n },\n\n // =========================================================================\n // Semantic Search Handler (Embedding-based)\n // =========================================================================\n\n aiSemanticSearch: async (criteria: SemanticSearchCriteria): Promise<APIResponse<SemanticSearchResponse>> => {\n const startTime = performance.now();\n try {\n // Refresh elements for search\n refreshElements();\n\n // Get all elements\n const allElements = registry.getAllElements() as any[];\n\n // Convert to AI discovered elements for semantic search\n const aiElements: Array<{ element: AIDiscoveredElement; text: string }> = allElements.map(el => {\n // Build searchable text from element properties\n const textParts: string[] = [];\n\n // Prioritize description and accessible name for semantic matching\n const state = 'getState' in el ? (el as any).getState() : el.state;\n const textContent = state?.textContent || '';\n const label = el.label || '';\n const accessibleName = el.accessibleName || '';\n const placeholder = el.placeholder || '';\n const title = el.title || '';\n\n if (label) textParts.push(label);\n if (accessibleName && accessibleName !== label) textParts.push(accessibleName);\n if (textContent && textContent !== label && textContent !== accessibleName) {\n textParts.push(textContent);\n }\n if (placeholder) textParts.push(`placeholder: ${placeholder}`);\n if (title) textParts.push(title);\n\n const combinedText = textParts.join(' ').trim() || el.id;\n\n return {\n element: {\n id: el.id,\n type: el.type,\n label: el.label,\n tagName: el.tagName || el.type,\n role: el.role,\n accessibleName: el.accessibleName,\n actions: el.actions || [],\n state: state || {},\n registered: true,\n description: label || el.id,\n aliases: [],\n suggestedActions: [],\n } as AIDiscoveredElement,\n text: combinedText,\n };\n });\n\n // Apply type/role filters if specified\n let filteredElements = aiElements;\n if (criteria.type) {\n filteredElements = filteredElements.filter(\n ({ element }) => element.type.toLowerCase() === criteria.type!.toLowerCase()\n );\n }\n if (criteria.role) {\n filteredElements = filteredElements.filter(\n ({ element }) => element.role?.toLowerCase() === criteria.role!.toLowerCase()\n );\n }\n\n // NOTE: Semantic search with embeddings requires server-side embedding support.\n // This handler provides the API structure. Actual embedding computation\n // should be delegated to the qontinui library or a separate embedding service.\n //\n // For now, we fall back to fuzzy text matching as a placeholder.\n // In production, this would call the qontinui embeddings module.\n\n const query = criteria.query.toLowerCase();\n const threshold = criteria.threshold ?? 0.5;\n const limit = criteria.limit ?? 10;\n\n // Simple text similarity as fallback (to be replaced with embedding similarity)\n const scoredResults: SemanticSearchResult[] = filteredElements.map(({ element, text }) => {\n // Calculate basic text similarity\n const textLower = text.toLowerCase();\n let similarity = 0;\n\n // Exact match\n if (textLower.includes(query)) {\n similarity = 0.9;\n } else {\n // Word overlap similarity\n const queryWords = new Set(query.split(/\\s+/).filter((w: string) => w.length > 2));\n const textWords = new Set(textLower.split(/\\s+/).filter((w: string) => w.length > 2));\n\n if (queryWords.size > 0 && textWords.size > 0) {\n let matchCount = 0;\n for (const word of queryWords) {\n for (const textWord of textWords) {\n if (textWord.includes(word) || word.includes(textWord)) {\n matchCount++;\n break;\n }\n }\n }\n similarity = matchCount / queryWords.size * 0.7;\n }\n }\n\n return {\n element,\n similarity,\n rank: 0, // Will be set after sorting\n embeddedText: text,\n };\n });\n\n // Filter by threshold and sort by similarity\n const filteredResults = scoredResults\n .filter(r => r.similarity >= threshold)\n .sort((a, b) => b.similarity - a.similarity)\n .slice(0, limit);\n\n // Set ranks\n filteredResults.forEach((result, index) => {\n result.rank = index + 1;\n });\n\n const response: SemanticSearchResponse = {\n results: filteredResults,\n bestMatch: filteredResults.length > 0 ? filteredResults[0] : null,\n scannedCount: filteredElements.length,\n durationMs: performance.now() - startTime,\n query: criteria.query,\n providerInfo: {\n provider: 'text-fallback',\n model: 'simple-similarity',\n dimension: 0,\n },\n timestamp: Date.now(),\n };\n\n return success(response);\n } catch (err) {\n return error((err as Error).message, 'AI_SEMANTIC_SEARCH_ERROR');\n }\n },\n };\n}\n\n/**\n * Create partial handlers for AI-specific functionality only\n *\n * Use this when you want to add AI endpoints to an existing handler setup.\n */\nexport function createAIHandlers(\n registry: RegistryLike,\n actionExecutor: ActionExecutorLike\n): Pick<\n UIBridgeServerHandlers,\n | 'aiSearch'\n | 'aiExecute'\n | 'aiAssert'\n | 'aiAssertBatch'\n | 'getSemanticSnapshot'\n | 'getSemanticDiff'\n | 'getPageSummary'\n> {\n const searchEngine = new SearchEngine();\n const nlExecutor = new NLActionExecutor();\n const assertionExecutor = new AssertionExecutor();\n const snapshotManager = new SemanticSnapshotManager();\n const diffManager = new SemanticDiffManager();\n\n function refreshElements(): void {\n const elements = registry.getAllElements();\n searchEngine.updateElements(elements as any[]);\n nlExecutor.updateElements(elements as any[]);\n nlExecutor.setActionExecutor(actionExecutor as any);\n assertionExecutor.updateElements(elements as any[]);\n }\n\n return {\n aiSearch: async (criteria: SearchCriteria): Promise<APIResponse<SearchResponse>> => {\n try {\n refreshElements();\n const response = searchEngine.search(criteria);\n return { success: true, data: response, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'AI_SEARCH_ERROR', timestamp: Date.now() };\n }\n },\n\n aiExecute: async (request: NLActionRequest): Promise<APIResponse<NLActionResponse>> => {\n try {\n refreshElements();\n const response = await nlExecutor.execute(request);\n return { success: true, data: response, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'AI_EXECUTE_ERROR', timestamp: Date.now() };\n }\n },\n\n aiAssert: async (request: AssertionRequest): Promise<APIResponse<AssertionResult>> => {\n try {\n refreshElements();\n const result = await assertionExecutor.assert(request);\n return { success: true, data: result, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'AI_ASSERT_ERROR', timestamp: Date.now() };\n }\n },\n\n aiAssertBatch: async (request: BatchAssertionRequest): Promise<APIResponse<BatchAssertionResult>> => {\n try {\n refreshElements();\n const result = await assertionExecutor.assertBatch(request);\n return { success: true, data: result, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'AI_ASSERT_BATCH_ERROR', timestamp: Date.now() };\n }\n },\n\n getSemanticSnapshot: async (): Promise<APIResponse<SemanticSnapshot>> => {\n try {\n const controlSnapshot = registry.createSnapshot();\n const snapshot = snapshotManager.createSnapshot(controlSnapshot);\n return { success: true, data: snapshot, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'SEMANTIC_SNAPSHOT_ERROR', timestamp: Date.now() };\n }\n },\n\n getSemanticDiff: async (_since?: number): Promise<APIResponse<SemanticDiff | null>> => {\n try {\n const controlSnapshot = registry.createSnapshot();\n const currentSnapshot = snapshotManager.createSnapshot(controlSnapshot);\n const diff = diffManager.update(currentSnapshot);\n return { success: true, data: diff, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'SEMANTIC_DIFF_ERROR', timestamp: Date.now() };\n }\n },\n\n getPageSummary: async (): Promise<APIResponse<string>> => {\n try {\n const snapshot = registry.createSnapshot();\n // Convert snapshot elements to AI elements format for summary\n const elements = snapshot.elements.map(el => ({\n ...el,\n description: el.label || el.id,\n aliases: [],\n suggestedActions: [],\n tagName: el.type,\n accessibleName: el.label,\n registered: true,\n })) as any[];\n const summary = generatePageSummary(elements);\n return { success: true, data: summary, timestamp: Date.now() };\n } catch (err) {\n return { success: false, error: (err as Error).message, code: 'PAGE_SUMMARY_ERROR', timestamp: Date.now() };\n }\n },\n };\n}\n","/**\n * Express Adapter\n *\n * Express.js middleware for UI Bridge server.\n */\n\nimport type { Router, Request, Response, NextFunction } from 'express';\nimport type {\n UIBridgeServerConfig,\n UIBridgeServerHandlers,\n APIResponse,\n RouteDefinition,\n CORSOptions,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\n\n/**\n * Express-specific configuration\n */\nexport interface ExpressAdapterConfig extends UIBridgeServerConfig {\n /** Use JSON body parser (if not already configured) */\n useBodyParser?: boolean;\n}\n\n/**\n * Create CORS middleware\n */\nfunction createCORSMiddleware(options: CORSOptions | boolean) {\n const corsOptions: CORSOptions =\n typeof options === 'boolean'\n ? { origin: options, methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'] }\n : options;\n\n return (req: Request, res: Response, next: NextFunction) => {\n // Origin\n if (corsOptions.origin === true) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof corsOptions.origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', corsOptions.origin);\n } else if (Array.isArray(corsOptions.origin)) {\n const origin = req.headers.origin;\n if (origin && corsOptions.origin.includes(origin)) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n }\n }\n\n // Methods\n if (corsOptions.methods) {\n res.setHeader('Access-Control-Allow-Methods', corsOptions.methods.join(', '));\n }\n\n // Headers\n if (corsOptions.headers) {\n res.setHeader('Access-Control-Allow-Headers', corsOptions.headers.join(', '));\n } else {\n res.setHeader(\n 'Access-Control-Allow-Headers',\n 'Content-Type, Authorization, X-Requested-With'\n );\n }\n\n // Credentials\n if (corsOptions.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n // Max age\n if (corsOptions.maxAge) {\n res.setHeader('Access-Control-Max-Age', String(corsOptions.maxAge));\n }\n\n // Handle preflight\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n };\n}\n\n/**\n * Wrap error in API format\n */\nfunction wrapError(error: Error | string, code?: string): APIResponse<never> {\n return {\n success: false,\n error: typeof error === 'string' ? error : error.message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create Express router with UI Bridge routes\n */\nexport function createExpressRouter(\n handlers: UIBridgeServerHandlers,\n config: ExpressAdapterConfig = {}\n): Router {\n // Dynamic import to avoid bundling Express if not used\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const express = require('express');\n const router: Router = express.Router();\n\n // Add CORS middleware if configured\n if (config.cors) {\n router.use(createCORSMiddleware(config.cors));\n }\n\n // Add body parser if requested\n if (config.useBodyParser) {\n router.use(express.json());\n }\n\n // Add authentication middleware if configured\n if (config.authenticate) {\n router.use(async (req: Request, res: Response, next: NextFunction) => {\n try {\n const authenticated = await config.authenticate!(req);\n if (!authenticated) {\n res.status(401).json(wrapError('Unauthorized', 'UNAUTHORIZED'));\n return;\n }\n next();\n } catch (error) {\n res.status(500).json(wrapError(error as Error, 'AUTH_ERROR'));\n }\n });\n }\n\n // Register routes\n for (const route of UI_BRIDGE_ROUTES) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch';\n const path = route.path;\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = handlers[handlerName];\n\n if (!handler) {\n console.warn(`Handler not found for route: ${route.method} ${route.path}`);\n continue;\n }\n\n router[method](\n path,\n createRouteHandler(route, handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)\n );\n }\n\n return router;\n}\n\n/**\n * Create a route handler from a route definition\n */\nfunction createRouteHandler(\n route: RouteDefinition,\n handler: (...args: unknown[]) => Promise<APIResponse<unknown>>\n) {\n return async (req: Request, res: Response) => {\n try {\n // Extract params\n const args: unknown[] = [];\n\n if (route.params) {\n for (const param of route.params) {\n args.push(req.params[param]);\n }\n }\n\n // Add body if required\n if (route.bodyRequired || route.method === 'POST') {\n args.push(req.body);\n }\n\n // Add query params for GET requests\n if (route.method === 'GET' && Object.keys(req.query).length > 0) {\n args.push(req.query);\n }\n\n const result = await handler(...args);\n res.json(result);\n } catch (error) {\n res.status(500).json(wrapError(error as Error, 'INTERNAL_ERROR'));\n }\n };\n}\n\n/**\n * Create Express app with UI Bridge routes\n *\n * Convenience function that creates a complete Express app with UI Bridge.\n */\nexport function createExpressApp(\n handlers: UIBridgeServerHandlers,\n config: ExpressAdapterConfig = {}\n): unknown {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const express = require('express');\n const app = express();\n\n app.use(express.json());\n\n const basePath = config.basePath || '/ui-bridge';\n const router = createExpressRouter(handlers, { ...config, useBodyParser: false });\n\n app.use(basePath, router);\n\n // Health check\n app.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: Date.now() });\n });\n\n return app;\n}\n\n/**\n * Express middleware that adds UI Bridge to an existing app\n */\nexport function uiBridgeMiddleware(\n handlers: UIBridgeServerHandlers,\n config: ExpressAdapterConfig = {}\n): Router {\n return createExpressRouter(handlers, config);\n}\n","/**\n * Next.js Adapter\n *\n * Next.js API route handlers for UI Bridge server.\n */\n\n// Define NextRequest interface locally to avoid requiring next as a dependency\ninterface NextRequest extends Request {\n nextUrl: URL;\n}\nimport type {\n UIBridgeServerConfig,\n UIBridgeServerHandlers,\n APIResponse,\n RouteDefinition,\n RenderLogQuery,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\nimport type {\n ControlActionRequest,\n ComponentActionRequest,\n FindRequest,\n WorkflowRunRequest,\n} from '../control';\n\n/**\n * Next.js specific configuration\n */\nexport interface NextJSAdapterConfig extends UIBridgeServerConfig {\n /** Runtime for edge/serverless */\n runtime?: 'edge' | 'nodejs';\n}\n\n/**\n * Wrap error in API format\n */\nfunction wrapError(error: Error | string, code?: string): APIResponse<never> {\n return {\n success: false,\n error: typeof error === 'string' ? error : error.message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create JSON response\n */\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\n/**\n * Route handler factory for Next.js App Router\n */\nexport type NextRouteHandler = (\n request: NextRequest,\n context: { params: Record<string, string> }\n) => Promise<Response>;\n\n/**\n * Create Next.js route handlers for UI Bridge\n *\n * Use this to create route handlers for the App Router.\n *\n * @example\n * ```ts\n * // app/api/ui-bridge/[...path]/route.ts\n * import { createNextRouteHandlers } from 'ui-bridge-server/nextjs';\n * import { handlers } from '@/lib/ui-bridge';\n *\n * export const { GET, POST, DELETE } = createNextRouteHandlers(handlers);\n * ```\n */\nexport function createNextRouteHandlers(\n handlers: UIBridgeServerHandlers,\n config: NextJSAdapterConfig = {}\n): {\n GET: NextRouteHandler;\n POST: NextRouteHandler;\n DELETE: NextRouteHandler;\n} {\n const authenticate = config.authenticate;\n\n async function handleRequest(\n request: NextRequest,\n context: { params: Record<string, string> }\n ): Promise<Response> {\n try {\n // Authentication\n if (authenticate) {\n const authenticated = await authenticate(request);\n if (!authenticated) {\n return jsonResponse(wrapError('Unauthorized', 'UNAUTHORIZED'), 401);\n }\n }\n\n // Extract path from catch-all route\n const pathParam = context.params.path;\n const path = Array.isArray(pathParam) ? '/' + pathParam.join('/') : '/' + pathParam;\n const method = request.method;\n\n // Find matching route\n const route = findMatchingRoute(path, method);\n if (!route) {\n return jsonResponse(wrapError('Not found', 'NOT_FOUND'), 404);\n }\n\n // Extract URL params\n const params = extractParams(path, route);\n\n // Get handler\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = handlers[handlerName];\n\n if (!handler) {\n return jsonResponse(wrapError('Handler not found', 'NOT_IMPLEMENTED'), 501);\n }\n\n // Build arguments\n const args: unknown[] = [];\n\n // Add URL params\n if (route.params) {\n for (const param of route.params) {\n args.push(params[param]);\n }\n }\n\n // Add body for POST requests\n if (method === 'POST') {\n try {\n const body = await request.json();\n args.push(body);\n } catch {\n // No body or invalid JSON\n args.push({});\n }\n }\n\n // Add query params for GET requests\n if (method === 'GET') {\n const searchParams = Object.fromEntries(request.nextUrl.searchParams);\n if (Object.keys(searchParams).length > 0) {\n args.push(searchParams);\n }\n }\n\n // Call handler\n const result = await (handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)(\n ...args\n );\n return jsonResponse(result);\n } catch (error) {\n console.error('UI Bridge error:', error);\n return jsonResponse(wrapError(error as Error, 'INTERNAL_ERROR'), 500);\n }\n }\n\n return {\n GET: handleRequest,\n POST: handleRequest,\n DELETE: handleRequest,\n };\n}\n\n/**\n * Find a matching route definition\n */\nfunction findMatchingRoute(path: string, method: string): RouteDefinition | null {\n for (const route of UI_BRIDGE_ROUTES) {\n if (route.method !== method) continue;\n\n // Convert route path to regex\n const routeRegex = route.path.replace(/:[^/]+/g, '([^/]+)').replace(/\\//g, '\\\\/');\n\n const regex = new RegExp(`^${routeRegex}$`);\n if (regex.test(path)) {\n return route;\n }\n }\n return null;\n}\n\n/**\n * Extract params from URL path based on route definition\n */\nfunction extractParams(path: string, route: RouteDefinition): Record<string, string> {\n const params: Record<string, string> = {};\n if (!route.params) return params;\n\n // Extract param values from path\n const routeParts = route.path.split('/');\n const pathParts = path.split('/');\n\n for (let i = 0; i < routeParts.length; i++) {\n const routePart = routeParts[i];\n if (routePart.startsWith(':')) {\n const paramName = routePart.slice(1);\n params[paramName] = pathParts[i];\n }\n }\n\n return params;\n}\n\n/**\n * Individual route handler creators for more granular control\n */\nexport function createRenderLogHandlers(handlers: UIBridgeServerHandlers) {\n return {\n async GET(request: NextRequest): Promise<Response> {\n const searchParams = Object.fromEntries(request.nextUrl.searchParams);\n const query: RenderLogQuery = {\n type: searchParams.type as RenderLogQuery['type'],\n since: searchParams.since ? parseInt(searchParams.since) : undefined,\n until: searchParams.until ? parseInt(searchParams.until) : undefined,\n limit: searchParams.limit ? parseInt(searchParams.limit) : undefined,\n };\n const result = await handlers.getRenderLog(query);\n return jsonResponse(result);\n },\n async DELETE(): Promise<Response> {\n const result = await handlers.clearRenderLog();\n return jsonResponse(result);\n },\n };\n}\n\nexport function createControlHandlers(handlers: UIBridgeServerHandlers) {\n return {\n elements: {\n async GET(): Promise<Response> {\n const result = await handlers.getElements();\n return jsonResponse(result);\n },\n },\n element: {\n async GET(_request: NextRequest, context: { params: { id: string } }): Promise<Response> {\n const result = await handlers.getElement(context.params.id);\n return jsonResponse(result);\n },\n async POST(request: NextRequest, context: { params: { id: string } }): Promise<Response> {\n const body = (await request.json()) as ControlActionRequest;\n const result = await handlers.executeElementAction(context.params.id, body);\n return jsonResponse(result);\n },\n },\n components: {\n async GET(): Promise<Response> {\n const result = await handlers.getComponents();\n return jsonResponse(result);\n },\n },\n component: {\n async GET(_request: NextRequest, context: { params: { id: string } }): Promise<Response> {\n const result = await handlers.getComponent(context.params.id);\n return jsonResponse(result);\n },\n async POST(\n request: NextRequest,\n context: { params: { id: string; actionId: string } }\n ): Promise<Response> {\n const body = (await request.json()) as Omit<ComponentActionRequest, 'action'>;\n const result = await handlers.executeComponentAction(context.params.id, {\n ...body,\n action: context.params.actionId,\n });\n return jsonResponse(result);\n },\n },\n find: {\n async POST(request: NextRequest): Promise<Response> {\n const body = (await request.json()) as FindRequest;\n const result = await handlers.find(body);\n return jsonResponse(result);\n },\n },\n discover: {\n /**\n * @deprecated Use /control/find instead\n */\n async POST(request: NextRequest): Promise<Response> {\n const body = (await request.json()) as FindRequest;\n const result = await handlers.discover(body);\n return jsonResponse(result);\n },\n },\n snapshot: {\n async GET(): Promise<Response> {\n const result = await handlers.getControlSnapshot();\n return jsonResponse(result);\n },\n },\n workflows: {\n async GET(): Promise<Response> {\n const result = await handlers.getWorkflows();\n return jsonResponse(result);\n },\n },\n workflow: {\n async POST(request: NextRequest, context: { params: { id: string } }): Promise<Response> {\n const body = (await request.json()) as WorkflowRunRequest;\n const result = await handlers.runWorkflow(context.params.id, body);\n return jsonResponse(result);\n },\n },\n };\n}\n\nexport function createDebugHandlers(handlers: UIBridgeServerHandlers) {\n return {\n actionHistory: {\n async GET(request: NextRequest): Promise<Response> {\n const limit = request.nextUrl.searchParams.get('limit');\n const result = await handlers.getActionHistory(limit ? parseInt(limit) : undefined);\n return jsonResponse(result);\n },\n },\n metrics: {\n async GET(): Promise<Response> {\n const result = await handlers.getMetrics();\n return jsonResponse(result);\n },\n },\n highlight: {\n async POST(_request: NextRequest, context: { params: { id: string } }): Promise<Response> {\n const result = await handlers.highlightElement(context.params.id);\n return jsonResponse(result);\n },\n },\n };\n}\n","/**\n * WebSocket Handler for UI Bridge Server\n *\n * Handles WebSocket connections and message routing.\n */\n\nimport type { UIBridgeServerHandlers } from './types';\nimport type {\n BridgeEvent,\n BridgeEventType,\n WSClientMessage,\n WSServerMessage,\n WSWelcomeMessage,\n WSPongMessage,\n WSSubscribedMessage,\n WSUnsubscribedMessage,\n WSEventMessage,\n WSResponseMessage,\n WSErrorMessage,\n} from '../core';\n\n/**\n * WebSocket-like interface for compatibility\n */\nexport interface WebSocketLike {\n send(data: string): void;\n close(): void;\n readyState: number;\n onmessage?: ((event: { data: string }) => void) | null;\n onclose?: (() => void) | null;\n onerror?: ((error: unknown) => void) | null;\n}\n\n/**\n * Client subscription state\n */\ninterface ClientSubscription {\n events: Set<BridgeEventType>;\n elementIds: Set<string>;\n componentIds: Set<string>;\n}\n\n/**\n * Connected client info\n */\ninterface ConnectedClient {\n id: string;\n ws: WebSocketLike;\n subscription: ClientSubscription;\n connectedAt: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * UI Bridge server version\n */\nconst VERSION = '0.1.0';\n\n/**\n * WebSocket handler for UI Bridge server\n */\nexport class UIBridgeWSHandler {\n private handlers: UIBridgeServerHandlers;\n private clients = new Map<string, ConnectedClient>();\n private verbose: boolean;\n private log: (message: string) => void;\n\n constructor(\n handlers: UIBridgeServerHandlers,\n options: { verbose?: boolean; log?: (message: string) => void } = {}\n ) {\n this.handlers = handlers;\n this.verbose = options.verbose ?? false;\n this.log = options.log ?? console.log;\n }\n\n /**\n * Handle new WebSocket connection\n */\n handleConnection(ws: WebSocketLike): string {\n const clientId = generateId();\n\n const client: ConnectedClient = {\n id: clientId,\n ws,\n subscription: {\n events: new Set(),\n elementIds: new Set(),\n componentIds: new Set(),\n },\n connectedAt: Date.now(),\n };\n\n this.clients.set(clientId, client);\n\n if (this.verbose) {\n this.log(`[WS] Client connected: ${clientId}`);\n }\n\n // Set up message handler\n ws.onmessage = (event: { data: string }) => {\n this.handleMessage(clientId, event.data);\n };\n\n // Set up close handler\n ws.onclose = () => {\n this.handleDisconnect(clientId);\n };\n\n // Send welcome message\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'welcome',\n timestamp: Date.now(),\n payload: {\n version: VERSION,\n features: {\n renderLog: true,\n control: true,\n debug: true,\n },\n clientId,\n },\n } as WSWelcomeMessage);\n\n return clientId;\n }\n\n /**\n * Handle client disconnect\n */\n handleDisconnect(clientId: string): void {\n this.clients.delete(clientId);\n\n if (this.verbose) {\n this.log(`[WS] Client disconnected: ${clientId}`);\n }\n }\n\n /**\n * Handle incoming message\n */\n private async handleMessage(clientId: string, data: string): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n let message: WSClientMessage;\n try {\n message = JSON.parse(data) as WSClientMessage;\n } catch (error) {\n this.sendError(clientId, undefined, 'PARSE_ERROR', 'Invalid JSON message');\n return;\n }\n\n if (this.verbose) {\n this.log(`[WS] ${clientId} -> ${message.type}`);\n }\n\n try {\n switch (message.type) {\n case 'ping':\n this.handlePing(clientId, message.id);\n break;\n\n case 'subscribe':\n await this.handleSubscribe(clientId, message);\n break;\n\n case 'unsubscribe':\n await this.handleUnsubscribe(clientId, message);\n break;\n\n case 'find':\n await this.handleFind(clientId, message);\n break;\n\n case 'discover':\n // @deprecated Use 'find' instead\n await this.handleFind(clientId, message as unknown as WSClientMessage & { type: 'find' });\n break;\n\n case 'getElement':\n await this.handleGetElement(clientId, message);\n break;\n\n case 'getSnapshot':\n await this.handleGetSnapshot(clientId, message);\n break;\n\n case 'executeAction':\n await this.handleExecuteAction(clientId, message);\n break;\n\n case 'executeComponentAction':\n await this.handleExecuteComponentAction(clientId, message);\n break;\n\n case 'executeWorkflow':\n await this.handleExecuteWorkflow(clientId, message);\n break;\n\n default:\n this.sendError(\n clientId,\n (message as WSClientMessage).id,\n 'UNKNOWN_MESSAGE',\n `Unknown message type: ${(message as WSClientMessage).type}`\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'HANDLER_ERROR', err.message);\n }\n }\n\n /**\n * Handle ping message\n */\n private handlePing(clientId: string, _requestId: string): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'pong',\n timestamp: Date.now(),\n } as WSPongMessage);\n }\n\n /**\n * Handle subscribe message\n */\n private async handleSubscribe(\n clientId: string,\n message: WSClientMessage & { type: 'subscribe' }\n ): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n const { events, elementIds, componentIds } = message.payload;\n\n // Add to subscriptions\n if (events?.length) {\n for (const event of events) {\n client.subscription.events.add(event);\n }\n }\n if (elementIds?.length) {\n for (const id of elementIds) {\n client.subscription.elementIds.add(id);\n }\n }\n if (componentIds?.length) {\n for (const id of componentIds) {\n client.subscription.componentIds.add(id);\n }\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'subscribed',\n timestamp: Date.now(),\n payload: {\n events: Array.from(client.subscription.events),\n },\n } as WSSubscribedMessage);\n }\n\n /**\n * Handle unsubscribe message\n */\n private async handleUnsubscribe(\n clientId: string,\n message: WSClientMessage & { type: 'unsubscribe' }\n ): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n const { events } = message.payload;\n\n let removedEvents: BridgeEventType[];\n if (events?.length) {\n removedEvents = events.filter((e: BridgeEventType) => client.subscription.events.has(e));\n for (const event of events) {\n client.subscription.events.delete(event);\n }\n } else {\n removedEvents = Array.from(client.subscription.events);\n client.subscription.events.clear();\n client.subscription.elementIds.clear();\n client.subscription.componentIds.clear();\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'unsubscribed',\n timestamp: Date.now(),\n payload: {\n events: removedEvents,\n },\n } as WSUnsubscribedMessage);\n }\n\n /**\n * Handle find message\n */\n private async handleFind(\n clientId: string,\n message: WSClientMessage & { type: 'find' }\n ): Promise<void> {\n const result = await this.handlers.find(message.payload || {});\n\n if (result.success && result.data) {\n this.sendResponse(clientId, message.id, true, { elements: result.data.elements });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle getElement message\n */\n private async handleGetElement(\n clientId: string,\n message: WSClientMessage & { type: 'getElement' }\n ): Promise<void> {\n const { elementId } = message.payload;\n const result = await this.handlers.getElement(elementId);\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, { element: result.data });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle getSnapshot message\n */\n private async handleGetSnapshot(\n clientId: string,\n message: WSClientMessage & { type: 'getSnapshot' }\n ): Promise<void> {\n const result = await this.handlers.getControlSnapshot();\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, result.data);\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle executeAction message\n */\n private async handleExecuteAction(\n clientId: string,\n message: WSClientMessage & { type: 'executeAction' }\n ): Promise<void> {\n const { elementId, action } = message.payload;\n const result = await this.handlers.executeElementAction(elementId, action);\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle executeComponentAction message\n */\n private async handleExecuteComponentAction(\n clientId: string,\n message: WSClientMessage & { type: 'executeComponentAction' }\n ): Promise<void> {\n const { componentId, action, params } = message.payload;\n const result = await this.handlers.executeComponentAction(componentId, { action, params });\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle executeWorkflow message\n */\n private async handleExecuteWorkflow(\n clientId: string,\n message: WSClientMessage & { type: 'executeWorkflow' }\n ): Promise<void> {\n const { workflowId, params } = message.payload;\n\n // Note: Progress streaming would need to be added to the handlers interface\n // For now, we just run the workflow without progress callbacks\n const result = await this.handlers.runWorkflow(workflowId, { params });\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Broadcast event to all subscribed clients\n */\n broadcastEvent(event: BridgeEvent): void {\n for (const [clientId, client] of this.clients) {\n // Check if client is subscribed to this event type\n if (\n client.subscription.events.size === 0 ||\n client.subscription.events.has(event.type)\n ) {\n // Check element/component filters if applicable\n const eventData = event.data as { elementId?: string; componentId?: string };\n\n if (\n eventData.elementId &&\n client.subscription.elementIds.size > 0 &&\n !client.subscription.elementIds.has(eventData.elementId)\n ) {\n continue;\n }\n\n if (\n eventData.componentId &&\n client.subscription.componentIds.size > 0 &&\n !client.subscription.componentIds.has(eventData.componentId)\n ) {\n continue;\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'event',\n timestamp: Date.now(),\n payload: event,\n } as WSEventMessage);\n }\n }\n }\n\n /**\n * Send message to specific client\n */\n private sendToClient(clientId: string, message: WSServerMessage): void {\n const client = this.clients.get(clientId);\n if (!client || client.ws.readyState !== 1) return;\n\n try {\n client.ws.send(JSON.stringify(message));\n\n if (this.verbose && message.type !== 'pong') {\n this.log(`[WS] ${clientId} <- ${message.type}`);\n }\n } catch (error) {\n console.error(`Failed to send message to ${clientId}:`, error);\n }\n }\n\n /**\n * Send response message\n */\n private sendResponse<T>(\n clientId: string,\n requestId: string,\n success: boolean,\n data?: T,\n error?: string\n ): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'response',\n timestamp: Date.now(),\n requestId,\n payload: {\n success,\n data,\n error,\n },\n } as WSResponseMessage<T>);\n }\n\n /**\n * Send error message\n */\n private sendError(\n clientId: string,\n requestId: string | undefined,\n code: string,\n message: string\n ): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n requestId,\n payload: {\n code,\n message,\n },\n } as WSErrorMessage);\n }\n\n /**\n * Get connected client count\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get all connected client IDs\n */\n get clientIds(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Disconnect all clients\n */\n disconnectAll(): void {\n for (const [_clientId, client] of this.clients) {\n try {\n client.ws.close();\n } catch {\n // Ignore close errors\n }\n }\n this.clients.clear();\n }\n}\n","/**\n * Standalone Server\n *\n * Standalone HTTP server for UI Bridge that can run independently.\n * Supports both HTTP and WebSocket connections.\n */\n\nimport type {\n UIBridgeServerConfig,\n UIBridgeServerHandlers,\n APIResponse,\n WebSocketMessage,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\nimport { UIBridgeWSHandler, type WebSocketLike } from './websocket-handler';\nimport type { BridgeEvent } from '../core';\n\n/**\n * Standalone server configuration\n */\nexport interface StandaloneServerConfig extends UIBridgeServerConfig {\n /** Host to bind to */\n host?: string;\n /** Port to listen on */\n port?: number;\n /** Enable WebSocket support */\n websocket?: boolean;\n /** WebSocket port (defaults to port) */\n websocketPort?: number;\n /** Logging function */\n log?: (message: string) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<\n Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n> = {\n host: 'localhost',\n port: 9876,\n websocket: false,\n websocketPort: 9876,\n log: console.log,\n};\n\n/**\n * Wrap error in API format\n */\nfunction wrapError(error: Error | string, code?: string): APIResponse<never> {\n return {\n success: false,\n error: typeof error === 'string' ? error : error.message,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Simple HTTP server implementation using Node.js built-in http module\n * with optional WebSocket support.\n */\nexport class StandaloneServer {\n private server: import('http').Server | null = null;\n private wsServer: unknown = null; // WebSocket.Server from 'ws' package\n private config: Required<\n Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n > &\n StandaloneServerConfig;\n private handlers: UIBridgeServerHandlers;\n private wsHandler: UIBridgeWSHandler | null = null;\n private wsConnections: Set<WebSocketLike> = new Set();\n\n constructor(handlers: UIBridgeServerHandlers, config: StandaloneServerConfig = {}) {\n this.handlers = handlers;\n this.config = { ...DEFAULT_CONFIG, ...config };\n\n // Create WebSocket handler if enabled\n if (this.config.websocket) {\n this.wsHandler = new UIBridgeWSHandler(handlers, {\n verbose: true,\n log: this.config.log,\n });\n }\n }\n\n /**\n * Start the server\n */\n async start(): Promise<void> {\n const http = await import('http');\n\n this.server = http.createServer(async (req, res) => {\n await this.handleRequest(req, res);\n });\n\n // Start WebSocket server if enabled\n if (this.config.websocket && this.wsHandler) {\n await this.startWebSocketServer();\n }\n\n return new Promise((resolve, reject) => {\n this.server!.listen(this.config.port, this.config.host, () => {\n this.config.log(\n `UI Bridge server listening on http://${this.config.host}:${this.config.port}`\n );\n if (this.config.websocket) {\n const wsPort = this.config.websocketPort || this.config.port;\n this.config.log(\n `UI Bridge WebSocket server listening on ws://${this.config.host}:${wsPort}`\n );\n }\n resolve();\n });\n\n this.server!.on('error', reject);\n });\n }\n\n /**\n * Start WebSocket server\n */\n private async startWebSocketServer(): Promise<void> {\n try {\n // Dynamically import ws package\n const { WebSocketServer } = await import('ws');\n\n const wsPort = this.config.websocketPort || this.config.port;\n const useSamePort = wsPort === this.config.port;\n\n if (useSamePort && this.server) {\n // Attach to same HTTP server (upgrade handling)\n this.wsServer = new WebSocketServer({ server: this.server });\n } else {\n // Create separate WebSocket server\n this.wsServer = new WebSocketServer({\n host: this.config.host,\n port: wsPort,\n });\n }\n\n const wss = this.wsServer as {\n on(event: 'connection', callback: (ws: WebSocketLike) => void): void;\n on(event: 'error', callback: (error: Error) => void): void;\n close(): void;\n };\n\n wss.on('connection', (ws) => {\n this.wsConnections.add(ws);\n this.wsHandler!.handleConnection(ws);\n\n ws.onclose = () => {\n this.wsConnections.delete(ws);\n };\n });\n\n wss.on('error', (error) => {\n this.config.log(`WebSocket server error: ${error.message}`);\n });\n } catch (error) {\n // ws package not installed - WebSocket support disabled\n this.config.log(\n 'Warning: WebSocket support requires the \"ws\" package. Install it with: npm install ws'\n );\n this.wsHandler = null;\n }\n }\n\n /**\n * Stop the server\n */\n async stop(): Promise<void> {\n // Close WebSocket handler\n if (this.wsHandler) {\n this.wsHandler.disconnectAll();\n }\n\n // Close WebSocket server\n if (this.wsServer) {\n const wss = this.wsServer as { close(): void };\n wss.close();\n this.wsServer = null;\n }\n\n // Close WebSocket connections\n for (const ws of this.wsConnections) {\n ws.close();\n }\n this.wsConnections.clear();\n\n return new Promise((resolve, reject) => {\n if (!this.server) {\n resolve();\n return;\n }\n\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n /**\n * Handle an HTTP request\n */\n private async handleRequest(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse\n ): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const method = req.method || 'GET';\n const basePath = this.config.basePath || '/ui-bridge';\n\n // Add CORS headers\n if (this.config.cors) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n\n // Handle preflight\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Health check\n if (url.pathname === '/health') {\n this.sendJSON(res, { status: 'ok', timestamp: Date.now() });\n return;\n }\n\n // Remove base path\n let path = url.pathname;\n if (path.startsWith(basePath)) {\n path = path.slice(basePath.length) || '/';\n }\n\n // Find matching route\n const route = this.findRoute(path, method);\n if (!route) {\n this.sendJSON(res, wrapError('Not found', 'NOT_FOUND'), 404);\n return;\n }\n\n try {\n // Parse body for POST requests\n let body: unknown = {};\n if (method === 'POST') {\n body = await this.parseBody(req);\n }\n\n // Extract params\n const params = this.extractParams(path, route.path);\n\n // Get handler\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = this.handlers[handlerName];\n\n if (!handler) {\n this.sendJSON(res, wrapError('Not implemented', 'NOT_IMPLEMENTED'), 501);\n return;\n }\n\n // Build arguments\n const args: unknown[] = [];\n\n if (route.params) {\n for (const param of route.params) {\n args.push(params[param]);\n }\n }\n\n if (method === 'POST') {\n args.push(body);\n }\n\n if (method === 'GET') {\n const query = Object.fromEntries(url.searchParams);\n if (Object.keys(query).length > 0) {\n args.push(query);\n }\n }\n\n // Call handler\n const result = await (handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)(\n ...args\n );\n this.sendJSON(res, result);\n } catch (error) {\n this.config.log(`Error handling ${method} ${path}: ${error}`);\n this.sendJSON(res, wrapError(error as Error, 'INTERNAL_ERROR'), 500);\n }\n }\n\n /**\n * Find a matching route\n */\n private findRoute(path: string, method: string): (typeof UI_BRIDGE_ROUTES)[0] | null {\n for (const route of UI_BRIDGE_ROUTES) {\n if (route.method !== method) continue;\n\n const routeRegex = route.path.replace(/:[^/]+/g, '([^/]+)').replace(/\\//g, '\\\\/');\n\n const regex = new RegExp(`^${routeRegex}$`);\n if (regex.test(path)) {\n return route;\n }\n }\n return null;\n }\n\n /**\n * Extract params from path\n */\n private extractParams(path: string, routePath: string): Record<string, string> {\n const params: Record<string, string> = {};\n const routeParts = routePath.split('/');\n const pathParts = path.split('/');\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(':')) {\n params[routeParts[i].slice(1)] = pathParts[i];\n }\n }\n\n return params;\n }\n\n /**\n * Parse request body\n */\n private parseBody(req: import('http').IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk) => (data += chunk));\n req.on('end', () => {\n try {\n resolve(data ? JSON.parse(data) : {});\n } catch {\n resolve({});\n }\n });\n req.on('error', reject);\n });\n }\n\n /**\n * Send JSON response\n */\n private sendJSON(res: import('http').ServerResponse, data: unknown, status = 200): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n }\n\n /**\n * Broadcast a message to all WebSocket connections (legacy)\n */\n broadcast(message: WebSocketMessage): void {\n const data = JSON.stringify(message);\n for (const ws of this.wsConnections) {\n if (ws.readyState === 1) {\n // OPEN\n ws.send(data);\n }\n }\n }\n\n /**\n * Broadcast an event to all subscribed WebSocket clients\n */\n broadcastEvent(event: BridgeEvent): void {\n if (this.wsHandler) {\n this.wsHandler.broadcastEvent(event);\n }\n }\n\n /**\n * Get WebSocket handler for direct access\n */\n getWSHandler(): UIBridgeWSHandler | null {\n return this.wsHandler;\n }\n\n /**\n * Get number of connected WebSocket clients\n */\n get wsClientCount(): number {\n return this.wsHandler?.clientCount ?? 0;\n }\n\n /**\n * Get the server address\n */\n getAddress(): { host: string; port: number } | null {\n const address = this.server?.address();\n if (!address || typeof address === 'string') return null;\n return { host: this.config.host, port: address.port };\n }\n}\n\n/**\n * Create and start a standalone server\n */\nexport async function createStandaloneServer(\n handlers: UIBridgeServerHandlers,\n config?: StandaloneServerConfig\n): Promise<StandaloneServer> {\n const server = new StandaloneServer(handlers, config);\n await server.start();\n return server;\n}\n\n/**\n * CLI entry point\n */\nexport async function startCLI(\n handlers: UIBridgeServerHandlers,\n args: string[] = process.argv.slice(2)\n): Promise<void> {\n const config: StandaloneServerConfig = {};\n\n // Parse CLI args\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n if (arg === '--port' || arg === '-p') {\n config.port = parseInt(nextArg);\n i++;\n } else if (arg === '--host' || arg === '-h') {\n config.host = nextArg;\n i++;\n } else if (arg === '--cors') {\n config.cors = true;\n }\n }\n\n const server = await createStandaloneServer(handlers, config);\n\n // Handle shutdown\n process.on('SIGINT', async () => {\n console.log('\\nShutting down...');\n await server.stop();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await server.stop();\n process.exit(0);\n });\n}\n"]}