{"version":3,"sources":["../src/page-health.ts","../src/handlers.ts"],"names":[],"mappings":"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","file":"handlers.mjs","sourcesContent":["/**\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"]}