{"version":3,"sources":["../src/types.ts","../src/page-health.ts","../src/handlers.ts","../src/express.ts","../src/nextjs.ts","../src/websocket-handler.ts","../src/standalone.ts"],"names":["error","mapInternalErrorCode","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, ElementHistoryOptions } from '@qontinui/ui-bridge/core';\nimport type { UiBridgeErrorCode } from '@qontinui/ui-bridge/diagnostics';\nimport type {\n  ControlActionRequest,\n  ControlActionResponse,\n  ComponentActionRequest,\n  ComponentActionResponse,\n  FindRequest,\n  FindResponse,\n  ControlSnapshot,\n  WorkflowRunRequest,\n  WorkflowRunResponse,\n} from '@qontinui/ui-bridge/control';\nimport type { RenderLogEntry, RenderLogEntryType } from '@qontinui/ui-bridge/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  ScreenAnalysis,\n} from '@qontinui/ui-bridge/ai';\nimport type { PageHealthReport } from './page-health';\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 (human-readable, dual-audience — plan goal #3) */\n  error?: string;\n  /**\n   * Stable machine-readable diagnostic code. Populated on every\n   * `success: false` response (plan Phase 1 — required on failure;\n   * optional at the type level only because successful responses omit it).\n   * Always a canonical `UiBridgeErrorCode` (mapped from internal/legacy\n   * codes via `error-mapper.ts`).\n   */\n  code?: UiBridgeErrorCode;\n  /** Request timestamp */\n  timestamp: number;\n  /** Response time in milliseconds (set by server) */\n  durationMs?: 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<\n    APIResponse<{\n      state: Record<string, unknown>;\n      computed: Record<string, unknown>;\n      timestamp: number;\n    }>\n  >;\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  // Screen analysis\n  getScreenAnalysis: () => Promise<APIResponse<ScreenAnalysis>>;\n\n  // Semantic search (embedding-based)\n  aiSemanticSearch: (\n    criteria: SemanticSearchCriteria\n  ) => Promise<APIResponse<SemanticSearchResponse>>;\n\n  // Element event log\n  getElementHistory: (\n    elementId: string,\n    options?: ElementHistoryOptions\n  ) => Promise<APIResponse<unknown[]>>;\n\n  // Performance diagnostics\n  getPerformanceEntries: () => Promise<APIResponse<unknown>>;\n  clearPerformanceEntries: () => Promise<APIResponse<{ cleared: boolean }>>;\n  getBrowserEvents: (params?: {\n    type?: string;\n    since?: number;\n    limit?: number;\n  }) => Promise<APIResponse<{ events: unknown[]; count: number }>>;\n\n  // Page health diagnostics\n  pageHealth?: () => Promise<APIResponse<PageHealthReport>>;\n\n  // Enhanced discovery endpoints\n  query: (request: {\n    selector: string;\n    limit?: number;\n    includeState?: boolean;\n  }) => Promise<APIResponse<{ elements: unknown[]; count: number }>>;\n\n  waitForElement: (request: {\n    selector?: string;\n    elementId?: string;\n    timeout?: number;\n    pollInterval?: number;\n  }) => Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>>;\n\n  // App-agnostic convenience endpoints\n  clickByText: (request: {\n    text: string;\n    tag?: string;\n    exact?: boolean;\n  }) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n  clickBySelector: (request: {\n    selector: string;\n    index?: number;\n  }) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n  typeInto: (request: {\n    selector?: string;\n    label?: string;\n    text: string;\n    clear?: boolean;\n  }) => Promise<APIResponse<{ typed: boolean; element?: unknown }>>;\n\n  readValue: (request: {\n    selector: string;\n    index?: number;\n  }) => Promise<APIResponse<{ value: string | null; length: number }>>;\n\n  findByText: (request: { text: string; tag?: string; exact?: boolean }) => Promise<\n    APIResponse<\n      Array<{\n        index: number;\n        tag: string;\n        text: string;\n        rect: { x: number; y: number; width: number; height: number };\n        disabled: boolean;\n        visible: boolean;\n      }>\n    >\n  >;\n\n  // Diagnostics endpoint (SDK runtime state — pre-existing)\n  getDiagnostics: () => Promise<APIResponse<unknown>>;\n\n  /**\n   * Diagnostic catalog endpoints (plan Phase 2). Read-only, backed by the\n   * single source `diagnostics/codes.json` (via the generated\n   * `@qontinui/ui-bridge/diagnostics` catalog). `getDiagnosticsCatalog`\n   * returns every code (agent bootstrap); `getDiagnosticCode` returns one\n   * code's entry, 404 + canonical `UiBridgeErrorCode` on an unknown code.\n   */\n  getDiagnosticsCatalog: () => Promise<APIResponse<unknown>>;\n  getDiagnosticCode: (code: string) => Promise<APIResponse<unknown>>;\n\n  // Navigation adapter endpoints\n  getRoutes: () => Promise<APIResponse<Array<{ name: string; path: string }>>>;\n  navigateByAdapter: (request: {\n    page: string;\n  }) => Promise<APIResponse<{ navigated: boolean; route: { name: string; path: string } }>>;\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: 'GET', path: '/control/render-log', handler: 'getRenderLog' }, // Alias under /control/\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  {\n    method: 'GET',\n    path: '/control/component/:id/state',\n    handler: 'getComponentState',\n    params: ['id'],\n  },\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    method: 'POST',\n    path: '/control/viewport-constraints',\n    handler: 'setViewportConstraints',\n    bodyRequired: true,\n  },\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  // Element event log\n  {\n    method: 'GET',\n    path: '/debug/element-history/:id',\n    handler: 'getElementHistory',\n    params: ['id'],\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: 'GET', path: '/ai/analyze', handler: 'getScreenAnalysis' },\n  { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n\n  // Performance diagnostics\n  { method: 'GET', path: '/control/performance-entries', handler: 'getPerformanceEntries' },\n  {\n    method: 'POST',\n    path: '/control/performance-entries/clear',\n    handler: 'clearPerformanceEntries',\n  },\n  { method: 'GET', path: '/control/browser-events', handler: 'getBrowserEvents' },\n\n  // Page health diagnostics\n  { method: 'POST', path: '/control/page-health', handler: 'pageHealth' },\n\n  // Enhanced discovery & navigation\n  { method: 'POST', path: '/control/query', handler: 'query', bodyRequired: true },\n  {\n    method: 'POST',\n    path: '/control/waitForElement',\n    handler: 'waitForElement',\n    bodyRequired: true,\n  },\n\n  // App-agnostic convenience endpoints\n  {\n    method: 'POST',\n    path: '/control/page/click-by-text',\n    handler: 'clickByText',\n    bodyRequired: true,\n  },\n  {\n    method: 'POST',\n    path: '/control/page/click-by-selector',\n    handler: 'clickBySelector',\n    bodyRequired: true,\n  },\n  { method: 'POST', path: '/control/page/type-into', handler: 'typeInto', bodyRequired: true },\n  { method: 'POST', path: '/control/page/read-value', handler: 'readValue', bodyRequired: true },\n  { method: 'POST', path: '/control/page/find-by-text', handler: 'findByText', bodyRequired: true },\n\n  // Diagnostics — SDK runtime state (pre-existing)\n  { method: 'GET', path: '/diagnostics', handler: 'getDiagnostics' },\n\n  // Diagnostic catalog (plan Phase 2 — read-only, codes.json-backed).\n  // `/diagnostics/catalog` is registered before `/diagnostics/:code` so the\n  // literal segment is not captured as a `:code` param (matters for both the\n  // express Router and the standalone first-match router).\n  { method: 'GET', path: '/diagnostics/catalog', handler: 'getDiagnosticsCatalog' },\n  {\n    method: 'GET',\n    path: '/diagnostics/:code',\n    handler: 'getDiagnosticCode',\n    params: ['code'],\n  },\n\n  // Navigation adapter\n  { method: 'GET', path: '/control/page/routes', handler: 'getRoutes' },\n  {\n    method: 'POST',\n    path: '/control/page/navigate-to',\n    handler: 'navigateByAdapter',\n    bodyRequired: true,\n  },\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 * Page Health Diagnostics\n *\n * Analyzes discovered elements to produce a health report identifying\n * spatial coverage gaps, layout issues, loading/error signals, and more.\n */\n\nimport type { DiscoveredElement } from '@qontinui/ui-bridge/control';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PageHealthSeverity = 'critical' | 'warning' | 'info';\n\nexport interface PageHealthFinding {\n  /** Short machine-readable key */\n  key: string;\n  /** Severity level */\n  severity: PageHealthSeverity;\n  /** Human-readable description */\n  message: string;\n  /** Optional supporting data */\n  details?: Record<string, unknown>;\n}\n\nexport interface PageHealthReport {\n  /** Overall health score: 'healthy' | 'degraded' | 'unhealthy' */\n  status: 'healthy' | 'degraded' | 'unhealthy';\n  /** Individual findings */\n  findings: PageHealthFinding[];\n  /** Spatial coverage heatmap (20x20 grid, '#' = filled, '.' = empty) */\n  heatmap: string[];\n  /** Summary statistics */\n  stats: {\n    totalElements: number;\n    visibleElements: number;\n    coveragePercent: number;\n    interactiveCount: number;\n    disabledCount: number;\n    contentElements: number;\n    regionCounts: { sidebar: number; header: number; content: number };\n  };\n  /** Timestamp */\n  timestamp: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst GRID_SIZE = 20;\n\nconst NAV_TYPES = new Set(['button', 'heading', 'badge', 'status-message']);\n\nconst SKIP_TEXT_SCAN_TYPES = new Set(['button', 'link', 'tab', 'menuitem']);\n\nconst ERROR_PATTERNS = [\n  'error occurred',\n  'failed to',\n  'exception',\n  'crash',\n  'unavailable',\n  'something went wrong',\n  'could not',\n];\n\nconst LOADING_PATTERNS = [\n  'loading',\n  'starting',\n  'connecting',\n  'please wait',\n  'initializing',\n  'fetching',\n];\n\nconst EMPTY_PATTERNS = [\n  'no data',\n  'no results',\n  'nothing here',\n  'empty',\n  'no items',\n  'get started',\n];\n\nconst LOADING_CLASS_PATTERNS = ['spin', 'pulse', 'skeleton', 'loading', 'shimmer'];\n\n// ============================================================================\n// Analysis Logic\n// ============================================================================\n\n/**\n * Diagnose page health from discovered elements.\n */\nexport function diagnosePageHealth(elements: DiscoveredElement[]): PageHealthReport {\n  const findings: PageHealthFinding[] = [];\n\n  const visibleElements = elements.filter((el) => el.state.visible);\n\n  // ---- Spatial Coverage (20x20 grid) ----\n  const grid: boolean[][] = Array.from({ length: GRID_SIZE }, () =>\n    Array.from({ length: GRID_SIZE }, () => false)\n  );\n\n  for (const el of visibleElements) {\n    const nr = el.state.normalizedRect;\n    if (!nr) continue;\n\n    const minCol = Math.max(0, Math.floor(nr.x * GRID_SIZE));\n    const maxCol = Math.min(GRID_SIZE - 1, Math.floor((nr.x + nr.width) * GRID_SIZE));\n    const minRow = Math.max(0, Math.floor(nr.y * GRID_SIZE));\n    const maxRow = Math.min(GRID_SIZE - 1, Math.floor((nr.y + nr.height) * GRID_SIZE));\n\n    for (let r = minRow; r <= maxRow; r++) {\n      for (let c = minCol; c <= maxCol; c++) {\n        grid[r][c] = true;\n      }\n    }\n  }\n\n  let totalFilled = 0;\n  let leftFilled = 0;\n  let rightFilled = 0;\n  const halfCol = GRID_SIZE / 2;\n\n  for (let r = 0; r < GRID_SIZE; r++) {\n    for (let c = 0; c < GRID_SIZE; c++) {\n      if (grid[r][c]) {\n        totalFilled++;\n        if (c < halfCol) leftFilled++;\n        else rightFilled++;\n      }\n    }\n  }\n\n  const totalCells = GRID_SIZE * GRID_SIZE;\n  const halfCells = totalCells / 2;\n  const coveragePercent = (totalFilled / totalCells) * 100;\n  const leftPercent = (leftFilled / halfCells) * 100;\n  const rightPercent = (rightFilled / halfCells) * 100;\n\n  if (coveragePercent < 15) {\n    findings.push({\n      key: 'low-spatial-coverage',\n      severity: 'critical',\n      message: `Spatial coverage critically low at ${coveragePercent.toFixed(1)}%`,\n      details: { coveragePercent, leftPercent, rightPercent },\n    });\n  } else if (coveragePercent < 30) {\n    findings.push({\n      key: 'low-spatial-coverage',\n      severity: 'warning',\n      message: `Spatial coverage low at ${coveragePercent.toFixed(1)}%`,\n      details: { coveragePercent, leftPercent, rightPercent },\n    });\n  }\n\n  if (rightPercent < 5 && leftPercent > 20) {\n    findings.push({\n      key: 'empty-content-area',\n      severity: 'critical',\n      message: `Right half nearly empty (${rightPercent.toFixed(1)}%) while left has content (${leftPercent.toFixed(1)}%) — content area may be blank`,\n      details: { leftPercent, rightPercent },\n    });\n  }\n\n  // ---- Layout Regions ----\n  const regionCounts = { sidebar: 0, header: 0, content: 0 };\n\n  for (const el of visibleElements) {\n    const nr = el.state.normalizedRect;\n    if (!nr) continue;\n    const cx = nr.x + nr.width / 2;\n    const cy = nr.y + nr.height / 2;\n\n    if (cx < 0.2) {\n      regionCounts.sidebar++;\n    } else if (cy < 0.08) {\n      regionCounts.header++;\n    } else {\n      regionCounts.content++;\n    }\n  }\n\n  if (regionCounts.content === 0) {\n    findings.push({\n      key: 'no-content-elements',\n      severity: 'critical',\n      message: 'No elements found in the content region',\n      details: { regionCounts },\n    });\n  } else if (regionCounts.content < 3) {\n    findings.push({\n      key: 'sparse-content',\n      severity: 'warning',\n      message: `Only ${regionCounts.content} element(s) in the content region`,\n      details: { regionCounts },\n    });\n  }\n\n  // ---- Element Diversity ----\n  const typeSet = new Set<string>();\n  for (const el of visibleElements) {\n    typeSet.add(el.type);\n  }\n\n  if (visibleElements.length > 5) {\n    const allNav = [...typeSet].every((t) => NAV_TYPES.has(t));\n    if (allNav) {\n      findings.push({\n        key: 'low-element-diversity',\n        severity: 'warning',\n        message: `All ${visibleElements.length} visible elements are navigation types (${[...typeSet].join(', ')})`,\n        details: { types: [...typeSet] },\n      });\n    }\n  }\n\n  // ---- Text Signals ----\n  const textElements = visibleElements.filter((el) => !SKIP_TEXT_SCAN_TYPES.has(el.type));\n\n  for (const el of textElements) {\n    const text = (el.state.textContent || '').toLowerCase();\n    if (!text) continue;\n\n    for (const pattern of ERROR_PATTERNS) {\n      if (text.includes(pattern)) {\n        findings.push({\n          key: 'error-text-signal',\n          severity: 'critical',\n          message: `Error text detected: \"${pattern}\" in element ${el.id}`,\n          details: { elementId: el.id, pattern, text: el.state.textContent?.slice(0, 200) },\n        });\n        break;\n      }\n    }\n\n    for (const pattern of LOADING_PATTERNS) {\n      if (text.includes(pattern)) {\n        findings.push({\n          key: 'loading-text-signal',\n          severity: 'warning',\n          message: `Loading text detected: \"${pattern}\" in element ${el.id}`,\n          details: { elementId: el.id, pattern, text: el.state.textContent?.slice(0, 200) },\n        });\n        break;\n      }\n    }\n\n    for (const pattern of EMPTY_PATTERNS) {\n      if (text.includes(pattern)) {\n        findings.push({\n          key: 'empty-text-signal',\n          severity: 'warning',\n          message: `Empty-state text detected: \"${pattern}\" in element ${el.id}`,\n          details: { elementId: el.id, pattern, text: el.state.textContent?.slice(0, 200) },\n        });\n        break;\n      }\n    }\n  }\n\n  // Check classes for loading indicators\n  for (const el of visibleElements) {\n    const classes = el.classes || [];\n    const classStr = classes.join(' ').toLowerCase();\n    for (const pattern of LOADING_CLASS_PATTERNS) {\n      if (classStr.includes(pattern)) {\n        findings.push({\n          key: 'loading-class-signal',\n          severity: 'warning',\n          message: `Loading CSS class detected: \"${pattern}\" on element ${el.id}`,\n          details: { elementId: el.id, pattern, classes },\n        });\n        break;\n      }\n    }\n  }\n\n  // ---- Interactive Readiness ----\n  const interactiveElements = elements.filter((el) => el.category === 'interactive');\n  const disabledCount = interactiveElements.filter((el) => !el.state.enabled).length;\n\n  if (interactiveElements.length > 0 && disabledCount / interactiveElements.length > 0.5) {\n    findings.push({\n      key: 'many-disabled-interactive',\n      severity: 'warning',\n      message: `${disabledCount} of ${interactiveElements.length} interactive elements are disabled (${((disabledCount / interactiveElements.length) * 100).toFixed(0)}%)`,\n      details: { interactiveCount: interactiveElements.length, disabledCount },\n    });\n  }\n\n  // ---- Visual Anomalies ----\n  for (const el of visibleElements) {\n    const nr = el.state.normalizedRect;\n    if (!nr) continue;\n\n    // Zero size\n    if (nr.width === 0 || nr.height === 0) {\n      findings.push({\n        key: 'zero-size-element',\n        severity: 'warning',\n        message: `Visible element ${el.id} has zero size`,\n        details: { elementId: el.id, normalizedRect: nr },\n      });\n    }\n\n    // Off-screen (entirely outside 0-1 range)\n    if (nr.x + nr.width < 0 || nr.x > 1 || nr.y + nr.height < 0 || nr.y > 1) {\n      findings.push({\n        key: 'off-screen-element',\n        severity: 'warning',\n        message: `Visible element ${el.id} is positioned off-screen`,\n        details: { elementId: el.id, normalizedRect: nr },\n      });\n    }\n  }\n\n  // ---- Build Heatmap ----\n  const heatmap: string[] = [];\n  for (let r = 0; r < GRID_SIZE; r++) {\n    let row = '';\n    for (let c = 0; c < GRID_SIZE; c++) {\n      row += grid[r][c] ? '#' : '.';\n    }\n    heatmap.push(row);\n  }\n\n  // ---- Determine overall status ----\n  const hasCritical = findings.some((f) => f.severity === 'critical');\n  const hasWarning = findings.some((f) => f.severity === 'warning');\n  const status = hasCritical ? 'unhealthy' : hasWarning ? 'degraded' : 'healthy';\n\n  return {\n    status,\n    findings,\n    heatmap,\n    stats: {\n      totalElements: elements.length,\n      visibleElements: visibleElements.length,\n      coveragePercent: Math.round(coveragePercent * 10) / 10,\n      interactiveCount: interactiveElements.length,\n      disabledCount,\n      contentElements: elements.filter((el) => el.category === 'content').length,\n      regionCounts,\n    },\n    timestamp: Date.now(),\n  };\n}\n","/**\n * UI Bridge Server Handlers\n *\n * Factory function to create handler implementations for all UI Bridge endpoints.\n */\n\nimport type { UIBridgeServerHandlers, APIResponse, RenderLogQuery } from './types';\nimport type {\n  ControlSnapshot,\n  DiscoveredElement,\n  ActionExecutor,\n  ControlActionResponse,\n  ComponentActionResponse,\n  FindResponse,\n  WorkflowRunResponse,\n} from '@qontinui/ui-bridge/control';\nimport { diagnosePageHealth } from './page-health';\nimport type { PageHealthReport } from './page-health';\nimport type { RenderLogEntry } from '@qontinui/ui-bridge/render-log';\nimport type {\n  ActionFailureDetails,\n  ElementHistoryOptions,\n  ElementLogEntry,\n} from '@qontinui/ui-bridge/core';\nimport type { UiBridgeErrorCode } from '@qontinui/ui-bridge/diagnostics';\nimport {\n  getRecoverySuggestions,\n  mapInternalErrorCode,\n  DIAGNOSTICS,\n  UI_BRIDGE_ERROR_CODES,\n} from '@qontinui/ui-bridge/diagnostics';\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  ScreenAnalysis,\n  CompactElement,\n  GroupedElements,\n  CompactModal,\n  CompactToast,\n  AggregatedErrors,\n  LoadingState,\n} from '@qontinui/ui-bridge/ai';\nimport {\n  SearchEngine,\n  NLActionExecutor,\n  AssertionExecutor,\n  SemanticSnapshotManager,\n  SemanticDiffManager,\n} from '@qontinui/ui-bridge/ai';\n\n/**\n * Registry interface - minimal contract for handler usage\n */\nexport interface RegistryLike {\n  getAllElements(): DiscoveredElement[];\n  getElement(id: string): DiscoveredElement | undefined;\n  getAllComponents(): unknown[];\n  getComponent(id: string): unknown | undefined;\n  getComponentState?(id: string): {\n    state: Record<string, unknown>;\n    computed: Record<string, unknown>;\n    timestamp: number;\n  } | 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  // Element event log\n  getElementHistory?(elementId: string, options?: ElementHistoryOptions): ElementLogEntry[];\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  /** Optional find method for filtered element discovery */\n  find?(request?: unknown): 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 *\n * The optional `code` argument accepts the historical loosely-typed\n * internal strings (`'NOT_FOUND'`, `'ELEMENT_ERROR'`, …) used across this\n * file; it is mapped to a canonical `UiBridgeErrorCode` via the\n * single-source error mapper (plan Phase 1). The prose `message` is\n * retained as the dual-audience human field (goal #3).\n */\nfunction error<T = unknown>(message: string, code?: string): APIResponse<T> {\n  return {\n    success: false,\n    error: message,\n    code: mapInternalErrorCode(code, message),\n    timestamp: Date.now(),\n  };\n}\n\n/**\n * Create structured failure details.\n *\n * Recovery suggestions come from the single generated diagnostics catalog\n * (plan D6) via getRecoverySuggestions(); the prior in-file switch + map are\n * deleted.\n */\nfunction createFailureDetails(\n  errorCode: UiBridgeErrorCode,\n  message: string,\n  options: {\n    elementId?: string;\n    selectorsTried?: string[];\n    durationMs?: number;\n    timeoutMs?: number;\n  } = {}\n): ActionFailureDetails {\n  const retryableErrors: UiBridgeErrorCode[] = [\n    'UB-ELEM-NOT-VISIBLE',\n    'UB-ACTION-TIMEOUT',\n    'UB-LOW-CONFIDENCE',\n    'UB-NET-ERROR',\n    'UB-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 * Build the public catalog entry for a code (plan Phase 2). Shape mirrors a\n * `diagnostics/codes.json` entry exactly — `{ code, category, description,\n * commonCauses, recoveryTemplate }` — so the proxy endpoint, the\n * `explain --json` CLI, and the raw JSON file are byte-equivalent. Sourced\n * from the single generated catalog (D6), never hand-duplicated.\n */\nfunction catalogEntry(code: UiBridgeErrorCode): {\n  code: UiBridgeErrorCode;\n  category: string;\n  description: string;\n  commonCauses: string[];\n  recoveryTemplate: ReturnType<typeof getRecoverySuggestions>;\n} {\n  const entry = DIAGNOSTICS[code];\n  return {\n    code,\n    category: entry.category,\n    description: entry.description,\n    commonCauses: [...entry.commonCauses],\n    recoveryTemplate: entry.recoveryTemplate.map((r) => ({ ...r })),\n  };\n}\n\n/**\n * Transform an AIDiscoveredElement into a CompactElement.\n * Truncates text to 200 chars, uses [x,y,w,h] bounds tuple.\n */\nfunction toCompactElement(el: AIDiscoveredElement): CompactElement {\n  const compact: CompactElement = {\n    id: el.id,\n    type: el.type,\n    visible: el.state.visible,\n    enabled: el.state.enabled,\n    actions: el.actions,\n  };\n  if (el.label) compact.label = el.label;\n  if (el.state.textContent) {\n    compact.text =\n      el.state.textContent.length > 200 ? el.state.textContent.slice(0, 200) : el.state.textContent;\n  }\n  if (el.state.value !== undefined) compact.value = el.state.value;\n  if (el.semanticType) compact.semanticType = el.semanticType;\n  if (el.state.rect) {\n    compact.bounds = [el.state.rect.x, el.state.rect.y, el.state.rect.width, el.state.rect.height];\n  }\n  return compact;\n}\n\n/**\n * Build a ScreenAnalysis from a registry + snapshot manager + summary generator.\n * Shared between createHandlers and createAIHandlers.\n */\nfunction buildScreenAnalysis(\n  registry: RegistryLike,\n  snapshotManager: { createSnapshot(cs: ControlSnapshot): SemanticSnapshot }\n): ScreenAnalysis {\n  const controlSnapshot = registry.createSnapshot();\n  const semanticSnapshot = snapshotManager.createSnapshot(controlSnapshot);\n\n  // Reuse ui-bridge's canonical summary — `snapshotManager.createSnapshot`\n  // already ran `generatePageSummary` over §4.6-branded elements produced by\n  // its OWN converter (label/description re-scrubbed by verdict). Re-deriving\n  // it here from hand-built plain-string elements would launder `description`.\n  const summary = semanticSnapshot.summary;\n\n  // Transform elements into compact grouped format\n  const interactive: CompactElement[] = [];\n  const content: CompactElement[] = [];\n  const media: CompactElement[] = [];\n\n  for (const el of semanticSnapshot.elements) {\n    const compact = toCompactElement(el);\n    const category = el.category || 'content';\n    if (category === 'interactive') {\n      interactive.push(compact);\n    } else if (category === 'media') {\n      media.push(compact);\n    } else {\n      content.push(compact);\n    }\n  }\n\n  const elements: GroupedElements = { interactive, content, media };\n\n  // Page info — prefer semantic, fallback to control\n  const page = {\n    url: semanticSnapshot.page?.url || controlSnapshot.page?.url || '',\n    title: semanticSnapshot.page?.title || controlSnapshot.page?.title || '',\n    type: semanticSnapshot.page?.pageType,\n  };\n\n  // Viewport from control snapshot\n  const viewport = controlSnapshot.viewport\n    ? {\n        width: controlSnapshot.viewport.viewportWidth,\n        height: controlSnapshot.viewport.viewportHeight,\n        scrollX: controlSnapshot.viewport.scrollX,\n        scrollY: controlSnapshot.viewport.scrollY,\n        canScrollDown: controlSnapshot.viewport.canScrollDown,\n      }\n    : undefined;\n\n  // Modals from semantic snapshot\n  const modals: CompactModal[] = semanticSnapshot.activeModals.map((m) => {\n    const compact: CompactModal = {\n      id: m.id,\n      type: m.type,\n      blocking: m.blocking,\n    };\n    if (m.title) compact.title = m.title;\n    if (m.closeButton) compact.closeButton = m.closeButton;\n    if (m.primaryAction) compact.primaryAction = m.primaryAction;\n    return compact;\n  });\n\n  // Aggregate errors from forms + control snapshot errorSummary\n  const validationErrors: string[] = [];\n  for (const form of semanticSnapshot.forms) {\n    for (const field of form.fields) {\n      if (field.error) {\n        validationErrors.push(`${field.label}: ${field.error}`);\n      }\n    }\n  }\n  const errorSummary = controlSnapshot.errorSummary;\n  const errors: AggregatedErrors = {\n    count: errorSummary?.errorCount ?? 0,\n    health: errorSummary?.health ?? 'healthy',\n    validationErrors,\n    runtimeError: errorSummary?.mostRecentError?.message,\n    hasErrorOverlay: (errorSummary?.errorOverlays?.length ?? 0) > 0,\n  };\n\n  // Toasts from control snapshot (CapturedToast typed via SnapshotToastContext)\n  const toasts: CompactToast[] =\n    controlSnapshot.toasts?.active.map((t) => {\n      const compact: CompactToast = {\n        id: t.id,\n        message: t.message,\n        dismissible: t.hasAction ?? false,\n      };\n      if (t.level) compact.level = t.level;\n      return compact;\n    }) ?? [];\n\n  // Loading state\n  const inFlightRequests = semanticSnapshot.networkActivity?.inFlightCount ?? 0;\n  const activeWorkflows = controlSnapshot.activeRuns?.length ?? 0;\n  const loading: LoadingState = {\n    isLoading: inFlightRequests > 0 || activeWorkflows > 0,\n    inFlightRequests,\n    activeWorkflows,\n  };\n\n  return {\n    page,\n    viewport,\n    summary,\n    elements,\n    forms: semanticSnapshot.forms,\n    modals,\n    errors,\n    toasts,\n    loading,\n    focusedElement: semanticSnapshot.focusedElement,\n    elementCounts: semanticSnapshot.elementCounts,\n    timestamp: Date.now(),\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);\n    nlExecutor.updateElements(elements);\n    nlExecutor.setActionExecutor(actionExecutor as unknown as ActionExecutor);\n    assertionExecutor.updateElements(elements);\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 unknown 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(\n            'UB-ELEM-NOT-FOUND',\n            `Element not found: ${id}`,\n            {\n              elementId: id,\n              selectorsTried: [id],\n            }\n          );\n          return {\n            success: false,\n            error: `Element not found: ${id}`,\n            code: 'UB-ELEM-NOT-FOUND',\n            data: { failureDetails } as unknown as ControlSnapshot['elements'][0],\n            timestamp: Date.now(),\n          };\n        }\n        return success(element as unknown 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    ): Promise<APIResponse<ControlActionResponse>> => {\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(\n            'UB-ELEM-NOT-FOUND',\n            `Element not found: ${id}`,\n            {\n              elementId: id,\n              selectorsTried: [id],\n              durationMs: Date.now() - startTime,\n            }\n          );\n          return {\n            success: false,\n            error: `Element not found: ${id}`,\n            code: 'UB-ELEM-NOT-FOUND',\n            data: {\n              failureDetails,\n              durationMs: Date.now() - startTime,\n            },\n            timestamp: Date.now(),\n          } as APIResponse<ControlActionResponse>;\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 {\n            success: boolean;\n            error?: string;\n            elementState?: unknown;\n          };\n          // Determine error code based on error message\n          let errorCode: UiBridgeErrorCode = 'UB-UNKNOWN-ERROR';\n          const errorMsg = actionResult.error?.toLowerCase() || '';\n\n          if (errorMsg.includes('not found')) {\n            errorCode = 'UB-ELEM-NOT-FOUND';\n          } else if (errorMsg.includes('not visible') || errorMsg.includes('hidden')) {\n            errorCode = 'UB-ELEM-NOT-VISIBLE';\n          } else if (errorMsg.includes('disabled') || errorMsg.includes('not enabled')) {\n            errorCode = 'UB-ELEM-NOT-ENABLED';\n          } else if (errorMsg.includes('timeout')) {\n            errorCode = 'UB-ACTION-TIMEOUT';\n          } else if (errorMsg.includes('blocked') || errorMsg.includes('interactable')) {\n            errorCode = 'UB-ELEM-NOT-INTERACTABLE';\n          }\n\n          const failureDetails = createFailureDetails(\n            errorCode,\n            actionResult.error || 'Action failed',\n            {\n              elementId: id,\n              durationMs: Date.now() - startTime,\n            }\n          );\n\n          // Return a proper failure envelope — don't wrap in success() which\n          // creates double-wrapping: {success: true, data: {success: false}}\n          return {\n            success: false,\n            error: actionResult.error || 'Action failed',\n            code: errorCode,\n            data: { ...actionResult, failureDetails },\n            timestamp: Date.now(),\n          } as APIResponse<ControlActionResponse>;\n        }\n\n        return success(result) as APIResponse<ControlActionResponse>;\n      } catch (err) {\n        const errorMessage = (err as Error).message;\n        let errorCode: UiBridgeErrorCode = 'UB-UNKNOWN-ERROR';\n\n        if (errorMessage.includes('not found')) {\n          errorCode = 'UB-ELEM-NOT-FOUND';\n        } else if (errorMessage.includes('timeout')) {\n          errorCode = 'UB-ACTION-TIMEOUT';\n        } else if (errorMessage.includes('network') || errorMessage.includes('fetch')) {\n          errorCode = 'UB-NET-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            failureDetails,\n            durationMs: Date.now() - startTime,\n          },\n          timestamp: Date.now(),\n        } as APIResponse<ControlActionResponse>;\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 (\n      id: string\n    ): Promise<\n      APIResponse<{\n        state: Record<string, unknown>;\n        computed: Record<string, unknown>;\n        timestamp: number;\n      }>\n    > => {\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 {\n          getState?: () => Record<string, unknown>;\n          getComputed?: () => Record<string, unknown>;\n        };\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    ): Promise<APIResponse<ComponentActionResponse>> => {\n      try {\n        const result = await actionExecutor.executeComponentAction(id, {\n          action: request.action,\n          params: request.params,\n        });\n        return success(result) as APIResponse<ComponentActionResponse>;\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): Promise<APIResponse<FindResponse>> => {\n      try {\n        // Use actionExecutor.find() when available — it supports text, role,\n        // and other filters that registry.findElements() doesn't handle\n        if (actionExecutor.find) {\n          const result = await actionExecutor.find(request);\n          return success(result) as APIResponse<FindResponse>;\n        }\n        // Fallback to registry\n        const findRequest = request as\n          | { types?: string[]; selector?: string; limit?: number }\n          | undefined;\n        const elements = registry.findElements?.(findRequest) ?? registry.getAllElements();\n        return success({\n          elements,\n          timestamp: Date.now(),\n          total: (elements as unknown[]).length,\n          durationMs: 0,\n        }) as APIResponse<FindResponse>;\n      } catch (err) {\n        return error((err as Error).message, 'FIND_ERROR');\n      }\n    },\n\n    discover: async (request?: unknown): Promise<APIResponse<FindResponse>> => {\n      try {\n        // Use actionExecutor.find() when available for proper filtering\n        if (actionExecutor.find) {\n          const result = await actionExecutor.find(request);\n          return success(result) as APIResponse<FindResponse>;\n        }\n        // Fallback to registry\n        const findRequest = request as\n          | { types?: string[]; selector?: string; limit?: number }\n          | undefined;\n        const elements = registry.findElements?.(findRequest) ?? registry.getAllElements();\n        return success({\n          elements,\n          timestamp: Date.now(),\n          total: (elements as unknown[]).length,\n          durationMs: 0,\n        }) as APIResponse<FindResponse>;\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 (id: string, request?: unknown): Promise<APIResponse<WorkflowRunResponse>> => {\n      try {\n        const runnerPort = process.env['QONTINUI_PORT'] ?? '9876';\n        const runnerUrl = `http://localhost:${runnerPort}`;\n        let response: Response;\n        try {\n          response = await fetch(\n            `${runnerUrl}/api/unified-workflows/${encodeURIComponent(id)}/run`,\n            {\n              method: 'POST',\n              headers: { 'Content-Type': 'application/json' },\n              body: JSON.stringify(request ?? {}),\n            }\n          );\n        } catch (fetchErr) {\n          return error<WorkflowRunResponse>(\n            `Failed to reach runner at ${runnerUrl}: ${(fetchErr as Error).message}`,\n            'RUNNER_UNAVAILABLE'\n          );\n        }\n        if (!response.ok) {\n          const body = await response.text().catch(() => '');\n          return error<WorkflowRunResponse>(\n            `Runner returned ${response.status}: ${body}`,\n            'RUNNER_ERROR'\n          );\n        }\n        const data = (await response.json()) as unknown;\n        return success(data) as APIResponse<WorkflowRunResponse>;\n      } catch (err) {\n        return error((err as Error).message, 'WORKFLOW_ERROR');\n      }\n    },\n\n    getWorkflowStatus: async (runId: string): Promise<APIResponse<WorkflowRunResponse>> => {\n      try {\n        const runnerPort = process.env['QONTINUI_PORT'] ?? '9876';\n        const runnerUrl = `http://localhost:${runnerPort}`;\n        let response: Response;\n        try {\n          response = await fetch(`${runnerUrl}/api/task-runs/${encodeURIComponent(runId)}`);\n        } catch (fetchErr) {\n          return error<WorkflowRunResponse>(\n            `Failed to reach runner at ${runnerUrl}: ${(fetchErr as Error).message}`,\n            'RUNNER_UNAVAILABLE'\n          );\n        }\n        if (!response.ok) {\n          const body = await response.text().catch(() => '');\n          return error<WorkflowRunResponse>(\n            `Runner returned ${response.status}: ${body}`,\n            'RUNNER_ERROR'\n          );\n        }\n        const data = (await response.json()) as unknown;\n        return success(data) as APIResponse<WorkflowRunResponse>;\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 (\n      request: BatchAssertionRequest\n    ): 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        // Use ui-bridge's canonical §4.6-branded summary rather than\n        // re-deriving it from hand-built plain-string elements (which would\n        // launder `description`). `createSnapshot` runs `generatePageSummary`\n        // internally over elements branded by its own converter.\n        const summary = snapshotManager.createSnapshot(registry.createSnapshot()).summary;\n        return success(summary);\n      } catch (err) {\n        return error((err as Error).message, 'PAGE_SUMMARY_ERROR');\n      }\n    },\n\n    getScreenAnalysis: async (): Promise<APIResponse<ScreenAnalysis>> => {\n      try {\n        const analysis = buildScreenAnalysis(registry, snapshotManager);\n        return success(analysis);\n      } catch (err) {\n        return error((err as Error).message, 'SCREEN_ANALYSIS_ERROR');\n      }\n    },\n\n    // =========================================================================\n    // Semantic Search Handler (Embedding-based)\n    // =========================================================================\n\n    aiSemanticSearch: async (\n      criteria: SemanticSearchCriteria\n    ): Promise<APIResponse<SemanticSearchResponse>> => {\n      const startTime = performance.now();\n      try {\n        // Refresh elements for search\n        refreshElements();\n\n        // Build a semantic snapshot: its `.elements` are converted to\n        // AIDiscoveredElement by ui-bridge's OWN converter, which applies the\n        // §4.6 brand (label/description re-scrubbed by verdict). Searching over\n        // these already-branded, already-scrubbed elements — rather than\n        // hand-building AIDiscoveredElement-shaped objects from raw registry\n        // reads — is what keeps `element` (re-emitted to the client in\n        // SemanticSearchResult) honestly branded instead of laundering a\n        // plain-string `description`.\n        const semanticSnapshot = snapshotManager.createSnapshot(registry.createSnapshot());\n\n        // Build searchable text per branded element for the fuzzy fallback.\n        // All fields read here are already §4.6-scrubbed at their source.\n        const aiElements: Array<{ element: AIDiscoveredElement; text: string }> =\n          semanticSnapshot.elements.map((element) => {\n            const textParts: string[] = [];\n            const label = element.label ?? '';\n            const accessibleName = element.accessibleName ?? '';\n            const textContent = element.state?.textContent ?? '';\n            const placeholder = element.placeholder ?? '';\n            const title = element.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() || element.id;\n\n            return { element, text: combinedText };\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) => w.length > 2));\n            const textWords = new Set(textLower.split(/\\s+/).filter((w) => 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    getPerformanceEntries: async (): Promise<APIResponse<unknown>> => {\n      return {\n        success: true,\n        data: { navigation: null, resources: [], paint: [] },\n        timestamp: Date.now(),\n      };\n    },\n\n    clearPerformanceEntries: async (): Promise<APIResponse<{ cleared: boolean }>> => {\n      return { success: true, data: { cleared: true }, timestamp: Date.now() };\n    },\n\n    getBrowserEvents: async (_params?: {\n      type?: string;\n      since?: number;\n      limit?: number;\n    }): Promise<APIResponse<{ events: unknown[]; count: number }>> => {\n      return { success: true, data: { events: [], count: 0 }, timestamp: Date.now() };\n    },\n\n    getElementHistory: async (\n      elementId: string,\n      options?: ElementHistoryOptions\n    ): Promise<APIResponse<ElementLogEntry[]>> => {\n      try {\n        const entries = registry.getElementHistory?.(elementId, options) ?? [];\n        return success(entries);\n      } catch (err) {\n        return error((err as Error).message, 'ELEMENT_HISTORY_ERROR');\n      }\n    },\n\n    // Page health diagnostics\n    pageHealth: async (): Promise<APIResponse<PageHealthReport>> => {\n      try {\n        // Get elements via discover/find (uses the same path as the discover handler)\n        let elements: DiscoveredElement[];\n        if (actionExecutor.find) {\n          const result = (await actionExecutor.find()) as { elements: DiscoveredElement[] };\n          elements = result.elements ?? [];\n        } else {\n          elements = (registry.findElements?.() ??\n            registry.getAllElements()) as DiscoveredElement[];\n        }\n\n        const report = diagnosePageHealth(elements);\n        return { success: true, data: report, timestamp: Date.now() };\n      } catch (err) {\n        return {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('PAGE_HEALTH_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\n      }\n    },\n\n    query: async (request: {\n      selector: string;\n      limit?: number;\n      includeState?: boolean;\n    }): Promise<APIResponse<{ elements: unknown[]; count: number }>> => {\n      try {\n        refreshElements();\n        const allElements =\n          registry.findElements?.({ selector: request.selector }) ?? registry.getAllElements();\n        const elements = request.limit\n          ? (allElements as unknown[]).slice(0, request.limit)\n          : (allElements as unknown[]);\n        return success({ elements, count: elements.length });\n      } catch (err) {\n        return error<{ elements: unknown[]; count: number }>((err as Error).message, 'QUERY_ERROR');\n      }\n    },\n\n    waitForElement: async (request: {\n      selector?: string;\n      elementId?: string;\n      timeout?: number;\n      pollInterval?: number;\n    }): Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>> => {\n      const timeout = request.timeout ?? 5000;\n      const pollInterval = request.pollInterval ?? 200;\n      const start = Date.now();\n      try {\n        while (Date.now() - start < timeout) {\n          refreshElements();\n          if (request.elementId) {\n            const el = registry.getElement(request.elementId);\n            if (el) return success({ found: true, element: el, waitedMs: Date.now() - start });\n          } else if (request.selector) {\n            const found = registry.findElements?.({ selector: request.selector });\n            if (found && (found as unknown[]).length > 0) {\n              return success({\n                found: true,\n                element: (found as unknown[])[0],\n                waitedMs: Date.now() - start,\n              });\n            }\n          }\n          await new Promise((r) => setTimeout(r, pollInterval));\n        }\n        return success({ found: false, waitedMs: Date.now() - start });\n      } catch (err) {\n        return error<{ found: boolean; element?: unknown; waitedMs: number }>(\n          (err as Error).message,\n          'WAIT_ERROR'\n        );\n      }\n    },\n\n    // App-agnostic convenience endpoints (stubs — browser context required)\n    clickByText: async (): Promise<APIResponse<{ clicked: boolean; element?: unknown }>> => {\n      return {\n        success: false,\n        error: 'clickByText requires browser context',\n        code: 'UB-UNSUPPORTED-ACTION',\n        timestamp: Date.now(),\n      };\n    },\n    clickBySelector: async (): Promise<APIResponse<{ clicked: boolean; element?: unknown }>> => {\n      return {\n        success: false,\n        error: 'clickBySelector requires browser context',\n        code: 'UB-UNSUPPORTED-ACTION',\n        timestamp: Date.now(),\n      };\n    },\n    typeInto: async (): Promise<APIResponse<{ typed: boolean; element?: unknown }>> => {\n      return {\n        success: false,\n        error: 'typeInto requires browser context',\n        code: 'UB-UNSUPPORTED-ACTION',\n        timestamp: Date.now(),\n      };\n    },\n    readValue: async (): Promise<APIResponse<{ value: string | null; length: number }>> => {\n      return {\n        success: false,\n        error: 'readValue requires browser context',\n        code: 'UB-UNSUPPORTED-ACTION',\n        timestamp: Date.now(),\n      };\n    },\n    findByText: async (): Promise<\n      APIResponse<\n        Array<{\n          index: number;\n          tag: string;\n          text: string;\n          rect: { x: number; y: number; width: number; height: number };\n          disabled: boolean;\n          visible: boolean;\n        }>\n      >\n    > => {\n      return {\n        success: false,\n        error: 'findByText requires browser context',\n        code: 'UB-UNSUPPORTED-ACTION',\n        timestamp: Date.now(),\n      };\n    },\n\n    // Diagnostics\n    getDiagnostics: async () => {\n      const registeredCount = registry.getAllElements().length;\n      return success({\n        sdk_initialized: true,\n        auto_register_active: false,\n        registered_elements: registeredCount,\n        dom_interactive_elements: 0,\n        mutation_observer_active: false,\n        navigation_adapter: 'none',\n        page_title: '',\n        page_url: '',\n        page_ready: true,\n        providers_mounted: [],\n        last_discover_at: null,\n        capabilities: ['control', 'find', 'ai'],\n      });\n    },\n\n    // Diagnostic catalog (plan Phase 2). Read-only; backed by the single\n    // source `diagnostics/codes.json` via the generated catalog. The raw\n    // entry shape mirrors a `codes.json` entry exactly: { code, category,\n    // description, commonCauses, recoveryTemplate }.\n    getDiagnosticsCatalog: async () => {\n      const codes = UI_BRIDGE_ERROR_CODES.map((code) => catalogEntry(code));\n      return success({ codes, count: codes.length });\n    },\n    getDiagnosticCode: async (code: string) => {\n      if (!(code in DIAGNOSTICS)) {\n        // Unknown code → 404-shaped APIResponse with a canonical\n        // UiBridgeErrorCode (reuse Phase 1's error() / mapper path).\n        return error(\n          `Unknown diagnostic code: ${code}. ` +\n            `See GET /diagnostics/catalog for the full catalog.`,\n          'NOT_FOUND'\n        );\n      }\n      return success(catalogEntry(code as UiBridgeErrorCode));\n    },\n\n    // Navigation adapter (stubs)\n    getRoutes: async (): Promise<APIResponse<Array<{ name: string; path: string }>>> => {\n      return success<Array<{ name: string; path: string }>>([]);\n    },\n    navigateByAdapter: async (): Promise<\n      APIResponse<{ navigated: boolean; route: { name: string; path: string } }>\n    > => {\n      return {\n        success: false,\n        error: 'navigateByAdapter requires browser context',\n        code: 'UB-UNSUPPORTED-ACTION',\n        timestamp: Date.now(),\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  | 'getScreenAnalysis'\n  | 'getPerformanceEntries'\n  | 'clearPerformanceEntries'\n  | 'getBrowserEvents'\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);\n    nlExecutor.updateElements(elements);\n    nlExecutor.setActionExecutor(actionExecutor as unknown as ActionExecutor);\n    assertionExecutor.updateElements(elements);\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 {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('AI_SEARCH_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\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 {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('AI_EXECUTE_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\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 {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('AI_ASSERT_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\n      }\n    },\n\n    aiAssertBatch: async (\n      request: BatchAssertionRequest\n    ): 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 {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('AI_ASSERT_BATCH_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\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 {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('SEMANTIC_SNAPSHOT_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\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 {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('SEMANTIC_DIFF_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\n      }\n    },\n\n    getPageSummary: async (): Promise<APIResponse<string>> => {\n      try {\n        // Use ui-bridge's canonical §4.6-branded summary rather than\n        // re-deriving it from hand-built plain-string elements (which would\n        // launder `description`). `createSnapshot` runs `generatePageSummary`\n        // internally over elements branded by its own converter.\n        const summary = snapshotManager.createSnapshot(registry.createSnapshot()).summary;\n        return { success: true, data: summary, timestamp: Date.now() };\n      } catch (err) {\n        return {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('PAGE_SUMMARY_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\n      }\n    },\n\n    getScreenAnalysis: async (): Promise<APIResponse<ScreenAnalysis>> => {\n      try {\n        const analysis = buildScreenAnalysis(registry, snapshotManager);\n        return { success: true, data: analysis, timestamp: Date.now() };\n      } catch (err) {\n        return {\n          success: false,\n          error: (err as Error).message,\n          code: mapInternalErrorCode('SCREEN_ANALYSIS_ERROR', (err as Error).message),\n          timestamp: Date.now(),\n        };\n      }\n    },\n\n    // Performance diagnostics (browser-only; SDK handler returns empty defaults)\n    getPerformanceEntries: async (): Promise<APIResponse<unknown>> => {\n      return {\n        success: true,\n        data: { navigation: null, resources: [], paint: [] },\n        timestamp: Date.now(),\n      };\n    },\n    clearPerformanceEntries: async (): Promise<APIResponse<{ cleared: boolean }>> => {\n      return { success: true, data: { cleared: true }, timestamp: Date.now() };\n    },\n    getBrowserEvents: async (_params?: {\n      type?: string;\n      since?: number;\n      limit?: number;\n    }): Promise<APIResponse<{ events: unknown[]; count: number }>> => {\n      return { success: true, data: { events: [], count: 0 }, timestamp: Date.now() };\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';\nimport { mapInternalErrorCode } from './error-mapper';\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  const message = typeof error === 'string' ? error : error.message;\n  return {\n    success: false,\n    error: message,\n    code: mapInternalErrorCode(code, message),\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\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\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  //\n  // Item B (iter-4 manual-test remediation): `express.json()` (body-parser\n  // strict mode in newer versions) returns HTTP 400 \"Unexpected end of JSON\n  // input\" / \"EOF\" when a POST arrives with `Content-Type: application/json`\n  // but a zero-byte body. Routes like `/control/page-health` take no\n  // parameters, so callers naturally send `curl -X POST -H 'Content-Type:\n  // application/json' .../page-health` without a payload. Normalize an\n  // empty body to `{}` BEFORE the JSON parser sees it so the request reaches\n  // the handler instead of dying at the middleware layer.\n  if (config.useBodyParser) {\n    router.use((req: Request, _res: Response, next: NextFunction) => {\n      const contentLength = req.headers['content-length'];\n      const isEmpty = contentLength === '0' || contentLength === undefined;\n      const isJson = (req.headers['content-type'] || '').includes('application/json');\n      if (req.method === 'POST' && isEmpty && isJson) {\n        // Mark body as already-parsed so express.json() short-circuits.\n        // Cast through `unknown` because Request typings consider req.body\n        // an unknown value, not a tagged shape.\n        (req as unknown as { body: unknown; _body: boolean })._body = true;\n        (req as unknown as { body: unknown }).body = {};\n      }\n      next();\n    });\n    router.use(express.json());\n    // Catch any residual body-parser errors (malformed JSON with non-zero\n    // content-length): downgrade to a structured 400 response carrying the\n    // canonical `BODY_PARSE_ERROR` code rather than express's default HTML.\n    router.use((err: Error & { type?: string }, _req: Request, res: Response, next: NextFunction) => {\n      if (err && err.type === 'entity.parse.failed') {\n        res.status(400).json(wrapError(err.message || 'Invalid JSON body', 'BODY_PARSE_ERROR'));\n        return;\n      }\n      next(err);\n    });\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  // P2.2 — Endpoint discovery. Returns every (method, path) pair sorted by\n  // path so SDKs and tests can introspect what the server exposes without\n  // grepping the source. Mirrors the `/ui-bridge/_routes` endpoint on the\n  // runner.\n  router.get('/_routes', (_req: Request, res: Response) => {\n    const routes = UI_BRIDGE_ROUTES.map((r) => ({ method: r.method, path: r.path })).sort(\n      (a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method)\n    );\n    res.json({\n      success: true,\n      data: { routes, count: routes.length },\n      timestamp: Date.now(),\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    const start = performance.now();\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. Defensive normalization (iter-4): an\n      // upstream proxy or a body-parser bypass can leave `req.body`\n      // undefined even for a POST. Handlers expect an object (e.g.\n      // `pageHealth()` takes no args but the route is POST). Coerce to\n      // `{}` so destructuring + key-access inside handlers doesn't crash.\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      const durationMs = Math.round(performance.now() - start);\n      res.setHeader('X-Response-Time', `${durationMs}ms`);\n      res.json({ ...result, durationMs });\n    } catch (error) {\n      const durationMs = Math.round(performance.now() - start);\n      res.setHeader('X-Response-Time', `${durationMs}ms`);\n      res.status(500).json({ ...wrapError(error as Error, 'INTERNAL_ERROR'), durationMs });\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-require-imports\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 { mapInternalErrorCode } from './error-mapper';\nimport type {\n  ControlActionRequest,\n  ComponentActionRequest,\n  FindRequest,\n  WorkflowRunRequest,\n} from '@qontinui/ui-bridge/control';\nimport { createHandlers, type RegistryLike, type ActionExecutorLike } from './handlers';\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  const message = typeof error === 'string' ? error : error.message;\n  return {\n    success: false,\n    error: message,\n    code: mapInternalErrorCode(code, message),\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      // P2.2 — Endpoint discovery. Served before route matching so it\n      // works without an explicit handler entry.\n      if (method === 'GET' && path === '/_routes') {\n        const routes = UI_BRIDGE_ROUTES.map((r) => ({ method: r.method, path: r.path })).sort(\n          (a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method)\n        );\n        return jsonResponse({\n          success: true,\n          data: { routes, count: routes.length },\n          timestamp: Date.now(),\n        });\n      }\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/**\n * Zero-config convenience wrapper for Next.js App Router.\n *\n * Creates a single route handler with server-safe stub implementations.\n * Read operations return empty data; write operations return errors.\n *\n * For full control API access (live snapshots, element actions, AI search),\n * use the runtime injection proxy or implement a custom client-server relay.\n *\n * @example\n * ```ts\n * // app/api/ui-bridge/[...path]/route.ts\n * import { createUIBridgeHandler } from '@qontinui/ui-bridge-server/nextjs';\n *\n * const handler = createUIBridgeHandler();\n *\n * export const GET = handler;\n * export const POST = handler;\n * export const DELETE = handler;\n * ```\n */\nexport function createUIBridgeHandler(config?: NextJSAdapterConfig): NextRouteHandler {\n  const registry: RegistryLike = {\n    getAllElements: () => [],\n    getElement: () => undefined,\n    getAllComponents: () => [],\n    getComponent: () => undefined,\n    createSnapshot: () =>\n      ({\n        timestamp: Date.now(),\n        elements: [],\n        components: [],\n        workflows: [],\n        activeRuns: [],\n      }) as ReturnType<RegistryLike['createSnapshot']>,\n  };\n\n  const executor: ActionExecutorLike = {\n    executeAction: async () => ({\n      success: false,\n      error: 'Server-side action execution not available. Use the runtime injection proxy.',\n      timestamp: Date.now(),\n    }),\n    executeComponentAction: async () => ({\n      success: false,\n      error: 'Server-side action execution not available. Use the runtime injection proxy.',\n      timestamp: Date.now(),\n    }),\n  };\n\n  const handlers = createHandlers(registry, executor);\n  const routeHandlers = createNextRouteHandlers(handlers, config);\n  // All three handlers point to the same internal handleRequest function\n  return routeHandlers.GET;\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 '@qontinui/ui-bridge';\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, preferredId?: string): string {\n    // Resume under a client-supplied stable id (e.g. persisted `__uiBridge_tabId`,\n    // forwarded from the upgrade request's `?tabId=`) so a tab keeps its\n    // server-side identity across reconnects instead of churning ids.\n    const clientId = preferredId && preferredId.trim() ? preferredId.trim() : generateId();\n\n    const existing = this.clients.get(clientId);\n    if (existing && existing.ws !== ws) {\n      try {\n        existing.ws.close?.();\n      } catch {\n        /* best-effort */\n      }\n    }\n\n    const client: ConnectedClient = {\n      id: clientId,\n      ws,\n      subscription: existing?.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 ${existing ? 'resumed' : '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. Capture THIS ws so a stale socket's delayed close\n    // cannot evict a newer resumed client registered under the same id.\n    ws.onclose = () => {\n      this.handleDisconnect(clientId, ws);\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, ws?: WebSocketLike): void {\n    if (ws) {\n      const current = this.clients.get(clientId);\n      if (current && current.ws !== ws) {\n        // A newer socket already resumed this id — leave it intact.\n        return;\n      }\n    }\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        case 'getElementHistory':\n          await this.handleGetElementHistory(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   * Handle getElementHistory message\n   */\n  private async handleGetElementHistory(\n    clientId: string,\n    message: WSClientMessage & { type: 'getElementHistory' }\n  ): Promise<void> {\n    const { elementId, options } = message.payload;\n    const result = await this.handlers.getElementHistory(elementId, options);\n\n    if (result.success) {\n      this.sendResponse(clientId, message.id, true, { entries: result.data });\n    } else {\n      this.sendResponse(clientId, message.id, false, undefined, result.error);\n    }\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 (client.subscription.events.size === 0 || client.subscription.events.has(event.type)) {\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 { mapInternalErrorCode } from './error-mapper';\nimport { UIBridgeWSHandler, type WebSocketLike } from './websocket-handler';\nimport type { BridgeEvent } from '@qontinui/ui-bridge';\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  const message = typeof error === 'string' ? error : error.message;\n  return {\n    success: false,\n    error: message,\n    code: mapInternalErrorCode(code, message),\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(\n          event: 'connection',\n          callback: (ws: WebSocketLike, request?: { url?: string }) => void\n        ): void;\n        on(event: 'error', callback: (error: Error) => void): void;\n        close(): void;\n      };\n\n      wss.on('connection', (ws, request) => {\n        this.wsConnections.add(ws);\n        // Forward the persisted tab id (?tabId=) so the client resumes its\n        // server-side identity across reconnects instead of churning ids.\n        let preferredId: string | undefined;\n        const rawUrl = request?.url;\n        if (rawUrl) {\n          try {\n            preferredId = new URL(rawUrl, 'http://localhost').searchParams.get('tabId') ?? undefined;\n          } catch {\n            /* malformed url — fall back to generated id */\n          }\n        }\n        this.wsHandler!.handleConnection(ws, preferredId);\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    // P2.2 — Endpoint discovery. Served before route matching so it works\n    // even if no UIBridgeServerHandlers entry registers it.\n    if (method === 'GET' && path === '/_routes') {\n      const routes = UI_BRIDGE_ROUTES.map((r) => ({ method: r.method, path: r.path })).sort(\n        (a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method)\n      );\n      this.sendJSON(res, {\n        success: true,\n        data: { routes, count: routes.length },\n        timestamp: Date.now(),\n      });\n      return;\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"]}